EtherCAT轴扩展模块EIO16084在运动控制系统中的应用

  • Post author:
  • Post category:其他


EIO16084扩展模块的使用分为如下几步,硬件接线;总线初始化建立总线通讯连接,初始化中执行扩展资源的映射,分别配置轴资源和IO资源;扩展资源配置完成可通过控制器端访问,扩展轴为脉冲型,设置相关轴参数,发送运动命令即可控制电机运动。



01 产品简介

EIO16084扩展模块是EtherCAT总线控制器使用的扩展模块,可扩展数字量IO和脉冲轴这两类资源,当控制器本体上资源不够的时候,EtherCAT总线控制器可连接多个EIO扩展模块进行资源扩展,可查看控制器的IO最大扩展点数和最大扩展轴数,支持IO的远程扩展。

在这里插入图片描述

每个EIO扩展模块在扩展接线完成后,不需要进行二次开发,只需使用指令在EtherCAT主站控制器配置唯一的IO地址和轴地址,配置完成即可访问。

IO地址编号通过总线指令NODE_IO来设置,控制器上程序只需通过IO编号就可以访问到扩展模块上的资源。轴地址的配置使用“AXIS_ADDRESS”指令映射绑定轴号,绑定完成通过BASE或AXIS指令指定轴号。

EIO16084扩展模块功能特点:

(1)支持4轴脉冲轴扩展。

(2)脉冲输出模式:方向/脉冲或双脉冲。

(3)每轴最大输出脉冲频率10MHz。

(4)支持16进+8出IO扩展,每个脉冲轴另外各有2进2出IO可供配置。

(5)脉冲轴以外的输出口最大输出电流达300mA,可直接驱动部分电磁阀。

(6)ECAT最快500us的刷新周期。

(7)单电源供电,连接主电源即可,无需IO电源。

此系列产品选型指南:

在这里插入图片描述

EIO系列带轴的扩展模块的使用方法相同,仅是扩展资源数量的区别,EIO16084和EIO24088的使用方法完全相同,EIO1616相比上面两个型号,无需轴映射相关操作。

在这里插入图片描述



02 接口说明


1.总线接口

EIO16084带两个EtherCAT总线接口,“EtherCAT IN”和“EtherCAT OUT”,使用标准网线完成接线。

接线时注意:“EtherCAT IN”连接上一级模块,“EtherCAT OUT”连接下一级模块,IN和OUT口不可混用。


2.通用输入口

通用输入口IN的内部电路参考图如下,EIO16084带16个通用输入口,输入口需要NODE_IO配置IO地址编号才能通过控制器端操作,输入口参数参见下表。

在这里插入图片描述

输入口参数说明:

在这里插入图片描述

3.通用输出口

通用输出口OUT的内部电路参考图如下,EIO16084带8个通用输入口,输出口需要NODE_IO配置IO地址编号才能通过控制器端操作(NODE_IO使用一次便可配置好输入和输出),输出口参数参见下表。

在这里插入图片描述

输入口参数说明:

在这里插入图片描述


4.轴接口

EIO16084的轴接口有4个,采用DB26针脚,针脚定义如下表,轴接口包含差分脉冲输入和差分编码器输入信号,同时还有两路通用输入口(其中一路为报警输入),两路通用输出口(其中一路为驱动使能)。

EIO16084扩展轴时,为总线转脉冲,将脉冲型驱动器接入到EIO16084扩展模块上的脉冲轴接口上。通过总线初始化建立EtherCAT总线控制器和EIO16084扩展模块之间的通讯连接,总线初始化过程中必须包含轴映射,之后参考脉冲型控制器的使用方法操作脉冲驱动器。

在这里插入图片描述

在这里插入图片描述

可以通过数据字典配置EIO扩展板直接使能与告警,缺省不使用,需要主控制器来操作。

告警输入、位置到位信号、轴使能、误差清除可以为通用的输入输出,由于驱动能力偏小建议做轴功能IO使用。

“EGND,OVCC电源”是控制器内部输出供伺服IO使用,请勿连接到开关电源,不使用时悬空。



