EtherCAT总线运动控制器应用进阶一
前面一节我们讲了EtherCAT总线快速入门,包括初始化使能、控制模式的特点和切换、基础设置等,本节主要围绕EtherCAT总线的参数设置展开说明。
一、材料准备
1.硬件
A.ZMC432控制器一台,带EtherCAT总线接口。
B.松下EtherCAT伺服驱动器+电机一套
C.电脑一台。
D.带屏蔽层网线两根。
E.24V直流电源一个。
F.接线端子与连接线若干。
2.软件
A.ZDevelop V3.10版本控制器编程软件。
从正运动官网www.zmotion.com.cn下载压缩包,解压后直接运行应用程序,无需安装。
B.松下伺服驱动器上位机调试软件。
从松下官网下载后安装。
二、硬件接线
1.控制器接线
控制器接口的用途参见下图。
A.主电源:将控制器主电源接线端子上的E+24V端子接入24V直流电源正极,将EGND端子接入24V直流电源负极。
B.以太网EtherNET端口接线:使用一根网线将控制器的EtherNET端口与电脑的以太网口相连。
C.伺服驱动器与控制器接线:使用一根网线将控制器的EtherCAT总线端口与伺服驱动器的X2A或X2B口相连。
注意伺服驱动器的EtherCAT接口有两个,有些驱动器这两个口可以随意接,有些分为EtherCAT IN和EtherCAT OUT,IN口接上一级设备,OUT口接下一级设备,二者不能混用,要注意连接顺序。
多轴控制时伺服驱动器的EtherCAT OUT口再连接下一级驱动设备的EtherCAT IN口,依此类推。
2.驱动器接线
伺服驱动器与电机和编码器的接线参见驱动器手册,将驱动器接入220V市电。
控制器与电脑可以通过串口或网口连接,下面以网口连接例展开说明。
一、网口通讯操作方法
先将控制器与电脑用网线连接好,接通控制器的电源,再打开ZDevelop编程软件,点击菜单栏“控制器”→“连接”,打开“连接到控制器”窗口。
通过“连接到控制器”窗口,可以快速查看本机IP,对比控制器与电脑是否处于同一网段。
IP地址列表下拉选择时,会自动查找当前局域网可用的控制器IP地址(控制器上电POWER灯和RUN灯亮的时候就能查找到该控制器的IP地址)。
同一个网络有多个控制器的时候,IP的下拉列表若没有显示目标控制器的IP地址,可以采取IP扫描来查看当前所有可用的控制器IP地址,扫描完成之后确定关闭此窗口,重新在IP下拉列表选择。
选择正确的IP地址,点击连接之后,编程软件与控制器连接成功,在线命令与输出窗口打印信息提示。
控制器出厂的缺省IP地址为192.168.0.11,“连接到控制器”窗口能显示出本机IP地址,请注意设置有线网卡与无线网卡各自的IP。电脑需要设置IP地址与控制器IP处于同一网段才能连接,即四段的前三段要相同,最后一段不同才能通讯。
若控制器与电脑不处于同一网段,则需要修改控制器或电脑其中之一的IP地址,使二者处于同一网段。
修改控制器IP地址需要先使用串口连接控制器,获取控制器IP地址,然后修改本机IP或控制器IP使二者处于同一网段。
二、修改控制器IP地址
先使用串口连接控制器,获取控制器IP地址,再修改控制器IP地址。
方法一:可以通过菜单栏“控制器”→“修改IP地址”窗口直接修改控制器IP地址。
方法二:通过IP_ADDRESS指令发送在线命令修改。
指令发送修改成功之后自动断开连接,在线命令打印控制器连接错误信息,通过网口连接选择新IP地址192.168.0.23再次连接控制器,IP地址修改成功后永久有效。
三、修改本机IP地址
以WIN10为例,在开始菜单里打开控制面板,打开“网络和Internet”。
再打开“网络与共享中心”。
点击“以太网”。
在“以太网状态”窗口点击“属性”,打开“以太网属性”窗口,找到Internet协议版本4(TCP/IPv4)打开,就能看到本机IP地址修改窗口,勾选“使用下面的IP地址”,在IP地址输入栏里修改IP,将本机IP改为和控制器IP处于同一网段,修改完成点击“确认”即可成功修改IP。
再次打开“连接到控制器”窗口尝试连接到控制器。
DPOS为用户定义的目标位置,即控制器发出的指令位置,单位是UNITS,该值的大小等于控制器实际发送脉冲数,除以脉冲当量得出。
写DPOS会自动转换为DEFPOS绝对坐标位置偏移,不会移动电机。
MPOS为用户单位的轴测量位置,也称为实际位置,单位是UNITS。该值是由编码器测量得出的轴实际位置,接在伺服电机上的编码器用于测量电机的转角与转速,MPOS的值正常情况下会跟随DPOS值,该值的大小等于编码器测得实际脉冲数,除以脉冲当量得出。没有编码器的场合,轴的MPOS值自动复制DPOS的值。
写MPOS会自动转换为DEFPOS绝对坐标位置偏移。
部分电机有一定跟随误差的(DPOS-MPOS),这个和机械和电机本身刚性都有关系,机械越好,电机越好,调的刚性越足,则跟随误差越小,但跟随误差永远存在,不可能消除,并且在实时变化,实际应用中尽量把机械刚性和电机刚性提高,让跟随误差尽量减小,速度尽量平滑,使得MPOS更准确。
另外SPEED为控制器给定速度,MSPEED为编码器的实际测量反馈速度。
如下图,轴类型ATYPE=65,EtherCAT周期位置模式,带编码器反馈,故脉冲信号输出与编码器反馈信号均在轴0上,此时MPOS为真,跟随DPOS。
ATYPE=4或65或50模式时,轴号上均带编码器反馈。
OFFPOS指令相对偏移修改所有的坐标,不会对已运行/进入缓冲区的运动产生影响。
DEFPOS指令设置当前轴位置为一个新的绝对位置值,不会对已运行/进入缓冲区的运动产生影响。
示例:
BASE(0,1) '选择轴0,轴1
DPOS=100,100 '设置当前位置为100,100
?DPOS(0),DPOS(1) '打印确认,当前位置为100,100
OFFPOS=10,20 '多次调用OFFPOS相对位置
OFFPOS=10,20
?DPOS(0),DPOS(1) '此时当前位置变为120,140
DEFPOS(10,20) '设置当前位置为10,20
?DPOS(0),DPOS(1) '当前位置为10,20
一、电子齿轮比的应用
伺服电机电子齿轮比就是伺服对接收到的控制器脉冲频率进行放大或者缩小,其中一个参数为分子,一个为分母。分子与分母比值大于1就是放大,比值小于1就是缩小,比值等于1时电机接受脉冲数等于控制器发出脉冲数。
计算公式:电机接收的实际脉冲数=控制器发送脉冲数*电子齿轮比
例如:控制器发出脉冲10000个,电子齿轮比分子设为1,分母设为2,电子齿轮比为0.5,那么伺服实际运行按照5000个脉冲来进行。控制器发出脉冲10000个,电子齿轮比分子设为2,分母设为1,电子齿轮比为2,那么伺服实际运行按照20000个脉冲来进行。
松下驱动器电子齿轮的比值在1000-1/1000的范围内有效。
电子齿轮比通过数据字典6091h的子字典01h和02h的比值设定。6091h-01h设置电子齿轮比的分子,6091h-02h设置电子齿轮比的分母。
数据字典6092h的子字典01h用以设定电机旋转一圈所需脉冲数,一般根据编码器的分辨率设置,6092h的子字典02h的值默认为1。
电子齿轮比等驱动器的相关参数修改,可以通过驱动器软件直接修改,或使用SDO指令读写对应的数据字典进行配置。
1.驱动器软件修改电子齿轮比
修改驱动器参数先连接驱动器,可选USB线或WLAN连接驱动器,使用USB线连接电脑与驱动器端的X1端口,给驱动器上电,打开松下驱动器软件PANATERM,弹出“选择与驱动器通信”窗口,选择与驱动器通过USB连接后,自动获取到驱动器信息显示在窗口内,点击OK连接成功,就能对驱动器进行设置。
点击菜单栏“显示”→“对象编辑器”,打开如下窗口,找到需要设置的数据字典,在“Setting Value”一栏直接修改数据字典的内容。
修改完成将参数传送给驱动器,并写入驱动器的EEPROM,驱动器再次上电后参数生效。
图中电子齿轮比=1:1,电机旋转一圈脉冲数10000。
2.SDO指令修改电子齿轮比
SDO指令包含数据字典读取SDO_READ、SDO_READ_AXIS和数据字典写入SDO_WRITE、SDO_WRITE_AXIS。
数据字典读取语法:
SDO_READ (槽位号, 设备编号, 数据字典编号, 数据字典子编号, 数据类型, 读取数据存储TABLE位置)
SDO_READ_AXIS (轴号, 数据字典编号, 数据字典子编号, 数据类型, 读取数据存储TABLE位置)
数据字典写入语法:
SDO_WRITE (槽位号, 设备编号, 数据字典编号, 数据字典子编号, 数据类型, 写入数据值)
SDO_WRITE_AXIS (轴号, 数据字典编号, 数据字典子编号, 数据类型, 写入数据值)
示例:
SDO_WRITE(Bus_Slot,iNode,$6091,1,7,1) '电子齿轮比分子设为1SDO_WRITE(Bus_Slot,iNode,$6091,2,7,1) '电子齿轮比分母设为1SDO_WRITE(Bus_Slot,iNode,$6092,1,7,10000) '电机一圈脉冲数设为10000SDO_WRITE(Bus_Slot,iNode,$1010,1,7,$65766173)'写EPPROM(写EPPROM后驱动器需要重新上电)
使用指令更改完成后,查看驱动器参数如下:
二、读取多圈编码器值
驱动器有多圈绝对值编码器时,可使用ENCORDE指令读取编码器硬件寄存器原始值,就是多圈绝对值,此参数为只读类型。只有配置为需要使用编码器的ATYPE时才可以读取。
驱动器重新启动之后将ENCORDE值清零。
?*ENCODER '打印各轴编码器值,驱动器上电初始值为0
?ENCODER(0) '打印单轴编码器值
?ENCODER AXIS(0) '打印单轴编码器值
如下图,使用EtherCAT驱动器,带编码器反馈,控制轴0持续正向运动MOVE(500),此时发送的总脉冲数=UNITS*DPOS=100*500=50000。
ENCORDE指令读取驱动器的多圈绝对值编码器的值,等于编码器检测到的接受脉冲总数50000。
此时将DPOS和MPOS改变,ENCORDE的值不会发生变化,因为改坐标电机不会运动,编码器接收脉冲数没有改变。
因为读取的是多圈绝对值,负方向运动ENCORDE值减小,正向运动ENCORDE值增大。
松下驱动器软件可对绝对式编码器设定。
通过参数Pr0.15设置。
Pr0.15参数选择说明:三个设定值说明如下,上方例子为默认值1,作为增量编码器使用。
三、驱动器IO操作
操作驱动器输入、输出之前,通过DRIVE_IO指令映射驱动器对象字典中60FDh驱动器IO输入、60FEh驱动器IO输出的起始IO编号。
驱动器在映射IO信号之后,可根据编号对驱动器的IO信号进行控制,IO信号输出可用OP指令控制。
Bit位的值设为1表示ON,为0表示OFF。
驱动器IO映射示例:映射正负限位信号
要设置正确的DRIVE_PROFILE或者PDO后才可以正常映射输入,也就是说DRIVE_PROFILE驱动器PDO配置模式包含60FDh和60FEh这两个数据字典。
DRIVE_PROFILE(iAxis) = 5 '设定对应的带IO映射的PDO模式DRIVE_IO(iAxis) = i_IoNum '设定IO起始编号REV_IN(iAxis) = i_IoNum '负限位应60FD BIT0FWD_IN(iAxis) = i_IoNum + 1 '正限位先对应60FD BIT1DATUM_IN(iAxis) = i_IoNum + 2 '原点信号对应60FD BIT2INVERT_IN(i_IoNum,ON) '特殊信号有效电平反转INVERT_IN(i_IoNum + 1,ON)INVERT_IN(i_IoNum + 2,ON)
驱动器IO输出:
DRIVE_PROFILE(iAxis) = 5'设定对应的带IO映射的PDO模式
DRIVE_IO(iAxis) = i_IoNum'设定IO起始编号
OP(i_IoNum,ON) '打开驱动器的第一个OUT口
可在驱动器的“参数”窗口,找到参数分类4,操作驱动器的IO信号,如下图。
四、驱动器回零
EtherCAT总线可使用控制器提供的回零方式DATUM(mode),mode模式值选择查看ZBasic编程手册的DATUM指令。EtherCAT总线也可以使用驱动器本身的回零模式。
驱动器本身回零使用DATUM(21,mode2)指令,mode2模式值要查驱动器手册数据字典6098h回零模式,如下图所示,mode2填入对应Value值,mode2缺省值为0,也是驱动器回零模式,注意此时的原点限位等信号要接在驱动器上,所以要使用驱动器回零时需要对驱动器的IO进行映射。
示例:
初始化完成后再运行驱动器回零程序,按上一节的示例,将驱动器的限位信号和原点信号映射到控制器的IO上,再运行以下回零程序。
BASE(iAxis) '按驱动器轴号逐个回零AXIS_STOPREASON = 0SPEED = 100 '回零速度CREEP = 10 '反找速度ACCEL = 1000DATUM(21,2) '驱动器回零模式value=2WAIT IDLEIF AXIS_STOPREASON = 0 THEN?'回零成功'ELSE?'回零失败','停止原因:',AXIS_STOPREASON,'状态字0X',HEX(DRIVE_STATUS)ENDIF
五、力矩的实时读取
当PDO包含数据字典6071h(目标力矩)时,ATYPE可设置为67,周期力矩模式,此时使用DAC指令控制电机以设置值的力矩运行,DAC值范围0-1000,对应0-100%的DAC的值,比如DAC=10,此时电机力矩=1%的力矩值。
力矩控制时DAC单位为千分之一,等于1000时表示100%力矩,此时的值等于数据字典6072h(设定最大转矩)的值。
注意速度模式和力矩模式切换时,先将DAC=0后,再修改ATYPE,防止出现事故。
SDO读取数据字典6071h的值为目标力矩的大小,即当前发送的DAC的大小,没有发送DAC指令时,6071h的值为0。一般当前力矩6071h的取值范围是0-6072h的设定值。
示例:ATYPE=67力矩模式
DAC=40
SDO_READ(0,0,$6071,0,3,0)'读取轴0的目标力矩,TABLE(0)的值变为40
驱动器力矩的读取可以在配置的DRIVE_PROFILE包含数据字典6077h的情况下,使用DRIVE_TORQUE指令读取当前轴的力矩,或使用SDO_READ指令直接读取数据字典6077h的值获取当前力矩,与目标转矩的值之间可能存在波动,读取的是实时值的大小。
示例:
?DRIVE_TORQUE(0) '打印轴0的力矩
示例:数据字典6077h用于读取当前力矩的值
SDO_READ(Bus_Slot,iNode,$6077,0,3,0)'读取当前力矩保存到TABLE(0)
六、转矩限制的应用
转矩控制用于印刷机、绕线机、注塑机等场合,使用EtherCAT总线时,电机输出的转矩与DAC指令输入的值成正比。
为了保护机台,可对输出转矩进行限制,电机的最大转矩使用6072h设置,出厂默认值10。
转矩控制时,电机转矩输出受DAC指令控制,但不对电机速度进行控制,因此轻载时,可能发生超速现象,为了保护机械,必须对速度进行限制。
数据字典6072h用于设置电机的最大转矩,6072h的值设为1000表示额定转矩的100%;设为500,表示额定转矩的50%。在EtherCAT的几种不同的模式下均支持,例如在位置模式下可以设置最大允许的力矩,使用MOVE等运动指令控制电机运行,此时电机速度按照SPEED参数运动,若目标位置设置的更大,这样碰到阻碍物后,速度受到限制,只能发出来设定的最大力矩。
SDO指令读取示例:
SDO_READ(0,0,$6072,0,3,0) '读取数据保存到TABLE(0),值为5000
七、电机极性设置
电机极性(旋转方向)通过数据字典607Eh设定,有8个bit值可设定,如下图,极性不反转的时候,将607Eh的bit7-5均设为0;极性反转的时候,将607Eh的bit7-5均设为1;其余位bit4-0均设为0。
设置方法:将607Eh的值设为224时,符号有反转,给正方向指令,电机旋转方向为CW(顺时针);将607Eh的值设为0时,符号无反转,给正方向指令,电机旋转方向为CCW(逆时针);电机旋转方向规定参见下图。
设置示例:
使用驱动器软件或SDO指令操作数据字典607Eh。
SDO_READ(Bus_Slot,iNode,$607E,0,5,0) '读取极性保存到TABLE(0)
SDO_WRITE(Bus_Slot,iNode,$607E,0,5,$E0) '极性设置
驱动器软件设置:可查看或修改设定值,值为224时,给正向运动参数,电机顺时针旋转。
八、驱动器其他参数设置
驱动器的出厂设置一般没有反转IO电平,会导致驱动器限位报警,出现限位报警之后,要根据驱动器手册设置限位电平反转。比如松下伺服要将Pr4.01、Pr4.02的参数分别设置为010101h(65793)、020202h(131586)。
IO输入出厂默认值(下图显示十进制):
可在驱动器软件上直接修改Pr4.01、Pr4.02的值,也可以通过SDO_write指令设置数据字典3401h和3402h设置正负限位的电平。
SDO指令设置正负限位的示例:
SDO_WRITE(Bus_Slot,iNode,$3401,0,4,$10101)'正限位电平,出厂值$818181
SDO_WRITE(Bus_Slot,iNode,$3402,0,4,$20202)'负限位电平,出厂值$828282
修改后的值,可查看数据字典的值,或查看参数分类。
其他参数的设置均可在“对象编辑器”窗口或“参数”窗口直接修改,修改完成保存到EEPROM,驱动器重新上电生效。
此初始化程序为通用版本,使用时只需更改个别全局定义的参数即可。
运动控制模块根据实际使用情况编写。
'**********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