跳到主要内容

Hot-Connect 组管理

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

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

典型应用:

  • 工艺夹具/末端工具按需挂接,不接也要让产线主站正常跑
  • 移动机器人/AGV 上的可拆卸 IO 模块
  • 工厂调试/临时探针,做完即拔
扫描前登记
  • HotConnectAddGroup 必须在 SetNetwork / 扫描前调用
  • 扫描缺席不卡 SAFEOP+ERROR
  • 运行中插回不会自动进 OP;主站可报 Offline/Online,应用层自己处理状态机
Alias 地址要求
  • Alias Address (ESC 0x0012) 必须预先烧录到从站 EEPROM
  • 必须非 0 且组内唯一
  • Alias=0 的从站不支持 Hot-Connect

数据结构​

typedef enum {
EC_HOTCONNECT_UNKNOWN = -1, /* 组未注册或查询失败 */
EC_HOTCONNECT_ABSENT = 0, /* 组在当前扫描中未探测到 */
EC_HOTCONNECT_PRESENT = 1 /* 组在当前扫描中探测到 */
} ec_hotconnect_status_t;

typedef struct {
uint16_t group_id; /* 组 ID, 1..65535 */
uint16_t alias_address; /* 期望 Alias 地址 */
uint32_t vendor_id; /* 期望 VendorID, 0=不校验 */
uint32_t product_code; /* 期望 ProductCode, 0=不校验 */
int32_t is_present; /* 是否探测到 */
uint16_t detected_slave_idx; /* 探测到时匹配的从站索引, 0=未匹配 */
uint16_t reserved;
} ec_hotconnect_group_t;

每个主站最多支持 EC_HOTCONNECT_MAX_GROUPS = 32 个组。

组管理​

HotConnectAddGroup()​

int HotConnectAddGroup(uint16_t master_index, uint16_t group_id,
uint16_t alias_address, uint32_t vendor_id,
uint32_t product_code);

向扫描期组表登记一个 Hot-Connect 组。须在 SetNetwork / 扫描前调用。 运行中插回不会因本组登记而自动进 OP。返回 1 成功,0 失败(参数非法/组表已满/group_id 重复)。

HotConnectRemoveGroup()​

int HotConnectRemoveGroup(uint16_t master_index, uint16_t group_id);

删除指定组,组内从站恢复 mandatory。返回 1 成功,0 失败(组未找到)。

HotConnectGetGroupStatus()​

int HotConnectGetGroupStatus(uint16_t master_index, uint16_t group_id);

查询组当前状态。返回 EC_HOTCONNECT_PRESENT(1)、EC_HOTCONNECT_ABSENT(0)、EC_HOTCONNECT_UNKNOWN(-1)。

HotConnectEnumerate()​

int HotConnectEnumerate(uint16_t master_index,
ec_hotconnect_group_t* out_buf, int max);

枚举所有已注册组,返回实际写入的组数(>=0;<0 表示参数错误)。

HotConnectClearAll()​

void HotConnectClearAll(uint16_t master_index);

清空当前主站全部 Hot-Connect 组,常用于切换工艺方案或测试用例之间的复位。

HotConnectGetGroupCount()​

int HotConnectGetGroupCount(uint16_t master_index);

返回当前已注册组数量(0..32)。

完整示例​

uint16_t mi = Initialize();

/* 1. 扫描前登记组表(必须在 SetNetwork / 扫描前,不是运行中自动登记) */
HotConnectAddGroup(mi, 1, 0x1001, 0x00000002, 0x07D81052);

/* 2. 可拆卸 AGV IO 模块登记成组 #2 (不校验 VID/PID) */
HotConnectAddGroup(mi, 2, 0x2001, 0, 0);

/* 3. SetNetwork 扫描按 Alias 匹配,缺席组标 absent */
SetNetwork(mi, "\\Device\\NPF_{...}", "");

/* 4. 进入 OP — 扫描缺席不卡 SAFEOP+ERROR。运行中插回不会自动进 OP */
SetStateSequence(mi, EC_STATE_OPERATIONAL, 10000);
Start(mi);

/* 5. Present/Absent 是扫描结果,不是自动进 OP */
int status = HotConnectGetGroupStatus(mi, 1);
printf("夹具组: %s\n",
status == EC_HOTCONNECT_PRESENT ? "已挂接" :
status == EC_HOTCONNECT_ABSENT ? "未挂接" : "未知");

/* 枚举所有组 */
ec_hotconnect_group_t groups[32];
int n = HotConnectEnumerate(mi, groups, 32);
for (int i = 0; i < n; i++) {
printf("Group %u alias=0x%04X %s detected=%u\n",
groups[i].group_id, groups[i].alias_address,
groups[i].is_present ? "Present" : "Absent",
groups[i].detected_slave_idx);
}

/* 切换工艺前清空(通常在重新 SetNetwork 前) */
HotConnectClearAll(mi);

配合事件订阅​

运行中插回不会自动进 OP。主站可报 Offline/Online;应用层要自己处理状态机。身份不符时订阅 RegisterSlaveIdentityMismatchCallback 回调,在操作员确认换件后调用 AcknowledgeSlaveReplacement。