欢迎大家积极投稿“EtherCAT总线生态拓展”,内容包括但不限于自动化技术与市场,欢迎大家来搞各个科技领域,另有自动化技术微信交流群欢迎大家加入,管理员微信1845635074


接口说明
总线接口
EIO16084带两个EtherCAT总线接口,EtherCAT IN和EtherCAT OUT,使用标准网线完成接线。
接线时注意EtherCAT IN连接上一级模块,EtherCAT OUT连接下一级模块,IN和OUT口不可混用。
通用输入口
通用输入口IN的内部电路参考图如下,EIO16084带16个通用输入口,输入口需要NODE_IO配置IO地址编号才能通过控制器端操作,输入口参数参见下表。

项目 |
规格 |
通道数 |
16(IN0-IN15) |
输入方式 |
NPN型 |
输入电压等级 |
DC24V |
输入电流(典型值) |
4.8mA |
输入开通电压 |
<14.5V |
输入最小电流 |
1.8mA |
输入阻抗 |
4.7KΩ |
隔离方式 |
光电隔离 |
输入频率 |
<5kHz |
通用输出口
通用输出口OUT的内部电路参考图如下,EIO16084带8个通用输入口,输出口需要NODE_IO配置IO地址编号才能通过控制器端操作(NODE_IO使用一次便可配置好输入和输出),输出口参数参见下表。

项目 |
规格 |
通道数 |
8(OUT0-OUT7) |
输出方式 |
晶体管NPN型,OD输出。 |
输出电压等级 |
负载电源≤36V |
最大输出电流 |
300mA |
关闭时最大漏电流 |
25μA |
导通响应时间 |
12μs |
关闭响应时间 |
80μs |
隔离方式 |
光电隔离 |
过流保护 |
支持,动作电流600mA |
输出频率 |
<8kHz |
针脚号 |
信号 |
说明 |
1 |
EGND |
外部电源地 |
2 |
IN16-19/ALM |
通用输入,建议做驱动报警 |
3 |
OUT8-11/ENABLE |
通用输出,建议驱动使能 |
4 |
EA- |
编码器输入 |
5 |
EB- |
编码器输入 |
6 |
EZ- |
编码器输入 |
7 |
+5V |
内部5V电源输出 |
8 |
备用 |
备用 |
9 |
DIR+ |
伺服或步进方向输出 |
10 |
GND |
内部电源地 |
11 |
PUL- |
伺服或步进脉冲输出 |
12 |
备用 |
备用 |
13 |
GND |
内部电源地 |
14 |
OVCC |
E24V输出(建议仅供伺服IO ) |
15 |
OUT12-15/CLR |
通用输出,建议驱动报警清除 |
16 |
IN20-23/INP |
通用输入,建议做到位信号 |
17 |
EA+ |
编码器输入 |
18 |
EB+ |
编码器输入 |
19 |
EZ+ |
编码器输入 |
20 |
GND |
内部电源地 |
21 |
GND |
内部电源地 |
22 |
DIR- |
伺服或步进方向输出 |
23 |
PUL+ |
伺服或步进脉冲输出 |
24 |
GND |
内部电源地 |
25 |
备用 |
备用 |
26 |
备用 |
备用 |
可以通过数据字典配置EIO扩展板直接使能与告警,缺省不使用,需要主控制器来操作。
告警输入、位置到位信号、轴使能、误差清除可以为通用的输入输出,由于驱动能力偏小建议做轴功能IO使用。
EGND,OVCC电源是控制器内部输出供伺服IO使用,请勿连接到开关电源,不使用时悬空。

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

上图涉及的编号概念如下:总线相关指令参数会用到如下编号。
若设备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。

轴映射
扩展模块的轴使用前需要使用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

SDO指令配置输入输出:
编号 |
描述 |
类型 |
读写 |
其它说明 |
6000h |
input |
ARRAY U8 |
RO |
1-闭合 |
6200h |
Output |
ARRAY U8 |
RW |
1-打开 |
6206h |
异常输出模式 |
ARRAY U8 |
RW |
1-使用异常输出 |
6207h |
异常输出使用状态 |
ARRAY U8 |
RW |
/ |
SDO指令配置驱动器参数:
例如:扩展的脉冲轴的真实轴类型设置通过数据字典6011h设置,(参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h+0*800h,第二个驱动器设置6011h+1*800h,以此类推,每个驱动器加800h,其他参数同理)
编号 |
描述 |
类型 |
读写 |
其它说明 |
6011h |
Atype |
UNSIGNED8 |
rw |
扩展板轴的类型 0 虚拟轴 1 脉冲方向方式的步进或伺服 2 模拟信号控制方式的伺服 3 正交编码器 4 步进+编码器 5 步进+脉冲方向编码器 6 脉冲方向方式的编码器 7 脉冲方向方式步进或伺服+EZ信号输入 |
6012h |
Invert_Step |
UNSIGNED16 |
rw |
参见控制器说明书Invert_Step |
6013h |
Iolevel |
UNSIGNED32 |
rw |
B0-原点电平 B1-限位电平 B8-自动使用使能信号 B9-使用ALM信号告警 B11-B15 原点信号选择 |
6014h |
Axisstatus |
UNSIGNED32 |
ro |
参见控制器说明书AXISSTATUS |
6040h |
Controlword |
UNSIGNED16 |
rw |
对应主控制器DRIVE_CONTROLWORD B0- Switch on B1- Enable voltage B3 - Enable operation B7- Fault reset |
6041h |
Statusword |
UNSIGNED16 |
ro |
对应主控制器DRIVE_STATUS B0 Ready to switch on B1 Switched on B2 Operation enabled B3 Fault B4 Voltage enabled B5 Quick stop B7 Warning B8 EZ status B9 Remote B10 Target reached B11 Internal limit active B12 - 13 Operation mode specific B14 EA status B15 EB status |
6060h |
Modes of operation |
INTEGER8 |
rw |
6 回零 8 周期定位 |
607Eh |
极性 |
INTEGER8 |
rw |
1 反向, 0-正常方向 |
60fDh |
驱动器输入兼容 |
UNSIGNED32 |
rw |
/ |
'*******************************************************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开始,EIO6084扩展模块的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总线驱动器能否正常运行。

后台回复“口罩机”领取大量PLC与CODESYS程序案例与资料,一些是入门级的程序,一些是实际工程项目,程序内容在不断更新,总线控制器厂家火热寻找合作伙伴

