内容简介:
在使用codesys过程中,伺服掉线是经常发生的,
需要对伺服轴进行初始复位才能恢复正常的使用。本文主要利用相关指令及状态位进行复位。调试步骤:
1、需要用到的实例名称:
1.1主站EtherCAT_Master,当创建专案的时候,系统默认产生一个
IODrvEtherCAT的实例,无需在程序中进行实例化。
需要用到的针脚为:
(1)EtherCAT_Master.xConfigFinished// 主站PLC初始代完成 (2)EtherCAT_Master.xDistributedClockInSync//主站PLC网络正常 (3)EtherCAT_Master.xError//主站PLC没有报警
1.2伺服驱动器ASDA_B3_E,当添加B3_E伺服时,系统默认产生一个ETCSlave的实例,无需在程序中进行实例化。
需要用到的针脚为:
(1) ETCSlave.wState//当掉线后重连正常后时,该状态为 IoDrvEthercatLib.ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL
1.3伺服电机Axis_1,系统默认产生一个AXIS_REF_SM3
需要用到的针脚为:
(1)Axis.bCommunication//该轴没有断线
2、需要用到的功能块:
2.1轴初始化复位功能块
3、复位原理流程:
主站(PLC)复位成功后,EtherCAT_Master.xConfigFinished和EtherCAT_Master.xDistributedClockInSync就会变成TRUE, EtherCAT_Master.xError就会变成FALSE,伺服站由Axis.bCommunication进行判断是否已经掉线。
当Axis.bCommunication为FALSE时,这时证明伺服处理掉线状态中,等待ETCSlave.wState=IoDrvEthercatLib.ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL后,触发SMC3_ReinitDrive.bExecute后方可复位成功。
4、程序的写法如下 :
——————————————————————————————
FUNCTION_BLOCK Drivereset
VAR_IN_OUT
Axis: AXIS_REF_SM3;
ETCSlave : ETCSlave;
END_VAR
VAR
TONRE: TON;
StepRe:INT;
SMC3_ReinitDrive1: SMC3_ReinitDrive;
MC_Reset : MC_Reset;
END_VAR
VAR_OUTPUT
CoumErr: BOOL;
END_VAR
———————————————————————————————
程序如下:
(****************************************轴掉线重连动作***********************************)
TONRE(IN:= , PT:= T#3S);
CASE StepRe OF
0://如果发生断线时会使程序进行断线bCommunication进行判断
IF NOT Axis.bCommunication//该轴没有断线
AND NOT CoumErr//没有报断线
AND EtherCAT_Master.xConfigFinished// 主站PLC初始代完成
AND EtherCAT_Master.xDistributedClockInSync//主站PLC网络正常
AND NOT EtherCAT_Master.xError//主站PLC没有报警
AND NOT SMC3_ReinitDrive1.bExecute//复位轴功能块没启用
THEN
CoumErr :=TRUE ;//轴断线异常
TONRE.IN := FALSE ;
StepRe := 10 ;
END_IF;
10://计时
TONRE.IN := TRUE ;//触发计时,
IF TONRE.Q//时间到后进行触发初始化
AND ETCSlave.wState=IoDrvEthercatLib.ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL
THEN
TONRE.IN := FALSE ;
StepRe := 20 ;
END_IF
20://进行触发复位
SMC3_ReinitDrive1.bExecute := TRUE ;//初始化伺服从站
IF SMC3_ReinitDrive1.bDone//复位完成
THEN
SMC3_ReinitDrive1.bExecute := FALSE ;
CoumErr :=FALSE ;//把断线报警关闭
TONRE.IN := FALSE ;
MC_Reset.Execute := FALSE ;
StepRe := 0 ;
ELSIF (SMC3_ReinitDrive1.bBusy//忙碌中
OR SMC3_ReinitDrive1.bError)
AND NOT SMC3_ReinitDrive1.bDone//复位完成
THEN
TONRE.IN := TRUE ;
IF TONRE.Q//复位不成功重新进行处理
THEN
TONRE.IN := FALSE ;
SMC3_ReinitDrive1.bExecute := FALSE ;
CoumErr := FALSE ;
StepRe := 0 ;
END_IF
END_IF
END_CASE
SMC3_ReinitDrive1(
Axis:= Axis,
bExecute:= ,
bVirtual:= ,
bDone=> ,
bBusy=> ,
bError=> ,
nErrorID=> );
很多工控朋友在复位伺服掉线的问题上,喜欢使用时间计时器进行复位,这样是不对的,建议必须等待ETCSlave.wState=IoDrvEthercatLib.ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL时触发功能块复位即可。