在自动化领域,运动控制是一件很复杂的事情,包含了上位机通讯,工业现场总线通信协议,运动控制算法,伺服电机控制等领域知识。致远电子自主研发的AWStudio 的 AWPLC 解决方案可以快速实现运动控制编程。
x86架构Windows系统的个人电脑;
ZMC600E运动控制器;
支持EtherCAT 协议的电机驱动器和伺服电机。
电脑端安装 AWStudio 软件 ;
ZMC600E端安装 awplc运行时。
图5 打开空白控制器项目
编写st脚本,包含两条语句:计数递增,打印计数。
PRINT_STR('cnt = ' + DWORD_TO_STRING(cnt));
cnt := cnt + 1;
POU调度程序会在每个周期调用main.st程序。
输入管理密码,登录到设备。
在设备端运行st脚本。
点击工具栏的【启动】按钮,【启动】按钮切换成【停止】按钮。
观察【输出】文本框,将会显示打印内容。
点击电机工具栏的【停止】按钮。
可以在输出文本框区域看到打印结果,计数每次累加1并打印到屏幕。
切换到缩放/映射页面。默认脉冲比是1:1,不需要特别配置。
轴是对伺服电机的高级抽象,避免了直接处理从站电机的状态字、控制字、指令位置等对象字典项,支持轴使能、发布运动、轴状态查询等功能。
以下是轴控制功能块常用接口的简单介绍:
MC_Power 控制轴使能(核心功能块)。
MC_Reset 清除轴错误。
MC_ReadStatus 查询轴状态。
MC_ReadActualPosition 查询轴实际位置。
MC_MoveAbsolute 轴运动到指定的绝对位置。
MC_MoveRelative 轴基于当前位置按照偏移量运动。
操作要点:轴要先使能,才能驱动电机运动。电机存在错误时,要先清除错误,才能使能轴。
首先添加多个功能块:轴状态查询,轴位置查询,轴错误复位,轴使能功能块。
然后编写一个简单的脚本,执行上述的功能块。
程序每运行200个周期,打印一次当前计数、实际位置、轴使能状态标志。
rdst(Axis:=CiA402_AXIS_0,Enable := true);
rdActPos(Axis:=CiA402_AXIS_0, Enable := true, Position => posAct);
IF rdst.ErrorStop THEN
rst(Axis := CiA402_AXIS_0, Execute := TRUE);
END_IF;
power(Axis:=CiA402_AXIS_0, Enable := true, bRegulatorOn := true, bDriveStart := true);
IF MOD(cnt, 200) = 0 THEN
PRINT_STR('cnt = ' + DWORD_TO_STRING(cnt) + ' pos=' + LREAL_TO_STRING(posAct));
PRINT_STR( 'Status ' + BOOL_TO_STRING(power.Status) + ' RegulatorOn ' + BOOL_TO_STRING(power.bRegulatorRealState));
END_IF;
cnt := cnt + 1;
查看打印过程。
首先添加绝对运动功能块,相对运动功能块对应的变量。
然后编写程序:
等待轴使能状态标志为真。
轴执行绝对运动。从当前位置运动到 100 单位的位置。
绝对运动到达目标后,再执行相对运动。从当前位置,往前运动200的单位。
代码中的位置,速度,加速度和减速度仅供参考,用户可以根据实际情况自行缩放。
power(Axis:=CiA402_AXIS_0, Enable := true, bRegulatorOn := true, bDriveStart := true);
if power.bRegulatorRealState THEN
movAbs(Axis := CiA402_AXIS_0, Execute := TRUE, Position := 100, Velocity := 50, Acceleration := 100, Deceleration := 100, Jerk := 0);
if movAbs.Done THEN
moveRel(Axis := CiA402_AXIS_0, Execute := TRUE, Distance := 200, Velocity := 50, Acceleration := 100, Deceleration := 100, Jerk := 0);
END_IF
END_IF
IF MOD(cnt, 50) = 0 THEN
PRINT_STR('cnt = ' + DWORD_TO_STRING(cnt) + ' pos=' + LREAL_TO_STRING(posAct));
END_IF;
cnt := cnt + 1;
查看打印过程。