正运动技术
正运动技术

协助伙伴成功,是我们的价值所在

The value of Zmotion is to bring customers more success!

首页 / 支持与服务 / 技术分享

Technical support

技术分享

EtherCAT运动控制器之ZMIO300模块的使用

今天,正运动技术给大家分享一下EtherCAT运动控制器之ZMIO300模块的使用。

    一、材料准备与控制器接线参考

    (一)材料准备

    1.电脑1台,安装ZDevelop软件。

    2.控制器1个,ZMC432(带Ethercat接口即可)。

    3.24V直流电源1个(给控制器和ZMIO模块供电)。

    4.ZMIO扩展模块一套+EtherCAT总线驱动器。

    5.控制器接线端子若干,导线若干。

    6.网线若干。

    (二)接线参考

   1.png

    二、实验思路

    1.我们先将ZMC432控制器、ZMIO300扩展模块、Ethercat总线驱动进行组合成一个小系统。然后通过Basic编程实现EtherCAT总线初始化,从而实现控制器对ZMIO300扩展模块和总线驱动器控制。

    2.如果采用上位机开发,可以通过接口ZAux_Execute()来调用下载到控制器里面的总线初始化的Basic函数,来实现总线设备的初始化。

    

    三、ZMIO300扩展模块的介绍和接线

    1.ZMIO扩展模块的组成。

 2.png

    通讯模块:该模块有ZMIO300-ECAT通讯模块和ZMIO300-CAN通讯模块两种,ZMIO300-ECAT通讯模块的使用需要通过一段Basic代码进行总线初始化才能通讯上。

    ZMIO300-CAN通讯模块使用简单,只要预先设置好拨码开关,然后上电即可实现通讯。但是ZMIO300-CAN通讯模块不能设置AD/DA扩展子模块的量程和模式。

    2.硬件接线。

    ECAT耦合器+扩展子模块接线参考:

    3.png

    注意:通讯模块和扩展子模块都需要24V电源供电。

    四、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        '总线扫描失败

       ?"总线扫描失败"

    ENDIF

ENDSUB

    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)

   endif

ENDSUB

    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

    五、设置ZMIO模拟量扩展模块的量程和模式

    可通过SDO_Write指令对ZMIO模拟量扩展模块的量程和模式进行设置。(需要是ECAT耦合器才支持修改模拟量模块的模式和量程)。

  4.png

    六、上位机开发进行总线轴和模块的初始化

    1.通过ZDevelop软件将该Basic程序下载到控制器中。

    2.通过ZAux_Execute()来调用控制器里面的Basic函数,进行EtherCAT总线初始化。

    示例:ZAux_Execute(g_handle,"Runtask0,EcatInit_Para()",NULL,0)

    5.png

    3.通过ZAux_Direct_GerVariableInt()指令来读取Basic文件定义的全局整形变量,比如读取EcatAxisInitFlag和NodeIoInitFlag这两个变量来获取Basic程序那边总线初始化的情况。

    示例:

    ZAux_Direct_GetVariableInt(g_handle,"EcatAxisInitFlag",&AxisInitFlag)

    ZAux_Direct_GetVariableInt(g_handle,"NodeIoInitFlag",&IoInitFlag)

    6.png

    本次,正运动技术EtherCAT运动控制器之ZMIO300模块的使用,就分享到这里。

    更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

邮箱留言

Copyright © 2013 正运动技术有限公司 Design by Zmotion 版权所有   粤ICP备13037187号    Powered by www.zmotion.com.cn 运动控制器-运动控制卡

在线咨询