Hot-Connect 组
Hot-Connect 组 (ETG.1000.4 / ETG.1020 §8) 允许主站把若干从站标记为可选: 该组在物理网络上缺席时不报 AL_ERROR, 主站仍可正常进 OP. 典型场景: 工具架上多种可换工具头, 同一时刻只插入其中一个.
- 用户不调用
add_group()→ 所有从站行为 = mandatory (默认; 缺失即AL_ERROR) - 一旦把从站加入 Hot-Connect 组 → 该组缺失就不再算错, Master 可正常进 OP
- 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(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_id | int | 用户分配的组 ID (1..65535) |
| alias_address | int | 期望 Alias 地址 (ESC 0x0012, 必须非 0) |
| vendor_id | int | 期望 VendorID (0=不校验) |
| product_code | int | 期望 ProductCode (0=不校验) |
| is_present | bool | 是否在当前扫描中探测到 |
| detected_slave_index | int | 探测到时匹配的 从站索引 (0=未匹配) |
| status | HotConnectStatus | is_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= 不校验
返回值:
bool—True成功;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 组成员) 复用主站的身份不符事件:
详见 属性与状态机 - 热插拔自修复.