编写EtherCAT状态判断功能块,方便以后调用,第一部分代码为变量部分,第二部分代码为主体部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//EtherCat通信检测,上电初始配置检测,运行中检测,输出最小掉线站号 FUNCTION_BLOCK HC_ETCCheck VAR_INPUT Check_En :BOOL:= FALSE;//检测使能 Check_Delay :UINT:= 30000;//检测延时,初始值30000ms,单位:ms; END_VAR VAR_OUTPUT InitialConfigDone :BOOL;//ETC初始配置完成 InitialConfigFail :BOOL;//ETC初始配置失败 SlaveError :BOOL;//ETC从站错误 SlaveErrorId :UINT;//ETC最小错误站号(非0时,最大31) END_VAR VAR i :UINT; vb_SlaveState :BOOL; Ton_0 :TON; pSlave :POINTER TO ETCSlave; vb_SlaveError :ARRAY[0..31] OF BOOL; END_VAR |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//********************上电检测******************** InitialConfigDone S= Check_En AND ETHERCAT_B.xConfigFinished AND ETHERCAT_B.xDistributedClockInSync AND NOT ETHERCAT_B.xError; InitialConfigDone R= NOT Check_En; InitialConfigFail := Ton_0.Q; Ton_0(in:= (Check_En AND NOT InitialConfigDone),pt:= UINT_TO_TIME(Check_Delay)); //********************运行检测******************** IF InitialConfigDone THEN SlaveError R= TRUE; pSlave := ETHERCAT_B.FirstSlave; i := 1; WHILE pSlave <> 0 DO pSlave^(); IF pSlave^.wState = ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL THEN Vb_SlaveState := FALSE; ELSE Vb_SlaveState := TRUE; END_IF vb_SlaveError[i] := vb_SlaveState; SlaveError S= vb_SlaveError[i]; IF SlaveError THEN IF (SlaveErrorId > i OR SlaveErrorId = 0) AND vb_SlaveError[i] = TRUE THEN SlaveErrorId:= i; END_IF ELSE SlaveErrorId:= 0; END_IF pSlave := pSlave^.NextInstance; i:= LIMIT(0,i + 1,31); END_WHILE END_IF |
//ETHERCAT
(*
(Ethercat.xConfigFinished) AND (NOT ETHERCAT.xError) AND (Ethercat.xDistributedClockInSync)
A) 通讯正常时标准位状态:
xConfigFinished= TRUE;
xDistributedClockInSync = TRUE;
xError= False。
B)网络中未接任何从站或从站不全
xConfigFinished= False;
xDistributedClockInSync = False;
xError=TRUE。
C) 通讯正常后将主站和第一个从站之间网线断开,即和所有从站数据中断
xConfigFinished = TRUE;
xDistributedClockInSync= False;
xError=False。
D)通讯正常后将第一个从站和第二个从站之间网线断开,即断开所有具有DC功能的从站
xConfigFinished = TRUE;
xDistributedClockInSync= False;
xError=False。
E)通讯正常后将第二个从站和最后一个从站之间网线断开。
xConfigFinished = TRUE;
xDistributedClockInSync= TRUE;
xError=False。
);
//(Ethercat.xConfigFinished) AND (Ethercat.xDistributedClockInSync) AND (NOT ETHERCAT.xError);
(定义:
pSlave: POINTER TO ETCSlave;
编程:
pSlave := Ethercat_Master.FirstSlave;
WHILE pSlave <> 0 DO
pSlave^();
IF pSlave^.wState = ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL THEN
;
END_IF
pSlave := pSlave^.NextInstance;
END_WHILE
首先通过EtherCAT_Master.FirstSlave找到主站的第一个从站。
在‘WHILE’循环中调用各个实例,由此确定wState,然后检查状态。通过pSlave^.NextInstance找到指向下一个从站的指针。在列表结尾出指针为空,循环结束。
*)
转载请注明:燕骏博客 » codesys中EtherCAT总线状态判断
赞赏作者微信赞赏支付宝赞赏