运动控制综合示例
为了让用户对一个完整的运动控制组态有全面的了解,下面将详细介绍工程的组态过程。
被控设备示意图
假设X和Y轴电机都是每1048576个指令位置转一圈,丝杠螺间距10mm;
使用位置开环模式控制;
伺服电机型号:EtherCAT总线型,MADHT1505BA1;
轴组态
1、'总线配置'节点右键添加'EtherCAT主站';
2、'EtherCAT主站'节点右键添加2个MADHT1505BA1伺服从站,并重命名为MADHT1505BA1_X、MADHT1505BA1_Y;
3、'设备节点'(Simulate_Device)右键添加'轴配置'生成'Axis Pool'节点;'Axis Pool'节点右键添加2个'PositionControl_Axis'位置轴,并重命名为Axis_X、Axis_Y;
EtherCAT从站伺服参数配置
双击EtherCAT从站节点,在'EtherCAT I/O映射'页面定义或者映射变量,目的为了给必要的I/O数据定义变量(双击变量列输入自定义变量名,也可双击变量列后点击变量框右边的输入助手框选择已有变量);
如果有些变量未在I/O映射页面出现,请在'过程数据'页面选择其它PDO组。(MaxSpeed_X/Y变量映射是为了控制电机最大转速,如果I/O映射变量无此参数可以不定义这个变量。)
轴参数配置
1、双击轴节点,在'驱动设备'页面的'输出映射'处关联必要的变量关系,实现轴与EtherCAT伺服从站输出数据的交互;
必要输出参数说明:
轴对象成员 | 伺服电机变量 | 说明 |
---|---|---|
out.ControlWord | Controlword_X/Y | 控制字,一般在伺服电机16#6040:00索引下。 |
out.ModesOfOperation | ModesOfOP_X/Y | 控制模式, 一般在伺服电机16#6060:00索引下。 |
out.outputPosition | Dpos_X/Y | 目标位置,一般在伺服电机16#607A:00索引下。 |
2、在'编码器设备'页面的'输入映射'处关联必要的变量关系,实现轴与EtherCAT伺服从站输入数据的交互;
必要输入参数说明:
轴对象成员 | 伺服电机变量 | 说明 |
---|---|---|
in.StatusWord | Statusword1 | 状态字,一般在伺服电机16#6041:00索引下。 |
in.ModesOfOperationDisplay | ModeOpDis1 | 控制模式显示, 一般在伺服电机16#6061:00索引下。 |
in.input | Mpos1 | 实际位置,一般在伺服电机16#6064:00索引下。(不启用编码器可不映射此参数) |
3、在'基本属性'页面选择'轴类型'和设置'位置单位'值;
由于运动控制平台为有限行程,因此轴类型选择'线性轴',X轴位置单位=104857610/10=1048576(电机一圈指令位置数减速机的减速比/螺间距),Y轴位置单位=10485766/10=629145.6(电机一圈指令位置数减速机的减速比/螺间距)。此时用户单位就被转换为了mm(毫米);
4、在'位置限制'页面设置软硬限位参数;
如果设备有硬限位开关,那么软限位可以不启用。如果设备没有硬限位开关,那么可使用软限位代替。由于平台X轴范围为1000,Y轴范围为800。假设用户期望平台的中心点为工作原点,那么X轴正负向限位就可以设定为500、-500,Y轴正负向限位就可以设定为400、-400;
硬限位关联的信号变量地址必须是实际限位信号接入PLC的地址;
5、在'回零'页面设置回零参数;
一般情况下选择'仅使用回零信号'回零就可以了,由于平台的原点信号安装在轴的负向,因此我们要选择'负向'回零。回零逼近速度尽量要慢,因此我们设置10mm/s。
回零输入标志关联的信号变量地址必须是实际原点信号接入PLC的地址;
工程组态 _Init子程序
Init子程序实现轴的回零动作和工作原点定义,以便主程序可以在正确的坐标系中执行运动控制指令。当设备异常导致原点位置失效,就需要再次调用Init子程序重新回零和定义工作原点。
- 变量定义
名称 | 数据类型 | 含义 |
---|---|---|
MC_Power_inst0 | MC_Power | X轴使能功能块实例 |
MC_Power_inst1 | MC_Power | Y轴使能功能块实例 |
MC_Home_inst0 | MC_Home | X轴回零功能块实例 |
MC_Home_inst1 | MC_Home | Y轴回零功能块实例 |
Home_Pass | BOOL | 回零成功标志 |
MC_SetPosition_inst1 | MC_SetPosition | X轴位置定义功能块实例 |
MC_SetPosition_inst2 | MC_SetPosition | Y轴位置定义功能块实例 |
(EtherCT伺服最大限速取消) MaxSpeed_X:=4294967295; MaxSpeed_Y:=4294967295; (如果使能了软限位,在回零阶段需要先禁用软限位。) Axis_X.SoftwareLimit.Enable:=FALSE; Axis_Y.SoftwareLimit.Enable:=FALSE; (设置轴初始速度、加速度、减速度参数,单位mm/s) Axis_X.SetValue.SetVelocity:=100; Axis_X.SetValue.SetAcceleration:=1000; Axis_X.SetValue.SetDeceleration:=1000; Axis_Y.SetValue.SetVelocity:=100; Axis_Y.SetValue.SetAcceleration:=1000; Axis_Y.SetValue.SetDeceleration:=1000; (轴伺服使能,使能后才可执行运动控制指令。) MC_Power_inst0(Axis := Axis_X , Enable := TRUE ); MC_Power_inst0(Axis := Axis_Y , Enable := TRUE ); (投送轴回原点指令,因为是沿触发,因此需要调用两次。) MC_Home_inst0(Axis := Axis_X , Execute := 0 ); MC_Home_inst1(Axis := Axis_Y , Execute := 0 ); MC_Home_inst0(Axis := Axis_X , Execute := 1 ); MC_Home_inst1(Axis := Axis_Y , Execute := 1 ); (等待轴回原点结束,并判断回零是否成功) WHILE 1 DO IF MC_Home_inst0.Done=TRUE AND MC_Home_inst1.Done=TRUE THEN Home_Pass:=TRUE; EXIT; END_IF; IF MC_Home_inst0.CommandAborted=TRUE OR MC_Home_inst1.CommandAborted=TRUE OR MC_Home_inst0.Error=TRUE OR MC_Home_inst1.Error=TRUE THEN Home_Pass:=FALSE; EXIT; END_IF; TaskSleepMs( 100 ); (WHILE循环休眠,防止CPU占用率过高。) END_WHILE; (复位功能块,便于下次继续使用。) MC_Home_inst0(Axis := Axis_X , Execute := 0 ); MC_Home_inst1(Axis := Axis_Y , Execute := 0 ); (回原点成功后X轴和Y轴当前位置都是0。如果要定义工作平台中心为工作原点,那么就是要设定X轴和Y轴(500,400)的位置为新原点。) IF Home_Pass=TRUE THEN MC_SetPosition_inst1(Axis := Axis_X , Execute := 0 ); MC_SetPosition_inst2(Axis := Axis_Y , Execute := 0 ); MC_SetPosition_inst1(Axis := Axis_X , Execute := 1 , Position := 500 , Relative :=TRUE ); MC_SetPosition_inst2(Axis := Axis_Y , Execute := 1 , Position := 400 , Relative :=TRUE ); (如果使能了软限位,在回零结束后再重新使能软限位。) Axis_X.SoftwareLimit.Enable:=TRUE; Axis_Y.SoftwareLimit.Enable:=TRUE; (复位功能块,便于下次继续使用。) MC_SetPosition_inst1(Axis := Axis_X , Execute := 0 ); MC_SetPosition_inst2(Axis := Axis_Y , Execute := 0 ); END_IF; 工程组态_Main主程序
此主程序只列举了Axis_X和Axis_Y轴的绝对位置定位,其它运动指令组态可参考各运动指令组态示例。同时还需要异常处理程序,比如MC_Power、MC_Stop、MC_Halt、MC_Reset等功能组态,来实现轴的使能、停止、暂停、复位错误等功能。
- 变量定义
名称 | 数据类型 | 含义 |
---|---|---|
Home_En | BOOL | 触发调用Init回原点子程序 |
MC_MoveAbsolute_inst0 | MC_MoveAbsolute | MC_MoveAbsolute实例 |
Execute | BOOL | 触发引脚 |
Position | LREAL | 绝对位置 |
Velocity | LREAL | 目标速度 |
Acceleration | LREAL | 加速度 |
Deceleration | LREAL | 减速度 |
Jerk | LREAL | 加加速度 |
Direction | MC_DIRECTION | 方向 |
BufferMode | MC_BUFFER_MODE | 缓存模式 |
Done | BOOL | 结束标志 |
Busy | BOOL | 忙碌标志 |
Active | BOOL | 激活标志 |
CommandAborted | BOOL | 终止标志 |
Error | BOOL | 错误状态 |
ErrorID | MC__ERROR_ID | 错误ID |
MC_MoveAbsolute_inst1 | MC_MoveAbsolute | MC_MoveAbsolute实例 |
Execute1 | BOOL | 触发引脚 |
Position1 | LREAL | 绝对位置 |
Velocity1 | LREAL | 目标速度 |
Acceleration1 | LREAL | 加速度 |
Deceleration1 | LREAL | 减速度 |
Jerk1 | LREAL | 加加速度 |
Direction1 | MC_DIRECTION | 方向 |
BufferMode1 | MC_BUFFER_MODE | 缓存模式 |
Done1 | BOOL | 结束标志 |
Busy1 | BOOL | 忙碌标志 |
Active1 | BOOL | 激活标志 |
CommandAborted1 | BOOL | 终止标志 |
Error1 | BOOL | 错误状态 |
ErrorID1 | MC__ERROR_ID | 错误ID |