|
ZMC432CL-V2全閉環(huán)EtherCAT運動控制器簡介
ZMC432CL-V2高性能多軸運動控制器是一款兼容EtherCAT總線和脈沖型的獨立式運動控制器,具備高速實時反饋功能,支持脈沖全閉環(huán)控制,能夠?qū)崿F(xiàn)高精度、高響應速度的運動控制。高精度定位,有效消除機械傳動誤差,滿足高精密加工場景應用要求。

ZMC432CL-V2硬件功能:
①豐富的運動控制功能:支持直線、圓弧、空間圓弧、螺旋插補等。
②硬件接口豐富:支持脈沖軸(帶編碼器反饋)和EtherCAT總線軸,具備24路輸入和12路輸出的通用IO,部分為高速IO,2路模擬量輸出(DA)。
③EtherCAT刷新周期最快達250us,滿足高速通信需求。
④支持4通道硬件比較輸出、硬件定時器、運動中精準輸出,適用于多通道視覺飛拍等場合。
⑤支持掉電檢測、掉電存儲,多種程序加密方式,能夠有效防止系統(tǒng)故障,保護項目工程文件數(shù)據(jù),并提高系統(tǒng)的可靠性。
⑥通過純國產(chǎn)IDE開發(fā)環(huán)境RTSys進行項目開發(fā),可實時仿真、在線跟蹤以及診斷與調(diào)試,簡便易用,支持多種高級上位機語言聯(lián)合編程進行二次開發(fā)。

更多關(guān)于ZMC432CL-V2運動控制器的詳情點擊→步進控制的光柵尺全閉環(huán)解決方案:32軸EtherCAT總線運動控制器ZMC432CL-V2查看。
ZMC432CL-V2產(chǎn)品介紹視頻請點擊→步進控制的光柵尺全閉環(huán)解決方案:32軸EtherCAT總線運動控制器ZMC432CL-V2
為什么要進行軸運動到位判斷?
在工業(yè)運動控制現(xiàn)場,控制器僅依靠運動指令狀態(tài)判定動作結(jié)束,往往存在局限性。常規(guī)的IDLE狀態(tài)只能識別指令位置是否執(zhí)行完成,無法同步校驗電機、編碼器的實際運行位置。
尤其當電機存在運動滯后、傳動間隙等問題時,會出現(xiàn)“指令顯示停止,實際軸并未精準到位”的情況,進而導致上下工位對接異常、加工精度不足、設備聯(lián)動出錯等故障。
為保障設備運行精度與動作邏輯可靠,就需要結(jié)合現(xiàn)場工況,搭配多種方式綜合判斷軸是否真正運動到位。
本文將詳細介紹四種到位判斷方式、對應指令參數(shù)及編程實現(xiàn)方法,滿足不同步進、伺服驅(qū)動器的使用需求。
01 正運動軸運動到位功能介紹
正運動控制器判斷運動是否結(jié)束一般通過判斷對應軸的運動狀態(tài)指令【IDLE】值是否未為【0】:
①為【0】表示運動中。
②為【-1】表示停止。
但是【IDLE】只能判斷指令位置是否到位,并不關(guān)心實際電機,或者說編碼器反饋坐標是否到位。如果實際應用場景對于到位的要求比較嚴格,電機運動滯后嚴重的情況下,還需要加入電機實際位置是否到位的判斷。
02 判斷運動到位的四種方式
方式一:判斷運動狀態(tài)
通過指令位置的運動狀態(tài)【IDLE】指令返回是否為【0】來判斷運動是否結(jié)束。
這種方式用于不帶編碼器的步進,或沒接編碼器線的脈沖伺服?刂破鞯妮S類型一般為【ATYPE】1/7純脈沖軸,例程中以虛擬軸類型演示功能,實際應用中注意修改。
Basic指令介紹:

PC函數(shù)介紹:

方式二:判斷運動狀態(tài)與反饋速度
通過指令位置的運動狀態(tài)【IDLE】判斷運動是否結(jié)束的同時,加上對伺服電機反饋速度的判斷,當反饋速度低于一定閾值時認為電機到位。
這種方式要求脈沖伺服一定要把編碼器線正常接入控制器,總線驅(qū)動器不是總線步進類型即可。
Basic指令介紹:

PC函數(shù)介紹:

方式三:判斷運動狀態(tài)與到位標志(1)
通過指令位置的運動狀態(tài)【IDLE】判斷運動是否結(jié)束的同時,加上對到位標志【IN_POS】的判斷,需要先映射好到位信號輸入【AXISINP_IN】參數(shù)。
這種方式一般針對于有到位輸出功能的脈沖步進與伺服,且僅限4系列與部分其他型號支持,使用前需確認。
Basic指令介紹:


