http://www.henanjusheng.com 2026-06-17 11:22 深圳市正運(yùn)動(dòng)技術(shù)有限公司
ZMC432CL-V2全閉環(huán)EtherCAT運(yùn)動(dòng)控制器簡(jiǎn)介
ZMC432CL-V2高性能多軸運(yùn)動(dòng)控制器是一款兼容EtherCAT總線和脈沖型的獨(dú)立式運(yùn)動(dòng)控制器,具備高速實(shí)時(shí)反饋功能,支持脈沖全閉環(huán)控制,能夠?qū)崿F(xiàn)高精度、高響應(yīng)速度的運(yùn)動(dòng)控制。高精度定位,有效消除機(jī)械傳動(dòng)誤差,滿足高精密加工場(chǎng)景應(yīng)用要求。

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

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

PC函數(shù)介紹:

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

PC函數(shù)介紹:

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


PC函數(shù)介紹:
到位標(biāo)志與到位信號(hào)輸入在上位機(jī)暫時(shí)沒(méi)有直接對(duì)應(yīng)的API函數(shù),需要間接通過(guò)軸參數(shù)修改函數(shù)【ZAux_Direct_GetParam】【ZAux_Direct_SetParam】訪問(wèn)basic指令字符串【IN_POS】【AXISINP_IN】進(jìn)行讀寫。


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


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

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

正運(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ù)匯集了來(lái)自華為、中興等公司的優(yōu)秀人才,在堅(jiān)持自主創(chuàng)新的同時(shí),積極聯(lián)合各大高校協(xié)同運(yùn)動(dòng)控制基礎(chǔ)技術(shù)的研究。主要業(yè)務(wù)有:運(yùn)動(dòng)控制卡_運(yùn)動(dòng)控制器_EtherCAT運(yùn)動(dòng)控制卡_EtherCAT控制器_運(yùn)動(dòng)控制系統(tǒng)_視覺(jué)控制器__運(yùn)動(dòng)控制PLC_運(yùn)動(dòng)控制_機(jī)器人控制器_視覺(jué)定位_XPCIe/XPCI系列運(yùn)動(dòng)控制卡等等。