一.硬件介紹
PCIE464運(yùn)動(dòng)控制卡是正運(yùn)動(dòng)推出的一款EtherCAT總線+脈沖型、PCIE接口式的運(yùn)動(dòng)控制卡,可選6-64軸運(yùn)動(dòng)控制,支持多路高速數(shù)字輸入輸出,可輕松實(shí)現(xiàn)多軸同步控制和高速數(shù)據(jù)傳輸。

PCIE464運(yùn)動(dòng)控制卡適合于多軸點(diǎn)位運(yùn)動(dòng)、插補(bǔ)運(yùn)動(dòng)、軌跡規(guī)劃、手輪控制、編碼器位置檢測(cè)、IO控制、位置鎖存等功能的應(yīng)用。
PCIE464運(yùn)動(dòng)控制卡適用于3C電子加工、檢測(cè)設(shè)備、半導(dǎo)體設(shè)備、SMT加工、激光加工、光通訊設(shè)備、鋰電及光伏設(shè)備、以及非標(biāo)自動(dòng)化設(shè)備等高速高精應(yīng)用場(chǎng)合。

PCIE4系列控制卡的應(yīng)用程序可以使用VC,VB,VS,C++,C#等軟件開發(fā),程序運(yùn)行時(shí)需要?jiǎng)討B(tài)庫(kù)zmotion.dll,調(diào)試時(shí)可以將RTSys軟件同時(shí)連接控制器,從而方便調(diào)試、方便觀察。

PCIE464視頻介紹可點(diǎn)擊→“【EtherCAT同步周期快至100us】超高實(shí)時(shí)性PCIe EtherCAT控制卡PCIE464”查看。
更多關(guān)于PCIE464的詳情介紹,點(diǎn)擊“PCIE464 — 高速高精,超高實(shí)時(shí)性的PCIe EtherCAT實(shí)時(shí)運(yùn)動(dòng)控制卡”查看。
二.接線參考
1.IN數(shù)字量輸入接口
數(shù)字輸入分布在J400(IN0-IN7)和X400(IN8-IN39)信號(hào)接口中。

2.OUT數(shù)字量輸出接口
數(shù)字輸出分布在J400(OUT0-7)和X400(OUT8-OUT39)信號(hào)接口中。

3.單端編碼器及單端脈沖接線

單端脈沖接線圖

差分脈沖接線圖

單端編碼器接線圖

差分編碼器接線圖
注:PCIE464的J400接口中有一個(gè)差分脈沖軸接口和三個(gè)單端脈沖軸接口,兩個(gè)差分編碼器接口(其中一個(gè)與差分脈沖軸接口復(fù)用,取決于固件設(shè)定)和兩個(gè)單端編碼器接口,具體引腳定義參見PCIE464硬件手冊(cè)。
三.同步指令解析及技巧解釋
1.同步過程
同步跟隨過程分為三部分:加速追趕、同步加工、結(jié)束歸位。
(1)加速追趕:動(dòng)作機(jī)構(gòu)加速追上產(chǎn)品位置,并保持追趕末端速度與產(chǎn)品速度一致的過程。
(2)同步加工:動(dòng)作機(jī)構(gòu)加速追趕上之后,繼續(xù)保持與產(chǎn)品同樣的速度運(yùn)動(dòng)的過程,即兩者相對(duì)靜止的過程;加工動(dòng)作常在此過程中進(jìn)行。
(3)結(jié)束歸位:加工完成后,打斷跟隨過程,回歸待機(jī)位的過程。
? 正運(yùn)動(dòng)技術(shù)提供了成熟的同步跟隨執(zhí)行指令MOVESYNC完成上述過程。
2.同步指令
MOVESYNC -- 同步運(yùn)動(dòng),皮帶上物體跟隨
語(yǔ)法:
MOVESYNC(mode,synctime,syncposition,syncaxis,pos1[,pos2, pos3…])
參數(shù)解釋:
(1)mode:mode=0 + angle,angle:皮帶旋轉(zhuǎn)角度,角度=皮帶軸dpos正向與BASE軸正向的夾角。使用時(shí)需要將角度轉(zhuǎn)換為弧度(0~2PI)。

