0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

應(yīng)用ZMC408SCAN開放式激光振鏡運(yùn)動(dòng)控制器的C++開發(fā)

伺服與運(yùn)動(dòng)控制 ? 來源:正運(yùn)動(dòng)技術(shù) ? 作者:正運(yùn)動(dòng)技術(shù) ? 2022-10-24 11:26 ? 次閱讀

今天,正運(yùn)動(dòng)技術(shù)為大家分享一下應(yīng)用ZMC408SCAN開放式激光振鏡運(yùn)動(dòng)控制器C++開發(fā),實(shí)現(xiàn)激光振鏡打標(biāo)。

除了C++還支持使用其他上位機(jī)軟件來開發(fā),上位機(jī)程序運(yùn)行時(shí)需要?jiǎng)討B(tài)庫“zmotion.dll”,上位機(jī)開發(fā)調(diào)試時(shí)可以把ZDevelop軟件同時(shí)連接到控制器輔助調(diào)試。

01 ZMC408SCAN控制器介紹

ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光振鏡運(yùn)動(dòng)控制器,專為工業(yè)激光+振鏡+運(yùn)動(dòng)控制方面的應(yīng)用而設(shè)計(jì)。通過EtherCAT總線和脈沖軸接口能實(shí)現(xiàn)多軸聯(lián)動(dòng)運(yùn)動(dòng)控制。

ZMC408SCAN支持ETHERNET、EtherCAT、USB、CAN、RS485、RS232等通訊接口,通過CAN、EtherCAT總線可以連接各個(gè)擴(kuò)展模塊,從而擴(kuò)展數(shù)字量、模擬量或運(yùn)動(dòng)軸。

(1)ZMC408SCAN內(nèi)置高精度PSO位置同步輸出功能,在加工圓角、曲線部分時(shí)即使進(jìn)行了減速調(diào)整,在高速加工的場(chǎng)合,也能控制激光輸出的間距保持恒定;

(2)支持激光振鏡控制和振鏡反饋,包含2個(gè)振鏡接口,支持2D振鏡和3D振鏡,配合不帶加減速的運(yùn)動(dòng)指令MOVESCAN,拐角處振鏡加工自動(dòng)延時(shí),完成精準(zhǔn)高效的激光控制,提高激光加工設(shè)備的產(chǎn)能;

(3)通過指令在運(yùn)動(dòng)中靈活的調(diào)節(jié)激光開光/關(guān)光延時(shí),響應(yīng)快,精確到us級(jí)別的控制,且設(shè)置過程簡(jiǎn)單,大大縮短了工程師的調(diào)參時(shí)間;

(4)自帶LASER激光器控制接口,支持IPG、YLR、YLS等類型激光電源,還帶一個(gè)EXIO擴(kuò)展IO接口,通過定制轉(zhuǎn)接板,靈活控制市場(chǎng)上主流的各種激光器;

(5)支持PC同時(shí)控制16個(gè)ZMC408SCAN控制器同時(shí)工作,形成一種振鏡陣列的激光加工;

(6)板載4路高速差分脈沖輸出,并帶4路高速差分編碼器反饋,支持EtherCAT總線驅(qū)動(dòng)器的控制,支持5軸XYZAC軸的插補(bǔ),支持振鏡軸與運(yùn)動(dòng)軸混合插補(bǔ);

(7)支持直線插補(bǔ)、任意圓弧插補(bǔ)、空間圓弧、螺旋插補(bǔ)、電子凸輪、電子齒輪、同步跟隨、虛擬軸設(shè)置等多種運(yùn)動(dòng)控制功能。

02 系統(tǒng)架構(gòu) 9f5a5076-5267-11ed-a3b6-dac502259ad0.png

下圖為ZMC408SCAN開放式激光控制器的參考架構(gòu),支持多種不同類型的激光器控制。

9fa7626c-5267-11ed-a3b6-dac502259ad0.png

03 上位機(jī)和控制器通訊 9f5a5076-5267-11ed-a3b6-dac502259ad0.png

上位機(jī)和控制器通訊調(diào)用正運(yùn)動(dòng)封裝好的函數(shù)庫,提供運(yùn)動(dòng)控制和激光控制等眾多函數(shù)庫接口,激光振鏡的系統(tǒng)架構(gòu)參見下圖。

9fe14f04-5267-11ed-a3b6-dac502259ad0.png

本例采用EtherNET網(wǎng)口連接控制器,通過函數(shù)ZAux_OpenEth()建立通訊連接,用戶可在設(shè)置好的界面中選擇當(dāng)前網(wǎng)段下的控制器IP完成連接,控制器出廠IP地址192.168.0.11,參見下圖。

