中型PLC使用基础汇报:https://pan.baidu.com/s/1UmbaMECPd0oYZPm70rYKbg
初始化
// IO初始化
IO_point := ADR(START_IO);
// 当前指针类型每次复位8个位,复位START_IO开始的5*8个位
FOR i := 0 TO num_IO BY 1 DO
IO_point^ := 0;
IO_point := IO_point + 1;
END_FOR
// 伺服参数初始化,根据伺服个数修改for循环次数
FOR i := 0 TO 1 BY 1 DO
单轴变量[i].gear_in := FALSE;
单轴变量[i].转矩运行 := FALSE;
单轴变量[i].速度运行 := FALSE;
单轴变量[i].绝对位移 := FALSE;
单轴变量[i].相对位移 := FALSE;
END_FOR
// 确定伺服通讯连接正常
IF ETHERCAT.xConfigFinished AND ETHERCAT.xDistributedClockInSync THEN
IF fangxian.wCommunicationState=100 THEN
EtherCAT_State:=TRUE;
ELSE
EtherCAT_State:=FALSE;
END_IF
END_IF
自动模式
// 动作分步运行,完成动作后运行步骤 + 1
CASE 运行步骤 OF
0 : // 给定变量初始值、标志位复位
运行步骤 := 运行步骤 + 1;
1 : // 动作1
2 : // 动作2
3 : // 动作3
ELSE // 动作完成处理
END_CASE
伺服控制:
1、定义伺服名(Axis_Name)
// 使用时根据现场伺服完成下列伺服命名
TYPE Axis_Name :
(
虚主轴 := 0,
放线轴 := 1
);
END_TYPE
2、伺服控制参数-结构体(PointAxis)
// 单轴控制相关参数
TYPE PointAxis :
STRUCT
使能 : BOOL; // 基础参数
使能ok : BOOL;
暂停 : BOOL;
快速停机 : BOOL;
回原 : BOOL;
故障复位 : BOOL;
模式切换 : BOOL;
重启运行 : BOOL; // 遇到故障伺服重启
重启完成 : BOOL; // 运行中遇到故障可进行伺服重新初始化
转矩运行 : BOOL; // 转矩运行
转矩大小 : LREAL;
绝对位移 : BOOL; // 绝对运行
绝对位移方向 : MC_Direction;
绝对位置 : LREAL;
相对位移 : BOOL; // 相对运行
相对距离 : LREAL;
速度运行 : BOOL; // 速度控制
速度运行方向 : MC_Direction;
速度运行速度 : LREAL := 100;
加速度值 : LREAL := 100; // 运动参数
减速度值 : LREAL := 100;
加加速值 : LREAL := 10;
原点位置 : LREAL;
gear_in : BOOL; // 进入电子凸轮
gearNum : DINT; // 齿轮比分子
gearDeno : UINT; // 齿轮比分母
gearMaster : AXIS_REF_SM3; // 电子凸轮主轴
控制模式 : SMC_CONTROLLER_MODE;
Axis : POINTER TO AXIS_REF_ETC_DS402_CS;
Server: POINTER TO ETCSlave;
END_STRUCT
END_TYPE
3、定义伺服控制参数数组(Axis)
//{attribute 'qualified_only'}
VAR_GLOBAL
// 0.。10中的10需要根据总的伺服数量设置,并将对应Axis_Name改变
单轴变量 : ARRAY[0..1] OF PointAxis;
END_VAR
4、伺服动作实现参数(MC_PointAxis)
(1)变量定义:
FUNCTION_BLOCK MC_PointAxis
VAR_IN_OUT
Point_Axis : PointAxis;
END_VAR
VAR
power : MC_Power; // 使能
halt : MC_Halt; // 暂停
stop : MC_Stop; // 停机
home : MC_Home; // 回零
reset : MC_Reset; // 故障复位
reinitDrive : SMC3_ReinitDrive; // 重启驱动
setControllerMode : SMC_SetControllerMode; // 设置控制模式
setTorque : SMC_SetTorque; // 转矩运行
moveAbsolute : MC_MoveAbsolute; // 绝对位移
moveRelative : MC_MoveRelative; // 相对位移
moveVelocity : MC_MoveVelocity; // 速度运行
gearIn : MC_GearIn; // 进入电子凸轮
gearOut : MC_GearOut; // 退出电子凸轮
camTableSelect : MC_CamTableSelect; // cam表设置
camIn : MC_CamIn; // 进入cam表
camOut : MC_CamOut; // 退出cam表
// 后续修改
去使能 : BOOL;
END_VAR
(2)函数调用:
// 伺服基础指令
power(Axis := Point_Axis.Axis^,
Enable := TRUE,
bRegulatorOn := Point_Axis.使能 AND (NOT 去使能),
bDriveStart := Point_Axis.使能,
Status => Point_Axis.使能ok);
// 暂停
halt(Axis := Point_Axis.Axis^,
Execute := Point_Axis.暂停,
Deceleration := Point_Axis.减速度值);
// 重启伺服
reinitDrive(Axis := Point_Axis.Axis^,
bExecute := Point_Axis.重启运行,
bVirtual := FALSE, // 目前默认为实轴,不是虚轴
bDone => Point_Axis.重启完成);
// 停机
stop(Axis := Point_Axis.Axis^,
Execute := Point_Axis.快速停机,
Deceleration := Point_Axis.减速度值,
Jerk := Point_Axis.加加速值);
// 回零
home(Axis := Point_Axis.Axis^,
Execute := Point_Axis.回原,
Position := Point_Axis.原点位置);
// 故障复位
reset(Axis := Point_Axis.Axis^,
Execute := Point_Axis.故障复位);
// 设置控制模式
setControllerMode(Axis := Point_Axis.Axis^,
bExecute := Point_Axis.模式切换,
nControllerMode := Point_Axis.控制模式);
// 转矩运行
setTorque(Axis := Point_Axis.Axis^,
bEnable := Point_Axis.转矩运行,
fTorque := Point_Axis.转矩大小);
// 绝对位移
moveAbsolute(Axis := Point_Axis.Axis^,
Execute := Point_Axis.绝对位移,
Position := Point_axis.绝对位置,
Direction := Point_axis.绝对位移方向,
Acceleration := Point_Axis.加速度值,
Deceleration := Point_Axis.减速度值,
Jerk := Point_Axis.加加速值);
// 相对位移
moveRelative(Axis := Point_Axis.Axis^,
Execute := Point_Axis.相对位移,
Distance := Point_Axis.相对距离,
Acceleration := Point_Axis.加速度值,
Deceleration := Point_Axis.减速度值,
Jerk := Point_Axis.加加速值);
// 速度运行
moveVelocity(Axis := Point_Axis.Axis^,
Execute := Point_axis.速度运行,
Velocity := Point_axis.速度运行速度,
Direction := Point_axis.速度运行方向,
Acceleration := Point_Axis.加速度值,
Deceleration := Point_Axis.减速度值,
Jerk := Point_Axis.加加速值);
// 加入电子凸轮运行,主轴为PointAxis中设置主轴。
// 使用需根据需要设置齿轮比,或PID实时调节齿轮比
gearIn(Execute := Point_Axis.gear_in,
Master := Point_Axis.gearMaster,
Slave := Point_Axis.Axis^,
RatioNumerator := Point_Axis.gearNum,
RatioDenominator := Point_Axis.gearDeno);
// 退出凸轮同步控制
gearOut(Execute := NOT Point_Axis.gear_in,
Slave := Point_Axis.Axis^);
// cam表之后根据实际使用再配置使用
5、参数更新(update)
// 伺服参数更新程序需要配置为优先级最高,且执行周期和同步周期成正比
// 将伺服与结构体变量参数映射使用,需要分为三个部分,根据后续需要添加轴
// 定时更新逻辑程序中的数据与伺服匹配动作
// 轴参数映射
// 单轴变量[虚主轴].Axis := (ADR(Axis_Virtual_Main));
单轴变量[放线轴].Axis := (ADR(fangxian));
// 伺服参数映射修改
单轴变量[放线轴].Server := (ADR(IS620N));
// 运动函数功能块调用更新
PointAxis_放线轴(Point_Axis := 单轴变量[放线轴]);