03 接线参考

EIO16084扩展模块接线规则:EIO16084可接到EtherCAT总线上的任意节点。

EIO16084为总线上的一个设备节点,可接入4个脉冲型驱动器,驱动器按照AXIS 0到AXIS 3的顺序依次编号,并且遵从总线上的驱动器编号规则。

驱动器的使能信号为脉冲接口内的通用输出口,直接通过主控制器的OP指令来使能。或使用SDO指令配置数据字典为自动使能后,主控制器无法直接控制对应的输出口来使能。

注意:轴扩展模块的使用个数不是无限制的,参考控制器可扩展的最大轴数。

如下图,ZMC416BE运动控制器本体支持连接16个脉冲驱动器,最大扩展轴数为20,故可以通过EtherCAT总线连接一个EIO16084扩展到支持20个脉冲驱动器。

扩展轴映射轴号时注意避开本地脉冲轴,若本地脉冲轴使用了16个,默认对应轴号0-15,则扩展轴上的AXIS0-3(对应下图中驱动器编号0-3)分别手动映射为轴号16-19。

在这里插入图片描述

如下图,ZMC432运动控制器本体支持连接32个轴(脉冲驱动器+EtherCAT总线驱动器一共32个),控制器本体只有6路脉冲接口,通过一个EIO16084可扩展4路脉冲接口,支持脉冲驱动器和总线驱动器混合使用。

在这里插入图片描述

上图涉及的编号概念如下:总线相关指令参数会用到如下编号。

(1)槽位号(slot)

槽位号是指控制器上总线接口的编号,EtherCAT总线槽位号为0。

(2)设备号(node)

设备号是指一个槽位上连接的所有设备的编号,从0开始,按设备在总线上的连接顺序自动编号,可以通过“NODE_COUNT(slot)”指令查看总线上连接的设备总数。

(3)驱动器编号

控制器会自动识别出槽位上的驱动器,编号从0开始,按驱动器在总线上的连接顺序自动编号。

驱动器编号与设备号不同,只给槽位上的驱动器设备编号,其他设备忽略,映射轴号时将会用到驱动器编号。



04 扩展资源映射方法

EIO16084扩展模块上有两类资源需要映射,轴资源和IO资源。


1.IO映射

控制器上程序只需通过IO编号就可以访问到扩展模块上的资源,EtherCAT总线扩展模块IO编号通过总线指令NODE_IO来设置,同时配置输入和输出。

IO映射时先查看控制器自身的最大IO编号(包括外部IO接口和脉冲轴内的接口),再使用指令设置。

若扩展的IO与控制器自身IO编号重合,二者将同时起作用,所以IO映射的映射的编号在整个控制系统中均不得重复。

IO映射语法:

NODE_IO(slot,node)=iobase

slot:槽位号,0-缺省

node:设备编号,编号从0开始

iobase:映射IO起始编号,设置结果只会是8的倍数

示例:

NODE_IO(0,0)=32 '设置槽位0接口设备0的IO起始编号为32

若设备0为EIO16084,按如上语法配置后,扩展模块上的通用输入口IN0-15对应的IO编号依次为32-47,轴接口内的通用输入口编号48-55,其中轴AXIS 0-3的驱动报警输入分别为48-51。通用输出口OUT0-7应的IO编号依次为32-39,轴接口内的通用输出口编号40-47,其中轴AXIS 0-3的驱动使能输出分别为40-43。

在这里插入图片描述


2.轴映射

扩展模块的轴使用前需要使用“AXIS_ADDRESS”指令映射轴号,轴映射也需要注意整个系统的轴号不得重复。EIO系列扩展轴的映射与总线驱动器的轴映射语法相同。

轴映射语法:

AXIS_ADDRESS(轴号)=(槽位号<<16)+驱动器编号+1

示例:

AXIS_ADDRESS(0)=(0<<16)+0+1 'EtherCAT总线上的第一个驱动器,驱动器编号0,绑定为轴0
AXIS_ADDRESS(1)=(0<<16)+1+1 'EtherCAT总线上的第二个驱动器,驱动器编号1,绑定为轴1

