一.硬件介紹
PCIE464運(yùn)動控制卡是正運(yùn)動推出的一款EtherCAT總線+脈沖型、PCIE接口式的運(yùn)動控制卡,可選6-64軸運(yùn)動控制,支持多路高速數(shù)字輸入輸出,可輕松實(shí)現(xiàn)多軸同步控制和高速數(shù)據(jù)傳輸。
PCIE464運(yùn)動控制卡適合于多軸點(diǎn)位運(yùn)動、插補(bǔ)運(yùn)動、軌跡規(guī)劃、手輪控制、編碼器位置檢測、IO控制、位置鎖存等功能的應(yīng)用。PCIE464運(yùn)動控制卡適用于3C電子加工、檢測設(shè)備、半導(dǎo)體設(shè)備、SMT加工、激光加工、光通訊設(shè)備、鋰電及光伏設(shè)備、以及非標(biāo)自動化設(shè)備等高速高精應(yīng)用場合。
PCIE4系列控制卡的應(yīng)用程序可以使用VC,VB,VS,C++,C#等軟件開發(fā),程序運(yùn)行時(shí)需要動態(tài)庫zmotion.dll,調(diào)試時(shí)可以將RTSys軟件同時(shí)連接控制器,從而方便調(diào)試、方便觀察。
更多關(guān)于PCIE464的詳情介紹,點(diǎn)擊“PCIE464 — 高速高精,超高實(shí)時(shí)性的PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡”查看。
二.接線參考
1.IN數(shù)字量輸入接口
數(shù)字輸入分布在J400(IN0-IN7)和X400(IN8-IN39)信號接口中。
2.OUT數(shù)字量輸出接口
數(shù)字輸出分布在J400(OUT0-7)和X400(OUT8-OUT39)信號接口中。
3.單端編碼器及單端脈沖接線
單端脈沖接線圖
差分脈沖接線圖
單端編碼器接線圖
差分編碼器接線圖
注:PCIE464的J400接口中有一個(gè)差分脈沖軸接口和三個(gè)單端脈沖軸接口,兩個(gè)差分編碼器接口(其中一個(gè)與差分脈沖軸接口復(fù)用,取決于固件設(shè)定)和兩個(gè)單端編碼器接口,具體引腳定義參見PCIE464硬件手冊。
三.使用運(yùn)動緩沖實(shí)現(xiàn)同步/提前/延時(shí)開關(guān)膠
1.運(yùn)動緩沖
ZMotion運(yùn)動控制器具有多級的運(yùn)動緩沖,并且遵循先進(jìn)先出原則。當(dāng)運(yùn)動緩沖開啟的時(shí)候,程序在掃描識別到程序任務(wù)的第一條運(yùn)動指令時(shí),將運(yùn)動指令分配到指定軸的運(yùn)動緩沖區(qū),電機(jī)開始運(yùn)動,此時(shí)程序繼續(xù)向下掃描到第二條運(yùn)動指令時(shí),再往運(yùn)動緩沖區(qū)中存,在不斷掃描存入運(yùn)動指令的同時(shí),從運(yùn)動緩沖區(qū)中依次取出運(yùn)動指令執(zhí)行。
運(yùn)動緩沖原理參考下圖:
①M(fèi)TYPE,NTYPE分別是當(dāng)前運(yùn)行的運(yùn)動指令類型和MTYPE后面的第一條指令類型。
②任意一段程序的運(yùn)動指令都可以進(jìn)入任意軸的運(yùn)動緩沖區(qū),由軸號指定。
③每個(gè)軸的運(yùn)動緩沖區(qū)都是獨(dú)立的,互不干擾。
如下圖:當(dāng)運(yùn)動緩沖區(qū)還有空間,運(yùn)動指令就會進(jìn)入運(yùn)動緩沖區(qū)。然后可以通過MOVE_MARK設(shè)置標(biāo)識,表示下一條要調(diào)用的運(yùn)動指令的MARK標(biāo)號,這個(gè)標(biāo)號會和運(yùn)動指令一起寫入運(yùn)動緩沖。等指令執(zhí)行完成后,則退出運(yùn)動緩沖區(qū),之前的下一條指令變成正在運(yùn)動指令,循環(huán)往復(fù),直到緩沖區(qū)沒有指令去執(zhí)行。
緩沖多條運(yùn)動指令時(shí),為了判斷當(dāng)前運(yùn)動執(zhí)行到哪一條,提供MOVE_MARK運(yùn)動標(biāo)號和MOVE_CURMARK當(dāng)前運(yùn)動標(biāo)號指令。 MOVE_MARK運(yùn)動標(biāo)號每掃描一條運(yùn)動指令+1。 MOVE_CURMARK指令為當(dāng)前運(yùn)動的標(biāo)號,提示當(dāng)前運(yùn)動到第幾條運(yùn)動指令,所有運(yùn)動完成后為-1。 當(dāng)前運(yùn)動完成后會自動執(zhí)行運(yùn)動緩沖區(qū)內(nèi)的下一條運(yùn)動。運(yùn)動指令全部執(zhí)行完后,運(yùn)動緩沖區(qū)為空,或者使用CANCEL/RAPIDSTOP指令清空運(yùn)動緩沖區(qū)。
2.使用到的運(yùn)動緩沖指令以及Basic效果演示
在點(diǎn)膠的應(yīng)用場景中,運(yùn)動控制系統(tǒng)需要精準(zhǔn)調(diào)節(jié)點(diǎn)膠閥開閉時(shí)機(jī)與針頭運(yùn)動軌跡,通過開膠延時(shí),關(guān)膠延時(shí),提前關(guān)膠等參數(shù),確保膠量精準(zhǔn)可控,滿足工藝要求。 正運(yùn)動技術(shù)提供了MOVE_OP等運(yùn)動緩沖中控制輸出的指令,用來實(shí)現(xiàn)點(diǎn)膠工藝中的同步/提前/延時(shí)開關(guān)膠功能。
(1)運(yùn)動緩沖開關(guān)OP指令(MOVE_OP -- 緩沖輸出)
MOVE_OP指令和MOVE/MOVEABS等指令一樣屬于運(yùn)動指令,屬于只操作I/O的特殊運(yùn)動指令,并不會阻塞后續(xù)運(yùn)動指令的執(zhí)行。 MOVE_OP指令與MOVE/MOVEABS等緩沖運(yùn)動指令配合時(shí)可以實(shí)現(xiàn)在運(yùn)動過程中指定位置同步開關(guān)膠。
Basic效果演示:
BASE(0,1) '依次例如點(diǎn)膠XY軸 UNITS = 1000000,1000000 SPEED = 100,100 ACCEL = 1000,1000 DECEL = 1000,1000 MPOS = 0,0DPOS = 0,0 MERGE = 1 OP(0,OFF) TRIGGER MOVEABS(100,100) '開膠點(diǎn)100,100 'XY走軌跡 MOVE_OP(0,ON) MOVE(0,70) MOVE(-100,0) MOVE(0,-70) MOVE(50,0) MOVEABS(100,100)'關(guān)膠點(diǎn) MOVE_OP(0,OFF) MOVEABS(0,0)

