時間:2021-11-23 16:44:15來æºï¼šæ·±åœ³å¸‚æ£é‹å‹•技術有é™å…¬å¸
  今天,æ£é‹å‹•å°åŠ©æ‰‹çµ¦å¤§å®¶åˆ†äº«ä¸€ä¸‹EtherCATé‹å‹•控制器之ZMIO300模塊的使用。
  01ã€ææ–™æº–å‚™èˆ‡æŽ§åˆ¶å™¨æŽ¥ç·šåƒè€ƒ
ã€€ã€€ä¸€ã€ææ–™æº–å‚™
  1.電腦1臺,安è£ZDevelop軟件。2.控制器1個,ZMC432(帶Ethercat接å£å³å¯)。3.24Vç›´æµé›»æº1個(給控制器和ZMIO模塊供電)。4.ZMIO擴展模塊一套+EtherCAT總線驅動器。5.控制器接線端å若干,導線若干。6.網線若干。
ã€€ã€€äºŒã€æŽ¥ç·šåƒè€ƒ
  02ã€å¯¦é©—æ€è·¯
  1.我們先將 ZMC432控制器ã€ZMIO 300擴展模塊ã€Ethercatç¸½ç·šé©…å‹•é€²è¡Œçµ„åˆæˆä¸€å€‹å°ç³»çµ±ã€‚ç„¶åŽé€šéŽBasic編程實ç¾EtherCAT總線åˆå§‹åŒ–ï¼Œå¾žè€Œå¯¦ç¾æŽ§åˆ¶å™¨å°ZMIO 300擴展模塊和總線驅動器控制。
  2.å¦‚æžœé‡‡ç”¨ä¸Šä½æ©Ÿé–‹ç™¼ï¼Œå¯ä»¥é€šé޿ޥå£ZAux_Execute()來調用下載到控制器里é¢çš„總線åˆå§‹åŒ–çš„Basic函數,來實ç¾ç¸½ç·šè¨å‚™çš„åˆå§‹åŒ–。
  03ã€ZMIO 300擴展模塊的介紹和接線
  1.ZMIO擴展模塊的組æˆã€‚
  通訊模塊:該模塊有ZMIO300-ECAT 通訊模塊和ZMIO300-CAN 通訊模塊兩種,ZMIO300-ECAT 通訊模塊的使用需è¦é€šéŽä¸€æ®µBasic代碼進行總線åˆå§‹åŒ–æ‰èƒ½é€šè¨Šä¸Šã€‚
  ZMIO300-CAN 通訊模塊使用簡單,åªè¦é å…ˆè¨ç½®å¥½æ’¥ç¢¼é–‹é—œï¼Œç„¶åŽä¸Šé›»å³å¯å¯¦ç¾é€šè¨Šã€‚但是ZMIO300-CAN 通訊模塊ä¸èƒ½è¨ç½®AD/DAæ“´å±•åæ¨¡å¡Šçš„é‡ç¨‹å’Œæ¨¡å¼ã€‚
  2.硬件接線。
  ECAT耦åˆå™¨+æ“´å±•åæ¨¡å¡ŠæŽ¥ç·šåƒè€ƒï¼š
  注æ„ï¼šé€šè¨Šæ¨¡å¡Šå’Œæ“´å±•åæ¨¡å¡Šéƒ½éœ€è¦24Vé›»æºä¾›é›»ã€‚
  04ã€ECAT總線åˆå§‹åŒ–çš„Basic代碼編寫
  1.EtherCAT總線掃æçš„Basic代碼。
  '/************************************************************'任務編號:無'函數功能:總線掃æ'Input:無'Output:無 '返回值:無'備注:無 '*************************************************************/GLOBAL SUB Ecat_ScanSlot() LOCAL i 'åˆå§‹åŒ–還原軸類型 RAPIDSTOP(2) For i=0 to gv_MaxAxisNum - 1 AXIS_ENABLE(i) = 0 '關軸使能 atype(i)=0 'è¨ç½®ç‚ºè™›æ“¬è»¸ AXIS_ADDRESS(i) =0 DELAY(10) 'é˜²æ¢æ‰€æœ‰é©…å‹•å™¨å…¨éƒ¨åŒæ™‚切æ›ä½¿èƒ½å°Žè‡´çž¬é–“é›»æµéŽå¤§ next '掃æç¸½ç·š SLOT_STOP(0) DELAY(200) SLOT_SCAN(0) '判斷總線掃æçµæžœ IF RETURN THEN if NODE_COUNT(0) <> (Gc_BusAxisNodeNum + Gc_BusIoNodeNum) then gv_BusScanState = 2 '總線掃æå¤±æ•—,實際數é‡ä¸ä¸€è‡´ ?"總線掃æå¤±æ•—,節點實際數é‡ä¸ä¸€è‡´" ELSE TRACE "ç¸½ç·šæŽƒææˆåŠŸï¼Œé€£æŽ¥è¨å‚™æ•¸ï¼š", NODE_COUNT(0) gv_BusScanState = 1 'ç¸½ç·šæŽƒææˆåŠŸ endif ELSEIF gv_BusScanState = -1 '總線掃æå¤±æ•— ?"總線掃æå¤±æ•—" ENDIFENDSUB
  2.è¨ç½®ç¸½ç·šIO擴展æ¿èµ·å§‹IO編號。
  '/************************************************************'任務編號:無'函數功能:IO擴展æ¿åˆå§‹åŒ–'Input:無'Output:無 '返回值:無'備注:無 '*************************************************************/GLOBAL SUB Ecat_IO_Init() gv_BusIoNodeNum = 0 'åˆå§‹åŒ–總線IOæ“´å±•æ¿æ•¸é‡ '如果總線掃æå¤±æ•— IF gv_BusScanState <> 1 THEN '總線掃æå¤±æ•—,io擴展æ¿ä¹ŸæŽƒæå¤±æ•— gv_NodeIoInitFlag=-1 RETURN ENDIF LOCAL Node_Num '節點è¨å‚™ç·¨è™Ÿ LOCAL Drive_Vender 'ç•¶å‰è¨å‚™å» 商編號 LOCAL Drive_Device 'è¨å‚™ç·¨è™Ÿ LOCAL Drive_Alias 'è¨å‚™æ’¥ç¢¼ID Dealy(200) '啟動總線 SLOT_START(0) if return =0 then TRACE "IO擴展æ¿åˆå§‹åŒ–,啟動總線失敗" gv_NodeIoInitFlag=-1 return endif 'é–‹å§‹æ˜ å°„ç¸½ç·šIO for Node_Num= 0 to NODE_COUNT(0) - 1 'éæ·æŽƒæåˆ°çš„æ‰€æœ‰å¾žç«™ç¯€é»ž Drive_Vender = NODE_INFO(0,Node_Num,0) '讀å–è¨å‚™å» 商 Drive_Device = NODE_INFO(0,Node_Num,1) '讀å–è¨å‚™ç·¨è™Ÿ Drive_Alias= NODE_INFO(0,Node_Num,3) '讀å–è¨å‚™æ’¥ç¢¼ID if NODE_AXIS_COUNT(0,Node_Num) = 0 then '判斷當å‰ç¯€é»žæ˜¯å¦æœ‰é›»æ©Ÿ Sub_SetNodeIo(Node_Num,Drive_Vender,Drive_Device,Gc_EcatIoStartId+(16* gv_BusIoNodeNum)) 'æ˜ å°„æ“´å±•æ¨¡å¡ŠIO gv_BusIoNodeNum = gv_BusIoNodeNum + 1 endif next gv_NodeIoInitFlag=1 '判斷IOæ“´å±•æ¿æ•¸ç›®æ˜¯å¦æ£ç¢º if gv_BusIoNodeNum <> Gc_BusIoNodeNum then ?"掃æåˆ°çš„IOæ“´å±•æ¿æ•¸ç›®ä¸æ£ç¢º" gv_NodeIoInitFlag=2 endif ENDSUB
  '/************************************************************'任務編號:無'函數功能:總線IOæ¨¡å¡Šæ˜ å°„'Input:無'Output:無 '返回值:無'備注:通éŽNODE_IO(0,Node_Num)åˆ†é…æ¨¡å¡ŠIO起始地å€ï¼Œä¸ä½¿ç”¨æ“´å±•æ¨¡å¡Šçš„æ™‚å€™åˆªæŽ‰æ¤æ®µ'*************************************************************/GLOBAL SUB Sub_SetNodeIo(iNode,iVender,iDevice,i_IoNum) if iVender = $41B then 'æ£é‹å‹•IO擴展模塊 NODE_IO(0,iNode) = i_IoNum NODE_AIO(0,iNode) = Gc_EcatAIoStartId 'è¨ç½®zmioçš„ad模å¼ç‚º0~20mAé›»æµæ¨¡å¼ SDO_WRITE(0,iNode,$5003,1,6,5) SDO_WRITE(0,iNode,$5004,1,6,13) endifENDSUB
  3.ç¸½ç·šé©…å‹•å™¨è»¸è™Ÿæ˜ å°„ã€‚
  '/************************************************************'任務編號: ç„¡'函數功能: 總線軸åˆå§‹åŒ–'Input: ç„¡'Output: ç„¡ '返回值: ç„¡'備注: 通éŽNODE_IO(0,Node_Num)åˆ†é…æ¨¡å¡ŠIO起始地å€ï¼Œä¸ä½¿ç”¨æ“´å±•æ¨¡å¡Šçš„æ™‚å€™åˆªæŽ‰æ¤æ®µ'*************************************************************/GLOBAL SUB Ecat_Axis_Init() LOCAL NodeSum_Num ,BusAxis_Num ,NodeAxis_Num 'è¨å‚™ç¸½æ•¸ã€ç¸½ç·šè»¸ç¸½æ•¸ã€æ¯å€‹ç¯€é»žä¸Šçš„電機數 LOCAL Drive_Vender,Drive_Device,Drive_Alias 'é©…å‹•å» å•†ç·¨è™Ÿã€é©…å‹•è¨å‚™ç·¨è™Ÿã€é©…å‹•è¨å‚™æ’¥ç¢¼ID LOCAL j,i '如果總線掃æå¤±æ•— IF gv_BusScanState <> 1 THEN gv_EcatAxisInitFlag=-1 RETURN ENDIF '總線軸總數,從0開始計數 BusAxis_Num = 0 FOR i = 0 TO NODE_COUNT(0) - 1 NodeAxis_Num = NODE_AXIS_COUNT(0,i) '讀å–è¨å‚™é›»æ©Ÿæ•¸ Drive_Vender = NODE_INFO(0,i,0) '讀å–é©…å‹•å™¨å» å•† Drive_Device = NODE_INFO(0,i,1) '讀å–è¨å‚™ç·¨è™Ÿ Drive_Alias = NODE_INFO(0,i,3) '讀å–è¨å‚™æ’¥ç¢¼ID FOR j = 0 TO NodeAxis_Num - 1 AXIS_ADDRESS(BusAxis_Num+Gc_BusAxisStartId) = BusAxis_Num + 1 'æ˜ å°„è»¸è™Ÿ ATYPE(BusAxis_Num+Gc_BusAxisStartId) = 65 'è¨ç½®æŽ§åˆ¶æ¨¡å¼ 65-ä½ç½® 66-速度 67-轉矩 詳細åƒç…§AXISSTATUS DRIVE_PROFILE(BusAxis_Num+Gc_BusAxisStartId) = 0 'PDO類型 DISABLE_GROUP(BusAxis_Num+Gc_BusAxisStartId) 'æ¯è»¸å–®ç¨åˆ†çµ„ 'Sub_SetNodePara(i,Drive_Vender,Drive_Device) 'è¨ç½®ç‰¹æ®Šç¸½ç·šåƒæ•¸ BusAxis_Num = BusAxis_Num + 1 '總線軸計數+1 NEXT NEXT if BusAxis_Num = Gc_BusAxisNodeNum then TRACE "è»¸æŽƒææ˜ 射完æˆï¼Œé€£æŽ¥ç¸½ç·šè»¸æ•¸ï¼š",BusAxis_Num else ?"掃æåˆ°çš„ç¸½ç·šè»¸æ•¸ç›®ä¸æ£ç¢º" gv_EcatAxisInitFlag =2 RETURN endif DELAY(100) SLOT_START(0) IF RETURN THEN TRACE "é–‹å§‹æ¸…é™¤é©…å‹•å™¨å ±è¦" FOR i = Gc_BusAxisStartId TO Gc_BusAxisStartId + BusAxis_Num - 1 BASE(i) DRIVE_CLEAR(0) WA(10) DRIVE_CONTROLWORD(i) = 128 WA(10) DRIVE_CONTROLWORD(i)=6 WA(10) DRIVE_CONTROLWORD(i)=15 WA(10) NEXT DELAY(100) TRACE "æŽ§åˆ¶å™¨å ±è¦æ¸…除完æˆ" DATUM(0) DELAY(1000) TRACE"開始伺æœä½¿èƒ½" WDOG = 1 FOR i = Gc_BusAxisStartId TO Gc_BusAxisStartId + BusAxis_Num - 1 AXIS_ENABLE(i) = 1 NEXT TRACE"伺æœä½¿èƒ½å®Œæˆ" gv_EcatAxisInitFlag =1 ELSE TRACE"總線開啟失敗" gv_EcatAxisInitFlag=-1 ENDIF ENDSUB
  05ã€è¨ç½®ZMIOæ¨¡æ“¬é‡æ“´å±•模塊的é‡ç¨‹å’Œæ¨¡å¼
  å¯é€šéŽSDO_Write指令å°ZMIOæ¨¡æ“¬é‡æ“´å±•模塊的é‡ç¨‹å’Œæ¨¡å¼é€²è¡Œè¨ç½®ã€‚(éœ€è¦æ˜¯ECAT 耦åˆå™¨æ‰æ”¯æŒä¿®æ”¹æ¨¡æ“¬é‡æ¨¡å¡Šçš„æ¨¡å¼å’Œé‡ç¨‹)。
  06ã€ä¸Šä½æ©Ÿé–‹ç™¼é€²è¡Œç¸½ç·šè»¸å’Œæ¨¡å¡Šçš„åˆå§‹åŒ–
  1.通éŽZDevelop軟件將該Basic程åºä¸‹è¼‰åˆ°æŽ§åˆ¶å™¨ä¸ã€‚
  2.通éŽZAux_Execute()來調用控制器里é¢çš„Basic函數,進行EtherCAT總線åˆå§‹åŒ–。
  示例:ZAux_Execute(g_handle, "Runtask 0,EcatInit_Para()", NULL, 0)
  3.通éŽZAux_Direct_GerVariableInt()指令來讀å–Basic文件定義的全局整形變é‡ï¼Œæ¯”如讀å–EcatAxisInitFlagå’ŒNodeIoInitFlag這兩個變é‡ä¾†ç²å–Basic程åºé‚£é‚Šç¸½ç·šåˆå§‹åŒ–的情æ³ã€‚
  示例:
  ZAux_Direct_GetVariableInt(g_handle,"EcatAxisInitFlag",&AxisInitFlag)
  ZAux_Direct_GetVariableInt(g_handle,"NodeIoInitFlag",&IoInitFlag)
