快速入门 | 正运动技术运动控制器运动缓冲简介
一、材料准备与接线参考
(1)电脑1台,安装ZDevelop3.10.10版本软件(软件路径可前往正运动技术官网下载)
(2)正运动技术型号ZMC432控制器一个
(3)24V直流电源1个
(4)驱动器、电机若干
(5)控制器接线端子若干
(6)网线若干
(7)连接线若干
(8)输入输出设备、扩展模块、人机界面等根据实际需求选择。

缓冲多条运动指令时,为了判断当前运动执行到哪一条,提供MOVE_MARK运动标号和MOVE_CURMARK当前运动标号指令。MOVE_MARK运动标号每扫描一条运动指令+1;MOVE_CURMARK指令为当前运动的标号,提示当前运动到第几条运动指令,所有运动完成后为-1。
当前运动完成后会自动执行运动缓冲区内的下一条运动。运动指令全部执行完后,运动缓冲区为空,或者使用CANCEL/RAPIDSTOP指令清空运动缓冲区。
SP指令也属于运动指令,使用SP运动指令(如MOVESP、MOVECIRCSP等直接在运动指令后方加上SP)时,SP速度FORCE_SPEED、ENDMOVE_SPEED和STRATMOVE_SPEED会随SP运动指令写入运动缓存区。
SP运动指令与运动指令的区别:
MOVE(100)的速度是SPEED=100,MOVESP(100)的速度是FORCE_SPEED=200。

下图中,当从运动缓冲区取出部分运动指令执行之后,缓冲区有了空间,FOR循环继续执行,并存入运动指令到运动缓冲区。指令执行退出运动缓冲区后,只要运动缓冲区的空间够,新的运动指令一条条往运动缓冲区中存。

3.运动缓冲例程
RAPIDSTOP(2)
WAIT IDLE(0)
WAIT IDLE(1)
BASE(0,1)
ATYPE=1,1
UNITS=100,100
SPEED=100,100
ACCEL=1000,1000
DECEL=1000,1000
DPOS=0,0
MERGE=OFF '关闭连续插补
TRIGGER
LIMIT_BUFFERED=3 '轴0/1运动缓冲区可缓冲运动指令个数设为3
MOVE(60,40) '进入MTYPE,Buffer0
MOVE(70,50) '进入NTYPE,Buffer1
MOVE(50,40) 'Buffer2
MOVE(60,50) '缓冲区满,暂不进入
?"轴0当前缓冲指令个数=" MOVES_BUFFERED(0) '结果2
?"轴0剩余缓冲区个数=" REMAIN_BUFFER(1) AXIS(0) '结果0
?"轴1剩余缓冲区个数=" REMAIN_BUFFER(1) AXIS(1) '结果3
END
将轴的运动缓冲区可缓冲运动指令个数限制为3,此时运动缓冲区最多能装3条直线插补指令。 共有4个直线插补指令,MOVE(60,40)占用轴0的MTYPE,轴0还能缓冲2个运动指令,轴0剩余缓冲数为0,且还有1条直线指令因为主轴轴0的运动缓冲区已满,还未进入运动缓冲区。
等到MOVE(60,40)运动完成,MOVE(60,50)才能进轴0的运动缓冲区。

4.普通输出与运动缓冲中输出的区别
普通输出指令程序扫描到该行指令便执行输出。
运动缓冲中输出指令在程序扫描之后,将其存入运动缓冲区,运动缓冲区按先进先出的顺序依此取出指令执行,直到取出该输出指令时才会执行输出。
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0) '选择轴0
DPOS=0
UNITS=100 '脉冲当量
SPEED=100 '速度
ACCEL=1000 '加速度
DECEL=1000 '减速度
TRIGGER '触发示波器采样
OP(0,3,$0) '关闭输出口0-3
DELAY(1000) '延时
MOVE(100)
MOVE_OP(1,ON) '运动缓冲中输出
OP(0,ON) '普通输出
例子运行效果:延时1s之后,程序扫描到OP指令,输出口0立即执行输出。
MOVE_OP把IO操作指令填入运动缓冲区,所以在运行完MOVE(100)之后,输出口1才输出。