可以看到xy插補(bǔ)的時(shí)候,先運(yùn)動到100,100打開OP,走完一個(gè)長方形軌跡后,再到100,100的位置關(guān)閉OP。
(2)MOVE_OP精準(zhǔn)輸出模式
實(shí)際點(diǎn)膠應(yīng)用中有時(shí)精度要求比較高,用普通MOVEOP是比較指令位置(DPOS)滿足不了要求,這時(shí)候我們需要開啟MOVEOP精準(zhǔn)模式。 開啟精準(zhǔn)模式后,MOVEOP執(zhí)行時(shí)會在緩沖比較編碼器位置(MPOS)到達(dá)前一條運(yùn)動的目標(biāo)位置再輸出。
能夠開啟精準(zhǔn)模式的OP需要硬件支持,一般4系列有4個(gè)通道可以用于精準(zhǔn)輸出,部分型號有8個(gè),不同型號支持的通道數(shù)可以咨詢正運(yùn)動廠家。
Basic演示:
BASE(0,1) '依次例如點(diǎn)膠XY軸 UNITS = 1000000,1000000 SPEED = 100,100 ACCEL = 1000,1000 DECEL = 1000,1000 MPOS = 0,0 DPOS = 0,0 MERGE = 1 OP(0,OFF)AXIS_ZSET = 19 '主軸設(shè)置精準(zhǔn)輸出模式 'XY走軌跡 MOVEABS(100,100) '關(guān)膠點(diǎn)100,100 MOVE_OP(0,ON) MOVEABS(300,400) '關(guān)膠點(diǎn)300,400 MOVE_OP(0,OFF)
(3)使用MOVEOP_ADIST設(shè)置提前/滯后一定距離開關(guān)膠
通過設(shè)置矢量距離來控制提前滯后開關(guān)膠,設(shè)置正數(shù)會比缺省輸出位置(MOVE_OP上一條運(yùn)動指令的目標(biāo)位置)提前指定矢量距離,設(shè)置負(fù)數(shù)則延后指定矢量距離。可以由AXIS_ZSET來啟動精準(zhǔn)輸出,同MOVE_OP精準(zhǔn),比較反饋位置。
Basic效果演示:
BASE(0,1) '依次例如點(diǎn)膠XY軸 UNITS = 1000000,1000000 SPEED = 100,100 ACCEL = 1000,1000 DECEL = 1000,1000 MPOS = 0,0 DPOS = 0,0 MERGE = 1 OP(0,OFF) TRIGGER MOVEABS(100,100) '開膠點(diǎn)100,100 'XY走軌跡 MOVEOP_ADIST = -50 '滯后50mm打開 MOVE_OP(0,ON) MOVEOP_ADIST = 0 MOVE_OP(1,ON) MOVE(0,70) MOVE(-100,0) MOVE(0,-70) MOVE(50,0) MOVEABS(100,100) '關(guān)膠點(diǎn) MOVEOP_ADIST = 50 '提前50mm關(guān)閉 MOVE_OP(0,OFF) MOVEOP_ADIST = 0 MOVE_OP(1,OFF) MOVEABS(0,0)

