跳到主要内容

Hot-Connect 组

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

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

典型场景: 工具架上多种可换工具头, 同一时刻只插入其中一个。

扫描前登记
  • add_group() 必须在 set_network() / 扫描前调用
  • 扫描缺席不卡 SAFEOP+ERROR
  • 运行中插回不会自动进 OP;主站可报 Offline/Online,应用层自己处理状态机
Alias Address 必须烧录
  • Alias Address(ESC 0x0012 寄存器)必须预先烧录到从站 EEPROM 内,非 0 且组内唯一
  • Alias=0 的从站不支持 Hot-Connect (ETG.1020 §8.3)
  • 烧录可通过 Darra 配置工具或 EEPROM 写入 API 完成

与 从站静态分组 的区别​

项静态分组 (groups)Hot-Connect (hot_connect)
目的不同 PDO 周期分频允许从站缺席不报错
标识0..7 组号Alias Address
缺席行为报 AL_ERROR标记 Absent, 主站照常进 OP
配置时机SAFE_OP 之前set_network() 之前

创建访问器​

from darra_ethercat.master.hot_connect import HotConnect

hc = HotConnect(master._dll, master.master_index)

HotConnect 是单 master 内的 Hot-Connect 管理器。 每个主站最多支持 32 个 Hot-Connect 组 (MAX_GROUPS)。扫描前登记组表,不是运行中自动登记。

HotConnectStatus 枚举​

class HotConnectStatus(IntEnum):
UNKNOWN = -1 # 组未注册或底层查询失败
ABSENT = 0 # 组在当前扫描中未探测到
PRESENT = 1 # 组在当前扫描中探测到

HotConnectGroup 数据类​

enumerate() 返回的只读快照。

类别字段类型读写说明
组定义group_idint只读用户分配的组 ID (1..65535)
alias_addressint只读期望 Alias 地址(ESC 0x0012,必须非 0)
vendor_idint只读期望 VendorID(0=不校验)
product_codeint只读期望 ProductCode(0=不校验)
扫描结果is_presentbool只读是否在当前扫描中探测到
detected_slave_indexint只读探测到时匹配的从站索引(0=未匹配)
statusHotConnectStatus只读is_present 的枚举封装

API​

类别方法返回读写说明
组表add_group(group_id, alias, vendor_id, product_code)bool只写扫描前登记 Hot-Connect 组
remove_group(group_id)bool只写移除指定组
clear_all()None只写清空本 master 全部组定义
组状态get_group_status(group_id)HotConnectStatus只读查询组 Present / Absent
group_count()int只读已注册组数
enumerate()List[HotConnectGroup]只读已注册组快照

add_group()​

def add_group(self, group_id: int, alias: int,
vendor_id: int = 0, product_code: int = 0) -> bool

向扫描期组表登记一个 Hot-Connect 组。 必须在 set_network() / 扫描前调用。 运行中插回不会因本组登记而自动进 OP。

参数:

  • group_id (int) — 组 ID, 1..65535(0 非法;同 master 唯一)
  • alias (int) — 期望 Alias 地址(必须非 0)
  • vendor_id (int) — 期望 VendorID, 0 = 不校验
  • product_code (int) — 期望 ProductCode, 0 = 不校验

返回值:

  • bool — True = DLL 已写入组表;False = 未登记(参数非法 / 组表已满 / group_id 重复 / FFI 缺失)

remove_group()​

def remove_group(self, group_id: int) -> bool

删除一个已注册的 Hot-Connect 组。

get_group_status()​

def get_group_status(self, group_id: int) -> HotConnectStatus

查询某个组的当前 Present / Absent 状态。

clear_all()​

def clear_all(self) -> None

清空当前 master 所有 Hot-Connect 组定义。 通常在重新 set_network() 前调用。

group_count()​

def group_count(self) -> int

当前已注册的组数。 0 表示无 HC 配置,所有从站行为等同 mandatory。

enumerate()​

def enumerate(self) -> List[HotConnectGroup]

枚举所有已注册的 Hot-Connect 组及其当前 present / absent 状态。

返回值:

  • List[HotConnectGroup] — 组快照列表(查询失败返回空列表)

完整示例​

from darra_ethercat import EtherCATMaster, EcState
from darra_ethercat.master.hot_connect import HotConnect, HotConnectStatus

with EtherCATMaster() as master:
# 1. 扫描前登记组表(必须在 set_network 之前,不是运行中自动登记)
hc = HotConnect(master._dll, master.master_index)
hc.clear_all()

# 工具架上 3 种工具头 Alias=1001/1002/1003, 每次只插一个
hc.add_group(group_id=1, alias=1001)
hc.add_group(group_id=2, alias=1002)
hc.add_group(group_id=3, alias=1003)

# 2. set_network 扫描按 Alias 匹配,缺席组标 absent
master.set_eni(r"C:\config.deni")
master.set_network(r"\Device\NPF_{GUID}")

# 3. 进入 OP — 扫描缺席不卡 SAFEOP+ERROR。运行中插回不会自动进 OP
master.set_state(EcState.OP)
master.start()

# 4. Present/Absent 是扫描结果,不是自动进 OP
for g in hc.enumerate():
print(f"组 {g.group_id} (Alias={g.alias_address}): "
f"{g.status.name}, 从站#{g.detected_slave_index}")

# 5. 仅对 PRESENT 组做控制(插回后不会自动进 OP,应用层自己处理状态机)
present_groups = [g for g in hc.enumerate() if g.is_present]
for g in present_groups:
slave = master[g.detected_slave_index]
# ... 后续控制 ...

热插拔自修复​

运行中插回不会自动进 OP. 主站可报 Offline/Online;应用层要自己处理状态机。 身份不符事件:

详见 属性与状态机 - 热插拔自修复。