1.MOVE_OP -- 缓冲输出
语法:MOVE_OP (输出编号,输出状态)
此指令随其他运动指令一起进入运动缓冲区,从运动缓冲区中取出执行时才操作OP输出,可以控制某个输出口单独输出信号,也可以批量输出,不会打断插补运动的连续性。
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
MERGE=ON '开启连续插补
TRIGGER '自动触发示波器
OP(0,3,0) '关闭输出口0-3
MOVE(100)
MOVE_OP (0,ON) '等待上条运动完成后,OUT0输出信号
MOVE(100)
MOVE_OP (0,OFF) '等待上条运动完成后,OUT0关闭信号
MOVE_OP(1,3,5) '批量输出,OUT1,3输出信号,OUT2不输出,5对应二进制101
例子运行效果:第11-15行的运动指令依此存入运动缓冲区,按先进先出的顺序执行,MOVE(100)运动完后,MOVE_OP操作OUT0输出,继续执行第二个MOVE(100),然后MOVE_OP操作OUT0关闭,紧接着控制OUT1-3批量输出。

3.MOVE_DELAY -- 缓冲延时
语法:MOVE_DELAY(延时ms数)
BASE轴运动缓冲加入一个延时。
这个指令缓冲执行时不做任何运动,只延时指定时间。
延时使前面的运动指令结束时速度会自动降为0,会打断插补运动的连续性。
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
SPEED=100
ACCEL=1000
DECEL=1000
DPOS=0
MERGE=ON '开启连续插补
TRIGGER '自动触发示波器
MOVE(100)
MOVE_DELAY(500) '两个MOVE中间等待500ms
MOVE(200)

5.MOVE_PAUSE——运动暂停
暂停轴运动,只有在单轴或多轴插补运动时有效,多轴联动时一起暂停。
可以通过AXISSTATUS来查询是否有暂停,暂停中轴的IDLE状态为0。
当轴已经暂停或不在运动中时,调用这个指令会有警告输出,但不影响程序运行。某些运动不支持暂停,如VMOVE、同步运动指令等。
语法:MOVE_PAUSE(模式值)

MOVE_PAUSE(1)或MOVE_PAUSE(2)
模式值2例子:手动设置MOVE_MARK,通过MOVE_PAUSE(2)指令可以在MARK不同的边界处暂停。
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
MERGE=ON
TRIGGER
MOVE_MARK =1 '设置为标号1
MOVE(100)
MOVE_MARK =1 '设置为标号1
MOVE(150)
MOVE_MARK =2 '设置为标号2
MOVE(200)
MOVE_PAUSE (2) '标号不一样时暂停
DELAY(5000)
?DPOS(0) '打印结果:250

7.MOVE_TABLE -- 缓冲输出TABLE
BASE轴运动缓冲加入一个TABLE。
指令缓冲执行时不做任何运动,只修改TABLE,不会打断插补运动的连续性。
语法:MOVE_TABLE(TABLE编号, 要修改的值)
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
MERGE=ON
TABLE(0)=0 '初始值设为0
TRIGGER '自动触发示波器
MOVE(100)
MOVE_TABLE(0, 60) '等待运动完成后,TABLE(0)赋值60
MOVE(160)
WAIT IDLE(0)
?TABLE(0) '打印修改后TABLE(0)的值,打印结果,60

