编程控制EtherCAT通讯重启:
EtherCAT通讯可以通过编程控制,所有EtherCAT通讯配置参数都可以用变量获取和设置。
1、后台配置实现
主站参数设置中勾选自动重启从站,如果从站掉站(如拔掉主站与第一个从站的网线,所有从站掉线,再重新插上)通讯会自动重启从站。这种重启方式只对所有从站掉站或者说通讯报错误时有用(xError=TRUE)。
这种方式重启后,如果有伺服轴,轴的状态还是会报通讯错误(1100),需用SMC3_ReinitDrive指令重新初始化。有伺服轴一般认为有DC时钟,用DC时钟同步上升沿触发使能该指令(ETHERCAT.xDistributedClockInSync),如下图。
2、编写用户程序实现
1)控制单个从站状态
从站状态可能为0、(1)初始化、(2)预运行、(4)安全运行、(8)运行,AM600如何通过程序控制从站状态呢?
可以修改属性SetOpMode的值控制从站状态。
定义:
VAR
wSlaveState: WORD:=8; //wSlaveState初始值设置为8
bSetSlaveOPmode: BOOL; //用户定义变量,设置为TRUE,从站状态不为OP则重启从站,注意在整个网络重启时不能为TRUE。
END_VAR
编程://从站状态控制
CASE wSlaveState OF
1:
IoConfig_Globals._IS620N.SetOpMode(wOpMode:= 2);
wSlaveState:=2;
2:
IF IoConfig_Globals._IS620N.wState=2 THEN wSlaveState:=3;
END_IF
3:
IoConfig_Globals._IS620N.SetOpMode(wOpMode:= 1);
wSlaveState:=4;
4:
IF IoConfig_Globals._IS620N.wState=1 THEN
wSlaveState:=5;
END_IF
5:
IoConfig_Globals._IS620N.SetOpMode(wOpMode:= 2);
wSlaveState:=6;
6:
IF IoConfig_Globals._IS620N.wState=2 THEN
wSlaveState:=7;
END_IF
7:
IoConfig_Globals._IS620N.SetOpMode(wOpMode:=4);
wSlaveState:=8;
8:
IF IoConfig_Globals._IS620N.wState=4 THEN
wSlaveState:=9;
END_IF
9:
IoConfig_Globals._IS620N.SetOpMode(wOpMode:= 8);
wSlaveState:=10;
10:
IF IoConfig_Globals._IS620N.wState=8 THEN
;
Else 故障无法复位;
END_IF
END_CASE
EtherCAT通讯某个别从站通讯故障可能不会导致整个通讯报错,只是对应从站不为运行状态,这就可以通过上面的方法重启对应从站。
如果重启伺服轴,需要SMC3_ReinitDrive指令初始化轴。
PS:不能在PLC系统初始化时调用该段程序,会导致PLC卡死
2)重启整个网络
如果后台没有勾选自动重启从站或者需要用户判断是否重启网络,此时用指令IoDrvEtherCAT控制实现。
xRestart:重启整个网络,注意需用上升沿,如果是电平总线会一直发重启命令无法完成重启运行。
Xstopbus:停止总线电平有效,为true时总线一直处于停止状态。
注意:IoDrvEtherCAT实例化名称必须用主站名称,如下图为EtherCAT。
通讯重启完成后要用PLCopen控制伺服轴还必须用SMC3_ReinitDrive指令初始化
//等待DC时钟同步有效信号,初始化轴
IF ETHERCAT.xConfigFinished AND ETHERCAT.xDistributedClockInSync THEN
SMC3_ReinitDrive_Axis0(
Axis:= Axis0,
bExecute:= TRUE,
bVirtual:= ,
bDone=> ,
bBusy=> ,
bError=> ,
nErrorID=> );
IF SMC3_ReinitDrive_Axis0.bDone THEN
bEtcReset:=FALSE;
END_IF
END_IF
注意什么时候重启从站呢?需要用户自己判断,比如主站参数xError=TRUE时、比如从站状态不在运行状态时。
PS:帮助文档,EtherCAT配置编辑器中有详细介绍