跳到主要内容

Hot-Connect 组管理

Hot-Connect 用于把"可能不在场"的从站登记成一组,主站启动/扫描时即使该组缺席也能继续进入 OP。典型应用:

  • 工艺夹具/末端工具按需挂接,不接也要让产线主站正常跑
  • 移动机器人/AGV 上的可拆卸 IO 模块
  • 工厂调试/临时探针,做完即拔
默认行为
  • 不调用 HotConnectAddGroup → 所有从站为 mandatory(缺失即 AL_ERROR)
  • 加入 Hot-Connect 组后,该组缺席不再算错,主站可正常进 OP
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 组。返回 1 成功,0 失败(参数非法/组表已满/group_id 重复)。

HotConnectRemoveGroup()

int HotConnectRemoveGroup(uint16_t master_index, uint16_t group_id);

删除指定组,组内从站恢复 mandatory。

HotConnectGetGroupStatus()

int HotConnectGetGroupStatus(uint16_t master_index, uint16_t group_id);

查询组当前状态。返回 1=Present,0=Absent,-1=Unknown。

HotConnectEnumerate()

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

枚举所有已注册组,返回实际写入的数量。

HotConnectClearAll()

void HotConnectClearAll(uint16_t master_index);

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

HotConnectGetGroupCount()

int HotConnectGetGroupCount(uint16_t master_index);

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

完整示例

dll_t dll;
LOAD_DLL(&dll, "Darra.Core.dll");

uint16_t mi = dll.Initialize();
dll.SetNetwork(mi, "\\Device\\NPF_{...}", "");

/* 把末端夹具登记成 Hot-Connect 组 #1 */
dll.HotConnectAddGroup(mi, 1, 0x1001, 0x00000002, 0x07D81052);

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

/* 进入 OP — 即使组缺席也不会报 AL_ERROR */
dll.SetStateSequence(mi, EC_STATE_OPERATIONAL, 10000);
dll.Start(mi);

/* 查询某组在不在 */
int status = dll.HotConnectGetGroupStatus(mi, 1);
printf("夹具组: %s\n",
status == 1 ? "已挂接" : status == 0 ? "未挂接" : "未知");

/* 枚举所有组 */
ec_hotconnect_group_t groups[32];
int n = dll.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);
}

/* 切换工艺前清空 */
dll.HotConnectClearAll(mi);

配合事件订阅

Hot-Connect 与"从站身份不符/热插拔自修复"语义相关。订阅 SlaveIdentityMismatch 回调,在操作员确认换件后调用 AcknowledgeSlaveReplacement