【Codesys】获取从站信息,判断是否从站断联,总线丢失

本文介绍了如何在EtherCAT网络中监控从站状态,包括错误代码处理、网络重启以及优化主站对从站的检测。特别提到当网络配置与实际连接不一致时,通过设置参数实现灵活运行和热接入功能。
摘要由CSDN通过智能技术生成

客户要求在屏幕上显示所有EtherCAT从站状态,如果有问题需要进行网络重启

PROGRAM SlaveMessage
VAR
    pSlave: ARRAY [0..1] OF POINTER TO ETCSlave; 
    SlaveErrorId: ARRAY [0..1] OF INT;
    MasterError: ARRAY [0..1]OF BOOL;
    ECT_SlaveOfQuantitys: ARRAY[0..1]OF UINT; 
    i:INT;
    addr1:ARRAY[0..1]OF  UINT;
END_VAR


RT800_EC.wState;(*********************************总线异常监控************************************)
(***************************** EtherCatDiagnosis *********************************)
// 获取EtherCat错误代码 //
// EtherCatInfo.Err                                :=    GetECError(
//     Code                                        =>    EtherCatInfo.ErrCode
//     );
// 
// // 复位EtherCat错误 //
// IF     EtherCatInfo.Err
//     and ( EtherCatInfo.Reset
//     OR stack.EqInput.Rest_Input )
// THEN
//     EtherCatResetError.Execute                    :=    TRUE                    ;
// ELSE
//     EtherCatResetError.Execute                    :=    FALSE                    ;
// END_IF;
// 
// EtherCatResetError(
//     );
// 
// // 读取EtherCat错误 //
// EtherCatInfo.NetTopologyErr                        :=    _EC_NetTopologyErr        ;//EtherCat网络配置异常
// 
// EtherCatInfo.SlavAdrDupErr                        :=    _EC_SlavAdrDupErr        ;//EtherCat从站节点重复异常
// FOR SlaveNumber:=1 TO 192 BY 1 DO
//     IF     NOT EtherCatInfo.SlaveErr[SlaveNumber]
//     THEN 
//             IF     _EC_CommErrTbl[SlaveNumber]
//             THEN
//                 EtherCatInfo.SlaveErr[SlaveNumber]    :=    TRUE                    ;
//             END_IF;
//     ELSIF EtherCatInfo.SlaveErr[SlaveNumber]
//         and    ( EtherCatInfo.Reset
//         OR stack.EqInput.Rest_Input )
//     THEN
//             EtherCatInfo.SlaveErr[SlaveNumber]        :=    FALSE                    ;
//     END_IF;
// END_FOR;
(*********************************EtherCAT主站通讯状态检测************************************)
//ECT主站0通讯正常时标准位状态
IF EtherCAT_Master_SoftMotion.xConfigFinished=TRUE AND
   EtherCAT_Master_SoftMotion.xDistributedClockInSync=TRUE AND
   EtherCAT_Master_SoftMotion.xError=FALSE 
THEN
   MasterError[0]:=FALSE;
ELSE
   MasterError[0]:=TRUE;
END_IF

(*********************************EtherCAT从站状态检测************************************)
//从站返回的当前状态,程序应该实时检测从站状态,运动控制一般认为从站为ETC_SLAVE_OPERATIONAL后才可以用常用的PLCopen指令控制轴。
(*
从站当前状态分为:

0: ETC_SLAVE_BOOT

1: ETC_SLAVE_INIT

2: ETC_SLAVE_PREOPERATIONAL
4: ETC_SLAVE_SAVEOPERATIONAL

8: ETC_SLAVE_OPERATIONAL

与EtherCAT主站一样,每个从站都可以认为是一个功能块,从站名称就是ETCslave功能块的实例,程序中只需要使用该功能块就可以。
基本的直接判断从站是否为ETC_SLAVE_OPERATIONAL状态
//检测从站是否为OP模式
IF _ECT.wState<>8 THEN
bnoOP:=TRUE;
END_IF
上面的方法,如果有几十个从站,每个从站都判断需要几十条IF语句,比较麻烦。
EtherCAT主站提供了指向第一个从站的指针和链表,所有从站都可以用链表找到,因此用while循环可以简化编程。
当EtherCAT组网中包含伺服与及ECT模块时,wState不能正确反映ECT模块的状态机,此时可以用m_wSlaveStateAct反映所有从站的状态机。
实际上,Ethercat芯片(ET1100)寄存器地址0x0130:0x0131的值为从站设备的状态。从站变量m_wSlaveStateAct获取的即为Ethercat
芯片(ET1100)寄存器地址0x0130:0x0131的值。编程时可以通过m_wSlaveStateAct来获取从站的状态机
*)
//ECT主站0下挂从站故障诊断
pSlave[0]:=EtherCAT_Master_SoftMotion.FirstSlave;///首先通过EtherCAT_Master_SoftMotion0.FirstSlave找到主站的第一个从站
WHILE pSlave[0] <> 0 DO //在‘WHILE’循环中调用各个实例,由此确定m_wSlaveStateAct,然后检查状态。
  pSlave[0]^();
IF pSlave[0]^.m_wSlaveStateAct = ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL THEN
    addr1[i]:=pSlave[0]^.SlaveAddr;//记录节点地址
      i:=i+1; 
ELSE
  SlaveErrorId[0]:=i+1; //获取第几个站号故障    
EXIT;
END_IF //通过pSlave^.NextInstance找到指向下一个从站的指针。在列表结尾出指针为空,循环结束
pSlave[0] := pSlave[0]^.NextInstance;
END_WHILE
i:=0;
(*********************************EtherCAT网络配置与实际连接不一致时如何运行************************************)
(*
EtherCAT_Master_SoftMotion.StartConfigWithLessDevice 设置为TRUE,遇到例如项目中配置了五个伺服控制器,但只连接了三个的情况,PLC不会报错,能正常配置运行。

参数EtherCAT_Master_SoftMotion.NumberActiveSlaves 显示实际连接的从站数。

此功能结合别名使用可以组态配置多个,实际连接数量可变,非常方便。

如果再配合总线复位EtherCAT_Master_SoftMotion.xReStart还可以实现类似热接入功能
*)
//ECT主站实际连接的从站数
ECT_SlaveOfQuantitys[0]:=EtherCAT_Master_SoftMotion.NumberActiveSlaves;//实际连接的从站数

以上代码来自第三方博客,具体是哪个忘记了,需要侵删清理请私信我。

只是记录一下,防止后面不记得写代码了 。

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值