若第一个节点是EIO16084,EIO16084上连接了驱动器,那么这里的驱动器0是连接在EIO16084上的第一个脉冲驱动器,否则便是EtherCAT总线驱动器。



05 拓展脉冲轴的使用方法

EIO16084扩展模块需要经过总线初始化之后才能使用,我们这里把一个脉冲型驱动器接到EIO16084扩展模块上的AXIS 0接口上,使用步骤如下。

第一步:执行总线初始化程序(参见下节),初始化过程中识别EIO扩展模块的设备编号和连接的驱动器编号,根据驱动器编号操作轴映射,根据设备号操作扩展模块的IO映射,设置DRIVE_PROFILE和ATYPE。

第二步:初始化成功后,使能EIO16084扩展模块上的脉冲驱动器,同样也是操作脉冲轴接口内的OP信号使能驱动器,由于扩展模块映射的起始编号是32,这里的AXIS 0-AXIS 3口内的使能信号对应通用输出口编号是40-43。在输出口窗口内按下OP(40)或在程序中执行指令OP(40,ON)均可使能AXIS 0的驱动器。

第三步:使能完成设置相关轴参数,再发送运动指令便可驱动电机。

在这里插入图片描述

在初始化操作成功后,总线上能识别该扩展模块,可查看扩展模块上的轴接口数,IO映射后可查看输入输出的编号范围。

例如设置起始编号为32,该扩展模块上的输入编号为外部自带的16点+轴接口通用输入8点,一共24点,范围32-55,输出编号为外部自带的8点+轴接口通用输入8点,一共16点,范围32-47。

在这里插入图片描述

EIO16084使用注意事项:

扩展模块上的IO不管有没有使用都需要使用NODE_IO指令映射EIO16084的输入输出编号。扩展模块的DRIVE_PROFILE配置为0,ATYPE设为65,但实际由于是脉冲型驱动器,轴类型并不是65,真实轴类型的配置使用SDO指令配置数据字典6011h设置。

初始化过程中若产生硬限位报警,可在轴参数窗口将硬限位FWD_IN和REV_IN的映射编号指向-1,表示不映射,需要接入限位开关时再去修改FWD_IN和REV_IN。

EIO16084扩展模块设置:

通过SDO指令读写数据字典设置,只开放了部分数据字典供设置,更多驱动器参数使用驱动器软件修改。

SDO指令配置输入输出:

在这里插入图片描述

SDO指令配置驱动器参数:

例如:扩展的脉冲轴的真实轴类型设置通过数据字典6011h设置,(参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h+0

800h,第二个驱动器设置6011h+1

800h,以此类推,每个驱动器加800h,其他参数同理)

在这里插入图片描述

数据字典读取语法:

SDO_READ (槽位号, 设备编号, 数据字典编号, 数据字典子编号, 数据类型, 读取数据存储TABLE位置)

SDO_READ_AXIS (轴号, 数据字典编号, 数据字典子编号, 数据类型, 读取数据存储TABLE位置)

数据字典写入语法:

SDO_WRITE (槽位号, 设备编号, 数据字典编号, 数据字典子编号, 数据类型, 写入数据值)

SDO_WRITE_AXIS (轴号, 数据字典编号, 数据字典子编号, 数据类型, 写入数据值)

数据字典读写示例:

global sub Sub_SetNodePara(iNode,iVender,iDevice,Iaxis)
   if iVender = $41B and iDevice = $1918   then    '正运动16084脉冲扩展轴
      SDO_WRITE(Bus_Slot,iNode,$6011+Iaxis*$800,0,5,4)      '设置扩展脉冲轴ATYPE类型,值为4表示脉冲和编码器信号在同一个轴号上
      SDO_WRITE(Bus_Slot,iNode,$6012+Iaxis*$800,0,6,0)      '设置扩展脉冲轴INVERT_STEP脉冲输出模式,模式0,脉冲+方向
      NODE_IO(Bus_Slot,iNode) = 32 + 32*iNode          '设置16084上IO的起始映射地址
   endif
end sub

