The value of Zmotion is to bring customers more success!
EIO24088-V2及EIO16084扩展模块配合正运动的主站控制器的使用分为三步。第一步:进行硬件接线;第二步:总线初始化建立EtherCAT通讯连接,初始化中需要对扩展的轴资源和IO资源的进行映射防止与控制器的资源产生冲突;第三步:通过相应指令读写IO及控制电机运动。
今天正运动小助手给大家分享一下EIO24088-V2及EIO16084如何用RTSys总线进行配置和使用。
EIO24088-V2总线扩展模块是EtherCAT总线控制器使用的扩展模块,当数字IO、脉冲轴资源不够需要扩展增加的时候,控制器可通过EtherCAT总线连接多个EtherCAT扩展模块进行扩展。控制器可通过映射编号直接访问EIO24088-V2的IO资源和轴资源。
支持8个脉冲轴进行扩展;
支持扩展24路数字量输入和8路数字量输出,每个脉冲轴另外各有1路数字量输入和1路数字量输出可供配置;
脉冲输出模式为方向/脉冲或双脉冲输出;
每轴最大输出脉冲频率10MHz;
脉冲轴以外的输出口最大输出电流达300mA,可直接驱动部分电磁阀。
EIO16084总线扩展模块是EtherCAT总线控制器使用的扩展模块,当数字IO、脉冲轴资源不够需要扩展增加的时候,控制器可通过EtherCAT总线连接多个EtherCAT扩展模块进行扩展。控制器可通过映射编号直接访问EIO16084的IO资源和轴资源。
接口说明
输入口参数说明:
输出口参数说明:
总线接线参考
EIO24088-V2扩展模块接线规则:EIO24088-V2可接到EtherCAT总线上的任意节点。
EIO24088-V2为总线上的一个设备节点,可接入8个脉冲型驱动器,驱动器按照AXIS 0到AXIS 7的顺序依次编号,并且遵从总线上的驱动器编号规则,需要进行轴映射。
驱动器的使能信号为脉冲接口内的通用输出口,直接通过主控制器的OP指令来使能,或使用SDO指令配置数据字典6013h中的BIT8为1后为即可自动使能,主控制器无法直接控制对应的输出口来使能,只需WDOG置1及对应轴的AXIS_ENABLE置1即可。
注意:轴扩展模块的使用个数不是无限制的,参考控制器可扩展的最大轴数。
ZMC432-V2本体有6个脉冲轴,通过EtherCAT扩展了节点0、1、2、3四个总线轴,节点4八个总线转脉冲轴。扩展轴上的AXIS0-7(对应下图中驱动器编号4-11)分别手动映射为轴号10-17。控制器、EIO扩展模块和驱动器的接线参考如下图:
涉及的总线相关指令参数概念如下:
1、槽位号(slot)
槽位号是指控制器上总线接口的编号,缺省为0。当控制器上有多个总线接口时,在线命令发送?*SLOT查看。
运动控制器支持单总线时,槽位号为0。
支持双总线时,EtherCAT总线槽位号为0,RTEX总线槽位号为1。
2、设备号(node)
设备号是指一个槽位上连接的所有设备的编号,从0开始,按设备在总线上的连接顺序自动编号,可以通过NODE_COUNT(slot)指令查看总线上连接的设备总数。
3、驱动器编号
控制器会自动识别出槽位上的驱动器,编号从0开始,按驱动器在总线上的连接顺序自动编号。
驱动器编号与设备号不同,只给槽位上的驱动器设备编号,其他设备忽略。
扩展资源映射方法
NODE_IO(0,0)=32 '设置槽位0接口设备0的IO起始编号为32
2、轴映射
AXIS_ADDRESS(轴号)=(槽位号<<16)+驱动器编号+1
AXIS_ADDRESS(0)=(0<<16)+0+1 'EtherCAT总线上的第一个驱动器,驱动器编号0,绑定为轴0 AXIS_ADDRESS(1)=(0<<16)+1+1 'EtherCAT总线上的第二个驱动器,驱动器编号1,绑定为轴1
总线初始化
EIO24088-V2扩展模块需要经过总线初始化之后才能使用,下图为总线初始化流程。
进行总线初始化有两种方式:
⚪ 通过正运动提供的总线初始化脚本进行初始化
⚪ 找到RTSys的工程设置,打开启动轴配置及EtherCAT配置自行配置
先给大家介绍的是第一种通过总线初始化脚本进行总线初始化,此初始化程序可用来初始化EtherCAT驱动器和EtherCAT总线扩展模块,建立通讯连接(通用模板,适用于多种品牌的驱动器),可找正运动厂商提供。
1、在RTSys或ZDevelop中新建一个工程
3、设置初始化脚本的任务号
4、设置本地脉冲轴数和起始编号及总线轴的起始编号,不使用本地脉冲轴只使用总线轴可使用默认配置(可根据实际使用情况修改参数),演示时使用了六个本地脉冲轴,ECAT总线连接了一个EIO24088-V2及两个松下的驱动器及一个台达的驱动器。
'控制器最大轴数 TABLE(0)= SYS_ZFEATURE(0) GLOBAL CONST ControlMaxAxis = TABLE(0) '支持电机个数 TABLE(0)= SYS_ZFEATURE(1) GLOBAL CONST RealAxisMax = TABLE(0) '槽位号,(单总线控制器缺省0,具体查看硬件手册) GLOBAL CONST Bus_Slot = 0 '本地脉冲轴起始编号 GLOBAL CONST LocalAxis_Start = 11 '本地脉冲轴轴数量 GLOBAL CONST LocalAxis_Num = 2 '总线轴起始编号 GLOBAL CONST BusAxis_Start = 0 '总线驱动器起始IOS GLOBAL CONST BusStaraIoNum=128 '总线初始化状态 -1--未进行 0--初始化错误 1--初始化完成 GLOBAL ECAT_InitEnable ECAT_InitEnable = -1 '延迟3秒,等待驱动器上电,不同驱动器自身上电时间不同,具体根据驱动器调整延时 DELAY(3000) '? "总线通讯周期:",SERVO_PERIOD,"us" ECAT_Init() '调用初始化函数 DIM ScanNum '如果没有扫描到在扫描4次 IF ECAT_InitEnable<>1 THEN FOR ScanNum=0 to 3 ECAT_Init() '调用初始化函数 IF ECAT_InitEnable=1 THEN EXIT FOR NEXT ENDIF END '/************************************************************* 'Description: //总线轴初始化 'Input: // 'Input: // 'Input: // 'Output: // ECAT_InitEnable=ON -->初始化完成标志 'Return: // '*************************************************************/ GLOBAL SUB ECAT_Init() LOCAL NodeSum_Num ,BusAxis_Num ,NodeAxis_Num '设备总数、总线轴总数、每个节点上的电机数 LOCAL Drive_Vender,Drive_Device,Drive_Alias '驱动厂商编号、驱动设备编号、驱动设备拨码ID local i,j ? "总线通讯周期:",SERVO_PERIOD,"us" RAPIDSTOP(2) '初始化还原轴类型 FOR i = 0 TO ControlMaxAxis - 1 AXIS_ADDRESS(i) = 0 AXIS_ENABLE(i) = 0 ATYPE(i) = 0 WAIT IDLE(i) NEXT '本地轴重新映射 FOR i=0 TO LocalAxis_Num -1 AXIS_ADDRESS(LocalAxis_Start+i)= (-1<<16) + i '将本地轴0-->i映射到轴20-->20+i ATYPE(LocalAxis_Start+i)=0 '轴类型 NEXT ECAT_InitEnable = -1 SYSTEM_ZSET = SYSTEM_ZSET OR 128 '扫描总线驱动器 FOR i=0 to 3 SLOT_STOP(Bus_Slot) DELAY(200) SLOT_SCAN(Bus_Slot) IF NODE_COUNT(Bus_Slot) THEN EXIT FOR DELAY(1000) NEXT IF RETURN THEN NodeSum_Num = NODE_COUNT(Bus_Slot) ? "总线扫描成功,连接设备数:",NodeSum_Num '总线轴总数,从0开始计数 BusAxis_Num = 0 FOR i = 0 TO NodeSum_Num - 1 NodeAxis_Num = NODE_AXIS_COUNT(Bus_Slot,i) '读取设备电机数 Drive_Vender = NODE_INFO(Bus_Slot,i,0) '读取驱动器厂商 Drive_Device = NODE_INFO(Bus_Slot,i,1) '读取设备编号 Drive_Alias = NODE_INFO(Bus_Slot,i,3) '读取设备拨码ID '轴设置 FOR j = 0 TO NodeAxis_Num - 1 AXIS_ADDRESS(BusAxis_Num+BusAxis_Start) = BusAxis_Num + 1 '映射轴号 ATYPE(BusAxis_Num+BusAxis_Start) = 65 '设置控制模式 65-位置 66-速度 67-转矩 详细参照AXISSTATUS DRIVE_PROFILE(BusAxis_Num+BusAxis_Start) = 0 '驱动器PDO设置,驱动器默认设置-- -1 位置模式--0 速度模式--20+ 力矩模式--30+ DISABLE_GROUP(BusAxis_Num+BusAxis_Start) '每轴单独分组 IF DRIVE_PROFILE(BusAxis_Num+BusAxis_Start)=4 OR DRIVE_PROFILE(BusAxis_Num+BusAxis_Start)=5 THEN '设置总线驱动器的起始IO地址 DRIVE_IO (BusAxis_Num+BusAxis_Start) = BusStaraIoNum+8*(BusAxis_Num+BusAxis_Start) '设置负限位 REV_IN(BusAxis_Num+BusAxis_Start) = DRIVE_IO (BusAxis_Num+BusAxis_Start) INVERT_IN(DRIVE_IO (BusAxis_Num+BusAxis_Start),ON) '设置正限位 FWD_IN(BusAxis_Num+BusAxis_Start) = DRIVE_IO (BusAxis_Num+BusAxis_Start)+1 INVERT_IN(DRIVE_IO (BusAxis_Num+BusAxis_Start)+1,ON) '设置原点 DATUM_IN(BusAxis_Num+BusAxis_Start) = DRIVE_IO (BusAxis_Num+BusAxis_Start)+2 INVERT_IN(DRIVE_IO (BusAxis_Num+BusAxis_Start)+2,ON) ELSEIF DRIVE_PROFILE(BusAxis_Num+BusAxis_Start)<4 THEN IF REV_IN(BusAxis_Num+BusAxis_Start)>=BusStaraIoNum THEN '取消设置负限位 REV_IN(BusAxis_Num+BusAxis_Start) = -1 ENDIF IF FWD_IN(BusAxis_Num+BusAxis_Start)>=BusStaraIoNum THEN '取消设置正限位 FWD_IN(BusAxis_Num+BusAxis_Start) = -1 ENDIF IF DATUM_IN(BusAxis_Num+BusAxis_Start)>=BusStaraIoNum THEN '取消设置原点 DATUM_IN(BusAxis_Num+BusAxis_Start) = -1 ENDIF ENDIF BusAxis_Num = BusAxis_Num + 1 '总线轴计数+1 NEXT '正运动EIO24088-V2总线转脉冲扩展轴 IF Drive_Vender = $41B AND Drive_Device = $1ab0 THEN local k for k=0 to 7 SDO_WRITE(Bus_Slot,i,$6011+k*$800,0,5,7) '设置扩展脉冲轴ATYPE类型 SDO_WRITE(Bus_Slot,i,$6012+k*$800,0,6,0) '设置扩展脉冲轴INVERT_STEP脉冲输出模式 NODE_IO(Bus_Slot,i) = 32 + 32*i '设置24088上IO的起始映射地址 next ENDIF NEXT ? "轴扫描映射完成,连接总线轴数:",BusAxis_Num DELAY(100) SLOT_START(Bus_Slot) WA(3000) ' 延迟3秒,等待驱动器时钟同步,不同驱动器时间不同,具体根据驱动器调整延时 IF RETURN THEN ? "开始清除驱动器报警" FOR i = BusAxis_Start TO BusAxis_Start + BusAxis_Num - 1 BASE(i) DRIVE_CLEAR(0) WA(10) DRIVE_CONTROLWORD(i) = 128 ' 伺服错误清除 WA(10) DRIVE_CONTROLWORD(i)=6 ' 伺服shutdown WA(10) 'DRIVE_CONTROLWORD(i)=7 ' 伺服disable voltage 'WA(10) DRIVE_CONTROLWORD(i)=15 ' 伺服fault reset WA(10) NEXT DELAY(100) ? "控制器报警清除完成" DATUM(0) ' 清除所有轴的错误状态。 DELAY(1000) ?"开始伺服使能" WDOG = 1 FOR i = BusAxis_Start TO BusAxis_Start + BusAxis_Num - 1 AXIS_ENABLE(i) = 1 NEXT ?"伺服使能完成" ECAT_InitEnable = 1 ELSE ?"总线开启失败" ECAT_InitEnable = 0 ENDIF ELSE ?"总线扫描失败" ECAT_InitEnable = 0 ENDIF ENDSUB
接下来给大家介绍第二种总线初始化配置的方法,通过RTSys的工程设置自行配置总线初始化脚本。
1、在RTSys中新建一个工程
2、打开EtherCAT配置。在工程视图右键选择工程设置,勾选轴配置及EtherCAT配置
通过RTSys测试扩展的资源
2、测试脉冲轴
首先将对要测试的脉冲轴进行映射(初始化中已映射不需要),如测试EIO24088-V2的轴1。
AXIS_ADDRESS(7)=(0<<16)+1+1 'EtherCAT总线上的第二个驱动器,驱动器编号1,绑定为轴7
扩展模块的DRIVE_PROFILE配置为0,ATYPE设为65,但由于扩展是总线转脉冲型驱动器,轴类型并不是65,真实轴类型的配置使用SDO指令配置数据字典6011h设置。
SDO指令配置驱动器参数:
例如:扩展的脉冲轴的真实轴类型设置通过数据字典6011h设置,(参考下表的参数,按轴号依次设置,第一个驱动器设置数据字典6011h+0*800h,第二个驱动器设置6011h+1*800h,以此类推,每个驱动器加800h,其他参数同理)。
数据字典读取语法:
SDO_READ (槽位号, 设备编号, 数据字典编号, 数据字典子编号, 数据类型, 读取数据存储TABLE位置)
SDO_READ_AXIS (轴号, 数据字典编号, 数据字典子编号, 数据类型, 读取数据存储TABLE位置)
数据字典写入语法:
SDO_WRITE (槽位号, 设备编号, 数据字典编号, 数据字典子编号, 数据类型, 写入数据值)
SDO_WRITE_AXIS (轴号, 数据字典编号, 数据字典子编号, 数据类型, 写入数据值)
数据字典读写示例:
读写处于节点0的EIO24088-V2的轴1的轴类型。
SDO_WRITE(0, 0, $6011 + 1 * $800, 0, 5, 7) '设置EIO24088-V2的轴1的轴类型为7 SDO_READ(0, 0, $6011 + 1 * $800, 0, 5, -1) '将轴1的轴类型数据打印出来
确认好轴类型、脉冲模式,测试时先将UNITS(脉冲当量)、SPEED(运行速度)、ACCEL(加速度)、DECEL(减速度)设置小一些保证安全,若设置为自动使能(通过6013H的BIT8设置)检查轴使能(AXIS_ENABLE)是否置1,手动使能则需轴使能(AXIS_ENABLE)及对应轴使能输出口置1。
发送运动指令看电机是否正常运动(看DPOS和MPOS是否变化),后续再根据驱动器移动1mm或转动一圈的脉冲数填入UNITS,此时MOVE(1)即为移动1mm或转动一圈,SPEED的单位为mm/s或r/s。
教学视频可点击→8轴/4轴的EtherCAT轴模块EIO24088-V2及EIO16084的使用(一):RTSys总线配置与使用查看。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。