(2)synctime:同步時(shí)間,ms單位。
(3)syncposition:皮帶軸物體被感應(yīng)到時(shí)皮帶軸的位置。
(4)syncaxis:皮帶軸軸號(hào),-1表示沒有皮帶軸。
(5)pos1:皮帶軸物體被感應(yīng)到時(shí)的BASE第1個(gè)軸絕對(duì)位置。
(6)posn:皮帶軸物體被感應(yīng)到時(shí)的BASE第n個(gè)軸絕對(duì)位置。
上位機(jī)指令參數(shù)排列一樣。

3.使用疑難點(diǎn)解析
(1)如何獲知syncposition:皮帶軸物體被感應(yīng)到時(shí)皮帶軸的位置?
首先,我們先了解跟隨的完整實(shí)現(xiàn)流程,如下:
光電傳感器產(chǎn)生信號(hào)→控制器收到信號(hào),鎖存獲取跟隨坐標(biāo)→產(chǎn)品流到到位,跟隨觸發(fā)→追趕產(chǎn)品,進(jìn)入同步加工,走軌跡→進(jìn)入下一次跟隨。
那么按照流程看,物體被感應(yīng)到時(shí)的位置就由鎖存產(chǎn)生并記錄,我們只需要將鎖存數(shù)據(jù)記錄就獲取到了參數(shù)syncposition的值。
(2)如何獲知同步跟隨所需的POSN:皮帶軸物體被感應(yīng)到時(shí)跟隨軸的位置?
syncposition與POSN都是在物體被感應(yīng)到時(shí)的位置,兩者的關(guān)系是同時(shí)相對(duì)靜止的;所以此處的POSN:皮帶軸物體被感應(yīng)到時(shí)跟隨軸的位置并不是感應(yīng)到產(chǎn)品時(shí)跟隨軸所處的位置,而是感應(yīng)到產(chǎn)品時(shí)跟隨軸應(yīng)該走到的位置,也就是我們想要的產(chǎn)品同步跟隨位置點(diǎn)。
在上一步,我們獲知了皮帶軸的感應(yīng)位置是在鎖存的時(shí)候獲取到,那么可以在程序中設(shè)計(jì),產(chǎn)品經(jīng)過傳感器后停下來,獲取當(dāng)前皮帶軸位置,用鎖存到的值-皮帶軸當(dāng)前位置=跟隨方向的位移量→移動(dòng)歸零后的跟隨軸組到產(chǎn)品上標(biāo)記的需要加工的起點(diǎn)位置,記錄下軸組位置數(shù)據(jù)→將軸組中跟隨方向軸的坐標(biāo)-計(jì)算出來的跟隨方向的位移量=鎖存時(shí)跟隨軸組中跟隨方向的軸位置→記錄下數(shù)據(jù)就得到了皮帶軸物體被感應(yīng)到時(shí)跟隨軸的位置POSN。
(3)跟隨三個(gè)過程中的數(shù)據(jù)怎么填?是否需要重新計(jì)算?
跟隨三個(gè)過程中的參數(shù)數(shù)據(jù)不需要重新計(jì)算;三個(gè)過程中唯一需要變化的參數(shù)是synctime,其他的參數(shù)保持不變;而synctime參數(shù)根據(jù)實(shí)際加工需要設(shè)定即可,一般會(huì)將同步加工時(shí)間設(shè)置大。
(4)在同步加工段中,怎么去走加工軌跡?能直接控制跟隨軸組走軌跡嗎?
在同步過程中一般是不能直接使用運(yùn)動(dòng)指令去操控跟隨軸組走軌跡的,不然會(huì)打斷跟隨的狀態(tài);可以使用疊加運(yùn)動(dòng)的方式間接走軌跡;通過addax指令將幾個(gè)沒有用到的虛擬軸,疊加到跟隨軸組上,使用運(yùn)動(dòng)指令控制虛擬軸執(zhí)行加工軌跡,就能實(shí)現(xiàn)在保持跟隨狀態(tài)下走加工軌跡。
(5)不同產(chǎn)品軌跡所需時(shí)間不一樣,同步加工段的時(shí)間怎么計(jì)算?
其實(shí)在實(shí)際應(yīng)用中,同步加工段的時(shí)間通常會(huì)設(shè)置一個(gè)很大很大的時(shí)間值確保加工完成,加工完成后,用MOVESYNC的-2模式強(qiáng)制結(jié)束即可。
(6)加工中產(chǎn)品不斷進(jìn)來,怎么實(shí)現(xiàn)跟隨軸組不回待機(jī),連續(xù)跟隨加工產(chǎn)品?
只需要注意不要在程序中每一段的跟隨加工返回待機(jī)位的后面加入等待或者其他進(jìn)運(yùn)動(dòng)緩沖的指令即可;因?yàn)閺?fù)位用-1模式時(shí),其會(huì)被后面的緩沖MOVESYNC覆蓋,也就是當(dāng)下一個(gè)產(chǎn)品的MOVESYNC跟隨指令已經(jīng)壓進(jìn)運(yùn)動(dòng)緩沖之后,當(dāng)前產(chǎn)品加工完的復(fù)位MOVESYNC就會(huì)被覆蓋,無效。
4.擴(kuò)展用法
MOVE_ADDAX運(yùn)動(dòng)緩沖疊加
使用MOVESYNC+MOVE_ADDAX,可以實(shí)現(xiàn)在保持跟隨狀態(tài)下直接操作跟隨軸組走軌跡。
四.C#語(yǔ)言進(jìn)行項(xiàng)目開發(fā)
1.在VS2010菜單“文件”→“新建”→“項(xiàng)目”,啟動(dòng)創(chuàng)建項(xiàng)目向?qū)А?/p>

