EIO16084扩展模块的使用分为如下几步,硬件接线;总线初始化建立总线通讯连接,初始化中执行扩展资源的映射,分别配置轴资源和IO资源;扩展资源配置完成可通过控制器端访问,扩展轴为脉冲型,设置相关轴参数,发送运动命令即可控制电机运动。
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相比上面两个型号,无需轴映射相关操作。
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使用,请勿连接到开关电源,不使用时悬空。
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开始,按驱动器在总线上的连接顺序自动编号。
驱动器编号与设备号不同,只给槽位上的驱动器设备编号,其他设备忽略,映射轴号时将会用到驱动器编号。
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总线驱动器。
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+0800h,第二个驱动器设置6011h+1800h,以此类推,每个驱动器加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映射。
此初始化程序可用来初始化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在运动控制系统中的应用,就分享到这里。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。