The value of Zmotion is to bring customers more success!
今天,正运动技术给大家分享一下EtherCAT运动控制器之ZMIO300模块的使用。
一、材料准备与控制器接线参考
(一)材料准备
1.电脑1台,安装ZDevelop软件。
2.控制器1个,ZMC432(带Ethercat接口即可)。
3.24V直流电源1个(给控制器和ZMIO模块供电)。
4.ZMIO扩展模块一套+EtherCAT总线驱动器。
5.控制器接线端子若干,导线若干。
6.网线若干。
(二)接线参考
二、实验思路
1.我们先将ZMC432控制器、ZMIO300扩展模块、Ethercat总线驱动进行组合成一个小系统。然后通过Basic编程实现EtherCAT总线初始化,从而实现控制器对ZMIO300扩展模块和总线驱动器控制。
2.如果采用上位机开发,可以通过接口ZAux_Execute()来调用下载到控制器里面的总线初始化的Basic函数,来实现总线设备的初始化。
三、ZMIO300扩展模块的介绍和接线
1.ZMIO扩展模块的组成。
通讯模块:该模块有ZMIO300-ECAT通讯模块和ZMIO300-CAN通讯模块两种,ZMIO300-ECAT通讯模块的使用需要通过一段Basic代码进行总线初始化才能通讯上。
ZMIO300-CAN通讯模块使用简单,只要预先设置好拨码开关,然后上电即可实现通讯。但是ZMIO300-CAN通讯模块不能设置AD/DA扩展子模块的量程和模式。
2.硬件接线。
ECAT耦合器+扩展子模块接线参考:
注意:通讯模块和扩展子模块都需要24V电源供电。
四、ECAT总线初始化的Basic代码编写
1.EtherCAT总线扫描的Basic代码。
'/************************************************************
'任务编号:无
'函数功能:总线扫描
'Input:无
'Output:无
'返回值:无
'备注:无
'*************************************************************/
GLOBAL SUB Ecat_ScanSlot()
LOCAL i
'初始化还原轴类型
RAPIDSTOP(2)
For i=0 to gv_MaxAxisNum - 1
AXIS_ENABLE(i) = 0 '关轴使能
atype(i)=0 '设置为虚拟轴
AXIS_ADDRESS(i) =0
DELAY(10) '防止所有驱动器全部同时切换使能导致瞬间电流过大
next
'扫描总线
SLOT_STOP(0)
DELAY(200)
SLOT_SCAN(0)
'判断总线扫描结果
IF RETURN THEN
if NODE_COUNT(0) <> (Gc_BusAxisNodeNum + Gc_BusIoNodeNum) then gv_BusScanState = 2 '总线扫描失败,实际数量不一致
?"总线扫描失败,节点实际数量不一致"
ELSE
TRACE "总线扫描成功,连接设备数:", NODE_COUNT(0)
gv_BusScanState = 1 '总线扫描成功
endif
ELSEIF
gv_BusScanState = -1 '总线扫描失败
?"总线扫描失败"
ENDIF
ENDSUB
2.设置总线IO扩展板起始IO编号。
'/************************************************************
'任务编号:无
'函数功能:IO扩展板初始化
'Input:无
'Output:无
'返回值:无
'备注:无
'*************************************************************/
GLOBAL SUB Ecat_IO_Init()
gv_BusIoNodeNum = 0 '初始化总线IO扩展板数量
'如果总线扫描失败
IF gv_BusScanState <> 1 THEN
'总线扫描失败,io扩展板也扫描失败
gv_NodeIoInitFlag=-1
RETURN
ENDIF
LOCAL Node_Num '节点设备编号
LOCAL Drive_Vender '当前设备厂商编号
LOCAL Drive_Device '设备编号
LOCAL Drive_Alias '设备拨码ID
Dealy(200)
'启动总线
SLOT_START(0)
if return =0 then
TRACE "IO扩展板初始化,启动总线失败"
gv_NodeIoInitFlag=-1
return
endif
'开始映射总线IO
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 '判断当前节点是否有电机
Sub_SetNodeIo(Node_Num,Drive_Vender,Drive_Device,Gc_EcatIoStartId+(16* gv_BusIoNodeNum)) '映射扩展模块IO
gv_BusIoNodeNum = gv_BusIoNodeNum + 1
endif
next
gv_NodeIoInitFlag=1
'判断IO扩展板数目是否正确
if gv_BusIoNodeNum <> Gc_BusIoNodeNum then
?"扫描到的IO扩展板数目不正确"
gv_NodeIoInitFlag=2
endif
ENDSUB
'/************************************************************
'任务编号:无
'函数功能:总线IO模块映射
'Input:无
'Output:无
'返回值:无
'备注:通过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) = Gc_EcatAIoStartId
'设置zmio的ad模式为0~20mA电流模式
SDO_WRITE(0,iNode,$5003,1,6,5)
SDO_WRITE(0,iNode,$5004,1,6,13)
endif
ENDSUB
3.总线驱动器轴号映射。
'/************************************************************
'任务编号: 无
'函数功能: 总线轴初始化
'Input: 无
'Output: 无
'返回值: 无
'备注: 通过NODE_IO(0,Node_Num)分配模块IO起始地址,不使用扩展模块的时候删掉此段
'*************************************************************/
GLOBAL SUB Ecat_Axis_Init()
LOCAL NodeSum_Num ,BusAxis_Num ,NodeAxis_Num '设备总数、总线轴总数、每个节点上的电机数
LOCAL Drive_Vender,Drive_Device,Drive_Alias '驱动厂商编号、驱动设备编号、驱动设备拨码ID
LOCAL j,i
'如果总线扫描失败
IF gv_BusScanState <> 1 THEN
gv_EcatAxisInitFlag=-1
RETURN
ENDIF
'总线轴总数,从0开始计数
BusAxis_Num = 0
FOR i = 0 TO NODE_COUNT(0) - 1
NodeAxis_Num = NODE_AXIS_COUNT(0,i) '读取设备电机数
Drive_Vender = NODE_INFO(0,i,0) '读取驱动器厂商
Drive_Device = NODE_INFO(0,i,1) '读取设备编号
Drive_Alias = NODE_INFO(0,i,3) '读取设备拨码ID
FOR j = 0 TO NodeAxis_Num - 1
AXIS_ADDRESS(BusAxis_Num+Gc_BusAxisStartId) = BusAxis_Num + 1 '映射轴号
ATYPE(BusAxis_Num+Gc_BusAxisStartId) = 65 '设置控制模式 65-位置 66-速度 67-转矩 详细参照AXISSTATUS
DRIVE_PROFILE(BusAxis_Num+Gc_BusAxisStartId) = 0 'PDO类型
DISABLE_GROUP(BusAxis_Num+Gc_BusAxisStartId) '每轴单独分组
'Sub_SetNodePara(i,Drive_Vender,Drive_Device) '设置特殊总线参数
BusAxis_Num = BusAxis_Num + 1 '总线轴计数+1
NEXT
NEXT
if BusAxis_Num = Gc_BusAxisNodeNum then
TRACE "轴扫描映射完成,连接总线轴数:",BusAxis_Num
else
?"扫描到的总线轴数目不正确"
gv_EcatAxisInitFlag =2
RETURN
endif
DELAY(100)
SLOT_START(0)
IF RETURN THEN
TRACE "开始清除驱动器报警"
FOR i = Gc_BusAxisStartId TO Gc_BusAxisStartId + BusAxis_Num - 1
BASE(i)
DRIVE_CLEAR(0)
WA(10)
DRIVE_CONTROLWORD(i) = 128
WA(10)
DRIVE_CONTROLWORD(i)=6
WA(10)
DRIVE_CONTROLWORD(i)=15
WA(10)
NEXT
DELAY(100)
TRACE "控制器报警清除完成"
DATUM(0)
DELAY(1000)
TRACE"开始伺服使能"
WDOG = 1
FOR i = Gc_BusAxisStartId TO Gc_BusAxisStartId + BusAxis_Num - 1
AXIS_ENABLE(i) = 1
NEXT
TRACE"伺服使能完成"
gv_EcatAxisInitFlag =1
ELSE
TRACE"总线开启失败"
gv_EcatAxisInitFlag=-1
ENDIF
ENDSUB
五、设置ZMIO模拟量扩展模块的量程和模式
可通过SDO_Write指令对ZMIO模拟量扩展模块的量程和模式进行设置。(需要是ECAT耦合器才支持修改模拟量模块的模式和量程)。
六、上位机开发进行总线轴和模块的初始化
1.通过ZDevelop软件将该Basic程序下载到控制器中。
2.通过ZAux_Execute()来调用控制器里面的Basic函数,进行EtherCAT总线初始化。
示例:ZAux_Execute(g_handle,"Runtask0,EcatInit_Para()",NULL,0)
3.通过ZAux_Direct_GerVariableInt()指令来读取Basic文件定义的全局整形变量,比如读取EcatAxisInitFlag和NodeIoInitFlag这两个变量来获取Basic程序那边总线初始化的情况。
示例:
ZAux_Direct_GetVariableInt(g_handle,"EcatAxisInitFlag",&AxisInitFlag)
ZAux_Direct_GetVariableInt(g_handle,"NodeIoInitFlag",&IoInitFlag)
教学视频可点击→EtherCAT运动控制器之ZMIO300模块的使用查看。
本次,正运动技术EtherCAT运动控制器之ZMIO300模块的使用,就分享到这里。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。