PLC
直播中

李春梅

7年用户 1729经验值
私信 关注

正运动技术运动控制器EtherCAT总线的基础使用

EtherCAT总线扩展模块包含哪些?
怎样去使用正运动技术运动控制器EtherCAT总线?

回帖(1)

李颖

2021-9-27 15:49:15
  之前正运动技术与大家分享了,运动控制器的固件升级、ZBasic程序开发、ZPLC程序开发、与触摸屏通讯和输入/输出IO的应用、运动控制器数据与存储的应用以及运动控制器ZCAN总线扩展模块的使用等。
  今天,我们来讲解一下正运动技术运动控制器EtherCAT总线的基础使用。
  1、材料准备与控制器接线参考
  材料准备:
  1)电脑1台,安装ZDevelop3.01以上版本软件。
  2)控制器1个。
  3)24V直流电源2个(主电源,IO电源)。
  4)总线驱动器+电机(或步进驱动器+电机)若干。
  5)控制器接线端子若干。
  6)网线若干。
  7)连接线若干。
  8)不同类型扩展模块多个(扩展模块接线参考参见下文)。
  2、扩展模块的作用
  当控制器自身的轴资源、IO资源不够用时,可采用扩展模块来扩展,可以扩展脉冲轴、数字量输入输出、模拟量输入输出这三种类型。只有带脉冲轴接口的扩展模块才支持扩展脉冲轴数,总线轴不可扩展。
  扩展模块按连接方式可分为ZCAN总线扩展模块和EtherCAT扩展模块两类。
  按产品系列划分,可分为ZCAN扩展模块,EtherCAT扩展模块、ZMIO300扩展模块三大类。
  IO数字量扩展:ZMC控制器4系列及以上的型号IO点数可扩展至4096点。
  AIO模拟量扩展:ZMC控制器4系列及以上的型号AIO点数可扩展至520点。
  轴扩展:只能扩展脉冲轴,鉴于成本和使用方面,不建议使用过多轴扩展板,可选用支持脉冲轴数较多的控制器型号。
  控制器可扩展的IO点数可在硬件手册或“命令与输出”窗口输入?*max打印查看。
  
  3、EtherCAT总线扩展模块
  EtherCAT总线扩展模块包含两个系列:可分为EIO扩展模块、ZMIO300-ECAT扩展模块。
  EIO1616MT支持扩展数字量IO,包含16路输入和16路输出。
  EIO24088可扩展数字量IO和脉冲轴,支持扩展8个脉冲轴,包含24路输入和8路输出。
  ZMIO300-ECAT扩展模块为立式组合模块,可扩展数字量IO和模拟量。
  EtherCAT通讯建议采用带屏蔽层的双绞线进行网络数据传输。
  ZMIO300-ECAT+16DO+16DI+4DA+4AD
  1)EIO扩展模块
  A、EIO扩展模块使用EtherCAT总线扩展
  EIO1616双电源供电(除了主电源,IO也需要单独供电),EIO24088为单电源供电。
  扩展模块数字量IO接口默认支持NPN型。
  EtherCAT扩展模块接线只需将各个模块的EtherCAT口相互连接即可,EIO扩展板带两个EtherCAT接口,EtherCAT IN口接主控制器,EtherCAT OUT口接下级扩展板或驱动设备,不可混用。
  B、EIO扩展模块使用接线
  EIO扩展接线参考如下:
  
  ZMC432+EIO24088+EIO1616
  2)ZMIO300-ECAT扩展模块
  A、ZMIO300-ECAT扩展模块可搭配子模块如下表:
  
  模拟量精度为16位,有NPN和PNP两种输入方式可选,数字量输入输出口带信号状态指示灯。
  ZMIO300-16DO/ZMIO300-16DOP数字量输出需要一路电源单独供电。
  B、ZMIO300-ECAT扩展模块使用接线
  ZMIO300-ECAT扩展模块接线参考如下,与EIO扩展模块接线方法相同。
  EtherCAT IN口与EtherCAT OUT口不可混用。
  4、EtherCAT总线使用
  EtherCAT总线上连接的电机则需要编写一段程序来进行使能。使能之后的应用与脉冲电机一致,运动指令都是相同的。初始化程序参见文章末尾。
  初始化过程主要包含以下几个步骤:
  1、总线扫描SLOT_SCAN (slot)
  2、轴映射AXIS_ADDRESS,扩展模块IO映射NODE_IO
  3、总线开启SLOT_START (slot)
  4、清除驱动器错误DRIVE_CLEAR(0)
  5、轴使能AXIS_ENABLE(单轴使能),WDOG(总使能)
  初始化成功后,便可以使用运动控制指令控制总线轴运转。
  扩展的资源必须映射到控制器本地资源才可使用。
  不同的EtherCAT扩展模块,IO映射、轴映射方法相同。
  IO映射采用NODE_IO指令(数字量)、NODE_AIO指令(模拟量)设置,轴映射采用AXIS_ADDRESS指令映射轴号。
  IO映射时先查看控制器自身的最大IO编号(包括外部IO接口和脉冲轴内的接口),再使用指令设置。
  若扩展的 IO与控制器自身IO编号重合,二者将同时起作用,所以IO映射的映射的编号在整个控制系统中均不得重复。
  5、EtherCAT总线相关概念
  总线相关指令参数会用到如下编号:
  槽位号(slot)
  槽位号是指控制器上总线接口的编号,缺省为0。当控制器上有多个总线接口,?*SLOT查看槽位号。
  
  运动控制器支持单总线时,槽位号为0。
  支持双总线时,EtherCAT总线槽位号为0,RTEX总线槽位号为1。
  设备号(node)
  设备号是指一个槽位上连接的所有设备的编号,从0开始,按设备在总线上的连接顺序自动编号,可以通过NODE_COUNT(slot)指令查看。
  驱动器编号
  控制器会自动识别出槽位上的驱动器,编号从0开始,按驱动器在总线上的连接顺序自动编号。
  驱动器编号与设备号不同,只给槽位上的驱动器设备编号,其他设备忽略。
  6、IO映射
  1)数字量IO
  NODE_IO指令设置设备的数字量IO起始编号,单个设备的输入输出的起始编号一样。必须总线扫描后才能设置。
  语法:
  NODE_IO(slot, node)=iobase
  slot:槽位号,0-缺省
  node:设备编号,编号从0开始
  iobase:映射IO起始编号,设置结果只会是8的倍数
  示例:
  SLOT_SCAN(0) ‘扫描总线
  IF NODE_COUNT(0)》0 THEN ’判断槽位0上是否有设备
  NODE_IO(0,0)=32 ‘设置槽位0接口设备0的IO起始编号为32
  ?NODE_IO(0,0) ’打印出设备0的IO起始编号
  ENDIF
  2)模拟量IO
  NODE_AIO指令设置设备的模拟量IO起始编号,单个设备的输入输出的起始编号一样。必须总线扫描后才能读取。
  NODE_AIO(slot, node[,idir])=Aiobase
  slot:槽位号,0-缺省
  node:设备编号,编号从0开始
  idir:AD/DA选择 。0-缺省,同时设置AIN、AOUT,读取时只读AIN;3-AIN;4-AOUT
  示例:
  SLOT_SCAN(0) ‘扫描总线
  IF NODE_COUNT(0)》0 THEN ’判断槽位0上是否有设备
  NODE_AIO(0,0,0)=8 ‘设置槽位0接口设备0的AIN和AOUT起始编号都为8
  ?NODE_AIO(0,0,0) ’打印出设备0的AIO起始编号
  ENDIF
  7、EtherCAT总线轴映射
  总线轴需要进行轴映射操作,采用AXIS_ADDRESS指令映射,操作方法如下:
  AXIS_ADDRESS(轴号)=(槽位号《《16)+驱动器编号+1
  轴映射写在总线初始化程序中,总线扫描之后,开启总线之前。
  示例:
  AXIS_ADDRESS (0)=(0《《16)+0+1 ‘第一个ECAT驱动器,驱动器编号0,绑定为轴0
  AXIS_ADDRESS (2)=(0《《16)+1+1 ’第二个ECAT驱动器,驱动器编号1,绑定为轴2
  AXIS_ADDRESS (1)=(0《《16)+2+1 ‘第三个ECAT驱动器,驱动器编号2,绑定为轴1
  ATYPE(0)=65 ’设置为ECAT轴类型, 65-位置 66-速度 67-转矩
  ATYPE(1)=65
  ATYPE(2)=65
  8、EtherCAT总线状态
  使用编程软件成功连接到控制器之后,执行总线扫描之后,在线命令栏输入?*EtherCAT打印出每个NODE节点的状态。
  
  Slot 0 contain 1 nodes:0槽位口共连接了1个设备
  Lostcount 0-0:丢包数
  Node:设备连接NODE编号
  Status:设备连接状态,参考NODE_STATUS
  Mainid:厂商ID
  Productid:设备ID
  Axises:设备总轴数
  Alstate:设备OP状态
  Node_profile:设备Profile设置
  Bindaxis:映射到控制器的轴号,-1表示未映射
  Drive_profile:设备收发PDO配置
  Controlword:控制字
  Drive_status:设备当前状态,参考DRIVE_STATUS
  Drive_mode:设备控制模式
  Target:电机位置
  Encode:编码器位置
  9、EtherCAT扩展模块参考配置
  控制模块接线完成,使用ZDevelop软件连接上控制器,运行总线初始化程序,打开“控制器”-“控制器状态”窗口,查看槽位0节点信息,可以看到EtherCAT总线连接的全部设备的信息。
  1)EIO扩展模块
  控制模块配置:
  1个ZMC432+1个EIO1616MT。
  EIO1616MT的节点号为0,扩展的数字量输入IO编号为1024-1039共16个,扩展的数字量输出IO编号为1024-1039共16个。
  NODE_IO(0,0)=1024
  
  2)ZMIO300-ECAT扩展模块
  控制模块配置:
  1个ZMC432+1个ZMIO300-ECAT通讯模块+4个ZMIO300-16DI输入+2个ZMIO300-16DO输出+1个ZMIO300-4AD+1个ZMIO300-4DA。
  NODE_IO(0,0)=32 ‘IO映射,起始编号从32开始,扩展了64个输入和32个输出
  NODE_AIO(0,0,0)=4 ’AIO映射,起始编号从4开始,扩展4个输入和4个输出
  
  10、EtherCAT总线参考配置1
  控制模块配置:
  1个ZMC432+2个总线驱动器。
  使用ZDevelop软件连接上控制器,执行完总线初始化程序后,打开“控制器”-“控制器状态”窗口,可查看槽位0节点信息,或在线命令栏输入?*EtherCAT打印出每个NODE节点的状态。
  
  此时总线上可以扫描到两个节点,这两个节点均为总线驱动器,每个驱动器各带一个电机,将节点0的轴映射到轴6,将节点1的轴映射到轴7。
  AXIS_ADDRESS(6)= (0《《16)+0+1 ‘映射轴号
  AXIS_ADDRESS(7)=(0《《16)+1+1
  ATYPE(6)=65 ’设置控制模式,65-位置 66-速度 67-转矩
  ATYPE(7)=65
  在线命令栏输入?*EtherCAT打印信息如下:
  
  11、EtherCAT总线参考配置2
  控制模块配置:
  1个ZMC432+1个EIO1616MT+2个总线驱动器。
  使用ZDevelop软件连接上控制器,执行完总线初始化程序后,打开“控制器”-“控制器状态”窗口,可查看槽位0节点信息,或在线命令栏输入?*EtherCAT打印出每个NODE节点的状态。
  
  此时总线上可以扫描到3个节点,0节点为EIO1616MT数字量IO扩展模块,带16进16出,IO映射编号范围为32-47,NODE_IO(0,0)=32
  节点1和2均为总线驱动器,每个驱动器各带一个电机,将这两个轴的轴号分别映射为轴6、轴7。
  在线命令栏输入?*EtherCAT打印信息如下:
  
  12、EtherCAT总线初始化程序
  此初始化程序为通用版本,以上几种配置均适用,使用时只需更改个别全局定义的参数即可。
  运动控制模块根据实际使用情况编写。
  **********ECAT总线初始化主程序***********
  global CONST PUL_AxisStart = 0 ‘本地脉冲轴起始轴号
  global CONST PUL_AxisNum = 0 ’本地脉冲轴轴数量
  global CONST Bus_AxisStart = 6 ‘总线轴起始轴号
  global CONST Bus_NodeNum = 1 ’总线配置节点数量,用于判断实际检测到的从站数量是否一致
  global MAX_AXISNUM ‘最大轴数
  MAX_AXISNUM = SYS_ZFEATURE(0) ’自动获取控制器支持的轴数
  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
  if Bus_InitStatus = 1 then ‘总线初始化是否完成
  main() ’运动控制模块
  endif
  END
  ‘************ECAT总线初始化**********
  ’初始流程: slot_scan(扫描总线) -》 从站节点映射轴/io -》 SLOT_START(启动总线) -》 初始化成功
  ‘***********************************
  global sub Ecat_Init()
  LOCAL Node_Num ’节点设备编号
  LOCAL Temp_Axis ‘当前总线轴的轴号
  LOCAL Drive_Vender ’当前设备厂商编号
  LOCAL Drive_Device ‘设备编号
  LOCAL Drive_Alias ’设备拨码ID
  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 ‘将扫描的总线总轴数置0
  SLOT_STOP(0)
  delay(200)
  slot_scan(0) ’扫描总线
  if return then
  ?“总线扫描成功”,“连接从站设备数:”NODE_COUNT(0)
  if NODE_COUNT(0) 《》 Bus_NodeNum then ‘判断总线检测数量是否为实际接线数量
  ?“”
  ?“扫描节点数量与程序配置数量不一致!” ,“配置数量:”Bus_NodeNum,“检测数量:”NODE_COUNT(0)
  Bus_InitStatus = 0 ’初始化失败。报警提示
  ‘return
  endif
  ’“开始映射轴号”
  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 ‘判断当前节点是否有电机
  for j=0 to NODE_AXIS_COUNT(0,Node_Num)-1 ’根据节点带的电机数量循环配置轴参数(针对一拖多驱动器)
  Temp_Axis = Bus_AxisStart + Bus_TotalAxisnum ‘轴号按NODE顺序分配,总线开始轴号+总线扫描轴号
  ’Temp_Axis = Drive_Alias ‘轴号按驱动器设定的拨码分配(一拖多需要特殊处理)
  base(Temp_Axis)
  AXIS_ADDRESS(Temp_Axis)= (0《《16)+ Bus_TotalAxisnum + 1 ’映射轴号
  ATYPE=65 ‘设置控制模式 65-位置 66-速度 67-转矩
  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
  ?“扩展IO映射完成”
  endif
  next
  ?“轴号映射完成”,“连接总轴数:”Bus_TotalAxisnum
  wa 200
  SLOT_START(0) ’启动总线
  if return then
  wdog=1 ‘使能总开关
  ’?“开始清除驱动器错误”
  for i= Bus_AxisStart to Bus_AxisStart + Bus_TotalAxisnum - 1
  BASE(i)
  DRIVE_CLEAR(0)
  DELAY 50
  ‘?“驱动器错误清除完成”
  datum(0) ’清除控制器轴状态错误“
  wa 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
  ‘********总线IO模块映射********
  ’通过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) = 4*(iNode+1)
  ?”IO映射成功“
  endif
  end sub
  ’**********运动控制模块********
  ‘初始化完成后,使用运动控制指令控制ECAT总线轴运动
  ’*****************************
  global sub main()
  RAPIDSTOP(2)
  WAIT IDLE
  BASE(6,7) ‘选择总线轴轴号
  ATYPE=65,65
  UNITS=100,100 ’脉冲当量设置
  SPEED=100,100
  ACCEL=1000,1000
  DECEL=1000,1000
  DPOS=0,0
  MPOS=0,0
  TRIGGER ‘自动触发示波器
  MOVE(100,100) ’先运动100,100位置
  MOVECIRC(200,0,100,0,1) ‘半径100顺时针画半圆,终点坐标(300,100)
  end sub
举报

更多回帖

发帖
×
20
完善资料,
赚取积分