如何自动获取PLC双EtherCAT主站的本地NetID?
双EtherCAT主站NetID自动获取与从站管理方案
现状梳理
- 目标PLC搭载两台EtherCAT主站,已知主站NetID后可扫描从站并将其切换至OP状态(用于应对设备断开等异常场景)
- 基于
Tc2_EtherCAT库的ST_EcSlaveState、FB_EcGetAllSlaveAddr等功能块,可通过主站NetID获取从站设备信息 - 当前使用
FB_GetLocalAmsNetId获取本地NetID,但因双主站存在,需手动指定读取对象,无法适配PLC更换或新设备接入的场景
落地解决方案
1. 批量获取本地所有AmsNetId
使用TwinCAT内置的FB_AmsGetLocalNetIds功能块,一次性拉取本地所有注册的AmsNetID(包含两台EtherCAT主站的ID),无需手动指定。该功能块会返回完整的NetID列表,直接遍历即可覆盖所有主站。
2. 精准筛选EtherCAT主站
获取全量NetID后,通过FB_EcIsMaster功能块验证每个NetID对应的设备是否为EtherCAT主站,过滤掉非目标设备,确保只处理主站节点。
3. 封装自动化流程
将上述逻辑封装为独立功能块,实现全自动化流程:
- 调用
FB_AmsGetLocalNetIds获取本地所有NetID - 遍历列表,用
FB_EcIsMaster筛选出EtherCAT主站 - 对每个主站,调用
FB_EcGetAllSlaveAddr获取从站地址,再通过ST_EcSlaveState将从站设置为OP状态
ST语言实现示例
VAR fbGetLocalNetIds : FB_AmsGetLocalNetIds; arrNetIds : ARRAY[0..7] OF AmsNetId; // 根据实际主站数量调整数组长度 uiNetIdCount : UINT; uiIndex : UINT; fbIsMaster : FB_EcIsMaster; bIsEcatMaster : BOOL; fbGetSlaveAddrs : FB_EcGetAllSlaveAddr; arrSlaveAddrs : ARRAY[0..31] OF WORD; // 根据从站数量调整数组长度 uiSlaveCount : UINT; fbSetSlaveOp : ST_EcSlaveState; uiSlaveIdx : UINT; END_VAR // 批量获取本地NetID fbGetLocalNetIds(Execute := TRUE, NetIds := arrNetIds, Count => uiNetIdCount); IF fbGetLocalNetIds.Done THEN fbGetLocalNetIds.Execute := FALSE; // 遍历每个NetID,筛选EtherCAT主站 FOR uiIndex := 0 TO uiNetIdCount - 1 DO fbIsMaster(NetId := arrNetIds[uiIndex], IsMaster => bIsEcatMaster); IF bIsEcatMaster THEN // 获取当前主站下的所有从站地址 fbGetSlaveAddrs(Execute := TRUE, NetId := arrNetIds[uiIndex], SlaveAddrs := arrSlaveAddrs, Count => uiSlaveCount); IF fbGetSlaveAddrs.Done THEN fbGetSlaveAddrs.Execute := FALSE; // 将所有从站切换至OP状态 FOR uiSlaveIdx := 0 TO uiSlaveCount - 1 DO fbSetSlaveOp(NetId := arrNetIds[uiIndex], SlaveAddr := arrSlaveAddrs[uiSlaveIdx], State := EC_STATE_OP); END_FOR; END_IF; END_IF; END_FOR; END_IF;
内容的提问来源于stack exchange,提问作者Daniel Müller Navarro
相关产品推荐
相关产品推荐

