客户要求在屏幕上显示所有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;//实际连接的从站数
以上代码来自第三方博客,具体是哪个忘记了,需要侵删清理请私信我。
只是记录一下,防止后面不记得写代码了 。