|

VPLC711硬件介紹
VPLC711是正運動推出的一款基於x86平台和Windows操作係統的高性能機器視覺EtherCAT運動控製器,具備強大的運算能力和靈活性。它具有出色的實時性能和多路高速硬件輸入與多路高速PSO輸出,能夠精準控製多軸同步運動,並與外部設備實現多協議的高速通信。

VPLC711支持多種硬件接口和通信協議,方便與其他設備的連接和集成。除此之外,VPLC711還具備視覺處理功能,能夠實時處理圖像數據,實現視覺檢測、測量和定位等應用。

VPLC711內置Windows運動控製實時內核MotionRT7,形成一種開放式IPC形態實時軟控製器/軟PLC,為用戶提供靈活集成的運動控製+視覺一體化解決方案。

VPLC711硬件參數
1.采用x86高性能CPU,EtherCAT可支持1ms 64軸同步運行;
2.板載RS232,RS485, EtherNet *5,EtherCAT,USB3.0*4硬件接口;
3.板載20DI,其中4個高速色標鎖存,2組高速單端編碼器;
4.板載20DO,其中4個高速單端脈衝軸,4組高速PWM;
5.支持DVI-D,HDMI顯示,支持雙網口不同IP設置。
想要了解更多關於VPLC711的詳情介紹,可以點擊“ x86平台實時Windows機器視覺EtherCAT運動控製器VPLC711”查看。
一、C#語言進行Delta並聯機械手的開發之運動庫和視覺庫的添加
1.在VS2010菜單“文件”→“新建”→“項目”,啟動創建項目向導。

2.選擇開發語言為“Visual C#”和.NET Framework 4以及Windows窗體應用程序。

3.找到廠家提供的光盤資料裏麵的C#函數庫,路徑如下(32位庫為例)。
1)進入廠商提供的光盤資料找到“04PC函數”文件夾,並點擊進入。

2)選擇“函數庫2.1”文件夾。

3)選擇“Windows平台”文件夾。

4)根據需要選擇對應的函數庫,這裏選擇32位庫。

5)解壓C#壓縮包,裏麵有C#對應的函數庫。

6)函數庫具體路徑如下。

4. 將廠商提供的C#庫文件以及相關文件複製到新建的項目中(注意這裏麵的PC函數庫默認提供的是運動庫,如果使用視覺功能還需要獲取視覺庫,視覺庫可以找廠商的相關銷售或技術人員獲取)。
1) 將Zmcaux.cs(運動庫)和Zvision.cs(視覺庫)文件複製到新建的項目裏麵中。

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

5. 用vs打開新建的項目文件,在右邊的解決方案資源管理器中點擊顯示所有文件,然後鼠標右擊Zmcaux.cs與 Zvision.cs文件,點擊包括在項目中。

6. 雙擊Form1.cs裏麵的Form1,出現代碼編輯界麵,在文件開頭寫入using cszmcaux,using ZVision並聲明控製器句柄g_handle 。

二、PC函數介紹
1.鏈接控製器,獲取鏈接句柄。

2.皮帶同步指令。

