今天,我們來講解一下正運(yùn)動(dòng)技術(shù)運(yùn)動(dòng)控制器EtherCAT總線的基礎(chǔ)使用。 1、材料準(zhǔn)備與控制器接線參考 軸擴(kuò)展:只能擴(kuò)展脈沖軸,鑒于成本和使用方面,不建議使用過多軸擴(kuò)展板,可選用支持脈沖軸數(shù)較多的控制器型號(hào)。 控制器可擴(kuò)展的IO點(diǎn)數(shù)可在硬件手冊(cè)或“命令與輸出”窗口輸入?*max打印查看。 3、EtherCAT總線擴(kuò)展模塊 EtherCAT總線擴(kuò)展模塊包含兩個(gè)系列:可分為EIO擴(kuò)展模塊、ZMIO300-ECAT擴(kuò)展模塊。 EIO1616MT支持?jǐn)U展數(shù)字量IO,包含16路輸入和16路輸出。 EIO24088可擴(kuò)展數(shù)字量IO和脈沖軸,支持?jǐn)U展8個(gè)脈沖軸,包含24路輸入和8路輸出。 ZMIO300-ECAT擴(kuò)展模塊為立式組合模塊,可擴(kuò)展數(shù)字量IO和模擬量。 EtherCAT通訊建議采用帶屏蔽層的雙絞線進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)傳輸。 EIO1616MT EIO24088 ZMIO300-ECAT+16DO+16DI+4DA+4AD A、EIO擴(kuò)展模塊使用EtherCAT總線擴(kuò)展,可選型號(hào)如下表: EIO1616雙電源供電(除了主電源,IO也需要單獨(dú)供電),EIO24088為單電源供電。 擴(kuò)展模塊數(shù)字量IO接口默認(rèn)支持NPN型。 EtherCAT擴(kuò)展模塊接線只需將各個(gè)模塊的EtherCAT口相互連接即可,EIO擴(kuò)展板帶兩個(gè)EtherCAT接口,EtherCAT IN口接主控制器,EtherCAT OUT口接下級(jí)擴(kuò)展板或驅(qū)動(dòng)設(shè)備,不可混用。 EIO擴(kuò)展接線參考如下: 2)ZMIO300-ECAT擴(kuò)展模塊 A、ZMIO300-ECAT擴(kuò)展模塊可搭配子模塊如下表: 模擬量精度為16位,有NPN和PNP兩種輸入方式可選,數(shù)字量輸入輸出口帶信號(hào)狀態(tài)指示燈。 ZMIO300-16DO/ZMIO300-16DOP數(shù)字量輸出需要一路電源單獨(dú)供電。 B、ZMIO300-ECAT擴(kuò)展模塊使用接線 ZMIO300-ECAT擴(kuò)展模塊接線參考如下,與EIO擴(kuò)展模塊接線方法相同。 EtherCAT IN口與EtherCAT OUT口不可混用。 4、EtherCAT總線使用 初始化過程主要包含以下幾個(gè)步驟: 1、總線掃描SLOT_SCAN (slot) 2、軸映射AXIS_ADDRESS,擴(kuò)展模塊IO映射NODE_IO 3、總線開啟SLOT_START (slot) 4、清除驅(qū)動(dòng)器錯(cuò)誤DRIVE_CLEAR(0) 5、軸使能AXIS_ENABLE(單軸使能),WDOG(總使能) 初始化成功后,便可以使用運(yùn)動(dòng)控制指令控制總線軸運(yùn)轉(zhuǎn)。 擴(kuò)展的資源必須映射到控制器本地資源才可使用。 不同的EtherCAT擴(kuò)展模塊,IO映射、軸映射方法相同。 IO映射采用NODE_IO指令(數(shù)字量)、NODE_AIO指令(模擬量)設(shè)置,軸映射采用AXIS_ADDRESS指令映射軸號(hào)。 IO映射時(shí)先查看控制器自身的最大IO編號(hào)(包括外部IO接口和脈沖軸內(nèi)的接口),再使用指令設(shè)置。 若擴(kuò)展的 IO與控制器自身IO編號(hào)重合,二者將同時(shí)起作用,所以IO映射的映射的編號(hào)在整個(gè)控制系統(tǒng)中均不得重復(fù)。 5、EtherCAT總線相關(guān)概念 總線相關(guān)指令參數(shù)會(huì)用到如下編號(hào): 槽位號(hào)(slot) 槽位號(hào)是指控制器上總線接口的編號(hào),缺省為0。當(dāng)控制器上有多個(gè)總線接口,?*SLOT查看槽位號(hào)。 運(yùn)動(dòng)控制器支持單總線時(shí),槽位號(hào)為0。 支持雙總線時(shí),EtherCAT總線槽位號(hào)為0,RTEX總線槽位號(hào)為1。 設(shè)備號(hào)(node) 設(shè)備號(hào)是指一個(gè)槽位上連接的所有設(shè)備的編號(hào),從0開始,按設(shè)備在總線上的連接順序自動(dòng)編號(hào),可以通過NODE_COUNT(slot)指令查看。 驅(qū)動(dòng)器編號(hào) 控制器會(huì)自動(dòng)識(shí)別出槽位上的驅(qū)動(dòng)器,編號(hào)從0開始,按驅(qū)動(dòng)器在總線上的連接順序自動(dòng)編號(hào)。 驅(qū)動(dòng)器編號(hào)與設(shè)備號(hào)不同,只給槽位上的驅(qū)動(dòng)器設(shè)備編號(hào),其他設(shè)備忽略。 6、IO映射 1)數(shù)字量IO NODE_IO指令設(shè)置設(shè)備的數(shù)字量IO起始編號(hào),單個(gè)設(shè)備的輸入輸出的起始編號(hào)一樣。必須總線掃描后才能設(shè)置。 語法: NODE_IO(slot, node)=iobase slot:槽位號(hào),0-缺省 node:設(shè)備編號(hào),編號(hào)從0開始 iobase:映射IO起始編號(hào),設(shè)置結(jié)果只會(huì)是8的倍數(shù) 示例: SLOT_SCAN(0) '掃描總線 IF NODE_COUNT(0)>0 THEN '判斷槽位0上是否有設(shè)備 NODE_IO(0,0)=32 '設(shè)置槽位0接口設(shè)備0的IO起始編號(hào)為32 ?NODE_IO(0,0) '打印出設(shè)備0的IO起始編號(hào) ENDIF 2)模擬量IO NODE_AIO指令設(shè)置設(shè)備的模擬量IO起始編號(hào),單個(gè)設(shè)備的輸入輸出的起始編號(hào)一樣。必須總線掃描后才能讀取。 NODE_AIO(slot, node[,idir])=Aiobase slot:槽位號(hào),0-缺省 node:設(shè)備編號(hào),編號(hào)從0開始 idir:AD/DA選擇 。0-缺省,同時(shí)設(shè)置AIN、AOUT,讀取時(shí)只讀AIN;3-AIN;4-AOUT 示例: SLOT_SCAN(0) '掃描總線 IF NODE_COUNT(0)>0 THEN '判斷槽位0上是否有設(shè)備 NODE_AIO(0,0,0)=8 '設(shè)置槽位0接口設(shè)備0的AIN和AOUT起始編號(hào)都為8 ?NODE_AIO(0,0,0) '打印出設(shè)備0的AIO起始編號(hào) ENDIF 7、EtherCAT總線軸映射 AXIS_ADDRESS(軸號(hào))=(槽位號(hào)<<16)+驅(qū)動(dòng)器編號(hào)+1 軸映射寫在總線初始化程序中,總線掃描之后,開啟總線之前。 示例: AXIS_ADDRESS (0)=(0<<16)+0+1 '第一個(gè)ECAT驅(qū)動(dòng)器,驅(qū)動(dòng)器編號(hào)0,綁定為軸0 AXIS_ADDRESS (2)=(0<<16)+1+1 '第二個(gè)ECAT驅(qū)動(dòng)器,驅(qū)動(dòng)器編號(hào)1,綁定為軸2 AXIS_ADDRESS (1)=(0<<16)+2+1 '第三個(gè)ECAT驅(qū)動(dòng)器,驅(qū)動(dòng)器編號(hào)2,綁定為軸1 ATYPE(0)=65 '設(shè)置為ECAT軸類型, 65-位置 66-速度 67-轉(zhuǎn)矩 ATYPE(1)=65 ATYPE(2)=65 8、EtherCAT總線狀態(tài) 使用編程軟件成功連接到控制器之后,執(zhí)行總線掃描之后,在線命令欄輸入?*EtherCAT打印出每個(gè)NODE節(jié)點(diǎn)的狀態(tài)。 Slot 0 contain 1 nodes:0槽位口共連接了1個(gè)設(shè)備 Lostcount 0-0:丟包數(shù) Node:設(shè)備連接NODE編號(hào) Status:設(shè)備連接狀態(tài),參考NODE_STATUS Mainid:廠商ID Productid:設(shè)備ID Axises:設(shè)備總軸數(shù) Alstate:設(shè)備OP狀態(tài) Node_profile:設(shè)備Profile設(shè)置 Bindaxis:映射到控制器的軸號(hào),-1表示未映射 Drive_profile:設(shè)備收發(fā)PDO配置 Controlword:控制字 Drive_status:設(shè)備當(dāng)前狀態(tài),參考DRIVE_STATUS Drive_mode:設(shè)備控制模式 Target:電機(jī)位置 Encode:編碼器位置 9、EtherCAT擴(kuò)展模塊參考配置 控制模塊接線完成,使用ZDevelop軟件連接上控制器,運(yùn)行總線初始化程序,打開“控制器”-“控制器狀態(tài)”窗口,查看槽位0節(jié)點(diǎn)信息,可以看到EtherCAT總線連接的全部設(shè)備的信息。 1)EIO擴(kuò)展模塊 控制模塊配置: 1個(gè)ZMC432+1個(gè)EIO1616MT。 EIO1616MT的節(jié)點(diǎn)號(hào)為0,擴(kuò)展的數(shù)字量輸入IO編號(hào)為1024-1039共16個(gè),擴(kuò)展的數(shù)字量輸出IO編號(hào)為1024-1039共16個(gè)。 NODE_IO(0,0)=1024 控制模塊配置: 1個(gè)ZMC432+1個(gè)ZMIO300-ECAT通訊模塊+4個(gè)ZMIO300-16DI輸入+2個(gè)ZMIO300-16DO輸出+1個(gè)ZMIO300-4AD+1個(gè)ZMIO300-4DA。 NODE_IO(0,0)=32 'IO映射,起始編號(hào)從32開始,擴(kuò)展了64個(gè)輸入和32個(gè)輸出 NODE_AIO(0,0,0)=4 'AIO映射,起始編號(hào)從4開始,擴(kuò)展4個(gè)輸入和4個(gè)輸出 10、EtherCAT總線參考配置1 控制模塊配置: 1個(gè)ZMC432+2個(gè)總線驅(qū)動(dòng)器。 使用ZDevelop軟件連接上控制器,執(zhí)行完總線初始化程序后,打開“控制器”-“控制器狀態(tài)”窗口,可查看槽位0節(jié)點(diǎn)信息,或在線命令欄輸入?*EtherCAT打印出每個(gè)NODE節(jié)點(diǎn)的狀態(tài)。 此時(shí)總線上可以掃描到兩個(gè)節(jié)點(diǎn),這兩個(gè)節(jié)點(diǎn)均為總線驅(qū)動(dòng)器,每個(gè)驅(qū)動(dòng)器各帶一個(gè)電機(jī),將節(jié)點(diǎn)0的軸映射到軸6,將節(jié)點(diǎn)1的軸映射到軸7。 AXIS_ADDRESS(6)= (0<<16)+0+1 '映射軸號(hào) AXIS_ADDRESS(7)=(0<<16)+1+1 ATYPE(6)=65'設(shè)置控制模式,65-位置 66-速度 67-轉(zhuǎn)矩 ATYPE(7)=65 在線命令欄輸入?*EtherCAT打印信息如下: 11、EtherCAT總線參考配置2 控制模塊配置: 1個(gè)ZMC432+1個(gè)EIO1616MT+2個(gè)總線驅(qū)動(dòng)器。 使用ZDevelop軟件連接上控制器,執(zhí)行完總線初始化程序后,打開“控制器”-“控制器狀態(tài)”窗口,可查看槽位0節(jié)點(diǎn)信息,或在線命令欄輸入?*EtherCAT打印出每個(gè)NODE節(jié)點(diǎn)的狀態(tài)。 此時(shí)總線上可以掃描到3個(gè)節(jié)點(diǎn),0節(jié)點(diǎn)為EIO1616MT數(shù)字量IO擴(kuò)展模塊,帶16進(jìn)16出,IO映射編號(hào)范圍為32-47,NODE_IO(0,0)=32 節(jié)點(diǎn)1和2均為總線驅(qū)動(dòng)器,每個(gè)驅(qū)動(dòng)器各帶一個(gè)電機(jī),將這兩個(gè)軸的軸號(hào)分別映射為軸6、軸7。 在線命令欄輸入?*EtherCAT打印信息如下: 12、EtherCAT總線初始化程序 此初始化程序?yàn)橥ㄓ冒姹?,以上幾種配置均適用,使用時(shí)只需更改個(gè)別全局定義的參數(shù)即可。 運(yùn)動(dòng)控制模塊根據(jù)實(shí)際使用情況編寫。 '**********ECAT總線初始化主程序*********** global CONST PUL_AxisStart = 0 '本地脈沖軸起始軸號(hào) global CONST PUL_AxisNum = 0 '本地脈沖軸軸數(shù)量 global CONST Bus_AxisStart = 6 '總線軸起始軸號(hào) global CONST Bus_NodeNum = 1 '總線配置節(jié)點(diǎn)數(shù)量,用于判斷實(shí)際檢測(cè)到的從站數(shù)量是否一致 global MAX_AXISNUM '最大軸數(shù) MAX_AXISNUM = SYS_ZFEATURE(0) '自動(dòng)獲取控制器支持的軸數(shù) global Bus_InitStatus '總線初始化完成狀態(tài) Bus_InitStatus = -1 global Bus_TotalAxisnum '檢查掃描的總軸數(shù) delay(3000) '延時(shí)3S等待驅(qū)動(dòng)器上電,不同驅(qū)動(dòng)器自身上電時(shí)間不同,具體根據(jù)驅(qū)動(dòng)器調(diào)整延時(shí) ?'總線通訊周期:',SERVO_PERIOD,'us' Ecat_Init() '初始化ECAT總線 while (Bus_InitStatus = 0) Ecat_Init() wend if Bus_InitStatus = 1 then '總線初始化是否完成 main() '運(yùn)動(dòng)控制模塊 endif END '************ECAT總線初始化********** '初始流程: slot_scan(掃描總線) -> 從站節(jié)點(diǎn)映射軸/io -> SLOT_START(啟動(dòng)總線) -> 初始化成功 '*********************************** global sub Ecat_Init() LOCAL Node_Num '節(jié)點(diǎn)設(shè)備編號(hào) LOCAL Temp_Axis '當(dāng)前總線軸的軸號(hào) LOCAL Drive_Vender '當(dāng)前設(shè)備廠商編號(hào) LOCAL Drive_Device '設(shè)備編號(hào) LOCAL Drive_Alias '設(shè)備撥碼ID RAPIDSTOP(2) for i=0 to MAX_AXISNUM - 1 '初始化還原軸類型 AXIS_ENABLE(i) = 0 '關(guān)軸使能 atype(i)=0 '設(shè)置為虛擬軸 AXIS_ADDRESS(i) =0 DELAY(10) '防止所有驅(qū)動(dòng)器全部同時(shí)切換使能導(dǎo)致瞬間電流過大 next Bus_InitStatus = -1 Bus_TotalAxisnum = 0 '將掃描的總線總軸數(shù)置0 SLOT_STOP(0) delay(200) slot_scan(0) '掃描總線 if return then ?'總線掃描成功','連接從站設(shè)備數(shù):'NODE_COUNT(0) if NODE_COUNT(0) <> Bus_NodeNum then '判斷總線檢測(cè)數(shù)量是否為實(shí)際接線數(shù)量 ?'' ?'掃描節(jié)點(diǎn)數(shù)量與程序配置數(shù)量不一致!' ,'配置數(shù)量:'Bus_NodeNum,'檢測(cè)數(shù)量:'NODE_COUNT(0) Bus_InitStatus = 0 '初始化失敗。報(bào)警提示 'return endif ''開始映射軸號(hào)' for Node_Num=0 to NODE_COUNT(0)-1 '遍歷掃描到的所有從站節(jié)點(diǎn) Drive_Vender = NODE_INFO(0,Node_Num,0) '讀取設(shè)備廠商 Drive_Device = NODE_INFO(0,Node_Num,1) '讀取設(shè)備編號(hào) Drive_Alias = NODE_INFO(0,Node_Num,3) '讀取設(shè)備撥碼ID if NODE_AXIS_COUNT(0,Node_Num) <> 0 then '判斷當(dāng)前節(jié)點(diǎn)是否有電機(jī) for j=0 to NODE_AXIS_COUNT(0,Node_Num)-1 '根據(jù)節(jié)點(diǎn)帶的電機(jī)數(shù)量循環(huán)配置軸參數(shù)(針對(duì)一拖多驅(qū)動(dòng)器) Temp_Axis = Bus_AxisStart + Bus_TotalAxisnum '軸號(hào)按NODE順序分配,總線開始軸號(hào)+總線掃描軸號(hào) 'Temp_Axis = Drive_Alias '軸號(hào)按驅(qū)動(dòng)器設(shè)定的撥碼分配(一拖多需要特殊處理) base(Temp_Axis) AXIS_ADDRESS(Temp_Axis)= (0<<16)+ Bus_TotalAxisnum + 1 '映射軸號(hào) ATYPE=65 '設(shè)置控制模式 65-位置 66-速度 67-轉(zhuǎn)矩 disable_group(Temp_Axis) '每軸單獨(dú)分組 Bus_TotalAxisnum=Bus_TotalAxisnum+1 '總軸數(shù)+1 next else 'IO擴(kuò)展模塊 Sub_SetNodeIo(Node_Num,Drive_Vender,Drive_Device,1024 + 32*Node_Num) '映射擴(kuò)展模塊IO ?'擴(kuò)展IO映射完成' endif next ?'軸號(hào)映射完成','連接總軸數(shù):'Bus_TotalAxisnum wa 200 SLOT_START(0) '啟動(dòng)總線 if return then wdog=1 '使能總開關(guān) '?'開始清除驅(qū)動(dòng)器錯(cuò)誤' for i= Bus_AxisStart to Bus_AxisStart + Bus_TotalAxisnum - 1 BASE(i) DRIVE_CLEAR(0) DELAY 50 '?'驅(qū)動(dòng)器錯(cuò)誤清除完成' datum(0) '清除控制器軸狀態(tài)錯(cuò)誤' wa 100 ''軸使能' AXIS_ENABLE=1 next Bus_InitStatus = 1 ?'軸使能完成' '本地脈沖軸配置 for i = 0 to PUL_AxisNum - 1 base(PUL_AxisStart + i) AXIS_ADDRESS = (-1<<16) + i ATYPE = 4 next ?'總線開啟成功' else ?'總線開啟失敗' Bus_InitStatus = 0 endif else ?'總線掃描失敗' Bus_InitStatus = 0 endif end sub '********總線IO模塊映射******** '通過NODE_IO(0,Node_Num)分配模塊IO起始地址,不使用擴(kuò)展模塊的時(shí)候刪掉此段 '***************************** global sub Sub_SetNodeIo(iNode,iVender,iDevice,i_IoNum) if iVender = $41B then '正運(yùn)動(dòng)IO擴(kuò)展模塊 NODE_IO(0,iNode) = i_IoNum 'NODE_AIO(0,iNode) = 4*(iNode+1) ?'IO映射成功' endif end sub
'**********運(yùn)動(dòng)控制模塊******** '初始化完成后,使用運(yùn)動(dòng)控制指令控制ECAT總線軸運(yùn)動(dòng) '***************************** global sub main() RAPIDSTOP(2) WAIT IDLE BASE(6,7) '選擇總線軸軸號(hào) ATYPE=65,65 UNITS=100,100 '脈沖當(dāng)量設(shè)置 SPEED=100,100 ACCEL=1000,1000 DECEL=1000,1000 DPOS=0,0 MPOS=0,0 TRIGGER '自動(dòng)觸發(fā)示波器 MOVE(100,100) '先運(yùn)動(dòng)100,100位置 MOVECIRC(200,0,100,0,1) '半徑100順時(shí)針畫半圓,終點(diǎn)坐標(biāo)(300,100) end sub |
|