如果扩展模块之后还连接了EtherCAT驱动器,使用时注意总线扫描设备数量的设置,EtherCAT驱动器在初始化程序执行完便使能成功,后续设置轴参数便能运行,注意初始化过程中的DRIVE_PROFILE给EtherCAT驱动器配置合适的PDO列表,需要用到驱动器IO时,还需操作DRIVE_IO映射。



06 总线初始化

此初始化程序可用来初始化EtherCAT驱动器和EtherCAT总线扩展模块,建立通讯连接(通用模板,适用于多种品牌的驱动器)。

在这里插入图片描述

'*******************************************************ECAT总线初始化
global CONST BUS_TYPE = 0      '总线类型。可用于上位机区分当前总线类型
global CONST MAX_AXISNUM =32    '最大轴数
global CONST Bus_Slot   = 0        '槽位号0(单总线控制器缺省0)
global CONST PUL_AxisStart= 0      '本地脉冲轴起始轴号
global CONST PUL_AxisNum = 0    '本地脉冲轴轴数量
global CONST Bus_AxisStart   = 6      总线轴起始轴号
global CONST Bus_NodeNum = 2    '总线配置节点数量,用于判断实际检测到的从站数量是否一致
global Bus_InitStatus      '总线初始化完成状态
Bus_InitStatus = -1
global  Bus_TotalAxisnum    '检查扫描的总轴数
delay(3000)        '延时3S等待驱动器上电,不同驱动器自身上电时间不同,具体根据驱动器调整延时
?"总线通讯周期:",SERVO_PERIOD,"us"
Ecat_Init()      '初始化ECAT总线 
while (Bus_InitStatus = 0)
   Ecat_Init()
wend
end

'****************************************ECAT总线初始化**********************************
'初始流程:  slot_scan(扫描总线) ->   从站节点映射轴/io  ->  SLOT_START(启动总线) -> 初始化成功
'*****************************************************************************************
global sub Ecat_Init()
   local Node_Num,Temp_Axis,Drive_Vender,Drive_Device,Drive_Alias
   RAPIDSTOP(2)
   for i=0 to MAX_AXISNUM - 1    '初始化还原轴类型
      AXIS_ENABLE(i) = 0
      atype(i)=0  
      AXIS_ADDRESS(i) =0
      DELAY(10)        '防止所有驱动器全部同时切换使能导致瞬间电流过大
   next
   Bus_InitStatus = -1
   Bus_TotalAxisnum = 0  
   SLOT_STOP(Bus_Slot)
   delay(200)
   slot_scan(Bus_Slot)                    '扫描总线
   if return then 
      ?"总线扫描成功","连接从站设备数:"NODE_COUNT(Bus_Slot)
      if NODE_COUNT(Bus_Slot) <> Bus_NodeNum then    '判断总线检测数量是否为实际接线数量
         ?""  
         ?"扫描节点数量与程序配置数量不一致!" ,"配置数量:"Bus_NodeNum,"检测数量:"NODE_COUNT(Bus_Slot)
         Bus_InitStatus = 0    '初始化失败。报警提示
         return
      endif   
      '"开始映射轴号"
      for Node_Num=0 to NODE_COUNT(Bus_Slot)-1  '遍历扫描到的所有从站节点
         Drive_Vender = NODE_INFO(Bus_Slot,Node_Num,0)    '读取驱动器厂商
         Drive_Device = NODE_INFO(Bus_Slot,Node_Num,1)    '读取设备编号
         Drive_Alias = NODE_INFO(Bus_Slot,Node_Num,3)      '读取设备拨码ID
         if NODE_AXIS_COUNT(Bus_Slot,Node_Num) <> 0  then    '判断当前节点是否有电机
            for j=0 to NODE_AXIS_COUNT(Bus_Slot,Node_Num)-1    '根据节点带的电机数量循环配置轴参数(针对一拖多驱动器)    
               Temp_Axis = Bus_AxisStart + Bus_TotalAxisnum    '轴号按NODE顺序分配
               'Temp_Axis = Drive_Alias        '轴号按驱动器设定的拨码分配(一拖多需要特殊处理)
               base(Temp_Axis)
               AXIS_ADDRESS= Bus_TotalAxisnum+1  '映射轴号
               ATYPE=65      '设置控制模式 65-位置 66-速度 67-转矩 
               Sub_SetPdo(Node_Num,Drive_Vender,Drive_Device)    '设定PDO参数
               Sub_SetNodePara(Node_Num,Drive_Vender,Drive_Device,j)  '设置特殊总线参数,包含EIO16084的配置  
               disable_group(Temp_Axis)          '每轴单独分组
               Bus_TotalAxisnum=Bus_TotalAxisnum+1    '总轴数+1
            next
         else                        'IO扩展模块
            Sub_SetNodeIo(Node_Num,Drive_Vender,Drive_Device,1024 + 32*Node_Num)    '映射扩展模块IO
         endif
      next
      ?"轴号映射完成","连接总轴数:"Bus_TotalAxisnum 
      DELAY 200
      SLOT_START(Bus_Slot)        '启动总线
      if return then 
         wdog=1            '使能总开关   
         '?"开始清除驱动器错误"
         for i= Bus_AxisStart to Bus_AxisStart + Bus_TotalAxisnum - 1 
            BASE(i)
            DRIVE_CLEAR(0)
            DELAY 50
            '?"驱动器错误清除完成"
            datum(0)            '清除控制器轴状态错误"
            DELAY 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

