跳到主要内容

Hot-Connect 组管理 (ETG.1020 §8.3)

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

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

典型应用:

  • 工艺夹具 / 末端工具按需挂接,不接也要让产线主站正常跑
  • 移动机器人 / AGV 上的可拆卸 IO 模块
  • 工厂调试 / 临时探针,做完即拔

通过 HotConnect 静态类访问。事件订阅请参见 事件 - SlaveIdentityMismatch。​

扫描前登记
  • AddGroup 必须在 SetNetwork / 扫描前调用
  • 扫描缺席不卡 SAFEOP+ERROR
  • 运行中插回不会自动进 OP;主站可报 Offline/Online,应用层自己处理状态机
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 { get; } // 用户分配的组 ID, 1..65535
public ushort AliasAddress { get; } // 期望 Alias 地址 (必须非 0)
public uint VendorId { get; } // 期望 VendorID, 0=不校验
public uint ProductCode { get; } // 期望 ProductCode, 0=不校验
public bool IsPresent { get; } // 是否在当前扫描中探测到
public ushort DetectedSlaveIndex { get; } // 探测到时匹配的 从站索引, 0=未匹配

public HotConnectStatus Status { get; }
}
类别字段类型读写说明
标识GroupIdushort只读用户分配的组 ID(1..65535,同主站唯一)
匹配条件AliasAddressushort只读期望 Alias 地址(ESC 0x0012,非 0)
匹配条件VendorIduint只读期望 VendorID,传 0 表示不校验
匹配条件ProductCodeuint只读期望 ProductCode,传 0 表示不校验
状态IsPresentbool只读当前扫描是否探测到
状态DetectedSlaveIndexushort只读命中时匹配的从站索引(1-based)
状态StatusHotConnectStatus只读等价于 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 组。须在 SetNetwork / 扫描前调用。 运行中插回不会因本组登记而自动进 OP。

参数:

  • groupId — 组 ID(1..65535,同主站唯一)
  • alias — Alias 地址(必须非 0)
  • vendorId — 期望 VendorID(0 不校验)
  • productCode — 期望 ProductCode(0 不校验)
  • masterIndex — 目标主站(多实例时使用,默认 0)

返回值: true = 已写入组表;false = 未登记(参数非法 / 组表已满 / groupId 重复)。

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();

// 1. 扫描前登记组表(必须在 SetNetwork / 扫描前,不是运行中自动登记)
HotConnect.AddGroup(
groupId: 1,
alias: 0x1001,
vendorId: 0x00000002,
productCode: 0x07D81052);

// 2. 可拆卸 AGV IO 模块登记成组 #2(不校验 VID/PID)
HotConnect.AddGroup(groupId: 2, alias: 0x2001);

// 3. SetNetwork → Build。Init→PreOp 扫描按 Alias 匹配,缺席组标 absent
master.SetNetwork(@"\Device\NPF_{...}").Build();

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

// 5. 业务运行中查询某组在不在(Present/Absent 是扫描结果,不是自动进 OP)
var status = HotConnect.GetStatus(1);
Console.WriteLine(status switch
{
HotConnectStatus.Present => "夹具组: 已挂接",
HotConnectStatus.Absent => "夹具组: 未挂接",
_ => "夹具组: 未知"
});

// 6. 列出所有组
foreach (var g in HotConnect.Enumerate())
{
Console.WriteLine($"Group {g.GroupId} alias=0x{g.AliasAddress:X4} "
+ $"{(g.IsPresent ? "Present" : "Absent")} "
+ $"detectedSlaveIndex={g.DetectedSlaveIndex}");
}

// 7. 切换工艺前清空所有 Hot-Connect 组(通常在重新 SetNetwork 前)
HotConnect.ClearAll();

配合事件订阅​

运行中插回不会自动进 OP。身份不符时 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 管理规则。