9fef7458-5267-11ed-a3b6-dac502259ad0.png

04 激光控制 9f5a5076-5267-11ed-a3b6-dac502259ad0.png一、指令介紹

下面是我們程序中用到的接口函數(shù),主要包含激光控制和激光振鏡控制兩部分,程序的實(shí)現(xiàn)可直接使用封裝好的接口函數(shù)發(fā)送命令給控制器。

本例采用FIBER激光器和2D激光振鏡,用到下面的函數(shù)接口:

ZAux_Direct_MoveScanAbs:振鏡軸多軸絕對(duì)直線插補(bǔ)SCAN運(yùn)動(dòng),不帶加減速過程,我們這里用來控制振鏡軸運(yùn)動(dòng),通過小線段的形式擬合圓形軌跡;

ZAux_Direct_MoveOpDelay:緩沖輸出延時(shí),提前開光時(shí)將延時(shí)時(shí)間設(shè)置為負(fù)數(shù);

ZAux_Direct_MoveDelay:緩沖輸出延時(shí),我們這里用來延時(shí)關(guān)光。

激光功率設(shè)置: 提供模擬量ZAux_Direct_SetDA、PWM的占空比ZAux_Direct_SetPwmDuty和頻率ZAux_Direct_SetPwmFreq等方式控制 設(shè)置振鏡軸拐角處自動(dòng)延時(shí):

ZAux_Direct_SetCornerMode

1.振鏡軸直線插補(bǔ)

ZAux_Direct_MoveScanAbs絕對(duì)運(yùn)動(dòng),ZAux_Direct_MoveScan相對(duì)運(yùn)動(dòng)。

指令27 ZAux_Direct_MoveScanAbs
指令原型 int32 __stdcall ZAux_Direct_MoveScanAbs(ZMC_HANDLE handle, int imaxaxises, int *piAxislist,float *pfDisancelist)
指令說明 振鏡軸多軸相對(duì)直線插補(bǔ)Scan運(yùn)動(dòng)。
輸入參數(shù)
參數(shù)名 描述
handle 連接句柄。
imaxaxises 運(yùn)動(dòng)軸數(shù)。
piAxislist 軸列表數(shù)組。
pfDisancelist 運(yùn)動(dòng)的距離列表。
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 插補(bǔ)運(yùn)動(dòng)距離X=
運(yùn)動(dòng)時(shí)間T=X/主軸速度
插補(bǔ)運(yùn)動(dòng)時(shí)只有主軸速度參數(shù)有效,主軸是軸列表數(shù)組的第一個(gè)軸,運(yùn)動(dòng)參照這個(gè)軸的參數(shù)。

2.設(shè)置開關(guān)光

輸出狀態(tài)為0關(guān)光,輸出狀態(tài)為1開光。

指令1 ZAux_Direct_SetOp
指令原型 int32 __stdcall ZAux_Direct_SetOp(ZMC_HANDLE handle, int ionum,uint32 iValue);
指令說明 打開輸出口,參見軟件手冊(cè)里面的“OP”指令。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接句柄。
ionum 輸入口編號(hào)。
piValue 設(shè)置的輸出口的狀態(tài)值。
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 ZIO擴(kuò)展板的IO通道號(hào)與撥碼有關(guān),起始值為(16 +撥碼組合值*16),EIO總線擴(kuò)展IO使用NODE_IO指令,只能設(shè)置為8的倍數(shù),詳細(xì)查看硬件手冊(cè)。
注意IO映射編號(hào)要大于控制器自身最大的IO編號(hào),不能與控制器的編號(hào)重合。
最多可操作32個(gè)輸出口。

3.開關(guān)光延時(shí)

指令13 ZAux_Direct_MoveDelay
指令原型 int32 __stdcall ZAux_Direct_MoveDelay(ZMC_HANDLE handle, int iaxis, int itimems)
指令說明 運(yùn)動(dòng)緩沖里面寫入延時(shí)。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接標(biāo)識(shí)。
iaxis 軸號(hào)。
itimems 延時(shí)時(shí)間MS。
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
指令示例 ZAux_Direct_Single_Move(handle, 0, 100);//軸0正向運(yùn)動(dòng)100
ZAux_Direct_MoveDelay(handle, 0,1000);//軸0正向運(yùn)動(dòng)100后延時(shí)1s,才執(zhí)行下一條緩沖
詳細(xì)說明 前面的運(yùn)動(dòng)指令結(jié)束時(shí)速度會(huì)自動(dòng)降為0,然后延時(shí)等待。

