跳到主要内容

Hot-Connect 组

Hot-Connect 组 (ETG.1000.4 / ETG.1020 §8) 允许主站把若干从站标记为可选: 该组在物理网络上缺席时不报 AL_ERROR, 主站仍可正常进 OP. 典型场景: 工具架上多种可换工具头, 同一时刻只插入其中一个.

"默默支持" 语义
  • 用户不调用 add_group() → 所有从站行为 = mandatory (默认; 缺失即 AL_ERROR)
  • 一旦把从站加入 Hot-Connect 组 → 该组缺失就不再算错, Master 可正常进 OP
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() 之前

创建访问器

HotConnect 为高级 API

本页示例中出现的 HotConnect(master._dll, master.master_index) 写法属于内部高级 API, 仅在需要 Hot-Connect 组动态注册 / 在线探测时使用。多数情况下 Hot-Connect 组直接在 ENI 配置中静态声明, 由 SDK 在 set_network() 阶段自动加载, 无需用户手动调用本类。 高级 API 的句柄参数后续可能调整, 请勿在生产代码中长期固化该构造形式。

from 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=未匹配)
statusHotConnectStatusis_present 的枚举封装

API

add_group()

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

注册一个 Hot-Connect 组. 必须在 set_network() 之前调用.

参数:

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

返回值:

  • boolTrue 成功; False = 参数非法 / 组表已满 / group_id 重复

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 ethercat import EtherCATMaster, EcState
from ethercat.master.hot_connect import HotConnect, HotConnectStatus

with EtherCATMaster() as master:
# 1. 注册 Hot-Connect 组 (在 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. 设置网络 + 状态切换
master.set_eni(r"C:\config.deni")
master.set_network(r"\\Device\\NPF_{GUID}")
master.set_state(EcState.OP)
master.start()

# 3. 查询当前实际插入的工具头
for g in hc.enumerate():
print(f"组 {g.group_id} (Alias={g.alias_address}): "
f"{g.status.name}, 从站#{g.detected_slave_index}")

# 4. 仅对 PRESENT 组做控制
present_groups = [g for g in hc.enumerate() if g.is_present]
for g in present_groups:
slave = master[g.detected_slave_index]
# ... 后续控制 ...

热插拔自修复

热插拔自修复 (拔插 / 替换 Hot-Connect 组成员) 复用主站的身份不符事件:

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