設(shè)置OP1開關(guān)不做提前延后設(shè)置與OP0進(jìn)行對比,可以看到OP0根據(jù)程序設(shè)置滯后50mm打開,提前50mm關(guān)閉了。
(4)使用MOVEOP_AHEADMS設(shè)置提前開關(guān)膠時(shí)間和MOVEOP_DELAY設(shè)置延后開關(guān)膠時(shí)間
注意MOVEOP_DELAY指令的效果受到軸FE的影響,若要忽略該影響,單純驗(yàn)證指令功能,可以把ATYPE設(shè)置成0或者1去測試。
Basic效果演示:
BASE(0,1) '依次例如點(diǎn)膠XY軸 UNITS = 1000000,1000000 SPEED = 100,100 ACCEL = 1000,1000 DECEL = 1000,1000 MPOS = 0,0 DPOS = 0,0 MERGE = 1 AXIS_ZSET = 19 '主軸設(shè)置精準(zhǔn)輸出模式 OP(0,OFF) TRIGGER MOVEABS(100,100) '開膠點(diǎn)100,100 'XY走軌跡 MOVEOP_DELAY = 100 '滯后50ms打開 MOVEOP_AHEADMS = 0 MOVE_OP(0,ON) MOVEOP_DELAY = 0 MOVEOP_AHEADMS = 0 MOVE_OP(1,ON) 'OP1對比 MOVE(0,70) MOVE(-100,0) MOVE(0,-70) MOVE(50,0) MOVEABS(100,100) '關(guān)膠點(diǎn) MOVEOP_DELAY = 0 MOVEOP_AHEADMS = 100 '提前50ms打開 MOVE_OP(0,OFF) MOVEOP_DELAY = 0 MOVEOP_AHEADMS = 0 MOVE_OP(1,OFF) 'OP1對比 MOVEABS(0,0)