三、Basic腳本快速驗證指令用法
1. 編寫Basic測試腳本進行MoveSync指令的用法測試。
'**************************************************************************************
'背景:假設有一對對射型的光電傳感器固定在流水線的兩端,來實時檢測流水線上的產品到位情況
'MOVESYNC指令參數填寫說明:
'syncposition:物體到感應點時皮帶軸的位置,需要通過編碼器鎖存把產品的對應位置記錄下來。
'pos1:跟隨軸1原點到光電傳感器感應點的位置,對於每個產品都是固定的。
'**************************************************************************************
GLOBAL CONST BeltAxis=4 '皮帶軸是軸4
GLOBAL CONST FollowAxis1=0 '跟隨軸1是軸0
GLOBAL CONST InducPos1=30 '跟隨軸1原點到光電傳感器感應點的位置
GLOBAL CONST StandbyPos1=50'跟隨軸1的待機位
GLOBAL CONST EmptyPos1=400 '跟隨軸1的放料位
'停止所有軸
RAPIDSTOP(2)
WAIT IDLE
'初始化相關軸的軸參數
BASE(FollowAxis1, BeltAxis)
ATYPE = 1,1
UNITS = 1000,1000
SPEED = 50,100
DPOS = 0,0
'觸發示波器采集波形
TRIGGER
DELAY(1000)
'跟隨軸先運動到待機位
BASE(FollowAxis1)
MOVEABS(StandbyPos1)
'皮帶軸開始運動
VMOVE(1) AXIS(BeltAxis)
'假設皮帶運動到200的位置時,有一個產品被檢測到
BASE(FollowAxis1)
Wait UNTIL MPOS(BeltAxis)> 200
MOVESYNC(0, 2000, 200, BeltAxis, InducPos1) '跟隨軸加速同步段該指令執行完後將同步上產品
MOVE_OP(0, ON) '同步上後打開真空吸
MOVESYNC(0, 1000, 200, BeltAxis, InducPos1) '繼續同步1s
MOVESYNC(-1, 0, 0, -1, EmptyPos1) '走到放料位置
MOVE_OP(0, OFF) '到放料位後關閉真空吸
2.通過RTSys軟件的示波器觀察波形,分析同步過程。


根據示波器的數據分析
1、產品剛剛被檢測到時,皮帶的位置是200,跟隨軸的位置是50。
2、跟隨軸追上產品,並保持速度和皮帶軸同步時皮帶的位置是400,跟隨軸1的位置是230。
3、由1和2可知,產品在同步過程中前進了200(400-200)。
4、因為跟隨軸1原點到光電傳感器感應點的位置InducPos1我們給的數據是30,所以在跟隨軸1和皮帶平行的情況下,皮帶帶著產品往前跑了200後,此時此刻跟隨軸1原點到光產品的實際距離是230(200+30)。
5、那麼第4點計算的結果和第2的同步完成後跟隨軸1的實際位置是一致的,所以流水線同步指令測試正常。
四、C#例程建設之視覺流水線同步分揀
1.皮帶同步指令關鍵參數詳細介紹。
ZAux_Direct_MoveSync(ZMC_HANDLE handle,float imode,int synctime,float syncposition,int syncaxis,int imaxaxises,int *piAxislist,float *pfDisancelist).
(1)參數imode:
imode = 0+angle,表示同步模式,如果皮帶和X軸平行,填0即可。
imode = -1,表示結束同步模式,可運動到指定的絕對位置,一般同步上抓取完物料後運動到放料位使用。
(2)參數synctime:同步時間,ms單位.運動在指定時間內完成,完成時軸跟皮帶軸上物體保持速度一致。0表示根據運動軸的速度加速度來估計同步時間。
(3)參數syncposition:視覺或傳感器識別到皮帶是的產品時,皮帶此時此刻的位置信息MPOS。
(4)參數pfDisancelist:如果是視覺定位產品時,這個參數直接填視覺識別到產品時產品的世界坐標。
如(ru)果(guo)用(yong)光(guang)電(dian)傳(chuan)感(gan)器(qi)檢(jian)測(ce)產(chan)品(pin)時(shi),這(zhe)個(ge)參(can)數(shu)是(shi)固(gu)定(ding)的(de),在(zai)傳(chuan)感(gan)器(qi)剛(gang)剛(gang)好(hao)感(gan)應(ying)到(dao)產(chan)品(pin)時(shi),產(chan)品(pin)當(dang)前(qian)位(wei)置(zhi)的(de)絕(jue)對(dui)坐(zuo)標(biao)。可(ke)以(yi)在(zai)此(ci)時(shi)此(ci)刻(ke)手(shou)動(dong)運(yun)動(dong)從(cong)軸(zhou)來(lai)定(ding)位(wei)到(dao)產(chan)品(pin)處(chu)來(lai)獲(huo)取(qu)位(wei)置(zhi)信(xin)息(xi)。
2.視覺流水線同步分揀流程圖。