PC函數(shù)介紹:
到位標志與到位信號輸入在上位機暫時沒有直接對應的API函數(shù),需要間接通過軸參數(shù)修改函數(shù)【ZAux_Direct_GetParam】【ZAux_Direct_SetParam】訪問basic指令字符串【IN_POS】【AXISINP_IN】進行讀寫。


方式四:判斷運動狀態(tài)與到位標志(2)
通過指令位置的運動狀態(tài)【IDLE】判斷運動是否結(jié)束的同時,加上對到位標志【IN_POS】的判斷,需要先設置好到位距離【IN_POS_DIST】與到位速度【IN_POS_SPEED】兩個參數(shù),由于到位信號【AXISINP_IN】指令的優(yōu)先級高于到位速度與到位距離,因此還需要把【AXISINP_IN】設置為【-1】,保證取消了到位信號。
這種方式與方式二相同,同樣需要驅(qū)動器為帶編碼器的伺服驅(qū)動器,否則到位標志【IN_POS】無法實際反應電機實際位置情況。同方式三也僅限4系列與部分其他型號支持,使用前需確認。
Basic指令介紹:


PC函數(shù)介紹:
與方式三相同,到位距離與到位速度也需要間接通過軸參數(shù)修改函數(shù)【ZAux_Direct_GetParam】【ZAux_Direct_SetParam】訪問basic指令字符串【IN_POS_DIST】【IN_POS_SPEED】進行讀寫。
Basic編程使用說明:
(1)軸到位判斷模式與參數(shù)設置函數(shù)。
'/************************************************************
'任務編號: 無
'函數(shù)功能: 軸到位判斷設置
'Input:
'iaxis:軸號
'imode:模式選擇
'InpIn:到位輸入信號
'ispeed:到位速度閾值,反饋速度小于閾值認為到位
'idist:到位距離閾值,規(guī)劃位置與反饋位置差值小于閾值認為到位
'Output: 無
'返回值: 無
'備注: 無
'*************************************************************/
GLOBAL SUB TargetReach(iaxis,imode,InpIn,ispeed,idist)
IF imode = 1 THEN
'方式一:僅適用于不帶編碼器的步進軸
WAIT UNTIL IDLE(iaxis) '等待運動結(jié)束
ELSEIF imode = 2 THEN
'方式二:通過自定義反饋速度閾值來判斷是否到位。需要伺服帶編碼器,也是伺服軸到位的通用方式
WAIT UNTIL IDLE(iaxis) AND ABS(MSPEED(iaxis))<ispeed '等待運動結(jié)束、反饋速度小于閾值條件達成
ELSEIF imode = 3 THEN
'方式三:通過映射到位輸入信號【AXISINP_IN】與到位標志指令【IN_POS】判斷是否到位,需要伺服支持到位信號輸出功能,用于脈沖軸,部分低系列控制器可能不支持
AXISINP_IN(iaxis) = InpIn '映射輸入到位信號
WAIT UNTIL IDLE(iaxis) AND IN_POS(iaxis) '等待運動結(jié)束、到位標志觸發(fā)條件達成
ELSEIF imode = 4 THEN
'方式四:通過設置到位參數(shù)【IN_POS_DIST】【IN_POS_SPEED】與到位標志指令【IN_POS】判斷是否到位,需要伺服帶編碼器,部分低系列控制器可能不支持
AXISINP_IN(iaxis) = -1 '到位信號的優(yōu)先級高于到位距離、到位速度參數(shù),如果操作不當設置了需要取消映射
IN_POS_SPEED(iaxis) = ispeed '設置到位速度
IN_POS_DIST(iaxis) = idist '設置到位距離
WAIT UNTIL IDLE(iaxis) AND IN_POS(iaxis) '等待運動結(jié)束、到位標志觸發(fā)條件達成
ENDIF
ENDSUB
(2)軸到位判斷函數(shù)使用示例。
GLOBAL CONST mode = 0'選擇對應的測試模式
if mode=1 then
BASE(0)
ATYPE = 0 '設置虛擬軸類型
UNITS = 100'設置脈沖當量
SPEED = 100 '設置運動速度
ACCEL = 10000'設置運動加速度
DECEL = 10000 '設置運動減速度
AXIS_STOPREASON = 0'清除軸歷史停止原因
MOVE(1000) '執(zhí)行運動
TargetReach(0,mode,0,0,0) '軸0使用方式1判斷到位,當運動結(jié)束時執(zhí)行后續(xù)程序
if AXIS_STOPREASON(0)=0 then '判斷軸0是否正常運動停止,輸出異常停止錯誤碼
PRINT "運動到位"
else
''''''''''''處理運動異常流程''''''''''''
PRINT "軸運動異常停止,停止錯誤碼:"+TOSTR(AXIS_STOPREASON(0),1,0)
endif
elseif mode=2 then
BASE(0)
ATYPE = 0'設置虛擬軸類型
UNITS = 100 '設置脈沖當量
SPEED = 100'設置運動速度
ACCEL = 10000 '設置運動加速度
DECEL = 10000'設置運動減速度
AXIS_STOPREASON = 0 '清除軸歷史停止原因
MOVE(1000) '執(zhí)行運動
TargetReach(0,mode,0,0.1,0) '軸0使用方式2判斷到位,當運動結(jié)束且反饋速度閾值低于0.1時執(zhí)行后續(xù)程序
if AXIS_STOPREASON(0)=0 then '判斷軸0是否正常運動停止,輸出異常停止錯誤碼
PRINT "運動到位"
else
''''''''''''處理運動異常流程''''''''''''
PRINT "軸運動異常停止,停止錯誤碼:"+TOSTR(AXIS_STOPREASON(0),1,0)
endif
elseif mode=3 then
BASE(0)
ATYPE = 0 '設置虛擬軸類型
UNITS = 100'設置脈沖當量
SPEED = 100 '設置運動速度
ACCEL = 10000'設置運動加速度
DECEL = 10000 '設置運動減速度
INVERT_IN(1,ON) 'ZMC系列控制器默認到位輸入口常閉有效,需要反轉(zhuǎn)輸入口邏輯,ECI系列控制器不用反轉(zhuǎn)
AXIS_STOPREASON = 0 '清除軸歷史停止原因
MOVE(1000) '執(zhí)行運動
TargetReach(0,mode,1,0,0) '軸0使用方式3判斷到位,當運動結(jié)束且到位輸入口IN1觸發(fā)后執(zhí)行后續(xù)程序
if AXIS_STOPREASON(0)=0 then '判斷軸0是否正常運動停止,輸出異常停止錯誤碼
PRINT "運動到位"
else
''''''''''''處理運動異常流程''''''''''''
PRINT "軸運動異常停止,停止錯誤碼:"+TOSTR(AXIS_STOPREASON(0),1,0)
endif
elseif mode=4 then
BASE(0)
ATYPE = 0 '設置虛擬軸類型
UNITS = 100'設置脈沖當量
SPEED = 100 '設置運動速度
ACCEL = 10000'設置運動加速度
DECEL = 10000 '設置運動減速度
AXIS_STOPREASON = 0'清除軸歷史停止原因
MOVE(1000) '執(zhí)行運動
TargetReach(0,mode,0,0.1,0.1) '軸0使用方式4判斷到位,當運動結(jié)束,反饋速度閾值低于0.1且反饋位置與規(guī)劃位置差值低于0.1時執(zhí)行后續(xù)程序
if AXIS_STOPREASON(0)=0 then '判斷軸0是否正常運動停止,輸出異常停止錯誤碼
PRINT "運動到位"
else
''''''''''''處理運動異常流程''''''''''''
PRINT "軸運動異常停止,停止錯誤碼:"+TOSTR(AXIS_STOPREASON(0),1,0)
endif
endif
END
C#編程使用說明:
(1)軸到位判斷模式與參數(shù)設置函數(shù)。
/// /// 軸到位判斷設置
/// /// 軸號/// 模式選擇/// 到位輸入信號/// 到位速度閾值,反饋速度小于閾值認為到位/// 到位距離閾值,規(guī)劃位置與反饋位置差值小于閾值認為到位private void TargetReach(int iaxis, int imode, int InpIn, float ispeed, float idist)
{
int Idle = -1; //運動狀態(tài)
float Mspeed = 0; //編碼器反饋速度
float Inpos = -1; //到位標志狀態(tài)
switch (imode)
{
case 1:
//方式一:僅適用于不帶編碼器的步進軸
while (true)
{
zmcaux.ZAux_Direct_GetIfIdle(g_handle, testAxis, ref Idle); //獲取軸0運動狀態(tài)
if (Idle != 0) { break; } //等待運動結(jié)束
Thread.Sleep(50);
}
break;
case 2:
//方式二:通過自定義反饋速度閾值來判斷是否到位。需要伺服帶編碼器,也是伺服軸到位的通用方式
while (true)
{
zmcaux.ZAux_Direct_GetIfIdle(g_handle, testAxis, ref Idle); //獲取軸0運動狀態(tài)
zmcaux.ZAux_Direct_GetMspeed(g_handle, testAxis, ref Mspeed); //獲取軸0反饋速度
if ((Idle != 0) && (Math.Abs(Mspeed) < ispeed)) { break; } //等待運動結(jié)束、反饋速度小于閾值條件達成
Thread.Sleep(50);
}
break;
case 3:
//方式三:通過映射到位輸入信號【AXISINP_IN】與到位標志指令【IN_POS】判斷是否到位,需要伺服支持到位信號輸出功能,用于脈沖軸,部分低系列控制器可能不支持
zmcaux.ZAux_Direct_SetParam(g_handle, "AXISINP_IN", testAxis, InpIn); //映射輸入到位信號
while (true)
{
zmcaux.ZAux_Direct_GetIfIdle(g_handle, testAxis, ref Idle); //獲取軸0運動狀態(tài)
zmcaux.ZAux_Direct_GetParam(g_handle, "IN_POS", testAxis, ref Inpos); //獲取到位標志狀態(tài)
if ((Idle != 0) && (Inpos != 0)) { break; } //等待運動結(jié)束、到位標志觸發(fā)條件達成
Thread.Sleep(50);
}
break;
case 4:
//方式四:通過設置到位參數(shù)【IN_POS_DIST】【IN_POS_SPEED】與到位標志指令【IN_POS】判斷是否到位,需要伺服帶編碼器,部分低系列控制器可能不支持
zmcaux.ZAux_Direct_SetParam(g_handle, "AXISINP_IN", testAxis, -1); //到位信號的優(yōu)先級高于到位距離、到位速度參數(shù),如果操作不當設置了需要取消映射
zmcaux.ZAux_Direct_SetParam(g_handle, "IN_POS_SPEED", testAxis, ispeed); //設置到位速度
zmcaux.ZAux_Direct_SetParam(g_handle, "IN_POS_DIST", testAxis, idist); //設置到位距離
while (true)
{
zmcaux.ZAux_Direct_GetIfIdle(g_handle, testAxis, ref Idle); //獲取軸0運動狀態(tài)
zmcaux.ZAux_Direct_GetParam(g_handle, "IN_POS", testAxis, ref Inpos); //獲取到位標志狀態(tài)
if ((Idle != 0) && (Inpos != 0)) { break; } //等待運動結(jié)束、到位標志觸發(fā)條件達成
Thread.Sleep(50);
}
break;
}
}
(2)軸到位判斷函數(shù)使用示例。
//C#開發(fā)軸到位判斷使用示例:
private int caseTest()
{
float Stopreason = 0;
if (mode == 1)
{
//設置測試運動軸運動參數(shù)
zmcaux.ZAux_Direct_SetAtype(g_handle, testAxis, 0); //設置虛擬軸類型
zmcaux.ZAux_Direct_SetUnits(g_handle, testAxis, 100); //設置脈沖當量
zmcaux.ZAux_Direct_SetSpeed(g_handle, testAxis, 100); //設置運動速度
zmcaux.ZAux_Direct_SetAccel(g_handle, testAxis, 1000); //設置運動加速度
zmcaux.ZAux_Direct_SetDecel(g_handle, testAxis, 1000); //設置運動減速度
zmcaux.ZAux_Direct_SetParam(g_handle, "AXIS_STOPREASON", testAxis, 0); //清除軸歷史停止原因
zmcaux.ZAux_Direct_Single_Move(g_handle, testAxis, 1000); //執(zhí)行運動
TargetReach(testAxis, mode, 0, 0, 0); //軸0使用方式1判斷到位,當運動結(jié)束時執(zhí)行后續(xù)程序
zmcaux.ZAux_Direct_GetParam(g_handle, "AXIS_STOPREASON", testAxis, ref Stopreason); //獲取到位后的停止原因,0為正常停止
}
else if (mode == 2)
{
//設置測試運動軸運動參數(shù)
zmcaux.ZAux_Direct_SetAtype(g_handle, testAxis, 0); //設置虛擬軸類型
zmcaux.ZAux_Direct_SetUnits(g_handle, testAxis, 100); //設置脈沖當量
zmcaux.ZAux_Direct_SetSpeed(g_handle, testAxis, 100); //設置運動速度
zmcaux.ZAux_Direct_SetAccel(g_handle, testAxis, 1000); //設置運動加速度
zmcaux.ZAux_Direct_SetDecel(g_handle, testAxis, 1000); //設置運動減速度
zmcaux.ZAux_Direct_SetParam(g_handle, "AXIS_STOPREASON", testAxis, 0); //清除軸歷史停止原因
zmcaux.ZAux_Direct_Single_Move(g_handle, testAxis, 1000); //執(zhí)行運動
TargetReach(testAxis, mode, 0, 00.1f, 0); //軸0使用方式2判斷到位,當運動結(jié)束且反饋速度閾值低于0.1時執(zhí)行后續(xù)程序
zmcaux.ZAux_Direct_GetParam(g_handle, "AXIS_STOPREASON", testAxis, ref Stopreason); //獲取到位后的停止原因,0為正常停止
}
else if (mode == 3)
{
//設置測試運動軸運動參數(shù)
zmcaux.ZAux_Direct_SetAtype(g_handle, testAxis, 0); //設置虛擬軸類型
zmcaux.ZAux_Direct_SetUnits(g_handle, testAxis, 100); //設置脈沖當量
zmcaux.ZAux_Direct_SetSpeed(g_handle, testAxis, 100); //設置運動速度
zmcaux.ZAux_Direct_SetAccel(g_handle, testAxis, 1000); //設置運動加速度
zmcaux.ZAux_Direct_SetDecel(g_handle, testAxis, 1000); //設置運動減速度
zmcaux.ZAux_Direct_SetParam(g_handle, "AXIS_STOPREASON", testAxis, 0); //清除軸歷史停止原因
zmcaux.ZAux_Direct_Single_Move(g_handle, testAxis, 1000); //執(zhí)行運動
TargetReach(testAxis, mode, 1, 0, 0); //軸0使用方式3判斷到位,當運動結(jié)束且到位輸入口IN1觸發(fā)后執(zhí)行后續(xù)程序
zmcaux.ZAux_Direct_GetParam(g_handle, "AXIS_STOPREASON", testAxis, ref Stopreason); //獲取到位后的停止原因,0為正常停止
}
else if (mode == 4)
{
//設置測試運動軸運動參數(shù)
zmcaux.ZAux_Direct_SetAtype(g_handle, testAxis, 0); //設置虛擬軸類型
zmcaux.ZAux_Direct_SetUnits(g_handle, testAxis, 100); //設置脈沖當量
zmcaux.ZAux_Direct_SetSpeed(g_handle, testAxis, 100); //設置運動速度
zmcaux.ZAux_Direct_SetAccel(g_handle, testAxis, 1000); //設置運動加速度
zmcaux.ZAux_Direct_SetDecel(g_handle, testAxis, 1000); //設置運動減速度
zmcaux.ZAux_Direct_SetParam(g_handle, "AXIS_STOPREASON", testAxis, 0); //清除軸歷史停止原因
zmcaux.ZAux_Direct_Single_Move(g_handle, testAxis, 1000); //執(zhí)行運動
TargetReach(testAxis, mode, 0, 0.1f, 0.1f); //軸0使用方式4判斷到位,當運動結(jié)束,反饋速度閾值低于0.1且反饋位置與規(guī)劃位置差值低于0.1時執(zhí)行后續(xù)程序
zmcaux.ZAux_Direct_GetParam(g_handle, "AXIS_STOPREASON", testAxis, ref Stopreason); //獲取到位后的停止原因,0為正常停止
}
//判斷軸0是否正常運動停止,輸出異常停止錯誤碼
if (Stopreason != 0)
{
//軸運動異常停止,異常停止報錯碼:Stopreason
return Convert.ToInt32(Stopreason);
}
else return 0;
}
完整代碼獲取地址
▼

本次,正運動技術(shù)全閉環(huán)EtherCAT運動控制器運動到位判斷方式詳解,就分享到這里。
更多精彩內(nèi)容請關(guān)注“正運動小助手”公眾號,需要相關(guān)開發(fā)環(huán)境與例程代碼,請咨詢正運動技術(shù)銷售工程師:400-089-8936。

正運動技術(shù)專注于運動控制技術(shù)研究和通用運動控制軟硬件產(chǎn)品的研發(fā),是國家級高新技術(shù)企業(yè)。正運動技術(shù)匯集了來自華為、中興等公司的優(yōu)秀人才,在堅持自主創(chuàng)新的同時,積極聯(lián)合各大高校協(xié)同運動控制基礎技術(shù)的研究。主要業(yè)務有:運動控制卡_運動控制器_EtherCAT運動控制卡_EtherCAT控制器_運動控制系統(tǒng)_視覺控制器__運動控制PLC_運動控制_機器人控制器_視覺定位_XPCIe/XPCI系列運動控制卡等等。
|