You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动获取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. 封装自动化流程

将上述逻辑封装为独立功能块,实现全自动化流程:

  1. 调用FB_AmsGetLocalNetIds获取本地所有NetID
  2. 遍历列表,用FB_EcIsMaster筛选出EtherCAT主站
  3. 对每个主站,调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:47:31