9.MOVE_PWM -- 缓冲PWM
BASE轴运动缓冲操作PWM。
指令缓冲执行时不做任何运动,只操作PWM。
PWM只能通过设置占空比为0来关闭,不能通过设置PWM频率为0实现,PWM频率一定要在PWM开启之前调整。
语法:MOVE_PWM(编号,占空比[,频率])
编号为支持PWM功能的输出口编号,查看硬件手册确认。
占空比指有效电平占整个周期的比例;范围0-1,设置0时关闭pwm;一个周期中先输出有效电平,再输出无效电平。
频率缺省为1KHz,硬件最大为1MHz,软件最大为2KHz。
RAPIDSTOP(2)
WAIT IDLE(0)
MOVE_PWM(0, 0, 1000) '关闭PWM
BASE(0)
ATYPE=1
UNITS=100
SPEED=100 '初始速度
ACCEL=1000
DECEL=1000
DPOS=0
TICKS = 10000
MOVE(10)
MOVE_PWM(0, 0.111, 2000) '轴0运行到10时,操作PWM0输出
MOVE_DELAY(100)
MOVE_PWM(0, 0.555, 3000) '延时100ms,修改PWM0输出
MOVE(20)
MOVE_PWM(0, 0, 1000) '关闭PWM
WHILE NOT IDLE(0) 'IDLE(0)=-1后退出while循环
? -TICKS,PWM_DUTY(0),PWM_FREQ(0)
DELAY(30)
WEND
例子运行效果:初始化关闭PWM输出,MOVE(10)运动完后,操作PWM0输出,保持100ms之后,修改PWM0输出的占空比和频率,再运行MOVE(20)后关闭PWM输出。WHILE循环在轴0运行时,每隔30ms打印一次PWM输出的占空比和频率,在轴0停止后,退出WHILE循环,不在打印。

使用SP运动后的效果如下,将最后一位参数设置非0值 ,此时触发轴1的运动速度为FORCE_SPEED=200。

12.MOVE_TASK -- 缓冲开启任务
BASE轴运动缓冲加入启动TASK。
这个指令缓冲执行时不做任何运动,只启动任务,不会打断插补运动的连续性。
语法:MOVE_TASK(任务号, 函数名)
从运动缓冲全区取出MOVE_TASK指令执行时,将task_move标记的程序作为任务1开启,在任务窗口可以看到任务1已启动。

13.MOVE_WAIT -- 缓冲等待
BASE轴运动缓冲加入一个条件判断。
指令缓冲执行时不做任何运动,只等待指定的条件满足,前面的运动指令结束时速度会自动降为0。
语法:MOVE_WAIT(参数名, 参数编号, 比较条件, 比较值)
参数可以为:DPOS,MPOS,IN,AIN,VPSPEED,MSPEED,MODBUS_REG,MODBUS_IEEE,MODBUS_BIT,VECTOR_BUFFERED,REMAIN
比较条件:1 参数值≥比较值;-1 参数值≤比较值;0 不建议使用
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
TRIGGER
MOVE(100)
MOVE_WAIT(IN, 0, 1, 1) '等待IN(0)有信号,才执行下一条运动
MOVE(100)

15.LOADED -- 缓冲空
用于判断轴的运动缓冲区是否为空,只读参数,返回值0表示运动缓冲区还有指令,返回值为-1表示运动缓冲区空。
BASE(0)
ATYPE=1
UNITS=100
SPEED=100
ACCEL=1000
DECEL=1000
DPOS=0
MERGE=ON '开启连续插补
OP(0,OFF)
TRIGGER
MOVE(100) '当前运动
MOVE(50) '缓冲运动,此时缓冲区只有这一条运动
'当本条运动执行时,缓冲区就已经清空
WAIT LOADED '运动缓冲空即可往下执行
OP(0,ON) '打开OP0

WAIT IDLE 等待轴停止16.MOVE_MARK -- 运动标号
下一条要调用的运动指令的MARK标号,这个标号会和运动指令一起写入运动缓冲。
每调用一条运动指令,MOVE_MARK会自动加一。
如果要强制指定MOVE_MARK,需要每次运动前都设定一次。
通过MOVE_PAUSE (2)指令可以在MARK不同的边界处暂停。
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
MERGE=OFF '关闭连续插补
OP(0,OFF)
TRIGGER
MOVE_MARK=0 '初始值:0
MOVE(100) '运动指令1
MOVE_DELAY(1000) '运动指令2
MOVE(50) '运动指令3
MOVE_OP(0,ON) '运动指令4
MOVE(80) '运动指令5
PRINT MOVE_MARK '打印结果:5
