跳到主要内容

Hot-Connect 组管理

Hot-Connect 把「扫描时可能不在场」的从站登记成一组。组表是扫描期登记:必须在 SetNetwork / 扫描前调用 addGroup。扫描按 Alias 匹配,把组标成 present / absent。不调用 addGroup 时所有从站仍是 mandatory(缺失即 AL_ERROR)。扫描时某组缺席不再算错,其余从站可以继续进 OP。

运行中插回不会自动进 OP。 主站可报 Offline/Online;应用层要自己处理状态机。不要指望插回去就自动进 OP;断电重连、换同型号也不会由主站自动拉回 OP。

通过 new HotConnect(masterIndex) 实例化。​

扫描前登记
  • addGroup 必须在 SetNetwork / 扫描前调用
  • 扫描缺席不卡 SAFEOP+ERROR
  • 运行中插回不会自动进 OP;主站可报 Offline/Online,应用层自己处理状态机
Alias 地址硬性要求

Hot-Connect 组依赖从站的 Alias 地址(ESC 寄存器 0x0012)。Alias 必须预先烧录到从站 EEPROM,非 0 且组内唯一。Alias=0 的从站不支持 Hot-Connect(ETG.1020 §8.3)。

上限​

public static final int MAX_GROUPS = 32;

每个 master 最多支持 32 个 Hot-Connect 组。

组操作​

类别方法类型读写说明
组表addGroup(int, int, long, long)boolean只写扫描前登记 Hot-Connect 组
removeGroup(int)boolean只写移除指定组
clearAll()void只写清空本 master 全部组定义
组状态getGroupStatus(int)HotConnectStatus只读查询组 Present / Absent
getGroupCount()int只读已注册组数
enumerate()List<HotConnectGroup>只读已注册组快照

addGroup(int groupId, int aliasAddress, long vendorId, long productCode)​

public boolean addGroup(int groupId, int aliasAddress, long vendorId, long productCode)

向扫描期组表登记一个 Hot-Connect 组。须在 SetNetwork / 扫描前调用。 运行中插回不会因本组登记而自动进 OP。

参数:

  • groupId (int) — 用户分配的组 ID(1..65535,同 master 唯一)
  • aliasAddress (int) — 期望 Alias 地址(必须非 0)
  • vendorId (long) — 期望 VendorID,0 表示不校验
  • productCode (long) — 期望 ProductCode,0 表示不校验

返回值:

  • boolean — true = 已写入组表;false = 未登记(参数非法 / 组表已满 / groupId 重复)

removeGroup(int groupId)​

public boolean removeGroup(int groupId)

移除指定组。

getGroupStatus(int groupId)​

public HotConnectStatus getGroupStatus(int groupId)

查询某个组当前的 Present / Absent 状态。

clearAll()​

public void clearAll()

清空当前 master 上所有 Hot-Connect 组定义。通常在重新 SetNetwork 前调用。

getGroupCount()​

public int getGroupCount()

返回当前已注册的 Hot-Connect 组数。0 表示无 HC 配置(所有从站均按 mandatory 处理)。

enumerate()​

public List<HotConnectGroup> enumerate()

枚举所有已注册组的快照(不可变列表)。

数据结构​

HotConnectStatus 枚举:

public enum HotConnectStatus {
UNKNOWN(-1), // 未注册或查询失败
ABSENT(0), // 当前扫描中未探测到
PRESENT(1); // 当前扫描中探测到
}

HotConnectGroup​

public static class HotConnectGroup {
public final int groupId; // 组 ID
public final int aliasAddress; // 期望 Alias
public final long vendorId; // 期望 VendorID (0=不校验)
public final long productCode; // 期望 ProductCode (0=不校验)
public final boolean isPresent; // 是否在最近扫描中存在
public final int detectedSlaveIndex; // 命中的 从站索引 (0=未匹配)

public HotConnectStatus getStatus(); // PRESENT / ABSENT
}

完整示例​

EtherCATMaster pending = EtherCATMaster.create();
HotConnect hc = new HotConnect(pending.MasterIndex);

// 1. 扫描前登记组表(必须在 SetNetwork / 扫描前,不是运行中自动登记)
hc.addGroup(1, 1001, 0, 0); // 工具头 1, alias=1001
hc.addGroup(2, 1002, 0, 0); // 工具头 2, alias=1002

// 2. SetNetwork → build。Init→PreOp 扫描按 Alias 匹配,缺席组标 absent
EtherCATMaster master = pending
.SetNetwork("\\Device\\NPF_{...}")
.build()
.master;

// 3. 进入 OP — 扫描缺席不卡 SAFEOP+ERROR。运行中插回不会自动进 OP
master.setState(EcState.OP);
master.Start();

for (HotConnect.HotConnectGroup g : hc.enumerate()) {
System.out.printf("组 %d (alias=%d): %s, 命中从站=%d%n",
g.groupId, g.aliasAddress, g.getStatus(), g.detectedSlaveIndex);
}

// 4. Present/Absent 是扫描结果,不是自动进 OP
if (hc.getGroupStatus(1) == HotConnect.HotConnectStatus.PRESENT) {
System.out.println("工具头 1 已连接");
}

// 5. 切换工艺前清空所有组(通常在重新 SetNetwork 前)
hc.clearAll();
运行中插回不会自动进 OP

主站可报 Offline/Online;应用层要自己处理状态机。不要指望插回去就自动进 OP。身份不符时订阅 master.Events().addSlaveIdentityMismatchListener,确认换件后调用 master.AcknowledgeSlaveReplacement。