之前正運動技術與大家分享了,運動控制器的固件升級、ZBasic程序開發、ZPLC程序開發、與觸摸屏通訊和輸入/輸出IO的應用、運動控制器數據與存儲的應用、運動控制器ZCAN、EtherCAT總線的使用、示波器的應用、多任務運行的特點、運動控制器中斷的應用、U盤接口的使用、ZDevelop 編程軟件的使用以及運動控制器的基礎軸參數與基礎運動控制指令等。
今天,我們來講解一下正運動技術運動控制器運動緩沖。
視頻教程:http://www.zmotion.com.cn/video/yemian/tvideos22.html
以下是圖文詳解
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)
5.MOVE_PAUSE——運動暫停
暫停軸運動,只有在單軸或多軸插補運動時有效,多軸聯動時一起暫停。
可以通過AXISSTATUS來查詢是否有暫停,暫停中軸的IDLE狀態為0。
當軸已經暫停或不在運動中時,調用這個指令會有警告輸出,但不影響程序運行。某些運動不支持暫停,如VMOVE、同步運動指令等。
語法:MOVE_PAUSE(模式值)
模式值0例子:MOVE_PAUSE(3)的執行效果與MOVE_PAUSE(0)類似。
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
SPEED=100
ACCEL=1000
DECEL=1000
DPOS=0
MERGE=ON '開啟連續插補
MOVE(100) '當前運動
MOVE(200)
MOVE_PAUSE(0) '暫停當前運動
DELAY(1000)
?DPOS(0) '打印結果:0,此時當前運動只運行了極短時間,掃描到MOVE_PAUSE時直接暫停
模式值1例子:模式2在運動標號MOVE_MARK自動編號時效果與模式1類似,因為每條運動的標號都是不同的,運動完一條運動指令后,運動標號發生改變,MOVE_MARK(2)生效,立即暫停。
模式2在手動設置MOVE_MARK時才與模式1不同。
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(200)
MOVE_PAUSE(1) '當前運動運行完暫停
DELAY(2000)
?DPOS(0) '打印結果:100
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
MOVE_PAUSE(2)
6.MOVE_RESUME -- 運動恢復
當BASE軸暫停暫停時,從暫停處繼續運動。
可以通過AXISSTATUS來查詢是否有暫停,AXISSTATUS顯示800000h,表示軸進入了暫停狀態。
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
MERGE=ON
TRIGGER
MOVE(100) '當前運動
MOVE(200) '緩沖運動
MOVE_PAUSE(1) '當前運動完成后暫停
DELAY(2000) '等待當前運動完成
?DPOS(0) '打印結果:100
MOVE_RESUME '繼續運行
WAIT IDLE(0)
?DPOS(0) '打印結果:300
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
軸0運動100后,TABLE(0)賦值60
8.MOVE_PARA -- 緩沖參數
BASE軸運動緩沖修改參數。
這個指令緩沖執行時不做任何運動,只修改參數,不會打斷插補運動的連續性。
語法:MOVE_PARA(參數名,參數編號,參數值)
參數名必須是?*set里面的非只讀參數。
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
SPEED=100 '初始速度
ACCEL=1000
DECEL=1000
DPOS=0
MERGE=ON '開啟連續插補
TRIGGER '自動觸發示波器
MOVE(200) '速度100
MOVE_PARA(SPEED,0,200) '修改軸0的SPEED參數值為200
MOVE(200) '速度200
WAIT IDLE(0) '等待軸0停止
?SPEED '打印結果:200
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循環,不在打印。
10.MOVE_SYNMOVE -- 緩沖觸發其他軸
BASE軸運動緩沖觸發其他軸運動,當前軸等待,等待其他軸運動完成,當前軸才繼續運動。
語法:MOVE_SYNMOVE(axisnum,dis[,ifsp])
axisnum:需要同步運動的軸號
dis:相對運動距離
ifsp:是否使用SP運動, 缺省值0不使用,設為其他值使用
RAPIDSTOP(2)
WAIT IDLE(0)
WAIT IDLE(1)
BASE(0,1)
DPOS=0,0
ATYPE=1,1
UNITS=100,100
SPEED=100,100
ACCEL=1000,1000
DECEL=1000,1000
MERGE=ON,ON
TRIGGER
MOVE(100)
MOVE_SYNMOVE(1,120,0) '軸0運行到100時,軸1開始運動120
MOVE(100) '待軸同步完成,軸0再繼續運動
使用SP運動后的效果如下,將最后一位參數設置非0值 ,此時觸發軸1的運動速度為FORCE_SPEED=200。
11.MOVE_ASYNMOVE -- 緩沖觸發其他軸2
BASE軸運動緩沖觸發其他軸運動,當前軸不等待,仍繼續運動。
語法:MOVE_ASYNMOVE(axisnum,dis[,ifsp])
axisnum:需要同步運動的軸號
dis:相對運動距離
ifsp:是否使用SP運動, 缺省值0不使用,設為其他值使用
RAPIDSTOP(2)
WAIT IDLE(0)
WAIT IDLE(1)
BASE(0,1)
DPOS=0,0
ATYPE=1,1
UNITS=100,100
SPEED=100,100
ACCEL=1000,1000
DECEL=1000,1000
MERGE=ON,ON
TRIGGER
MOVE(100)
MOVE_ASYNMOVE(1,120,0) '軸0運行到100時,軸1開始運動120
MOVE(100) '待軸同步完成,軸0再繼續運動
12.MOVE_TASK -- 緩沖開啟任務
BASE軸運動緩沖加入啟動TASK。
這個指令緩沖執行時不做任何運動,只啟動任務,不會打斷插補運動的連續性。
語法:MOVE_TASK(任務號, 函數名)
從運動緩沖全區取出MOVE_TASK指令執行時,將task_move標記的程序作為任務1開啟,在任務窗口可以看到任務1已啟動。
RAPIDSTOP(2)
WAIT IDLE(0)
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
MERGE=ON
TRIGGER
MOVE(100)
MOVE_TASK(1,task_move) '第一個運動完成后,將task_move作為任務1啟動
MOVE(100)
END
'任務1
task_move:
PRINT "TASK_MOVE"
END
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)
14.MOVE_CANCEL--緩沖停止
把CANCEL指令寫入運動緩沖。
語法:MOVE_CANCEL(軸號,模式值)
0:取消當前運動,繼續取緩沖區指令指令
1:取消緩沖區的運動,當前運動仍然要執行完
2:取消當前運動和緩沖區的運動,軸立即停止
3:立即中斷脈沖的發送
RAPIDSTOP(2)
WAIT IDLE(0)
WAIT IDLE(1)
BASE(0,1)
DPOS=0,0
ATYPE=1,1
UNITS=100,100
SPEED=100,100
ACCEL=1000,1000
DECEL=1000,1000
MERGE=ON,ON:
TRIGGER
MOVE(50) AXIS(0) '軸0當前運動
MOVE(80) AXIS(1) '軸1當前運動
MOVE_CANCEL(1,2) AXIS(0) '軸0緩沖里面寫入停止軸1的指令
MOVE(60) AXIS(0) '軸0緩沖運動
MOVE(70) AXIS(1) '軸1緩沖運動,被取消
例子運行效果:軸0運動50后,MOVE_CANCEL(1,2) AXIS(0)指令生效,CANCEL(2)模式取消軸1的當前運動和緩沖運動,軸1立刻停止,軸0繼續運動。
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 LOADED 等待緩沖區空
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
17.MOVE_CURMARK -- 當前運動標號
返回當前軸正在運動指令的MOVE_MARK標號,編號默認從0開始,到運動指令總數減1。
在軸參數窗口可以監控當前程序掃描到的運動指令個數,查看MOVE_MARK;和軸當前運行到了第幾個運動指令,查看MOVE_CURMARK。
BASE(0)
ATYPE=1
UNITS=100
DPOS=0
SPEED=100
ACCEL=1000
DECEL=1000
MERGE=ON
OP(1,OFF)
TRIGGER
MOVE_MARK =1
MOVE(50)
MOVE_MARK =2
MOVE(100)
MOVE_MARK =3
MOVE(150)
WAIT UNTIL MOVE_CURMARK = 2 '等待MOVE(100)開始執行的時候,開輸出口1
OP(1,ON)
-
運動控制器
+關注
關注
2文章
393瀏覽量
24657 -
運動控制
+關注
關注
4文章
566瀏覽量
32828 -
正運動技術
+關注
關注
0文章
96瀏覽量
331
發布評論請先 登錄
評論