4.提前/延時(shí)開關(guān)光

正數(shù)時(shí)間延時(shí),負(fù)數(shù)時(shí)間提前開關(guān)光。

指令14 ZAux_Direct_MoveOpDelay
指令原型 int32 __stdcall ZAux_Direct_MoveOpDelay(ZMC_HANDLE handle, float uTime, int nAxis)
指令說明 軸緩沖中MOVEOP精準(zhǔn)高速輸出口提前/延時(shí)輸出。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接標(biāo)識(shí)。
uTime 延時(shí)時(shí)間MS,支持小數(shù)到us控制。
nAxis 軸號(hào)。
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
指令示例 ZAux_Direct_MoveOpDelay(handle,0,-1.5); //后面軸0的MOVE_OP輸出口提前1.5ms動(dòng)作。
ZAux_Direct_Single_Move(handle, 0, 100);//軸0正向運(yùn)動(dòng)100
ZAux_Direct_MoveOp(handle, 0,0, 1);//軸0正向運(yùn)動(dòng)100后把out0的狀態(tài)置為1
詳細(xì)說明 不影響插補(bǔ)軸速度曲線,只對(duì)MOVE_OP輸出口進(jìn)行延時(shí)操作,設(shè)置負(fù)值時(shí)表示提前輸出。

5.設(shè)置激光能量(功率)

通過改變模擬量輸出的電壓值來控制激光能量大小。

指令7 ZAux_Direct_SetDA
指令原型 int32 __stdcall ZAux_Direct_SetDA(ZMC_HANDLE handle, int ionum, float fValue);
指令說明 打開模擬量輸出口,參見軟件手冊(cè)里面的“AOUT”指令。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接句柄。
ionum DA輸出口編號(hào)。
fValue 設(shè)置值
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 12位刻度值范圍0~4095對(duì)應(yīng)0~10V電壓。
16位刻度值范圍0~65536對(duì)應(yīng)0~10V電壓。

6.PWM占空比

通過設(shè)置PWM的占空比來調(diào)整激光頻率,在開始打軌跡之前一定要先設(shè)置好。

指令4 ZAux_Direct_SetPwmDuty
指令原型 int32 __stdcall ZAux_Direct_SetPwmDuty(ZMC_HANDLE handle, int ionum, float fValue);
指令說明 pwm占空比設(shè)置,參見軟件手冊(cè)里面的“PWM_DUTY”指令。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接句柄。
ionum PWM口編號(hào)。
fValue 設(shè)置值
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 PWM只能通過設(shè)置占空比為0來關(guān)閉,不能通過設(shè)置PWM頻率為0實(shí)現(xiàn),PWM頻率一定要在PWM開關(guān)之前調(diào)整。
占空比指有效電平占整個(gè)周期的比例。
一個(gè)周期中先輸出有效電平,再輸出無效電平。
PWM的實(shí)際輸出受輸出口的控制,必須輸出口打開,PWM才能輸出,否則輸出被屏蔽掉??梢韵乳_PWM功能,然后再開輸出口,這樣實(shí)現(xiàn)激光電源的首脈沖抑制功能。

7.PWM頻率

指令3 ZAux_Direct_SetPwmFreq
指令原型 int32 __stdcall ZAux_Direct_SetPwmFreq(ZMC_HANDLE handle, int
ionum, float fValue);
指令說明 pwm 頻率設(shè)置, 參見軟件手冊(cè)里面的“ PWM_FREQ”指令。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接句柄。
ionum PWM口編號(hào)。
fValue 設(shè)置值
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 PWM只能通過設(shè)置占空比為0來關(guān)閉,不能通過設(shè)置PWM頻率為0實(shí)現(xiàn),不要將頻率設(shè)為0,PWM頻率一定要在PWM開關(guān)之前調(diào)整。

8.振鏡軸拐角延時(shí)

指令15 ZAux_Direct_SetCornerMode
指令原型 int32 __stdcall ZAux_Direct_SetCornerMode(ZMC_HANDLE handle, int iaxis, int iValue);
指令說明 設(shè)置振鏡軸SCAN指令拐角延時(shí)模式。針對(duì)非Scan運(yùn)動(dòng)指令意義不同。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接句柄。
iaxis 軸號(hào)。
iValue 模式設(shè)置
描述
0 1 預(yù)留
1 2 自動(dòng)拐角延時(shí)
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 mode:不同的位代表不同的意義,位可以同時(shí)使用。
描述
0 1 預(yù)留
1 2 自動(dòng)拐角延時(shí)
拐角延時(shí)時(shí)間以ZSmooth值為最大參考時(shí)間根據(jù)DECEL_ANGLE和STOP_ANGLE值線性的計(jì)算減速時(shí)間。
拐角時(shí)間=(拐角角度-DECEL_ANGLE)/(STOP_ANGLE-DECEL_ANGLE)*ZSmooth