2.選擇開發(fā)語(yǔ)言為“Visual C#”和.NET Framework 4以及Windows窗體應(yīng)用程序。

3.找到廠家提供的光盤資料里面的C#函數(shù)庫(kù),路徑如下(32位庫(kù)為例)。
1)進(jìn)入廠商提供的光盤資料找到“04PC函數(shù)”文件夾,并點(diǎn)擊進(jìn)入。

2)選擇“01PC函數(shù)庫(kù)V2.1”文件夾。

3)選擇“Windows平臺(tái)”文件夾。

4)選擇“C#”文件夾。

5)根據(jù)需要選擇對(duì)應(yīng)的函數(shù)庫(kù),這里選擇32位庫(kù)。

4.將廠商提供的C#的庫(kù)文件以及相關(guān)文件復(fù)制到新建的項(xiàng)目中。
1)將zmcaux.cs文件復(fù)制到新建的項(xiàng)目里面中。

2)將zauxdll.dll和zmotion.dll文件放入bin\debug文件夾中。

5.雙擊Form1.cs里面的Form1,出現(xiàn)代碼編輯界面,在文件開頭寫入using cszmcaux,并聲明控制器句柄g_handle。

6.至此,項(xiàng)目新建完成,可進(jìn)行C#項(xiàng)目開發(fā)。
C#跟隨主體代碼:
public void SubMoveSync()
{
int iret = 0;
int []iAxisList = new int[2]{0,1} ;
int []iTime = new int[3];
iTime[0] = Convert.ToInt32(TextAccTime.Text);
iTime[1] = Convert.ToInt32(TextSyncTime.Text);
iTime[2] = Convert.ToInt32(TextBackTime.Text);
float []fWaitPos = new float[2];
fWaitPos[0] = Convert.ToSingle (TextXpos.Text);
fWaitPos[1] = Convert.ToSingle(TextYpos.Text);
float fOffPos= Convert.ToSingle(TextOffpos.Text);
float fPdAxisPos = 0; //當(dāng)前皮帶軸位置
float[] fMakrPos = new float[2]; //當(dāng)前加工產(chǎn)品鎖存編碼器的位置
int iMaxNum = Convert.ToInt32(Text_TabNum.Text);
float imode = 0;
imode = 0 ; //X方向跟隨
if (m_SyncMode == 1) //同步軌跡運(yùn)動(dòng)
{
iret = zmcaux.ZAux_Direct_SetMerge(G_CardHandle, 4, 1); //打開虛擬X軸連續(xù)插補(bǔ)
iret = zmcaux.ZAux_Direct_Single_Addax(G_CardHandle,0,4); //虛擬4號(hào)軸X軸的運(yùn)動(dòng)疊加到實(shí)際X軸
iret = zmcaux.ZAux_Direct_Single_Addax(G_CardHandle, 1, 5); //虛擬5號(hào)軸Y軸的運(yùn)動(dòng)疊加到實(shí)際Y軸
}
float[] Units = new float[2];
zmcaux.ZAux_Direct_GetUnits(G_CardHandle, 2, ref Units[0]);
zmcaux.ZAux_Direct_GetUnits(G_CardHandle, 0, ref Units[1]);
float[] ratio = new float[1] { Units[0] / Units[1] };
int[] scraxis = new int[1] { 2 };
while(true)
{
if( (m_RegistCount != 0) && (iWorkCount iMaxNum) //鎖存坐標(biāo)已經(jīng)溢出,數(shù)據(jù)保存在鎖存前面
{
iWorkCount = iWorkCount - m_RegistCount; //從下個(gè)循環(huán)開始取值
if (iWorkCount < m_RegistCount)
{
iret = zmcaux.ZAux_Direct_GetTable(G_CardHandle, Convert.ToInt32(Text_TabStart.Text) + 1 + iWorkCount, 1, fMakrPos); //獲取當(dāng)前準(zhǔn)備加工的鎖存位置
}
else
{
continue;
}
}
//鎖存事件未觸發(fā)
if (m_RegistCount == 0 || m_RegistCount == iWorkCount)
{
continue;
}
//等待傳送帶位置運(yùn)動(dòng)超過開始跟隨位置
do
{
iret = zmcaux.ZAux_Direct_GetMpos(G_CardHandle, 2, ref fPdAxisPos); //獲取當(dāng)前編碼軸位置
} while (fPdAxisPos < fOffPos + fMakrPos[0]);
iret = zmcaux.ZAux_Direct_MoveSync(G_CardHandle, imode, iTime[0], fMakrPos[0] + fOffPos, 2, 2, iAxisList, fWaitPos); //同步啟動(dòng)加速段,
if (Sync_Mode == 0)
{
if (m_SyncMode == 1) //同步軌跡運(yùn)動(dòng)
{
SubVirAxisMove(); //調(diào)用虛擬軸軌跡
iret = zmcaux.ZAux_Direct_MoveTable(G_CardHandle, (uint)iAxisList[0], 0, (float)1); //寫TABLE數(shù)據(jù)到實(shí)際軸緩沖區(qū),速度同步后修改TABLE觸發(fā)虛擬軸
if (iret != 0)
{
MessageBox.Show("ZAux_Direct_MoveTable失敗 錯(cuò)誤碼:" + iret.ToString());
continue;
}
iret = zmcaux.ZAux_Direct_MoveSync(G_CardHandle, imode, iTime[1], fMakrPos[0] + fOffPos, 2, 2, iAxisList, fWaitPos); //同步啟動(dòng)勻速速段,勻速時(shí)間
//同步結(jié)束
iret = zmcaux.ZAux_Direct_MoveTable(G_CardHandle, (uint)iAxisList[0], 0, (float)0); //寫TABLE數(shù)據(jù)到實(shí)際軸緩沖區(qū),速度同步后修改TABLE觸發(fā)虛擬軸
//iret = zmcaux.ZAux_Direct_MoveCancel(G_CardHandle, iAxisList[0], 4, 2); //運(yùn)動(dòng)完成強(qiáng)制停止未完成的虛擬軸運(yùn)動(dòng)
}
else
{
iret = zmcaux.ZAux_Direct_MoveSync(G_CardHandle, imode, iTime[1], fMakrPos[0] + fOffPos, 2, 2, iAxisList, fWaitPos); //同步啟動(dòng)勻速速段,勻速時(shí)間
}
}
else if(Sync_Mode == 1)
{
if (m_SyncMode == 1) //同步軌跡運(yùn)動(dòng)
{
iret = Motion_MoveAddax(G_CardHandle, iAxisList[0], iAxisList, 2, ratio, scraxis); //建立疊加關(guān)系
SubVirAxisMove_Dirct(); //直接控制實(shí)際軸走軌跡
//同步結(jié)束
iret = zmcaux.ZAux_Direct_MoveTable(G_CardHandle, (uint)iAxisList[0], 0, (float)0); //寫TABLE數(shù)據(jù)到實(shí)際軸緩沖區(qū),速度同步后修改TABLE觸發(fā)虛擬軸
iret = Motion_MoveAddax(G_CardHandle, iAxisList[0], iAxisList, 0, ratio, scraxis);
}
else
{
iret = Motion_MoveAddax(G_CardHandle, iAxisList[0], iAxisList, 2, ratio, scraxis); //建立疊加關(guān)系
iret = zmcaux.ZAux_Direct_MoveDelay(G_CardHandle, iAxisList[0], iTime[1]); //運(yùn)行延時(shí)時(shí)間
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); //結(jié)束同步走到待機(jī)位置
int Axisidle = 0;
//此處判斷并實(shí)現(xiàn)是否每次都強(qiáng)制回待機(jī)位之后再執(zhí)行下一次跟隨動(dòng)作,由于MOVESYNC在-1模式下的特殊性,會(huì)被緊接的MOVESYNC取代,不需要其他邏輯,即可以實(shí)現(xiàn)連續(xù)跟隨
if (Force_Back_Flag == 1)
{
do
{
iret = zmcaux.ZAux_Direct_GetIfIdle(G_CardHandle, iAxisList[0], ref Axisidle); //等待主軸跟隨完畢
} while (Axisidle == 0);
}
iWorkCount++;
}
}
五.Basic編程進(jìn)行項(xiàng)目開發(fā)
1.在電腦里新建一個(gè)文件夾用來保存即將要建立的工程。打開RTSys編程軟件。

2.新建項(xiàng)目:菜單欄“文件”→“新建工程”。

3.點(diǎn)擊“新建工程”后彈出“另存為”界面,選擇一個(gè)文件夾打開,輸入文件名后保存項(xiàng)目,后綴為“.zpj”。

4.新建文件:點(diǎn)擊菜單欄“文件”→“新建”,新建彈出窗口支持Basic/Plc/Hmi混合編程,這里選擇新建的文件類型為Basic后確認(rèn)。

5.設(shè)置文件自動(dòng)運(yùn)行:如下圖,雙擊文件右邊自動(dòng)運(yùn)行的位置,輸入任務(wù)號(hào)“0”。

Basic跟隨主體代碼:
global sub reg_Task() '//鎖存線程
REG_INPUTS(belt) = $0000 '//指定皮帶軸的鎖存輸入口,這里R3 R2 R1 R0都用0號(hào)輸入口的信號(hào)
Reg_Count = 0 '// 清零鎖存計(jì)數(shù)循環(huán)量
WHILE 1
REGIST(4)axis(belt) '//開啟軸鎖存
wait until(MARK(belt)) '//等待軸鎖存觸發(fā)
Reg_Array(Reg_Count) = REG_POS(belt) '//將鎖存到的軸位置存放到鎖存數(shù)組中
reg_Flag(Reg_Count) = 1 '//標(biāo)記觸發(fā)
if(Reg_Count >= Reg_Space - 1) then '//判斷鎖存緩存數(shù)組是否滿,滿了重新開始計(jì)數(shù)
Reg_Count = 0
else
Reg_Count = Reg_Count + 1
endif
Reg_Count_All = Reg_Count_All + 1
WEND
endsub
global sub movesync_Task(Mode) '//mode 0- 三段式跟隨 1- 直接跟隨
Sync_Count = 0 '// 清零 跟隨標(biāo)志
Over_Max_Count = 0
Sync_Count_All = 0
base(X_sync,Y_sync,Z_sync)
moveabs(X_Wait,Y_Wait,Z_Wait) '//移動(dòng)到待機(jī)位
WHILE 1
if(reg_Flag(Sync_Count) = 1) then
reg_Flag(Sync_Count) = -1 '//復(fù)位標(biāo)志
wait until(MPOS(belt) > Reg_Array(Sync_Count) + Diff_Pos) '//等待滿足觸發(fā)跟隨距離
if(MPOS(belt) = Reg_Space - 1) then '//判斷跟隨觸發(fā)是否讀取完了全部數(shù)據(jù),滿了重新開始計(jì)數(shù)
Sync_Count = 0
else
Sync_Count = Sync_Count + 1
endif
endif
wend
endsub
六.效果演示
下面以C#代碼跑測(cè)試和RTSys示波器抓取波形分析。

C#同步跟隨界面圖

單次觸發(fā)和連續(xù)多次觸發(fā)圖

單次觸發(fā)與連續(xù)多次觸發(fā)速度分析圖
視頻講解可點(diǎn)擊→“PCIe EtherCAT實(shí)時(shí)運(yùn)動(dòng)控制卡PCIE464同步跟隨皮帶跟隨加工應(yīng)用”查看。
完整代碼獲取地址
▼

本次,正運(yùn)動(dòng)技術(shù)PCIe EtherCAT實(shí)時(shí)運(yùn)動(dòng)控制卡PCIE464同步跟隨/皮帶跟隨加工應(yīng)用,就分享到這里。
更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開發(fā)環(huán)境與例程代碼,請(qǐng)咨詢正運(yùn)動(dòng)技術(shù)銷售工程師:400-089-8936。
本文由正運(yùn)動(dòng)技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國(guó)智能制造水平。文章版權(quán)歸正運(yùn)動(dòng)技術(shù)所有,如有轉(zhuǎn)載請(qǐng)注明文章來源。

正運(yùn)動(dòng)技術(shù)專注于運(yùn)動(dòng)控制技術(shù)研究和通用運(yùn)動(dòng)控制軟硬件產(chǎn)品的研發(fā),是國(guó)家級(jí)高新技術(shù)企業(yè)。正運(yùn)動(dòng)技術(shù)匯集了來自華為、中興等公司的優(yōu)秀人才,在堅(jiān)持自主創(chuàng)新的同時(shí),積極聯(lián)合各大高校協(xié)同運(yùn)動(dòng)控制基礎(chǔ)技術(shù)的研究,是國(guó)內(nèi)工控領(lǐng)域發(fā)展最快的企業(yè)之一,也是國(guó)內(nèi)少有、完整掌握運(yùn)動(dòng)控制核心技術(shù)和實(shí)時(shí)工控軟件平臺(tái)技術(shù)的企業(yè)。主要業(yè)務(wù)有:運(yùn)動(dòng)控制卡_運(yùn)動(dòng)控制器_EtherCAT運(yùn)動(dòng)控制卡_EtherCAT控制器_運(yùn)動(dòng)控制系統(tǒng)_視覺控制器__運(yùn)動(dòng)控制PLC_運(yùn)動(dòng)控制_機(jī)器人控制器_視覺定位_XPCIe/XPCI系列運(yùn)動(dòng)控制卡等。
|