Fork me on GitHub

检测EherCAT通讯状态

1、EtherCAT主站通讯状态标志位:

主站可以通过下面几个参数来判断网络是否正常。

需要注意的是配置完成后通讯再断开xConfigFinished报错为true,除非使用xStopBus停止总线;

1)xConfigFinished:如果这个参数为“TRUE”,所有配置参数的传送已经正确完成。通讯正在运行。

2)xDistributedClockInSync :如果使用了分布时钟,PLC将和第一个激活分布时钟设置的EtherCAT从站同步。只要同步成功完成,输出为TRUE。

注意 :xDistributedClockInSync为ON不能保证通讯一定是完全正常的,需要通过xError和从站状态一起判断。

这个信号可用于同步化模式下,在PLC启动之前启动SoftMotion功能块,因为否则的话可能会发生位置跳跃。在PLC启动时,输出是FALSE,几秒钟之后它将变为TRUE。如果由于任何故障而失去同步性,则输出重置为FALSE.

3)xError :所有从站掉站或者说通讯报错误时有用(xError=TRUE).如果EtherCAT堆栈启动时探测到错误,或者在操作时与从站的通讯被中断,则该输出为TRUE,因为再收不到任何消息(比如由于连线中断)。可通过错误列表或错误信息来了解错误原因。

举例说明:主站+ECT通讯模块+620N+620N

通讯正常时标准位状态:

xConfigFinished= TRUE;

xDistributedClockInSync = TRUE;

xError= False。

B)网络中未接任何从站或从站不全

xConfigFinished= False;

xDistributedClockInSync = False;

xError=TRUE。

通讯正常后将主站和第一个从站之间网线断开,即和所有从站数据中断

xConfigFinished = TRUE;

xDistributedClockInSync= False;

xError=False。

D)通讯正常后将第一个从站和第二个从站之间网线断开,即断开所有具有DC功能的从xConfigFinished = TRUE;

xDistributedClockInSync= False;

xError=False。

E)通讯正常后将第二个从站和最后一个从站之间网线断开。

xConfigFinished = TRUE;

xDistributedClockInSync= TRUE;

xError=False。

2、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

一般通讯正常会自动切换到运行状态,AM600停止后为状态初始化。从初始化状态向运行状态转化时,必须按照“初始化 预运行 安全运行_ 运行”的顺序转化,不可以越级。从运行状态返回时可以越级转化。状态的转化操作和初始化过程

 

 

 

与EtherCAT主站一样,每个从站都可以认为是一个功能块,从站名称就是ETCslave功能块的实例,程序中只需要使用该功能块就可以。

基本的直接判断从站是否为ETC_SLAVE_OPERATIONAL状态

//检测从站是否为OP模式

IF _IS620N.wState<>8 THEN

bnoOP:=TRUE;

END_IF

上面的方法,如果有几十个从站,每个从站都判断需要几十条IF语句,比较麻烦。

EtherCAT主站提供了指向第一个从站的指针和链表,所有从站都可以用链表找到,因此用while循环可以简化编程。

定义:

VAR

pSlave: POINTER TO ETCSlave;

END_VAR

编程:

pSlave := Ethercat.FirstSlave; //首先通过EtherCAT_Master.FirstSlave找到主站的第一个从站。

WHILE pSlave <> 0 DO //在‘WHILE’循环中调用各个实例,由此确定wState,然后检查状态。

pSlave^();

IF pSlave^.wState = ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL THEN

i:=i+1;

else

exit;

END_IF //通过pSlave^.NextInstance找到指向下一个从站的指针。在列表结尾出指针为空,循环结束。

pSlave := pSlave^.NextInstance;

END_WHILE

故障站号:=i+1; //获取第几个站号故障

i:=0;

当EtherCAT组网中包含伺服与及ECT模块时,wState不能正确反映ECT模块的状态机,此时可以用m_wSlaveStateAct反映所有从站的状态机。实际上,Ethercat芯片(ET1100)寄存器地址0x0130:0x0131的值为从站设备的状态,该值的意义如下图所示。从站变量m_wSlaveStateAct获取的即为Ethercat芯片(ET1100)寄存器地址0x0130:0x0131的值。编程时可以通过m_wSlaveStateAct来获取从站的状态机。

例如:

基本的直接判断从站是否为ETC_SLAVE_OPERATIONAL状态

//检测从站是否为OP模式

IF _IS620N. m_wSlaveStateAct<>8 THEN

bnoOP:=TRUE;

END_IF

EtherCAT主站提供了指向第一个从站的指针和链表,所有从站都可以用链表找到,因此用while循环可以简化编程。

定义:

VAR

pSlave: POINTER TO ETCSlave;

END_VAR

编程:

pSlave := Ethercat.FirstSlave; //首先通过EtherCAT_Master.FirstSlave找到主站的第一个从站。

WHILE pSlave <> 0 DO //在‘WHILE’循环中调用各个实例,由此确定m_wSlaveStateAct,然后检查状态。

pSlave^( );

IF pSlave^.m_wSlaveStateAct = 8 THEN

i:=i+1;

ELSE

ErrorId:=i+1; //获取第几个站号故障

exit;

END_IF //通过pSlave^.NextInstance找到指向下一个从站的指针。在列表结尾出指针为空,循环结束。

pSlave := pSlave^.NextInstance;

END_WHILE

i:=0;

注意如果未加该段指令AM600 ECT模块其状态一直会为ETC_SLAVE_BOOT,加上后可正常显示从站状态。

 

作者:Then_7af6
链接:https://www.jianshu.com/p/d483dcec168b
posted @ 2024-04-16 14:46  _浮尘  阅读(2718)  评论(0)    收藏  举报