9.拐角延時(shí)起始角度

指令16 ZAux_Direct_SetDecelAngle
指令原型 int32 __stdcall ZAux_Direct_SetDecelAngle(ZMC_HANDLE handle, int iaxis, float fValue);
指令說明 設(shè)置拐角減速角度,開始減速角度,單位為弧度。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接句柄。
iaxis 軸號(hào)。
fValue 設(shè)置的拐角減速角度。
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 拐角延時(shí)時(shí)間以ZSMOOTH為參考,一定要設(shè)置合理的FORCE_SPEED。
角度轉(zhuǎn)換弧度公式:角度值*(PI/180)
減速角度是指電機(jī)的參考角度相對(duì)上一條運(yùn)動(dòng)的變化值。如下圖。
此角度值不是實(shí)際軌跡的角度,是換算到電機(jī)變換的角度,此角度值僅為參考。
a00b7aea-5267-11ed-a3b6-dac502259ad0.png
下一插補(bǔ)運(yùn)動(dòng)軌跡處于下方時(shí)取絕對(duì)值。
直線與圓弧相連時(shí)按照?qǐng)A弧的切線方向計(jì)算角度。
與STOP_ANGLE一起使用,當(dāng)實(shí)際運(yùn)動(dòng)的角度處于DECEL_ANGLE(上限)與STOP_ANGLE(下限)之間線性自動(dòng)計(jì)算延時(shí)時(shí)間。

10.拐角延時(shí)結(jié)束角度

指令17 ZAux_Direct_SetStopAngle
指令原型 int32 __stdcall ZAux_Direct_SetStopAngle(ZMC_HANDLE handle, int iaxis, float pfValue);
指令說明 設(shè)置停止減速角度。
輸入?yún)?shù)
參數(shù)名 描述
handle 連接句柄。
iaxis 軸號(hào)。
pfValue 停止減速角度。
輸出參數(shù) /
返回值 成功返回值為0,非0詳見錯(cuò)誤碼說明。
詳細(xì)說明 拐角延時(shí)時(shí)間以ZSMOOTH為參考,一定要設(shè)置合理的FORCE_SPEED。
角度轉(zhuǎn)換弧度公式:角度值*(PI/180)
減速角度是指電機(jī)的參考角度相對(duì)上一條運(yùn)動(dòng)的變化值。如下圖。
此角度值不是實(shí)際軌跡的角度,是換算到電機(jī)變換的角度,此角度值僅為參考。
a00b7aea-5267-11ed-a3b6-dac502259ad0.png
下一插補(bǔ)運(yùn)動(dòng)軌跡處于下方時(shí)取絕對(duì)值。
直線與圓弧相連時(shí)按照?qǐng)A弧的切線方向計(jì)算角度。
與STOP_ANGLE一起使用,當(dāng)實(shí)際運(yùn)動(dòng)的角度處于DECEL_ANGLE(上限)與STOP_ANGLE(下限)之間線性自動(dòng)計(jì)算延時(shí)時(shí)間。。

二、程序流程

先建立控制器通訊,獲取連接句柄,激光器選擇及參數(shù)設(shè)置,然后編輯紅光與激光口控制開關(guān),運(yùn)動(dòng)參數(shù)設(shè)置,軌跡參數(shù)進(jìn)行小線段處理,開始運(yùn)動(dòng),停止運(yùn)動(dòng)。

a03b53e6-5267-11ed-a3b6-dac502259ad0.pnga0449d3e-5267-11ed-a3b6-dac502259ad0.png

三、主要程序展示

初始化定義相關(guān)變量,初始化軸參數(shù),配置好FIBER轉(zhuǎn)接板的方向?yàn)檩敵?,后續(xù)的激光軌跡加工控制由按鈕觸發(fā)。

在運(yùn)動(dòng)之前我們要設(shè)置好空移速度、打標(biāo)速度、開關(guān)光延時(shí)、軌跡圓半徑、標(biāo)刻行列數(shù)、圓心距等參數(shù)。運(yùn)動(dòng)開始直接調(diào)用這些相關(guān)參數(shù)執(zhí)行,獲取完軌跡后調(diào)用3次文件執(zhí)行。