完整代碼ç²å–地å€
â–¼
  本次,æ£é‹å‹•技術EtherCATé‹å‹•控制器之ZMIO300模塊的使用,就分享到這里。
  更多精彩內容請關注“æ£é‹å‹•å°åŠ©æ‰‹â€å…¬çœ¾è™Ÿï¼Œéœ€è¦ç›¸é—œé–‹ç™¼ç’°å¢ƒèˆ‡ä¾‹ç¨‹ä»£ç¢¼ï¼Œè«‹å’¨è©¢æ£é‹å‹•技術銷售工程師:400-089-8936。
  本文由æ£é‹å‹•技術原創,æ¡è¿Žå¤§å®¶è½‰è¼‰ï¼Œå…±åŒå¸ç¿’,一起æé«˜ä¸åœ‹æ™ºèƒ½åˆ¶é€ æ°´å¹³ã€‚æ–‡ç« ç‰ˆæ¬Šæ¸æ£é‹å‹•æŠ€è¡“æ‰€æœ‰ï¼Œå¦‚æœ‰è½‰è¼‰è«‹æ³¨æ˜Žæ–‡ç« ä¾†æºã€‚
ä¸Šä¸€ç¯‡ï¼šè¶…è²æ³¢æ¸¬åŽšå„€æ˜¯æ¸¬é‡ä»€ä¹ˆçš„
ä¸‹ä¸€ç¯‡ï¼šé—œäºŽå·¥æ¥æ©Ÿå™¨äººå’Œç§»å‹•機器人
ä¸åœ‹å‚³å‹•網版權與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²æ³¨æ˜Ž[來æºï¼šä¸åœ‹å‚³å‹•ç¶²]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Šå‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(www.hysjfh.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉載請與0755-82949061è¯ç³»ã€‚任何媒體ã€ç¶²ç«™æˆ–å€‹äººè½‰è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²â€ï¼Œé•å者本網將追究其法律責任。
本網轉載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯ç¶²æˆ–æ¥å…§æŠ•稿人士,版權屬于原版權人。轉載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Šæ³•å¾‹è²¬ä»»ã€‚
相關資訊