(1)視覺匹配定位代碼詳情。
/************************************************************************************
'任務編號: 無
'函數功能: 視覺定位產品
'Input: 無
'Output: 無
'返回值: 子線程---進行視覺定位
**************************************************************************************/
public void RunSubTaskVisua()
{
int TempArrid = 0;
float TempVar = 0;
WriteLog("視覺功能正常啟動");
while (SysRunFlag > 0)
{
//暫停按鈕沒有按下時
while (SysRunFlag == 1)
{
//采集圖像
VisuaOper.CameAcquisition();
//進行模板匹配
RTDisplay.Image = VisuaOper.ShapeFind();
if (MainWindows.BeltMpos != 0)//如果采集照片的時候皮帶編碼器位置獲取正常
{
//操作MoveSyncBuff數據先加鎖
while (true)
{
if (MainWindows.SetMoveSyncFlag == 0)
{
MainWindows.SetMoveSyncFlag = 1;
break;
}
}
//找到可以存儲數據的數組起始下標
int ArrId = 0;
for (int i = 0; i < 50; i++)
{
if (MainWindows.MoveSyncBuff[i, 0] == 0)
{
ArrId = i;
break;
}
}
//開始存儲數據 一次匹配最多10個結果
TempArrid = ArrId;
for (int i = 0; i < 10; i++)
{
//如果分數滿足要求
if (MainWindows.VisionRst[i, 0] >= MainWindows.VisionScore)
{
int j;
//如果有重複的目標需要剔除
for (j = 0; j < TempArrid; j++)
{
TempVar = MainWindows.VisionRst[i, 1] - MainWindows.BeltMpos - MainWindows.MoveSyncBuff[j, 1] + MainWindows.MoveSyncBuff[j, 4];
if (((TempVar) = -10))
{
j = -10;
break;
}
}
if (j >= 0)
{
MainWindows.MoveSyncBuff[ArrId, 0] = 1;
MainWindows.MoveSyncBuff[ArrId, 1] = MainWindows.VisionRst[i, 1]; //存儲匹配結果的X坐標
MainWindows.MoveSyncBuff[ArrId, 2] = MainWindows.VisionRst[i, 2]; //存儲匹配結果的Y坐標
MainWindows.MoveSyncBuff[ArrId, 3] = MainWindows.VisionRst[i, 3]; //存儲匹配結果的角度偏移
MainWindows.MoveSyncBuff[ArrId, 4] = MainWindows.BeltMpos; //存儲匹配到產品時,傳送帶的位置信息
ArrId = ArrId + 1;
IdentiNum.Text = (Convert.ToInt32(IdentiNum.Text) + 1).ToString();
WriteLog("視覺目標:" + "(" + MainWindows.VisionRst[i, 1].ToString("0,0") + "," + MainWindows.VisionRst[i, 2].ToString("0,0") + ")");
}
}
//分數清空
MainWindows.VisionRst[i, 0] = 0;
}
//解鎖
MainWindows.SetMoveSyncFlag = 0;
}
}
Thread.Sleep(100);
}
}
(2)流水線同步分揀代碼詳情。
/************************************************************************************
'任務編號: 無
'函數功能: 流水線同步分揀
'Input: 無
'Output: 無
'返回值: 無
**************************************************************************************/
public void RunSubTaskMotion()
{
float[] MoveSyncTemp = new float[5];
float TempMpos = 0;
while (SysRunFlag > 0)
{
while (SysRunFlag == 1)
{
if (MainWindows.MoveSyncBuff[0, 0] == 1)
{
MainWindows.ZauxErr = zmcaux.ZAux_Direct_GetMpos(MainWindows.g_Handle, MainWindows.ConveyorAxisId, ref TempMpos);
//如果編碼器位置抓取正確
if (0 == MainWindows.ZauxErr)
{
//編碼器往前運動了多少
TempMpos = TempMpos - MainWindows.MoveSyncBuff[0, 4];
//判斷是否處於同步起始區
if (((MainWindows.MoveSyncBuff[0, 1] + TempMpos) >= MainWindows.SyncReX[0]) && ((MainWindows.MoveSyncBuff[0, 1] + TempMpos) <= MainWindows.SyncReX[1]))
{
WriteLog("開始同步抓取");
//取一組數據
MoveSyncTemp[0] = MainWindows.MoveSyncBuff[0, 1] ; //X
MoveSyncTemp[1] = MainWindows.MoveSyncBuff[0, 2] ; //Y
MoveSyncTemp[2] = MainWindows.GetBinHigt; //取料高度
MoveSyncTemp[3] = MainWindows.MoveSyncBuff[0, 3]; //Aanle
MoveSyncTemp[4] = MainWindows.MoveSyncBuff[0, 4]; //Mpos
//下發同步運動的指令
//0、複位輸出口
zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 0);
//1、先同步上傳送帶
zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 0, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);
//2、同步一段時間(關節軸有滯後) 50ms
zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 50, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);
//3、打開真空吸嘴
zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 1);
//4、同步一段時間 1500ms
zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 700, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);
//5、同步段把Z軸提升到安全高度,選擇軸到放料角度
MoveSyncTemp[2] = MainWindows.StandPos[2]; //取料高度
zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, 0, 100, MainWindows.MoveSyncBuff[0, 4], MainWindows.ConveyorAxisId, 4, MainWindows.gVAxisList, MoveSyncTemp);
//4、解除同步去放料點
MoveSyncTemp[0] = MainWindows.EmptPos[0]; //X
MoveSyncTemp[1] = MainWindows.EmptPos[1]; //Y
MoveSyncTemp[2] = MainWindows.EmptPos[2]; //放料高度
MoveSyncTemp[3] = MainWindows.EmptPos[3]; //Aanle
zmcaux.ZAux_Direct_MoveSync(MainWindows.g_Handle, -1, 0, 0, -1, 4, MainWindows.gVAxisList, MoveSyncTemp);
//5、關閉真空吸嘴放料,Delay100ms
zmcaux.ZAux_Direct_MoveOp(MainWindows.g_Handle, MainWindows.gVAxisList[0], MainWindows.VacSucIo, 0);
zmcaux.ZAux_Direct_MoveDelay(MainWindows.g_Handle, MainWindows.gVAxisList[0], 100);
//6、去安全高度
MoveSyncTemp[0] = MainWindows.EmptPos[0]; //X
MoveSyncTemp[1] = MainWindows.EmptPos[1]; //Y
MoveSyncTemp[2] = MainWindows.StandPos[2]; //放料高度
MoveSyncTemp[3] = MainWindows.EmptPos[3]; //Aanle
zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MoveSyncTemp);
//操作MoveSyncBuff數據先加鎖
while (true)
{
if (MainWindows.SetMoveSyncFlag == 0)
{
MainWindows.SetMoveSyncFlag = 1;
break;
}
}
//視覺匹配緩衝區數據往前覆蓋
for (int k = 0; k < 49; k++)
{
MainWindows.MoveSyncBuff[k, 0] = MainWindows.MoveSyncBuff[k + 1, 0];
MainWindows.MoveSyncBuff[k, 1] = MainWindows.MoveSyncBuff[k + 1, 1];
MainWindows.MoveSyncBuff[k, 2] = MainWindows.MoveSyncBuff[k + 1, 2];
MainWindows.MoveSyncBuff[k, 3] = MainWindows.MoveSyncBuff[k + 1, 3];
MainWindows.MoveSyncBuff[k, 4] = MainWindows.MoveSyncBuff[k + 1, 4];
}
//解鎖
MainWindows.SetMoveSyncFlag = 0;
//等待輸出口打開
int TimeOut = 10000;
TimeOut = 100000;
//等待軸停止
int AxisIdle = 0; //軸停止狀態
while (TimeOut > 0)
{
zmcaux.ZAux_Direct_GetIfIdle(MainWindows.g_Handle, MainWindows.gVAxisList[0], ref AxisIdle);
if (AxisIdle == (-1))
{
break;
}
Thread.Sleep(10);
TimeOut = TimeOut - 10;
}
if (TimeOut MainWindows.SyncReX[1])
{
//操作MoveSyncBuff數據先加鎖
while (true)
{
if (MainWindows.SetMoveSyncFlag == 0)
{
MainWindows.SetMoveSyncFlag = 1;
break;
}
}
//視覺匹配緩衝區數據往前覆蓋
for (int k = 0; k < 49; k++)
{
MainWindows.MoveSyncBuff[k, 0] = MainWindows.MoveSyncBuff[k + 1, 0];
MainWindows.MoveSyncBuff[k, 1] = MainWindows.MoveSyncBuff[k + 1, 1];
MainWindows.MoveSyncBuff[k, 2] = MainWindows.MoveSyncBuff[k + 1, 2];
MainWindows.MoveSyncBuff[k, 3] = MainWindows.MoveSyncBuff[k + 1, 3];
MainWindows.MoveSyncBuff[k, 4] = MainWindows.MoveSyncBuff[k + 1, 4];
}
//解鎖
MainWindows.SetMoveSyncFlag = 0;
//如果視覺匹配緩衝區沒有數據了
if (MainWindows.MoveSyncBuff[0, 0] == 0)
{
//Delta去待機位
zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MainWindows.StandPos);
WriteLog("去待機位");
}
}
}
}
else
{
//Delta去待機位
zmcaux.ZAux_Direct_MoveAbs(MainWindows.g_Handle, 4, MainWindows.gVAxisList, MainWindows.StandPos);
}
Thread.Sleep(50);
}
//停止傳送帶
zmcaux.ZAux_Direct_Single_Cancel(MainWindows.g_Handle, MainWindows.ConveyorAxisId, 2);
}
}
本次,正運動技術C#之Delta並聯機械手的視覺同步分揀,就分享到這裏。
更多精彩內容請關注“ 正運動小助手 ”公眾號,需要相關開發環境與例程代碼,請谘詢正運動技術銷售工程師。
本(ben)文(wen)由(you)正(zheng)運(yun)動(dong)技(ji)術(shu)原(yuan)創(chuang),歡(huan)迎(ying)大(da)家(jia)轉(zhuan)載(zai),共(gong)同(tong)學(xue)習(xi),一(yi)起(qi)提(ti)高(gao)中(zhong)國(guo)智(zhi)能(neng)製(zhi)造(zao)水(shui)平(ping)。文(wen)章(zhang)版(ban)權(quan)歸(gui)正(zheng)運(yun)動(dong)技(ji)術(shu)所(suo)有(you),如(ru)有(you)轉(zhuan)載(zai)請(qing)注(zhu)明(ming)文(wen)章(zhang)來(lai)源(yuan)。
正運動技術專注於運動控製技術研究和通用運動控製軟硬件產品的研發,是國家級高新技術企業。正運動技術彙集了來自華為、中(zhong)興(xing)等(deng)公(gong)司(si)的(de)優(you)秀(xiu)人(ren)才(cai),在(zai)堅(jian)持(chi)自(zi)主(zhu)創(chuang)新(xin)的(de)同(tong)時(shi),積(ji)極(ji)聯(lian)合(he)各(ge)大(da)高(gao)校(xiao)協(xie)同(tong)運(yun)動(dong)控(kong)製(zhi)基(ji)礎(chu)技(ji)術(shu)的(de)研(yan)究(jiu),是(shi)國(guo)內(nei)工(gong)控(kong)領(ling)域(yu)發(fa)展(zhan)最(zui)快(kuai)的(de)企(qi)業(ye)之(zhi)一(yi),也(ye)是(shi)國(guo)內(nei)少(shao)有(you)、完整掌握運動控製核心技術和實時工控軟件平台技術的企業。主要業務有:運動控製卡_運動控製器_EtherCAT運動控製卡_EtherCAT控製器_運動控製係統_視覺控製器__運動控製PLC_運動控製_機器人控製器_視覺定位_XPCIe/XPCI係列運動控製卡等等。

|