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(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_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(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;应用层要自己处理状态机。 身份不符事件:
详见 属性与状态机 - 热插拔自修复。