同樣設(shè)置OP1開關(guān)不做提前延后設(shè)置與OP0進(jìn)行對比,可以看到OP0根據(jù)程序設(shè)置滯后100ms打開,提前100ms關(guān)閉了。
3.流程總結(jié)
四.C#編程進(jìn)行運(yùn)動控制項(xiàng)目開發(fā)
1.在VS2010菜單“文件”→“新建”→“項(xiàng)目”,啟動創(chuàng)建項(xiàng)目向?qū)А?/p>
2.選擇開發(fā)語言為“Visual C#”和.NET Framework 4以及Windows窗體應(yīng)用程序。
3.找到廠家提供的光盤資料里面的C#函數(shù)庫,路徑如下(32位庫為例)。
(1)進(jìn)入廠商提供的光盤資料找到“04PC函數(shù)”文件夾,并點(diǎn)擊進(jìn)入。
(2)選擇“01PC函數(shù)庫2.1”文件夾。
(3)選擇“Windows平臺”文件夾。
(4)選擇“C#”文件夾。
(5)根據(jù)需要選擇對應(yīng)的函數(shù)庫,這里選擇32位庫。
4.將廠商提供的C#的庫文件以及相關(guān)文件復(fù)制到新建的項(xiàng)目中。
(1)將zmcaux.cs文件復(fù)制到新建的項(xiàng)目里面中。
(2)將zauxdll.dll和zmotion.dll文件放入bindebug文件夾中。
5.雙擊Form1.cs里面的Form1,出現(xiàn)代碼編輯界面,在文件開頭寫入using cszmcaux,并聲明控制器句柄g_handle。
6.至此,項(xiàng)目新建完成,可進(jìn)行C#項(xiàng)目開發(fā)。
五.相關(guān)PC函數(shù)
由于函數(shù)庫未封裝對應(yīng)MOVEOP_ADIST / MOVEOP_AHEADMS / MOVEOP_DELAY的函數(shù),所以需要用ZAux_DirectCommand來發(fā)送對應(yīng)Basic指令。
C#主體代碼:
privatevoidauto_move() { ThreadFlag =true; zmcaux.ZAux_Direct_SetSpeed(g_handle,0, Convert.ToSingle(C_AutoSpeed.Text)); zmcaux.ZAux_Direct_SetAccel(g_handle,0, Convert.ToSingle(C_AutoAccel.Text)); zmcaux.ZAux_Direct_SetDecel(g_handle,0, Convert.ToSingle(C_AutoDecel.Text)); stringcmdbuff ="AXIS_ZSET(0) = 19 "; UInt32 uiResponseLength =2048; StringBuilder psResponse =newStringBuilder((Int32)uiResponseLength); Int32 iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); //設(shè)置主軸開啟精準(zhǔn)輸出模式 zmcaux.ZAux_Direct_MoveAbs(g_handle,2,newint[] {0,1},newfloat[] {0,0});//走到零位 while(true) { if(checkFrameAxisIdleState() ==true)break; } zmcaux.ZAux_Trigger(g_handle); //相對運(yùn)動走軌跡 zmcaux.ZAux_Direct_Move(g_handle,2,newint[] {0,1},newfloat[] {0,-35}); //走到開膠點(diǎn) cmdbuff ="MOVEOP_DELAY = 0"; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); if(!ifTimeControl) //距離控制 { cmdbuff ="MOVEOP_ADIST = "+ C_OpenDis.Text; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); } else { if(Convert.ToSingle(C_OpenTime.Text) >0) //提前 { cmdbuff ="MOVEOP_AHEADMS = "+ C_OpenTime.Text; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); } else //滯后 { stringT_Value = (-Convert.ToSingle(C_OpenTime.Text)).ToString(); //moveop_delay滯后需要正值 cmdbuff ="MOVEOP_DELAY = "+ T_Value; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); } } zmcaux.ZAux_Direct_MoveOp(g_handle,0,0,1); //測試走點(diǎn)膠軌跡 zmcaux.ZAux_Direct_Move(g_handle,2,newint[] {0,1},newfloat[] {50,0}); //iresult = zmcaux.ZAux_Direct_MSpherical(g_handle, virAxisList.Length, virAxisList, 0, 100, 0, 50, 50, 0, mSphericalMode, 5, 90); zmcaux.ZAux_Direct_Move(g_handle,2,newint[] {0,1},newfloat[] {0,70}); //iresult = zmcaux.ZAux_Direct_MSpherical(g_handle, virAxisList.Length, virAxisList, 0, -100, 0, -50, -50, 0, mSphericalMode, 5, 90); zmcaux.ZAux_Direct_Move(g_handle,2,newint[] {0,1},newfloat[] {-100,0}); zmcaux.ZAux_Direct_Move(g_handle,2,newint[] {0,1},newfloat[] {0,-70}); zmcaux.ZAux_Direct_Move(g_handle,2,newint[] {0,1},newfloat[] {50,0}); //走到關(guān)膠點(diǎn) //zmcaux.ZAux_Direct_Move(g_handle, 2, new int[] { 0, 1 }, new float[] { 0, 35 }); //走到關(guān)膠點(diǎn) cmdbuff ="MOVEOP_DELAY = 0"; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); if(!ifTimeControl) //距離控制 { cmdbuff ="MOVEOP_ADIST = "+ C_CloseDis.Text; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); } else { if(Convert.ToSingle(C_CloseTime.Text) >0) //提前 { cmdbuff ="MOVEOP_AHEADMS = "+ C_CloseTime.Text; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); } else //滯后 { stringT_Value = (-Convert.ToSingle(C_CloseTime.Text)).ToString(); //moveop_delay滯后需要正值 cmdbuff ="MOVEOP_DELAY = "+ T_Value; iresult = zmcaux.ZAux_DirectCommand(g_handle, cmdbuff, psResponse, uiResponseLength); } } zmcaux.ZAux_Direct_MoveOp(g_handle,0,0,0); zmcaux.ZAux_Direct_MoveAbs(g_handle,2,newint[] {0,1},newfloat[] {0,0}); //走到零位 }
六.效果演示
下面以C#代碼跑測試和RTSys示波器抓取波形分析。
1.同步輸出效果:
2.距離控制提前滯后輸出效果:
3.時(shí)間控制提前滯后效果:
視頻講解可點(diǎn)擊→“PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡PCIE464點(diǎn)膠工藝中的同步提前延時(shí)開關(guān)膠”查看。
完整代碼獲取地址
▼
本次,正運(yùn)動技術(shù)PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡PCIE464點(diǎn)膠工藝中的同步/提前/延時(shí)開關(guān)膠,就分享到這里。
更多精彩內(nèi)容請關(guān)注“正運(yùn)動小助手”公眾號,需要相關(guān)開發(fā)環(huán)境與例程代碼,請咨詢正運(yùn)動技術(shù)銷售工程師:400-089-8936。
本文由正運(yùn)動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運(yùn)動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。
審核編輯 黃宇
-
PCIe
+關(guān)注
關(guān)注
16文章
1322瀏覽量
84647 -
運(yùn)動控制
+關(guān)注
關(guān)注
4文章
635瀏覽量
33357 -
ethercat
+關(guān)注
關(guān)注
19文章
992瀏覽量
39608 -
正運(yùn)動技術(shù)
+關(guān)注
關(guān)注
0文章
118瀏覽量
598
發(fā)布評論請先 登錄

PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡PCIE464點(diǎn)膠工藝中的同步/提前/延時(shí)開關(guān)膠 #正運(yùn)動技術(shù)
PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡PCIE464的CAD導(dǎo)圖與刀向跟隨應(yīng)用


PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡PCIE464的CAD導(dǎo)圖與刀向跟隨應(yīng)用#正運(yùn)動技術(shù) #運(yùn)動控制卡
運(yùn)動控制卡周期上報(bào)實(shí)時(shí)數(shù)據(jù)IO狀態(tài)之C++篇


運(yùn)動控制看的更清楚細(xì)致!RTSys示波器功能簡介 #正運(yùn)動技術(shù) #運(yùn)動控制器 #運(yùn)動控制系統(tǒng) #運(yùn)動控制卡
PCIe實(shí)時(shí)運(yùn)動控制卡的雙盤視覺篩選機(jī)上位機(jī)開發(fā)應(yīng)用

VPLC系列機(jī)器視覺運(yùn)動控制一體機(jī)在五軸聯(lián)動點(diǎn)膠上的應(yīng)用

PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡PCIE464的IO與編碼器讀寫應(yīng)用# 正運(yùn)動技術(shù)# 運(yùn)動控制卡
PCIe EtherCAT實(shí)時(shí)運(yùn)動控制卡PCIE464的IO與編碼器讀寫應(yīng)用

評論