一.硬件介紹
PCIE464運動控制卡是正運動推出的一款EtherCAT總線+脈沖型、PCIE接口式的運動控制卡,可選6-64軸運動控制,支持多路高速數字輸入輸出,可輕松實現多軸同步控制和高速數據傳輸。
PCIE464運動控制卡適合于多軸點位運動、插補運動、軌跡規劃、手輪控制、編碼器位置檢測、IO控制、位置鎖存等功能的應用。PCIE464運動控制卡適用于3C電子加工、檢測設備、半導體設備、SMT加工、激光加工、光通訊設備、鋰電及光伏設備、以及非標自動化設備等高速高精應用場合。
PCIE4系列控制卡的應用程序可以使用VC,VB,VS,C++,C#等軟件開發,程序運行時需要動態庫zmotion.dll,調試時可以將RTSys軟件同時連接控制器,從而方便調試、方便觀察。
PCIE464產品介紹可點擊→“【EtherCAT同步周期快至100us】超高實時性PCIe EtherCAT控制卡PCIE464”查看。
更多關于PCIE464的詳情介紹,點擊“PCIE464 — 高速高精,超高實時性的PCIe EtherCAT實時運動控制卡”查看。
二.接線參考
1.IN數字量輸入接口
數字輸入分布在J400(IN0-IN7)和X400(IN8-IN39)信號接口中。
2.OUT數字量輸出接口
數字輸出分布在J400(OUT0-7)和X400(OUT8-OUT39)信號接口中。
3.單端編碼器及單端脈沖接線
單端脈沖接線圖
差分脈沖接線圖
單端編碼器接線圖
差分編碼器接線圖
注:PCIE464的J400接口中有一個差分脈沖軸接口和三個單端脈沖軸接口,兩個差分編碼器接口(其中一個與差分脈沖軸接口復用,取決于固件設定)和兩個單端編碼器接口,具體引腳定義參見PCIE464硬件手冊。
三.同步指令解析及技巧解釋
1.同步過程
同步跟隨過程分為三部分:加速追趕、同步加工、結束歸位。
(1)加速追趕:動作機構加速追上產品位置,并保持追趕末端速度與產品速度一致的過程。
(2)同步加工:動作機構加速追趕上之后,繼續保持與產品同樣的速度運動的過程,即兩者相對靜止的過程;加工動作常在此過程中進行。
(3)結束歸位:加工完成后,打斷跟隨過程,回歸待機位的過程。
? 正運動技術提供了成熟的同步跟隨執行指令MOVESYNC完成上述過程。
2.同步指令
MOVESYNC -- 同步運動,皮帶上物體跟隨
語法:
MOVESYNC(mode,synctime,syncposition,syncaxis,pos1[,pos2, pos3…])
參數解釋:
(1)mode:mode=0 + angle,angle:皮帶旋轉角度,角度=皮帶軸dpos正向與BASE軸正向的夾角。使用時需要將角度轉換為弧度(0~2PI)。
(2)synctime:同步時間,ms單位。
(3)syncposition:皮帶軸物體被感應到時皮帶軸的位置。
(4)syncaxis:皮帶軸軸號,-1表示沒有皮帶軸。
(5)pos1:皮帶軸物體被感應到時的BASE第1個軸絕對位置。
(6)posn:皮帶軸物體被感應到時的BASE第n個軸絕對位置。
上位機指令參數排列一樣。
3.使用疑難點解析
(1)如何獲知syncposition:皮帶軸物體被感應到時皮帶軸的位置?
首先,我們先了解跟隨的完整實現流程,如下:
光電傳感器產生信號→控制器收到信號,鎖存獲取跟隨坐標→產品流到到位,跟隨觸發→追趕產品,進入同步加工,走軌跡→進入下一次跟隨。
那么按照流程看,物體被感應到時的位置就由鎖存產生并記錄,我們只需要將鎖存數據記錄就獲取到了參數syncposition的值。
(2)如何獲知同步跟隨所需的POSN:皮帶軸物體被感應到時跟隨軸的位置?
syncposition與POSN都是在物體被感應到時的位置,兩者的關系是同時相對靜止的;所以此處的POSN:皮帶軸物體被感應到時跟隨軸的位置并不是感應到產品時跟隨軸所處的位置,而是感應到產品時跟隨軸應該走到的位置,也就是我們想要的產品同步跟隨位置點。
在上一步,我們獲知了皮帶軸的感應位置是在鎖存的時候獲取到,那么可以在程序中設計,產品經過傳感器后停下來,獲取當前皮帶軸位置,用鎖存到的值-皮帶軸當前位置=跟隨方向的位移量→移動歸零后的跟隨軸組到產品上標記的需要加工的起點位置,記錄下軸組位置數據→將軸組中跟隨方向軸的坐標-計算出來的跟隨方向的位移量=鎖存時跟隨軸組中跟隨方向的軸位置→記錄下數據就得到了皮帶軸物體被感應到時跟隨軸的位置POSN。
(3)跟隨三個過程中的數據怎么填?是否需要重新計算?
跟隨三個過程中的參數數據不需要重新計算;三個過程中唯一需要變化的參數是synctime,其他的參數保持不變;而synctime參數根據實際加工需要設定即可,一般會將同步加工時間設置大。
(4)在同步加工段中,怎么去走加工軌跡?能直接控制跟隨軸組走軌跡嗎?
在同步過程中一般是不能直接使用運動指令去操控跟隨軸組走軌跡的,不然會打斷跟隨的狀態;可以使用疊加運動的方式間接走軌跡;通過addax指令將幾個沒有用到的虛擬軸,疊加到跟隨軸組上,使用運動指令控制虛擬軸執行加工軌跡,就能實現在保持跟隨狀態下走加工軌跡。
(5)不同產品軌跡所需時間不一樣,同步加工段的時間怎么計算?
其實在實際應用中,同步加工段的時間通常會設置一個很大很大的時間值確保加工完成,加工完成后,用MOVESYNC的-2模式強制結束即可。
(6)加工中產品不斷進來,怎么實現跟隨軸組不回待機,連續跟隨加工產品?
只需要注意不要在程序中每一段的跟隨加工返回待機位的后面加入等待或者其他進運動緩沖的指令即可;因為復位用-1模式時,其會被后面的緩沖MOVESYNC覆蓋,也就是當下一個產品的MOVESYNC跟隨指令已經壓進運動緩沖之后,當前產品加工完的復位MOVESYNC就會被覆蓋,無效。
4.擴展用法
MOVE_ADDAX運動緩沖疊加
使用MOVESYNC+MOVE_ADDAX,可以實現在保持跟隨狀態下直接操作跟隨軸組走軌跡。
四.C#語言進行項目開發
1.在VS2010菜單“文件”→“新建”→“項目”,啟動創建項目向導。
2.選擇開發語言為“Visual C#”和.NET Framework 4以及Windows窗體應用程序。
3.找到廠家提供的光盤資料里面的C#函數庫,路徑如下(32位庫為例)。
1)進入廠商提供的光盤資料找到“04PC函數”文件夾,并點擊進入。
2)選擇“01PC函數庫V2.1”文件夾。
3)選擇“Windows平臺”文件夾。
4)選擇“C#”文件夾。
5)根據需要選擇對應的函數庫,這里選擇32位庫。
4.將廠商提供的C#的庫文件以及相關文件復制到新建的項目中。
1)將zmcaux.cs文件復制到新建的項目里面中。
2)將zauxdll.dll和zmotion.dll文件放入bindebug文件夾中。
5.雙擊Form1.cs里面的Form1,出現代碼編輯界面,在文件開頭寫入using cszmcaux,并聲明控制器句柄g_handle。
6.至此,項目新建完成,可進行C#項目開發。
C#跟隨主體代碼:
publicvoidSubMoveSync() { intiret =0; int[]iAxisList =newint[2]{0,1} ; int[]iTime =newint[3]; iTime[0] = Convert.ToInt32(TextAccTime.Text); iTime[1] = Convert.ToInt32(TextSyncTime.Text); iTime[2] = Convert.ToInt32(TextBackTime.Text); float[]fWaitPos =newfloat[2]; fWaitPos[0] = Convert.ToSingle (TextXpos.Text); fWaitPos[1] = Convert.ToSingle(TextYpos.Text); floatfOffPos= Convert.ToSingle(TextOffpos.Text); floatfPdAxisPos =0; //當前皮帶軸位置 float[] fMakrPos = newfloat[2]; //當前加工產品鎖存編碼器的位置 intiMaxNum = Convert.ToInt32(Text_TabNum.Text); floatimode =0; imode =0; //X方向跟隨 if(m_SyncMode ==1) //同步軌跡運動 { iret = zmcaux.ZAux_Direct_SetMerge(G_CardHandle,4,1); //打開虛擬X軸連續插補 iret = zmcaux.ZAux_Direct_Single_Addax(G_CardHandle,0,4); //虛擬4號軸X軸的運動疊加到實際X軸 iret = zmcaux.ZAux_Direct_Single_Addax(G_CardHandle,1,5); //虛擬5號軸Y軸的運動疊加到實際Y軸 } float[] Units =newfloat[2]; zmcaux.ZAux_Direct_GetUnits(G_CardHandle,2,refUnits[0]); zmcaux.ZAux_Direct_GetUnits(G_CardHandle,0,refUnits[1]); float[] ratio =newfloat[1] { Units[0] / Units[1] }; int[] scraxis =newint[1] {2}; while(true) { if( (m_RegistCount !=0) && (iWorkCount iMaxNum) //鎖存坐標已經溢出,數據保存在鎖存前面 { iWorkCount = iWorkCount - m_RegistCount; //從下個循環開始取值 if(iWorkCount < m_RegistCount) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_GetTable(G_CardHandle, Convert.ToInt32(Text_TabStart.Text) +?1?+ iWorkCount,?1, fMakrPos); //獲取當前準備加工的鎖存位置 ? ? ? ? ? ? } ? ? ? ? ? ??else ? ? ? ? ? ? { ? ? ? ? ? ? ? ??continue; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ??//鎖存事件未觸發 ? ? ? ??if?(m_RegistCount ==?0?|| m_RegistCount == iWorkCount) ? ? ?? { ? ? ? ? ? ??continue; ? ? ? ? } ? ? ? ??//等待傳送帶位置運動超過開始跟隨位置 ? ? ? ??do ? ? ? ? { ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_GetMpos(G_CardHandle,?2,?ref?fPdAxisPos); ? ? ? ? ? ?//獲取當前編碼軸位置 ? ? ? ? }?while?(fPdAxisPos < fOffPos + fMakrPos[0]); ? ? ? ? iret = zmcaux.ZAux_Direct_MoveSync(G_CardHandle, imode, iTime[0], fMakrPos[0] + fOffPos,?2,?2, iAxisList, fWaitPos); ? ? ?//同步啟動加速段, ? ? ? ??if?(Sync_Mode ==?0) ? ? ? ? { ? ? ? ? ? ??if?(m_SyncMode ==?1) ? ? ? ? ? ? ? ?//同步軌跡運動 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? SubVirAxisMove(); ? ? ? ? ? ? ??//調用虛擬軸軌跡 ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_MoveTable(G_CardHandle, (uint)iAxisList[0],?0, (float)1); ? ? ?//寫TABLE數據到實際軸緩沖區,速度同步后修改TABLE觸發虛擬軸 ? ? ? ? ? ? ? ??if?(iret !=?0) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? MessageBox.Show("ZAux_Direct_MoveTable失敗 錯誤碼:"?+ iret.ToString()); ? ? ? ? ? ? ? ? ? ??continue; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_MoveSync(G_CardHandle, imode, iTime[1], fMakrPos[0] + fOffPos,?2,?2, iAxisList, fWaitPos); ? ? ?//同步啟動勻速速段,勻速時間 ? ? ? ? ? ? ? ??//同步結束 ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_MoveTable(G_CardHandle, (uint)iAxisList[0],?0, (float)0); ? ? ?//寫TABLE數據到實際軸緩沖區,速度同步后修改TABLE觸發虛擬軸 ? ? ? ? ? ? ? ??//iret = zmcaux.ZAux_Direct_MoveCancel(G_CardHandle, iAxisList[0], 4, 2); ? ? ? ? ? ? ? ? //運動完成強制停止未完成的虛擬軸運動 ? ? ? ? ? ? } ? ? ? ? ? ??else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_MoveSync(G_CardHandle, imode, iTime[1], fMakrPos[0] + fOffPos,?2,?2, iAxisList, fWaitPos); ? ? ?//同步啟動勻速速段,勻速時間 ? ? ? ? ? ? } ? ? ? ? } ? ? ? ??else?if(Sync_Mode ==?1) ? ? ? ? { ? ? ? ? ? ??if?(m_SyncMode ==?1) ? ? ? ? ? ? ? ?//同步軌跡運動 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? iret = Motion_MoveAddax(G_CardHandle, iAxisList[0], iAxisList,?2, ratio, scraxis);?//建立疊加關系 ? ? ? ? ? ? ? ? SubVirAxisMove_Dirct(); ? ? ? ? ? ? ??//直接控制實際軸走軌跡 ? ? ? ? ? ? ? ??//同步結束 ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_MoveTable(G_CardHandle, (uint)iAxisList[0],?0, (float)0); ? ? ?//寫TABLE數據到實際軸緩沖區,速度同步后修改TABLE觸發虛擬軸 ? ? ? ? ? ? ? ? iret = Motion_MoveAddax(G_CardHandle, iAxisList[0], iAxisList,?0, ratio, scraxis); ? ? ? ? ? ? } ? ? ? ? ? ??else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? iret = Motion_MoveAddax(G_CardHandle, iAxisList[0], iAxisList,?2, ratio, scraxis);?//建立疊加關系 ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_MoveDelay(G_CardHandle, iAxisList[0], iTime[1]); ? ?//運行延時時間 ? ? ? ? ? ? ? ? iret = Motion_MoveAddax(G_CardHandle, iAxisList[0], iAxisList,?0, ratio, scraxis); ??//取消疊加 ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? iret = zmcaux.ZAux_Direct_MoveSync(G_CardHandle, imode, iTime[2],?0,?-1,?2, iAxisList, fWaitPos); ? ? ?//結束同步走到待機位置 ? ? ? ??int?Axisidle =?0; ? ? ? ??//此處判斷并實現是否每次都強制回待機位之后再執行下一次跟隨動作,由于MOVESYNC在-1模式下的特殊性,會被緊接的MOVESYNC取代,不需要其他邏輯,即可以實現連續跟隨 ? ? ? ??if?(Force_Back_Flag ==?1) ? ? ? ? { ? ? ? ? ? ??do ? ? ? ? ? ? { ? ? ? ? ? ? ? ? iret = zmcaux.ZAux_Direct_GetIfIdle(G_CardHandle, iAxisList[0],?ref?Axisidle); ? ? ? ? ? ?//等待主軸跟隨完畢 ??? ? ? ? ?}?while?(Axisidle ==?0); ? ? ? ? } ? ? ? ? iWorkCount++; ? ? } }
1.在電腦里新建一個文件夾用來保存即將要建立的工程。打開RTSys編程軟件。
2.新建項目:菜單欄“文件”→“新建工程”。
3.點擊“新建工程”后彈出“另存為”界面,選擇一個文件夾打開,輸入文件名后保存項目,后綴為“.zpj”。
4.新建文件:點擊菜單欄“文件”→“新建”,新建彈出窗口支持Basic/Plc/Hmi混合編程,這里選擇新建的文件類型為Basic后確認。
5.設置文件自動運行:如下圖,雙擊文件右邊自動運行的位置,輸入任務號“0”。
Basic跟隨主體代碼:
globalsub reg_Task() '//鎖存線程 REG_INPUTS(belt) = $0000 '//指定皮帶軸的鎖存輸入口,這里R3 R2 R1 R0都用0號輸入口的信號 Reg_Count =0'// 清零鎖存計數循環量 WHILE 1 REGIST(4)axis(belt) '//開啟軸鎖存 wait until(MARK(belt)) '//等待軸鎖存觸發 Reg_Array(Reg_Count) = REG_POS(belt) '//將鎖存到的軸位置存放到鎖存數組中 reg_Flag(Reg_Count) =1 '//標記觸發 if(Reg_Count >= Reg_Space - 1) then '//判斷鎖存緩存數組是否滿,滿了重新開始計數 Reg_Count =0 else Reg_Count = Reg_Count +1 endif Reg_Count_All = Reg_Count_All +1 WEND endsub globalsub movesync_Task(Mode) '//mode 0- 三段式跟隨 1- 直接跟隨 Sync_Count = 0 '// 清零 跟隨標志 Over_Max_Count =0 Sync_Count_All =0 base(X_sync,Y_sync,Z_sync) moveabs(X_Wait,Y_Wait,Z_Wait) '//移動到待機位 WHILE 1 if(reg_Flag(Sync_Count) = 1) then reg_Flag(Sync_Count) = -1 '//復位標志 wait until(MPOS(belt) >Reg_Array(Sync_Count) + Diff_Pos) '//等待滿足觸發跟隨距離 if(MPOS(belt) <= Reg_Array(Sync_Count) + Max_Diff) then ? '//滿足跟隨觸發的最大距離,也就是在跟隨觸發的最小距離和最大距離之間 ? ? ? ? ? ??if(Mode =?0) then ?? ? ? ? ? ? ? ?base(X_sync,Y_sync,Z_sync) ? ? ? ? ? ? ? ??MOVESYNC(0,catch_time,Reg_Array(Sync_Count),belt,X_POS,Y_POS,Z_POS)axis(X_sync) ??'// 同步追趕段 ?由于MOVESYNC指令會根據跟隨軸位置控制跟隨從軸,此處填入鎖存時刻的位置即可 ? ? ? ? ? ? ? ? MOVE_TASK(10,rectangel)AXIS(X_sync) ?'//開啟異步線程10,執行加工動作 ? ? ? ? ? ? ? ??MOVESYNC(0,work_time,Reg_Array(Sync_Count),belt,X_POS,Y_POS,Z_POS)axis(X_sync) ??'//保持跟隨狀態 ? ? ? ? ? ? ? ? wait until(PROC_STATUS(10) = 1)? ? ? ? ? ? ? ? wait until(PROC_STATUS(10) = 0) ? ? ? ? ? ? ? ? MOVESYNC(-1,back_time,Reg_Array(Sync_Count),-1, X_Wait,Y_Wait,Z_Wait)AXIS(X_sync) ? ? ? ? ? ? ? ? Sync_Count_All = Sync_Count_All + 1 ? ? ? ? ? ? elseif(mode = 1) then ?? ? ? ? ? ? ? ?base(X_sync,Y_sync,Z_sync) ? ? ? ? ? ? ? ? MOVESYNC(0,catch_time,Reg_Array(Sync_Count),belt,X_POS,Y_POS,Z_POS)axis(X_sync) ? '// 同步追趕段 ?由于MOVESYNC指令會根據跟隨軸位置控制跟隨從軸,此處填入鎖存時刻的位置即可 ? ? ? ? ? ? ? ??MOVE_ADDAX(belt,?1,?UNITS(belt) /?UNITS(X_sync))axis(X_sync) ??'//使用move_addax替代MOVESYNC,使得跟隨動作保持,將皮帶軸的運動疊加到跟隨軸上 ? ? ? ? ? ? ? ? rectangel2 ? '//加工 ? ? ? ? ? ? ? ??MOVESYNC(-1,back_time,Reg_Array(Sync_Count),-1, X_Wait,Y_Wait,Z_Wait)AXIS(X_sync) ? ? ? ? ? ? ? ? Sync_Count_All = Sync_Count_All +?1 ? ? ? ? ? ??endif ?? ? ? ??else ? ? ? ? ? ? ?"位置超出最大觸發距離"? ? ??'//此處簡單做打印輸出提示,可以根據自己需求擴展 ? ? ? ? ? ? Over_Max_Count = Over_Max_Count + 1 ? ? ? ? endif ?? ? ? ? if(Sync_Count >= Reg_Space - 1) then '//判斷跟隨觸發是否讀取完了全部數據,滿了重新開始計數 Sync_Count =0 else Sync_Count = Sync_Count +1 endif endif wend endsub
六.效果演示
下面以C#代碼跑測試和RTSys示波器抓取波形分析。
C#同步跟隨界面圖
單次觸發和連續多次觸發圖
單次觸發與連續多次觸發速度分析圖
視頻講解可點擊→“PCIe EtherCAT實時運動控制卡PCIE464同步跟隨皮帶跟隨加工應用”查看。
完整代碼獲取地址
▼
本次,正運動技術PCIe EtherCAT實時運動控制卡PCIE464同步跟隨/皮帶跟隨加工應用,就分享到這里。
更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
審核編輯 黃宇
-
運動控制
+關注
關注
4文章
638瀏覽量
33385 -
ethercat
+關注
關注
19文章
1000瀏覽量
39638
發布評論請先 登錄
評論