1.初始化408FIBER轉(zhuǎn)換板針腳定義,不同激光器類型定義一套不同的輸出口,輸出口可以在選擇激光器類型后對(duì)應(yīng)在界面上進(jìn)行修改。

408 FIBER轉(zhuǎn)換板參數(shù)初始化程序:

void CZmc_fontToMoveDlg::OnCbnSelchangeComboLaser()
{
    // TODO: 在此添加控件通知處理程序代碼
    UpdateData(TRUE);
    if(m_nLaserType == FIBER_408)  //408 FIBER轉(zhuǎn)換板參數(shù)設(shè)置
    {
        char  cmdbuffAck[2048] = "";
        int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $8FFFF)",cmdbuffAck,2048);
        m_nEnableIO = 47;  //使能io
        m_nLaserIO = 8;    //出關(guān)io
        m_nRedIO = 48;     //紅光io
        m_nAout = 3;       //功率io
        m_nPwmIo = 9;      //頻率io
    }
    else if(m_nLaserType == YLR_408)
    {
        m_nEnableIO = 31;  //使能io
        m_nLaserIO = 8;    //出關(guān)io
        m_nRedIO = 32;     //紅光io
        m_nAout = 2;       //功率io
        m_nPwmIo = 9;      //頻率io
    }
    else if(m_nLaserType == YAG_408)  //408 YAG轉(zhuǎn)換板參數(shù)設(shè)置
    {
        char  cmdbuffAck[2048] = "";
        int iresult = ZAux_Execute(m_Handle,"EXIO_DIR(0, $AFBBF)",cmdbuffAck,2048);
        m_nEnableIO = 47;   //使能io
        m_nLaserIO = 8;     //出關(guān)io
        m_nRedIO = 48;      //紅光io
        m_nAout = 3;        //功率io
        m_nPwmIo = 9;      //頻率io
    }
    else if(m_nLaserType == FIBER_504)    //504
    {
        m_nEnableIO = 5;    //使能io
        m_nLaserIO = 6;     //出關(guān)io
        m_nRedIO = 28;     //紅光io
        m_nAout = 2;      //功率io
        m_nPwmIo = 7;     //頻率io
    }
    UpdateData(FALSE);
}
2.設(shè)置拐角延時(shí)與激光功率,再調(diào)用運(yùn)動(dòng)執(zhí)行,程序如下。
void CZmc_fontToMoveDlg::OnBnClickedBtnMove()
{
    // TODO: 在此添加控件通知處理程序代碼
    UpdateData(TRUE);
    //設(shè)置拐角減速此ZSMOOTH為拐角延時(shí)
    int iresult = ZAux_Direct_SetCornerMode(m_Handle,SCAN_AxisX,2);  
    //設(shè)置精準(zhǔn)輸出
    iresult = ZAux_Direct_SetParam(m_Handle,"AXIS_ZSET",SCAN_AxisX,3);      
    //設(shè)置拐角延時(shí)
    iresult = ZAux_Direct_SetZsmooth(m_Handle,SCAN_AxisX,m_nCorDelay);      
    //設(shè)置拐角起始角度,減速時(shí)間在DecelAngle-StopAngle線性變化
    iresult = ZAux_Direct_SetDecelAngle(m_Handle,SCAN_AxisX,0);            //設(shè)置拐角結(jié)束角度
    iresult = ZAux_Direct_SetStopAngle(m_Handle,SCAN_AxisX,90/180*3.1415926);  
//設(shè)置激光功率
    iresult = ZAux_Direct_SetDA(m_Handle,m_nAout,m_nAoutVal);          
    //設(shè)置激光頻率
    iresult = ZAux_Direct_SetPwmDuty(m_Handle,m_nPwmIo,0.5);        
    iresult = ZAux_Direct_SetPwmFreq(m_Handle,m_nPwmIo,m_nPwmFreq);    
    //獲取軌跡數(shù)據(jù),(0,0)為圓外接起點(diǎn),5*5間距畫半徑為5的小圓
    Cal_WorkData(m_fStartX, m_fStartY, m_nStepDis, m_nColNum, m_nRowNum, m_fRadius);     
    Run_3FileMode();
}

3.圓弧轉(zhuǎn)小線段是將我們的設(shè)置的圓弧軌跡轉(zhuǎn)換為小線段存起來,然后轉(zhuǎn)換后由3次文件的形式加載執(zhí)行。

