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