'*****************************************手动配置PDO**********************************
'部分特殊品牌可能需要手动配置,大部分只需要通过DRIVE_PROFILE设置自动配置相应的POD参数即可
'*******************************************************************************************
global sub Sub_SetPdo(iNode,iVender,iDevice)
   IF iVender = 0 then                    '自定义PDO  
      SDO_WRITE (Bus_Slot, iNode, $1c12, 0 ,5 ,0)        '禁用PDO,禁用后才可以修改内容
      DELAY(50)
      SDO_WRITE (Bus_Slot, iNode, $1c13, 0 ,5 ,0)
      DELAY(50)
      SDO_WRITE (Bus_Slot, iNode, $1600, $0 ,5 ,0)        'RxPDO配置对应参数
      SDO_WRITE (Bus_Slot, iNode, $1600, $1 ,7 ,$60400010)    '控制字
      SDO_WRITE (Bus_Slot, iNode, $1600, $2 ,7 ,$607a0020)    '目标位置
      SDO_WRITE (Bus_Slot, iNode, $1600, $3 ,7 ,$60fe0120)    '驱动器IO输入
      SDO_WRITE (Bus_Slot, iNode, $1600, $0 ,5 ,3)   
      SDO_WRITE (Bus_Slot, iNode, $1a00, $0 ,5 ,0)        'TxPDO配置对应参数
      SDO_WRITE (Bus_Slot, iNode, $1a00, $1 ,7 ,$60410010)    '状态字
      SDO_WRITE (Bus_Slot, iNode, $1a00, $2 ,7 ,$60640020)    '反馈位置
      SDO_WRITE (Bus_Slot, iNode, $1a00, $3 ,7 ,$60fd0020)    '驱动器IO输出
      SDO_WRITE (Bus_Slot, iNode, $1a00, $0 ,5 ,3)    
      SDO_WRITE (Bus_Slot, iNode, $1c12, 1 ,6 ,$1600)      'RxPDO分配对象
      DELAY(50)
      SDO_WRITE (Bus_Slot, iNode, $1c13, 1 ,6 ,$1a00)      TxPDO分配对象
      DELAY(50)
      SDO_WRITE (Bus_Slot, iNode, $1c12, 0 ,5 ,1)      '启用PDO
      DELAY(50)
      SDO_WRITE (Bus_Slot, iNode, $1c13, 0 ,5 ,1)
      SDO_WRITE (Bus_Slot, iNode, $1C32, $1 ,6 ,2)      '设置DC同步模式
      SDO_WRITE (Bus_Slot, iNode, $1C33, $1 ,6 ,2) 
      DRIVE_PROFILE = -1                '使用驱动缺省PDO配置
   elseif iVender = $66f then
      DRIVE_PROFILE = 4                
   else
      DRIVE_PROFILE = 0                
   endif
