Hot-Connect 组管理 (ETG.1020 §8.3)
Hot-Connect 允许把"可能不在场"的从站登记成一组,主站启动 / 扫描时即使该组缺席也可以继续进入 OP。典型应用:
- 工艺夹具 / 末端工具按需挂接,不接也要让产线主站正常跑
- 移动机器人 / AGV 上的可拆卸 IO 模块
- 工厂调试 / 临时探针,做完即拔
通过 darra::ethercat::master_hot_connect 命名空间下的自由函数管理 Hot-Connect 组。事件订阅请参见 事件 - SlaveIdentityMismatch。
- 不调用
AddGroup→ 所有从站行为 = mandatory(默认;缺失 → AL_ERROR) - 加入 Hot-Connect 组 → 该组缺席不再算错,主站可正常进 OP
- Alias Address (ESC
0x0012) 必须预先烧录到从站 EEPROM - 必须 非 0 且 组内唯一
- Alias=0 的从站不支持 Hot-Connect (ETG.1020 §8.3)
可通过 EtherCAT 配置工具 / slave.WriteRegister(0x0012, ...) 一次性烧录。
HotConnectStatus 枚举
namespace darra::ethercat {
enum class HotConnectStatus : int {
Unknown = -1, // 组未注册或底层查询失败
Absent = 0, // 组在当前扫描中未探测到
Present = 1 // 组在当前扫描中探测到
};
}
HotConnectGroup 快照
HotConnectGroup 是组的一次性只读快照(由 Enumerate() 返回)。
struct HotConnectGroup {
uint16_t groupId; // 用户分配的组 ID, 1..65535
uint16_t aliasAddress; // 期望 Alias 地址 (必须非 0)
uint32_t vendorId; // 期望 VendorID, 0=不校验
uint32_t productCode; // 期望 ProductCode, 0=不校验
bool isPresent; // 是否在当前扫描中探测到
uint16_t detectedSlaveIndex; // 探测到时匹配的 从站索引, 0=未匹配
HotConnectStatus Status() const noexcept;
};
| 字段 | 类型 | 说明 |
|---|---|---|
| groupId | uint16_t | 用户分配的组 ID(1..65535,同主站唯一) |
| aliasAddress | uint16_t | 期望 Alias 地址(ESC 0x0012,非 0) |
| vendorId | uint32_t | 期望 VendorID,传 0 表示不校验 |
| productCode | uint32_t | 期望 ProductCode,传 0 表示不校验 |
| isPresent | bool | 当前扫描是否探测到 |
| detectedSlaveIndex | uint16_t | 命中时匹配的从站索引(1-based) |
| Status() | HotConnectStatus | 等价于 isPresent ? Present : Absent |
组管理函数
所有函数都在 darra::ethercat::master_hot_connect 命名空间下。每个主站最多支持 master_hot_connect::MaxGroups = 32 个 Hot-Connect 组。
AddGroup()
namespace darra::ethercat::master_hot_connect {
bool AddGroup(EtherCATMaster& m,
uint16_t groupId,
uint16_t alias,
uint32_t vendorId = 0,
uint32_t productCode = 0);
}
注册一个 Hot-Connect 组。
参数:
m— 主站实例groupId— 组 ID(1..65535,同主站唯一)alias— Alias 地址(必须非 0)vendorId— 期望 VendorID(0不校验)productCode— 期望 ProductCode(0不校验)
返回值: true 成功;false 表示参数非法、Alias 已被占用或 DLL 未导出 Hot-Connect 入口。
RemoveGroup()
bool RemoveGroup(EtherCATMaster& m, uint16_t groupId);
删除指定组(恢复组内从站为 mandatory)。返回 false 表示该组未注册或 DLL 未导出对应入口。
GetGroupStatus()
HotConnectStatus GetGroupStatus(const EtherCATMaster& m, uint16_t groupId);
查询组当前的 Present / Absent 状态。组未注册或底层查询失败时返回 HotConnectStatus::Unknown。
Enumerate()
std::vector<HotConnectGroup> Enumerate(EtherCATMaster& m);
枚举主站当前所有已注册的 Hot-Connect 组。底层一次性把 C 端 hotconnect_group_t 数组拷出来转成 HotConnectGroup vector,最多 MaxGroups = 32 项。DLL 未导出 / 没有任何组时返回空 vector。
ClearAll()
void ClearAll(EtherCATMaster& m);
清空当前主站的全部 Hot-Connect 组。常用于切换工艺方案 / 测试用例之间的复位。
GroupCount()
int GroupCount(const EtherCATMaster& m);
当前已注册组数(0..32)。
完整示例
#include "ethercat.hpp"
using namespace darra;
using namespace darra::ethercat;
int main() {
EtherCATMaster master(dll);
master.SetNetwork("\\Device\\NPF_{...}").Build();
// 1. 把 "末端夹具" 登记成 Hot-Connect 组 #1
master_hot_connect::AddGroup(master,
/*groupId*/ 1,
/*alias*/ 0x1001,
/*VID*/ 0x00000002,
/*PID*/ 0x07D81052);
// 2. 把 "可拆卸 AGV IO 模块" 登记成组 #2 (不校验 VID/PID)
master_hot_connect::AddGroup(master, /*groupId*/ 2, /*alias*/ 0x2001);
// 3. 进入 OP — 即使组 1 / 组 2 缺席也不会报 AL_ERROR
master.SetState(EcState::OP);
master.Start();
// 4. 业务运行中查询某组在不在
auto status = master_hot_connect::GetGroupStatus(master, 1);
printf("夹具组: %s\n",
status == HotConnectStatus::Present ? "已挂接" :
status == HotConnectStatus::Absent ? "未挂接" : "未知");
// 5. 列出所有组
for (auto& g : master_hot_connect::Enumerate(master)) {
printf("Group %u alias=0x%04X %s detectedSlaveIndex=%u\n",
g.groupId, g.aliasAddress,
g.isPresent ? "Present" : "Absent",
g.detectedSlaveIndex);
}
// 6. 切换工艺前清空所有 Hot-Connect 组
master_hot_connect::ClearAll(master);
return 0;
}
配合事件订阅
Hot-Connect 与"从站身份不符 / 热插拔自修复"语义相关。SDK 提供 OnHotPlug() 包装函数,把 master.Events().OnSlaveIdentityMismatch(...) 的参数直接打包成 HotPlugIdentityMismatchEvent 结构供消费:
struct HotPlugIdentityMismatchEvent {
uint16_t masterIndex;
uint16_t slaveIndex;
uint32_t expectedVendor, expectedProduct, expectedRevision;
uint32_t actualVendor, actualProduct, actualRevision;
};
using HotPlugCallback = std::function<void(const HotPlugIdentityMismatchEvent&)>;
void OnHotPlug(EtherCATMaster& m, HotPlugCallback cb);
示例:
darra::ethercat::OnHotPlug(master, [](const auto& e) {
printf("从站 %u 身份不符:\n", e.slaveIndex);
printf(" 期望 VID=0x%08X PID=0x%08X RevID>=0x%08X\n",
e.expectedVendor, e.expectedProduct, e.expectedRevision);
printf(" 实际 VID=0x%08X PID=0x%08X RevID=0x%08X\n",
e.actualVendor, e.actualProduct, e.actualRevision);
// UI 弹窗 / 提示用户检查或更换设备...
// 操作员确认后调用:
// master_other::acknowledge_slave_replacement(master, e.slaveIndex);
});
详见 事件 - SlaveIdentityMismatch 与 属性与状态机 - 热插拔自修复。
ETG.1020 §8.3 Hot-Connect Group 管理规则。