Hot-Connect 组管理 (ETG.1020 §8.3)
Hot-Connect 允许把"可能不在场"的从站登记成一组,主站启动 / 扫描时即使该组缺席也可以继续进入 OP。典型应用:
- 工艺夹具 / 末端工具按需挂接,不接也要让产线主站正常跑
- 移动机器人 / AGV 上的可拆卸 IO 模块
- 工厂调试 / 临时探针,做完即拔
通过 HotConnect 静态类访问。事件订阅请参见 事件 - SlaveIdentityMismatch。
默默支持
- 不调用
AddGroup→ 所有从站行为 = mandatory(默认;缺失 → AL_ERROR) - 加入 Hot-Connect 组 → 该组缺席不再算错,主站可正常进 OP
Alias 地址硬性要求
- Alias Address (ESC
0x0012) 必须预先烧录到从站 EEPROM - 必须 非 0 且 组内唯一
- Alias=0 的从站不支持 Hot-Connect (ETG.1020 §8.3)
可通过 EtherCAT 配置工具或写寄存器 API 一次性烧录。
HotConnectStatus 枚举
public enum HotConnectStatus
{
Unknown = -1, // 组未注册或底层查询失败
Absent = 0, // 组在当前扫描中未探测到
Present = 1 // 组在当前扫描中探测到
}
HotConnectGroup 快照
HotConnectGroup 是组的一次性只读快照(由 Enumerate() 返回)。
public class HotConnectGroup
{
public ushort GroupId; // 用户分配的组 ID, 1..65535
public ushort AliasAddress; // 期望 Alias 地址 (必须非 0)
public uint VendorId; // 期望 VendorID, 0=不校验
public uint ProductCode; // 期望 ProductCode, 0=不校验
public bool IsPresent; // 是否在当前扫描中探测到
public ushort DetectedSlaveIndex; // 探测到时匹配的 从站索引, 0=未匹配
public HotConnectStatus Status { get; }
}
| 字段 | 类型 | 说明 |
|---|---|---|
| GroupId | ushort | 用户分配的组 ID(1..65535,同主站唯一) |
| AliasAddress | ushort | 期望 Alias 地址(ESC 0x0012,非 0) |
| VendorId | uint | 期望 VendorID,传 0 表示不校验 |
| ProductCode | uint | 期望 ProductCode,传 0 表示不校验 |
| IsPresent | bool | 当前扫描是否探测到 |
| DetectedSlaveIndex | ushort | 命中时匹配的从站索引(1-based) |
| Status | HotConnectStatus | 等价于 IsPresent ? Present : Absent |
组管理方法
每个主站最多支持 MaxGroups = 32 个 Hot-Connect 组。
HotConnect.AddGroup()
public static bool AddGroup(
ushort groupId,
ushort alias,
uint vendorId = 0,
uint productCode = 0,
ushort masterIndex = 0)
注册一个 Hot-Connect 组。
参数:
groupId— 组 ID(1..65535,同主站唯一)alias— Alias 地址(必须非 0)vendorId— 期望 VendorID(0不校验)productCode— 期望 ProductCode(0不校验)masterIndex— 目标主站(多实例时使用,默认 0)
返回值: true 成功;false 表示参数非法、Alias 已被占用或组表已满。
HotConnect.RemoveGroup()
public static bool RemoveGroup(ushort groupId, ushort masterIndex = 0)
删除指定组(恢复组内从站为 mandatory)。返回 false 表示该组未注册。
HotConnect.GetStatus()
public static HotConnectStatus GetStatus(ushort groupId, ushort masterIndex = 0)
查询组当前的 Present / Absent 状态。组未注册或底层查询失败时返回 HotConnectStatus.Unknown。
HotConnect.Enumerate()
public static IReadOnlyList<HotConnectGroup> Enumerate(ushort masterIndex = 0)
枚举主站当前所有已注册的 Hot-Connect 组(最多 MaxGroups = 32 项)。
HotConnect.ClearAll()
public static void ClearAll(ushort masterIndex = 0)
清空当前主站的全部 Hot-Connect 组。常用于切换工艺方案 / 测试用例之间的复位。
HotConnect.GroupCount()
public static int GroupCount(ushort masterIndex = 0)
当前已注册组数(0..32)。
HotConnect.MaxGroups
public const int MaxGroups = 32;
每个主站最多支持的 Hot-Connect 组数。
完整示例
var master = new DarraEtherCAT()
.SetNetwork(@"\Device\NPF_{...}")
.Build();
// 1. 把 "末端夹具" 登记成 Hot-Connect 组 #1
HotConnect.AddGroup(
groupId: 1,
alias: 0x1001,
vendorId: 0x00000002,
productCode:0x07D81052);
// 2. 把 "可拆卸 AGV IO 模块" 登记成组 #2 (不校验 VID/PID)
HotConnect.AddGroup(groupId: 2, alias: 0x2001);
// 3. 进入 OP — 即使组 1 / 组 2 缺席也不会报 AL_ERROR
master.SetState(EcState.OP);
// 4. 业务运行中查询某组在不在
var status = HotConnect.GetStatus(1);
Console.WriteLine(status switch
{
HotConnectStatus.Present => "夹具组: 已挂接",
HotConnectStatus.Absent => "夹具组: 未挂接",
_ => "夹具组: 未知"
});
// 5. 列出所有组
foreach (var g in HotConnect.Enumerate())
{
Console.WriteLine($"Group {g.GroupId} alias=0x{g.AliasAddress:X4} "
+ $"{(g.IsPresent ? "Present" : "Absent")} "
+ $"detectedSlaveIndex={g.DetectedSlaveIndex}");
}
// 6. 切换工艺前清空所有 Hot-Connect 组
HotConnect.ClearAll();
配合事件订阅
Hot-Connect 与"从站身份不符 / 热插拔自修复"语义相关。SDK 通过 master.Events.SlaveIdentityMismatch 事件携带身份不符上下文供消费:
master.Events.SlaveIdentityMismatch += (sender, e) =>
{
Console.WriteLine($"从站 {e.SlaveIndex} 身份不符:");
Console.WriteLine($" 期望 VID=0x{e.ExpectedVendor:X8} PID=0x{e.ExpectedProduct:X8} RevID>=0x{e.ExpectedRevision:X8}");
Console.WriteLine($" 实际 VID=0x{e.ActualVendor:X8} PID=0x{e.ActualProduct:X8} RevID=0x{e.ActualRevision:X8}");
// 操作员确认后调用:
// master.AcknowledgeSlaveReplacement(e.SlaveIndex);
};
详见 事件 - SlaveIdentityMismatch 与 属性与状态机 - 热插拔自修复。
参考
ETG.1020 §8.3 Hot-Connect Group 管理规则。