之前正运动技术与大家分享了,运动控制器的固件升级、ZBasic程序开发、ZPLC程序开发、与触摸屏通讯和输入/输出IO的应用、运动控制器数据与存储的应用、运动控制器ZCAN、EtherCAT总线的使用、示波器的应用、多任务运行的特点、运动控制器中断的应用、U盘接口的使用、ZDevelop 编程软件的使用以及运动控制器的基础轴参数与基础运动控制指令等。
今天,我们来讲解一下正运动技术运动控制器运动缓冲。
01 材料准备与接线参考
02运动缓冲
1.运动缓冲原理
在运行运动指令时,为了防止程序堵塞,控制器提供了一个缓冲区来保存进入运动缓冲的运动缓冲队列,把这个功能叫做运动缓冲,这样程序就能正常向下扫描,不会堵塞。
ZMotion运动控制器具有多级的运动缓冲,当运动缓冲开启的时候,程序在扫描识别到程序任务的第一条运动指令时,将运动指令分配到指定轴的运动缓冲区,电机开始运动,此时程序继续向下扫描到第二条运动指令时,再往运动缓冲区中存,在不断扫描存入运动指令的同时,从运动缓冲区中依次取出运动指令执行。
MTYPE,NTYPE分别是当前运行的运动指令和第一个缓冲运动指令。
任意一段程序的运动指令都可以进入任意轴的运动缓冲区,由轴号指定。
每个轴的运动缓冲区都是独立的,互不干扰。
缓冲多条运动指令时,为了判断当前运动执行到哪一条,提供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。
2.运动缓冲区堵塞
每个轴的运动缓冲空间是有限的,当扫描太多运动指令放入运动缓冲区时,多级运动缓冲区全部被塞满,如果程序继续扫描到更多的运动指令,程序也会被堵塞,直到运动指令依次完成并退出,运动缓冲区有了空位,运动指令才会继续进入运动缓冲区。
例:以V3.10版本仿真器为例,默认为4096个运动缓冲,下图例程中显示该控制器的运动缓冲区最多能存459条圆弧插补指令,下载程序后后打印i的值为458,表示当前FOR循环并未执行完,程序堵塞了。
下图中,当从运动缓冲区取出部分运动指令执行之后,缓冲区有了空间,FOR循环继续执行,并存入运动指令到运动缓冲区。指令执行退出运动缓冲区后,只要运动缓冲区的空间够,新的运动指令一条条往运动缓冲区中存。
每个轴的运动缓冲都是独立的,互不干扰,且缓冲区大小相同,通过指令REMAIN_BUFFER(MTYPE) AXIS(n)查看某个轴的剩余可用缓冲区的个数。
ZMC4系列运动控制器每个轴可支持多达4096段运动缓冲(不同型号的控制器缓冲个数有区别,具体情况参见控制器硬件手册说明或使用?*max打印查看),可以手动设置LIMIT_BUFFERED运动缓冲限制。
不同的运动指令占用的缓冲空间是不同的,越复杂的运动占用的运动缓冲空间越多。
例如:
ZMC432控制器,运动缓冲区大小为4096,缓冲区一次性可缓冲的MOVE直线插补指令和MOVECIRC圆弧插补指令个数是不同的。
插补运动缓冲在主轴的运动缓冲区。
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的运动缓冲区。
插补运动缓冲在主轴轴0里,故轴1的运动缓冲区是没有指令的,剩余缓冲大小为3。每条MOVE指令占用一个缓冲空间。
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才输出。
03 运动缓冲相关指令
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批量输出。
2.MOVE_OP2 -- 缓冲输出2
语法:MOVE_OP2(输出编号,输出状态,输出多少ms后翻转)
BASE轴运动缓冲加入一个输出口操作,指定时间后输出状态翻转。
此指令随其他运动指令一起进入运动缓冲区,从运动缓冲区中取出执行时才操作OP输出,保持输出一定时间后关闭输出。
单个轴同一时间只支持一个脉冲输出,第二个MOVE_OP2指令会自动关闭前面指令的脉冲。不会打断插补运动的连续性。
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=200
ACCEL=1000
DECEL=1000
MERGE=ON '开启连续插补
OP(0,OFF) '关闭OUT0口
TRIGGER '自动触发示波器
MOVE(500)
MOVE_OP2 (0,ON,1000) '等待上条运动完成,输出口0保持输出1s后关闭,输出时不会阻碍下一条运动执行
MOVE(-300)
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)
4.MOVE_AOUT -- 缓冲输出模拟量
语法:MOVE_AOUT(DA编号,输出值)
BASE轴运动缓冲加入一个AOUT指令。
这个指令缓冲执行时不做任何运动,只修改AOUT值,不会打断插补运动的连续性。
// 例子
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
SPEED=100
ACCEL=1000
DECEL=1000
DPOS=0
MERGE=ON '开启连续插补
AOUT(0)=0 'DA0通道赋值0
TRIGGER '自动触发示波器
MOVE(200)
MOVE_AOUT(0, 30.5) '第一个运动完成后,将DA0通道赋值30.5
MOVE(200)
今天,我们来讲解一下正运动技术运动控制器运动缓冲。
01 材料准备与接线参考
02运动缓冲
1.运动缓冲原理
在运行运动指令时,为了防止程序堵塞,控制器提供了一个缓冲区来保存进入运动缓冲的运动缓冲队列,把这个功能叫做运动缓冲,这样程序就能正常向下扫描,不会堵塞。
ZMotion运动控制器具有多级的运动缓冲,当运动缓冲开启的时候,程序在扫描识别到程序任务的第一条运动指令时,将运动指令分配到指定轴的运动缓冲区,电机开始运动,此时程序继续向下扫描到第二条运动指令时,再往运动缓冲区中存,在不断扫描存入运动指令的同时,从运动缓冲区中依次取出运动指令执行。
MTYPE,NTYPE分别是当前运行的运动指令和第一个缓冲运动指令。
任意一段程序的运动指令都可以进入任意轴的运动缓冲区,由轴号指定。
每个轴的运动缓冲区都是独立的,互不干扰。
缓冲多条运动指令时,为了判断当前运动执行到哪一条,提供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。
2.运动缓冲区堵塞
每个轴的运动缓冲空间是有限的,当扫描太多运动指令放入运动缓冲区时,多级运动缓冲区全部被塞满,如果程序继续扫描到更多的运动指令,程序也会被堵塞,直到运动指令依次完成并退出,运动缓冲区有了空位,运动指令才会继续进入运动缓冲区。
例:以V3.10版本仿真器为例,默认为4096个运动缓冲,下图例程中显示该控制器的运动缓冲区最多能存459条圆弧插补指令,下载程序后后打印i的值为458,表示当前FOR循环并未执行完,程序堵塞了。
下图中,当从运动缓冲区取出部分运动指令执行之后,缓冲区有了空间,FOR循环继续执行,并存入运动指令到运动缓冲区。指令执行退出运动缓冲区后,只要运动缓冲区的空间够,新的运动指令一条条往运动缓冲区中存。
每个轴的运动缓冲都是独立的,互不干扰,且缓冲区大小相同,通过指令REMAIN_BUFFER(MTYPE) AXIS(n)查看某个轴的剩余可用缓冲区的个数。
ZMC4系列运动控制器每个轴可支持多达4096段运动缓冲(不同型号的控制器缓冲个数有区别,具体情况参见控制器硬件手册说明或使用?*max打印查看),可以手动设置LIMIT_BUFFERED运动缓冲限制。
不同的运动指令占用的缓冲空间是不同的,越复杂的运动占用的运动缓冲空间越多。
例如:
ZMC432控制器,运动缓冲区大小为4096,缓冲区一次性可缓冲的MOVE直线插补指令和MOVECIRC圆弧插补指令个数是不同的。
插补运动缓冲在主轴的运动缓冲区。
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的运动缓冲区。
插补运动缓冲在主轴轴0里,故轴1的运动缓冲区是没有指令的,剩余缓冲大小为3。每条MOVE指令占用一个缓冲空间。
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才输出。
03 运动缓冲相关指令
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批量输出。
2.MOVE_OP2 -- 缓冲输出2
语法:MOVE_OP2(输出编号,输出状态,输出多少ms后翻转)
BASE轴运动缓冲加入一个输出口操作,指定时间后输出状态翻转。
此指令随其他运动指令一起进入运动缓冲区,从运动缓冲区中取出执行时才操作OP输出,保持输出一定时间后关闭输出。
单个轴同一时间只支持一个脉冲输出,第二个MOVE_OP2指令会自动关闭前面指令的脉冲。不会打断插补运动的连续性。
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=200
ACCEL=1000
DECEL=1000
MERGE=ON '开启连续插补
OP(0,OFF) '关闭OUT0口
TRIGGER '自动触发示波器
MOVE(500)
MOVE_OP2 (0,ON,1000) '等待上条运动完成,输出口0保持输出1s后关闭,输出时不会阻碍下一条运动执行
MOVE(-300)
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)
4.MOVE_AOUT -- 缓冲输出模拟量
语法:MOVE_AOUT(DA编号,输出值)
BASE轴运动缓冲加入一个AOUT指令。
这个指令缓冲执行时不做任何运动,只修改AOUT值,不会打断插补运动的连续性。
// 例子
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
SPEED=100
ACCEL=1000
DECEL=1000
DPOS=0
MERGE=ON '开启连续插补
AOUT(0)=0 'DA0通道赋值0
TRIGGER '自动触发示波器
MOVE(200)
MOVE_AOUT(0, 30.5) '第一个运动完成后,将DA0通道赋值30.5
MOVE(200)