圓弧轉(zhuǎn)小線段程序如下:

void CZmc_fontToMoveDlg::Cal_WorkData(float fStartX, float fStartY, float iStepDis, int iColNum, int iRowNum, float fRadius)
{
    //圓弧轉(zhuǎn)小線段
    int ilen = -1;
    double ArcX;
    double ArcY;
    //獲取單個(gè)整圓轉(zhuǎn)換長(zhǎng)度
    int iret = ZMotionOptimize_TransArcSeges(m_Handle,fStartX - fRadius, fStartY,  fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, &ArcX, &ArcY, &ilen);
    if (iret != 0 || ilen < 0)
    {
        CString StrErr;
        StrErr.Format("圓弧轉(zhuǎn)小線段失敗錯(cuò)誤碼:%d",iret);
        MessageBox(StrErr);
        return;
    }
    double *ArcToLineX;
    double *ArcToLineY;
    ArcToLineX = (double*)malloc(sizeof(double)*ilen);
    ArcToLineY = (double*)malloc(sizeof(double)*ilen);
    //獲取數(shù)據(jù)
    iret = ZMotionOptimize_TransArcSeges(m_Handle, fStartX - fRadius, fStartY, fStartX + fRadius, fStartY + 2 * fRadius, 0, -2 * PI, m_refDistance, ArcToLineX, ArcToLineY, &ilen);
    //軌跡總長(zhǎng)度
    m_GraphTotalLen = ilen * iColNum * iRowNum;
    m_GraphData  = (struct_GraphPos*)malloc(sizeof(struct_GraphPos)*m_GraphTotalLen);    //申請(qǐng)分配內(nèi)存
    //填寫數(shù)據(jù)
    int iAcr = 0;
    for (int icol = 0; icol < iColNum ; icol++)
    {
        for(int irow = 0 ;irow

4.這里程序完成空移,然后移動(dòng)完成之前,如果下一條運(yùn)動(dòng)指令執(zhí)行的是軌跡運(yùn)動(dòng),那么提前將激光打開。

//空移到打標(biāo)點(diǎn)起始點(diǎn)
void CZmc_fontToMoveDlg::Zscan_Z3pFile_StartString(struct_GraphPos *iGraphData)
{
    char  cmdbuff[2048] = "";      
    char  tempbuff[2048] = "";
    //生成命令
    sprintf(tempbuff, "BASE(%d,%d)
",SCAN_AxisX,SCAN_AxisY);    //設(shè)置打標(biāo)軸
    strcat(cmdbuff, tempbuff);
    //空移到起點(diǎn)
    sprintf(tempbuff, "FORCE_SPEED = %f
",m_dEmpSpeed);    //設(shè)置空移速度
    strcat(cmdbuff, tempbuff);
    sprintf(tempbuff, "MOVESCANABS(%f,%f)
",(*iGraphData).fposx,(*iGraphData).fposy);    //移動(dòng)
    strcat(cmdbuff, tempbuff);
    //設(shè)置提前開光
    if (m_nStartDelay < 0)      //提前出光
    {
        sprintf(tempbuff, "MOVEOP_DELAY = %f
",m_nStartDelay/1000);
        strcat(cmdbuff, tempbuff);
    }
    else
    {
        sprintf(tempbuff, "MOVE_DELAY(%f)
",m_nStartDelay/1000);
        strcat(cmdbuff, tempbuff);
    }
    //開光
    sprintf(tempbuff, "MOVE_OP(%d,1)
MOVE_DELAY(10)
MOVE_OP(%d,1)
",m_nEnableIO,m_nLaserIO);  
    strcat(cmdbuff, tempbuff);
    //判斷命令長(zhǎng)度是否發(fā)送
    strcat(g_MoveStr,cmdbuff);
    Zscan_Z3pFile_Down();
}


 //生成打標(biāo)直線段字符串
void CZmc_fontToMoveDlg::Zscan_Z3pFile_LineString(struct_GraphPos *iGraphData)
{
    char  cmdbuff[2048] = "";      
    char  tempbuff[2048] = "";
    //生成命令
    //空移到起點(diǎn)
    sprintf(tempbuff, "FORCE_SPEED = %f
",m_dSpeed);    //設(shè)置打標(biāo)速度
    strcat(cmdbuff, tempbuff);
    sprintf(tempbuff, "MOVESCANABS(%f,%f)
",(*iGraphData).fposx,(*iGraphData).fposy);    //移動(dòng)
    strcat(cmdbuff, tempbuff);
    //判斷命令長(zhǎng)度是否發(fā)送
    strcat(g_MoveStr,cmdbuff);
    Zscan_Z3pFile_Down();
}

5.延時(shí)關(guān)光是在打標(biāo)軌跡完成后,將激光延時(shí)關(guān)閉。

延時(shí)關(guān)光程序如下:

void CZmc_fontToMoveDlg::Zscan_Z3pFile_EndString(struct_GraphPos *iGraphData)
{
    char  cmdbuff[2048] = "";      
    char  tempbuff[2048] = "";
    //生成命令
    sprintf(tempbuff, "FORCE_SPEED = %f
",m_dEmpSpeed);    //設(shè)置空移速度
    strcat(cmdbuff, tempbuff);
    sprintf(tempbuff, "MOVESCANABS(%f,%f)
",(*iGraphData).fposx,(*iGraphData).fposy);    //移動(dòng)
    strcat(cmdbuff, tempbuff);
    //延時(shí)關(guān)光
    if(m_nLastDelay >0)
    {
        //延時(shí)關(guān)光
        sprintf(tempbuff, "MOVEOP_DELAY = 0
MOVE_DELAY(%f)
",m_nLastDelay/1000);
        strcat(cmdbuff, tempbuff);
    }
    else
    {
        sprintf(tempbuff, "MOVEOP_DELAY = %f
",m_nLastDelay/1000);
        strcat(cmdbuff, tempbuff);
    }
    //關(guān)光
    sprintf(tempbuff, "MOVE_OP(%d,OFF)
",m_nLaserIO);  
    strcat(cmdbuff, tempbuff);
    //判斷命令長(zhǎng)度是否發(fā)送
    strcat(g_MoveStr,cmdbuff);
    Zscan_Z3pFile_Down();
}

四、最終效果

首先點(diǎn)擊下拉框選擇控制器IP,點(diǎn)擊連接,依次設(shè)置好激光器參數(shù)、運(yùn)動(dòng)參數(shù),設(shè)置好后輸入打軌跡的參數(shù),點(diǎn)擊運(yùn)動(dòng)開始打圓形軌跡,點(diǎn)擊停止結(jié)束。

a04f21d2-5267-11ed-a3b6-dac502259ad0.png

通過Zdevelop軟件的示波器采樣運(yùn)動(dòng)結(jié)果:先從其他位置空移到起始位置,然后提前1ms開光,走完一個(gè)圓形軌跡,關(guān)閉激光(延時(shí)關(guān)光),再空移到下一個(gè)圓形軌跡的起點(diǎn),開光(提前1ms開光),又走完一個(gè)軌跡后,關(guān)光(延時(shí)5ms關(guān)光),如此循環(huán)執(zhí)行,直到設(shè)置的行列數(shù)打完停止(打軌跡中也能點(diǎn)擊停止)。

a0615fc8-5267-11ed-a3b6-dac502259ad0.png

XY模式下的軌跡,軌跡包括了圓形打標(biāo)軌跡和空走軌跡:

a06f3a08-5267-11ed-a3b6-dac502259ad0.png

本次,正運(yùn)動(dòng)技術(shù)開放式激光振鏡運(yùn)動(dòng)控制器:C++快速開發(fā),就分享到這里。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16101

    瀏覽量

    177064
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8447

    瀏覽量

    150720
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2100

    瀏覽量

    73453
  • 激光振鏡
    +關(guān)注

    關(guān)注

    1

    文章

    18

    瀏覽量

    3260

原文標(biāo)題:開放式激光振鏡運(yùn)動(dòng)控制器:C++快速開發(fā)

文章出處:【微信號(hào):伺服與運(yùn)動(dòng)控制,微信公眾號(hào):伺服與運(yùn)動(dòng)控制】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ZMC408SCAN控制光纖激光器加工

    ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光
    的頭像 發(fā)表于 09-14 14:16 ?1585次閱讀
    <b class='flag-5'>ZMC408SCAN</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b><b class='flag-5'>控制</b>光纖<b class='flag-5'>激光器</b>加工

    【資料】正運(yùn)動(dòng)ZMC408SCAN控制器用戶手冊(cè)

    ZMC408SCAN 激光運(yùn)動(dòng)控制器是正運(yùn)動(dòng)技術(shù)
    發(fā)表于 05-10 15:06

    開放式激光+運(yùn)動(dòng)控制器(五):ZMC408SCAN控制器

    軸設(shè)置等;采用優(yōu)化的網(wǎng)絡(luò)通訊協(xié)議可以實(shí)現(xiàn)實(shí)時(shí)的運(yùn)動(dòng)控制。ZMC408SCAN總線控制器支持脈沖軸/總線軸/
    發(fā)表于 03-03 14:45 ?2090次閱讀
    <b class='flag-5'>開放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b>+<b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制器</b>(五):<b class='flag-5'>ZMC408SCAN</b><b class='flag-5'>控制器</b>

    激光運(yùn)動(dòng)控制器(一):ZMC408SCAN接口與功能

    ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光
    的頭像 發(fā)表于 08-01 15:03 ?3026次閱讀
    <b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制器</b>(一):<b class='flag-5'>ZMC408SCAN</b>接口與功能

    開放式激光運(yùn)動(dòng)控制器ZMC408SCAN激光接口與控制

    上一節(jié)介紹了ZMC408SCAN控制器的功能、硬件參數(shù)與硬件接口的特點(diǎn)等,本節(jié)主要介紹激光相關(guān)的接口與如何實(shí)現(xiàn)激光控制
    的頭像 發(fā)表于 09-01 16:04 ?2556次閱讀
    <b class='flag-5'>開放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制器</b>:<b class='flag-5'>ZMC408SCAN</b><b class='flag-5'>激光</b>接口與<b class='flag-5'>控制</b>

    開放式激光運(yùn)動(dòng)控制器C++快速開發(fā)

    今天,正運(yùn)動(dòng)技術(shù)為大家分享一下應(yīng)用ZMC408SCAN開放式激光
    的頭像 發(fā)表于 10-19 09:04 ?1404次閱讀
    <b class='flag-5'>開放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制器</b>:<b class='flag-5'>C++</b>快速<b class='flag-5'>開發(fā)</b>

    ZMC408SCAN控制光纖激光器加工的方法

    ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光
    的頭像 發(fā)表于 10-26 17:32 ?1947次閱讀

    開放式激光運(yùn)動(dòng)控制器C++矯正方法與實(shí)現(xiàn)

    ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光
    的頭像 發(fā)表于 10-27 09:02 ?1882次閱讀
    <b class='flag-5'>開放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制器</b>:<b class='flag-5'>C++</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b>矯正方法與實(shí)現(xiàn)

    開放式激光運(yùn)動(dòng)控制器ZMC408SCAN進(jìn)行矯正的方法與實(shí)現(xiàn)

    ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光
    的頭像 發(fā)表于 10-31 17:56 ?1735次閱讀

    淺談ZMC408SCAN激光接口與如何實(shí)現(xiàn)激光控制

    ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光
    發(fā)表于 11-01 14:54 ?1168次閱讀

    如何實(shí)現(xiàn)激光打標(biāo)控制

    ZMC408SCAN是正運(yùn)動(dòng)技術(shù)新推出的一款支持EtherCAT總線的開放式激光
    的頭像 發(fā)表于 11-01 15:13 ?2118次閱讀

    運(yùn)動(dòng)激光運(yùn)動(dòng)控制器ZMC408SCAN用戶手冊(cè)

    ZMC408SCAN 激光運(yùn)動(dòng)控制器是正運(yùn)動(dòng)技術(shù)
    發(fā)表于 04-11 14:22 ?3次下載

    ZMC420SCAN激光運(yùn)動(dòng)控制器用戶手冊(cè)

    ZMC 是正運(yùn)動(dòng)技術(shù)推出的網(wǎng)絡(luò)運(yùn)動(dòng)控制器型號(hào)簡(jiǎn)稱。 ZMC4 系列支持正運(yùn)動(dòng) XPLC 的功能
    發(fā)表于 04-11 14:28 ?3次下載

    激光運(yùn)動(dòng)控制器ZMC408SCAN-V2用戶手冊(cè)

    ZMC408SCAN-V2 是正運(yùn)動(dòng)技術(shù)推出的高性能總線雙運(yùn)動(dòng)控制器集成了 2 個(gè)百兆以太網(wǎng)
    發(fā)表于 06-08 15:34 ?9次下載

    開放式激光運(yùn)動(dòng)控制器激光清洗應(yīng)用

    開放式激光運(yùn)動(dòng)控制器激光清洗解決方案。
    的頭像 發(fā)表于 07-18 09:44 ?266次閱讀
    <b class='flag-5'>開放式</b><b class='flag-5'>激光</b><b class='flag-5'>振</b><b class='flag-5'>鏡</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制器</b>的<b class='flag-5'>激光</b>清洗應(yīng)用