end sub

'***************************************从站节点特殊参数配置*****************************
'通过SDO方式修改对应对象字典的值修改从站参数(具体对象字典查看驱动器手册)
'**********************************************************************************************
global sub Sub_SetNodePara(iNode,iVender,iDevice,Iaxis)
   if iVender = $41B and iDevice = $1918   then    '正运动EIO16084脉冲扩展轴
      SDO_WRITE(Bus_Slot,iNode,$6011,Iaxis*$800,5,4)  '设置扩展脉冲轴ATYPE类型
      SDO_WRITE(Bus_Slot,iNode,$6012,Iaxis*$800,6,0)  '设置扩展脉冲轴INVERT_STEP脉冲输出模式
      NODE_IO(Bus_Slot,iNode) = 32 + 32*iNode    '设置16084上IO的起始映射地址
   elseif iVender = $66f then              '松下驱动器
      SDO_WRITE(Bus_Slot,iNode,$3401,0,4,$10101)        '正限位电平 $818181
      SDO_WRITE(Bus_Slot,iNode,$3402,0,4,$20202)        '负限位电平 $828282 
      SDO_WRITE(Bus_Slot,iNode,$6091,1,7,1)          '齿轮比
      SDO_WRITE(Bus_Slot,iNode,$6091,2,7,1)  
      SDO_WRITE(Bus_Slot,iNode,$6092,1,7,10000)        '电机一圈脉冲数
      SDO_WRITE(Bus_Slot,iNode,$607E,0,5,224)        '电机方向0-反转224   
      SDO_WRITE(Bus_Slot,iNode,$6085,0,7,4290000000)      '异常减速度
      'SDO_WRITE(Bus_Slot,iNode,$1010,1,7,$65766173)      '写EPPROM(写EPPROM后驱动器需要重新上电)
   elseif iVender = $100000 then              '汇川驱动器
      SDO_WRITE(Bus_Slot,iNode,$6091,1,7,1)          '齿轮比
      SDO_WRITE(Bus_Slot,iNode,$6091,2,7,1)  
   endif
end sub

'********************************总线IO模块映射**************************************
'通过NODE_IO(Bus_Slot,Node_Num)分配模块IO起始地址
'******************************************************************************************
global sub Sub_SetNodeIo(iNode,iVender,iDevice,i_IoNum)
   if iVender = $41B and iDevice = $130   then    '正运动EIO1616
      NODE_IO(Bus_Slot,iNode) = i_IoNum
   endif
end sub

参考配置采用控制器依次连接一个EIO16084扩展模块和一个EtherCAT总线驱动器,采用以上初始化程序,成功建立通讯连接,控制器状态窗口显示当前扫描连接的节点情况。

总线上的主站为控制器,控制器连接的第一个从站设备为EIO16084扩展模块,第二个从站设备为EtherCAT总线驱动器,没有使用控制器的本地脉冲轴接口。总线上的驱动设备映射轴号可以从6开始,EIO16084扩展模块的AXIS 0-3接口上的脉冲驱动器映射为轴号6-9,EtherCAT总线驱动器映射为轴号10,EIO16084扩展模块的IO编号起始为32。

注意:映射的轴号和IO编号整个控制系统中不得重复,根据具体情况去选择编号。

在这里插入图片描述

在没有IO设备的情况下,我们可以通过OUT和IN端口直接相连判断IO的响应情况,如下图,测试EIO扩展模块的IO配置,将EIO的OUT2(映射编号34)端子连接到EIO的IN8(映射编号40)上,操作OP(34)可见输入口40收到信号。

在这里插入图片描述

EtherCAT总线初始化执行后,配置轴参数,发送运动指令便可控制电机运行,或参考下图,通过手动运动窗口,快速检测EtherCAT总线驱动器能否正常运行。

在这里插入图片描述

本次,正运动技术EtherCAT轴扩展模块EIO16084在运动控制系统中的应用,就分享到这里。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。



版权声明:本文为weixin_57350300原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。