中国自动化学会专家咨询工作委员会指定宣传媒体
文摘详情
gkongbbs

EtherCAT运动控制器与EtherCAT总线电缸的自定义PDO控制

http://www.gkong.com 2026-04-30 09:43 深圳市正运动技术有限公司

今天,正运动小助手给大家分享一下ZMC432-V2运动控制器在EtherCAT总线下通过PDO指令实现PDO数据字典交互,并以SMC总线电缸为例进行控制的快速入门教程。

01 ZMC432-V2运动控制器介绍

ZMC432-V2高性能多轴运动控制器是一款兼容EtherCAT总线和脉冲型的独立式运动控制器,自带6轴本地差分脉冲轴,最多可扩展至32轴,能实现总线轴+脉冲轴混合插补的多轴运动控制场合。同时支持正运动远程显示功能,能提供网络组态显示,可实时监控和调整参数配置。

QQ20260429-104424.webp

ZMC432-V2硬件功能特性

(1)支持32轴运动控制(脉冲+EtherCAT总线),EtherCAT最小通讯周期可达125us。

(2)24路通用输入、12路通用输出,2路模拟量输出(DA),其中包括2路高速输入和2路高速输出。

(3)6路差分脉冲轴输出,总线轴、脉冲轴可混合插补。

(4)内置多项实时性运动控制功能,例如视觉飞拍、多维PSO、高速位置锁存,多轴同步运行等。

(5)可通过EtherCAT扩展模块进行IO硬件资源扩展,可扩展至4096个隔离输入口和4096个隔离输出口。

(6)具备丰富的运动控制功能,如点位运动、电子凸轮、直线插补、圆弧插补、连续轨迹加工。

(7)支持掉电检测、掉电存储,多种程序加密方式,能够有效防止系统故障,保护项目工程文件数据,并提高系统的可靠性。

(8)通过纯国产IDE开发环境RTSys进行项目开发,可实时仿真、在线跟踪以及诊断与调试,简便易用,支持多种高级上位机语言联合编程进行二次开发。

02 ZMC432-V2控制器接口介绍

正运动ZMC432-V2控制器接口介绍.webp

ZMC432-V2控制器接口介绍表格.webp

03 ZMC432-V2控制器接线参考

1.数字量输入口IN接线

ZMC432-V2控制器接线参考1.webp

图1 输入口通用接线图

ZMC432-V2控制器接线参考2.webp

图2 输入口单端编码器接线图

2.数字量输出口接线

ZMC432-V2控制器接线参考3.webp

图3 输出口通用接线图

ZMC432-V2控制器接线参考4.webp

图4 输出口单端脉冲轴接线图

04

控制器开发

1.PC开发

支持以下语言进行开发,我们所有的开发语言和所有控制器提供的都是同一套API接口。

正运动控制器开发1pc开发.webp

2.脱机开发

使用自主自研的IDE RTSys进行开发,支持Basic、梯形图开发。

正运动技术开发环境及工具.webp

05

PDO的基本概念介绍

EtherCAT总线简介:

EtherCAT为倍福公司开发的一种基于以太网的开放式架构的实时工业现场总线通讯协议,现已发展为一种标准协议,目前是最快的工业以太网技术之一,具有高性能、拓扑结构灵活,低成本、高精度、应用简单等优点。

EtherCAT充分利用了以太网的全双工特性,使用主从模式介质访问控制。

控制器EtherCAT通讯口和EtherCAT从站之间通过COE(CANopen over EtherCAT)协议进行数据交换。

控制器和从站之间数据传输的两种方式:

①按指定时间周期性交换数据,称为PDO。

②请求应答式交换数据,称为SDO。

EtherCAT总线通信过程如下:

EtherCAT总线通信过程.webp

PDO是什么?在EtherCAT总线中起到什么作用?

  • PDO全名为Process Data Object,指在EtherCAT总线网络中周期的进行主站与从站的数据交互的功能。

  • PDO数据用于周期性数据读取和控制,读写速度快。

  • 主站和从站通过PDO进行数据交换时,一方发送数据后,另一方不需要应答。

  • 控制器通过指令控制EtherCAT从站时,控制器和从站之间通过PDO方式进行数据交换。

  • PDO列表可以看作一个数组空间,每个数组元素存放了不同的功能码,PDO在一个周期中执行这些功能码对应的操作,这些功能码就叫做数据字典,数据字典用4位16进制数来表示。

  • PDO分为两种:从站传送数据给主站用的TxPDO和主站传送数据给从站用的RxPDO。

  • 其中EtherCAT总线上控制器为主站,伺服驱动器或其他总线模块为从站。

  • 一个节点的TxPDO是将数据由此节点传输到其他节点,而RxPDO则是接收由其他节点传输的数据。

  • PDO报文数据域中每个字节都用作数据传输,因此报文利用率高。

06

PDO相关指令说明

1.NODE_PDOBUFF--特殊设备PDO设置

PDO相关指令1.png

2.NODE_PDO_WRBUFF--偏移修改PDO

PDO相关指令2.webp

3.NODE_PDO_RDBUFF--偏移读取PDO

PDO相关指令3.webp

07

如何导入总线电缸设备的配置文件并查询PDO信息

从站设备描述文件ESI是EtherCAT从站设备的配置文件,文件为XML格式。它由从站设备制造商提供,主要包含该设备所有能被主站识别、配置和控制的必要信息,其核心作用是让主站能认识从站,控制器可以通过配置文件识别电缸设备信息并完成对应的过程数据对象PDO的映射与配置。

添加SMC总线电缸的配置文件

方式一:在RTSys软件配置文件中添加xml文件。

①将对应电缸设备的xml文件复制到工程路径的文件夹里。

方式一1.webp

②打开RTSys【工程视图】→【配置文件】→【增加到配置文件】。

方式一2.webp

③选择目标xml文件→【打开】。

方式一3.webp

④这样xml文件就添加到配置文件中了。(注:xml文件添加会自动转为zml文件)

方式一4.webp

方式二:通过XMLParsingTools工具将XML文件转换成ZML文件再添加进配置文件。(此软件可以在正运动技术官网-技术与支持-下载中心-工具软件中下载)

①打开XMLParsingTools工具,点击左上角文件夹位置-【Open xml】。

方式二1.webp

②选择想要转换的xml文件-【打开】。

方式二3.png

③打开后选择对应的从站型号、从站类型为特殊设备。

33333.png

④点击左上角文件夹位置-【Export zml】导出。

four.png

⑤选择对应路径-设置文件名(不超过20个字符)-【保存】。

方式二5.png

⑥打开RTSys【工程视图】→【配置文件】→【增加到配置文件】。

方式二6.png

⑦选择要添加的zml文件-【打开】即可完成zml文件的添加。

方式二7.png

下载basic程序执行总线初始化

添加配置文件后,点击【下载到RAM/ROM】即可把配置文件的信息导入到控制器,使控制器识别该设备,然后执行总线初始化,让控制器作为主站和EtherCAT总线电缸从站设备建立正常通讯。

下载basic程序执行总线初始化.png

查询当前设备PDO映射信息

总线初始化完成、控制器和总线电缸设备通讯上后,可以通过RTSys在线命令功能,输入ZTEST(30,10,nodeid)指令即可查询对应节点编号设备的PDO映射与关键数据字典信息。

如下图为总线驱动器查询示例:在线命令执行ZTEST(30,10,0)后,打印输出该节点0的总线驱动器的当前PDO信息。

查询当前设备PDO映射信息.png

08

使用NODE_PDOBUFF指令对总线电缸实现控制和状态检测

以SMC EtherCAT总线电缸为例

以SMC EtherCAT总线电缸为例.png

电缸,也称电动缸,是将伺服电机与丝杠一体化设计的模块化产品,将伺服电机的旋转运动转换成直线运动。

SMC EtherCAT总线电缸通过EtherCAT总线接收控制指令,实现位置等模式控制,并能反馈实时的位置、状态及故障等信息。

EtherCAT总线电缸的控制,与EtherCAT总线变频器等从站类似,主要区别在于各厂家数据字典的定义不同,需查阅电缸说明手册或联系厂家技术支持,明确动作所需要的参数地址及写入顺序,使用NODE_PDOBUFF指令即可实现控制。

下面通过Basic编程实现电缸定位控制及报警检测。SMC电缸设备的PDO映射列表如下图所示,按照该参数地址操作即可实现控制,更多参数说明可见电缸手册对应章节详细内容。

8(1).png

83.png

总线电缸进行参数初始化

在进行定位控制之前,要对电缸进行必要的参数初始化设置,根据手册7011h详细说明可见,当bit4-15置ON时才可修改对应参数数值,因此在参数初始化时先通过node_pdobuff指令将7011h的bit4-15置位后再设置各数据的初始化数值。

总线电缸进行参数初始化.png

'iNode - 电缸节点号,有多个电缸时由iNode区分不同电缸
'*****************************SMC电缸初始化 **************************
global sub sub_SMC_Init(iNode)
    '初始化SMC电缸的相关参数
    node_pdobuff(0,iNode,$7011,0,6) = (node_pdobuff(0,iNode,$7011,0,6) Or $FFF0)	'数据字典7011h bit4-15 置1,开放参数修改限制 
    node_pdobuff(0,iNode,$7020,0,5) = SET_BIT(0,node_pdobuff(0,iNode,$7020,0,5))	'数据字典7020h bit0 置1,设置绝对值模式
    '扭矩模式参数
    node_pdobuff(0,iNode,$7025,0,6) = 0'推压力(设0为定位运行),对应数据字典7025h
    node_pdobuff(0,iNode,$7026,0,6) = 0	'阀值,对应数据字典7026h
    node_pdobuff(0,iNode,$7027,0,6) = 0'推动速度,对应数据字典7027h
    '扭矩/位置模式通用参数
    node_pdobuff(0,iNode,$7028,0,6) = 100'决定位置推力,对应数据字典7028h
    node_pdobuff(0,iNode,$7029,0,7) = 0	'区域1,对应数据字典7029h
    node_pdobuff(0,iNode,$702A,0,7) = 0'区域2,对应数据字典702Ah
    node_pdobuff(0,iNode,$702B,0,7) = 50	'决定位置宽度,对应数据字典702Bh
end sub

总线电缸上使能并执行回零动作

执行定位动作之前需要进行伺服使能和原点回零的准备工作,根据手册说明将7010h的bit9和bit12置1即可执行上使能和执行回零动作。

总线电缸上使能并执行回零动作.png

①总线电缸打开/关闭使能。

'iNode - 电缸节点号	Istatus -使能状态 0/1
'*****************************SMC电缸使能 **************************
global sub SMC_AxisEnAble(iNode,Istatus)
    if(Istatus = 0) then
        '关闭使能,对应数据字典7010h
        node_pdobuff(0,iNode,$7010,0,6) = CLEAR_BIT(9,node_pdobuff(0,iNode,$7010,0,6))
    else
        '打开使能,对应数据字典7010h
        node_pdobuff(0,iNode,$7010,0,6) = SET_BIT(9,node_pdobuff(0,iNode,$7010,0,6))
    endif
end sub

②总线电缸执行回零动作,并判断回零是否完成。

'iNode - 电缸节点号
'*****************************SMC电缸回零 **************************
global sub SMC_AxisHome(iNode)
    '回零标志置1,对应数据字典7010h
    node_pdobuff(0,iNode,$7010,0,6) = SET_BIT(12,node_pdobuff(0,iNode,$7010,0,6))
	    delay(500)
    '回零标志复位,对应数据字典7010h
    node_pdobuff(0,iNode,$7010,0,6) = CLEAR_BIT(12,node_pdobuff(0,iNode,$7010,0,6))
    LOCAL TimeOut 	'超时时间60s
    TimeOut=60000
    '等待回零完成
    WHILE TimeOut>0
        '根据6010h的各bit位的状态来判断回零是否完成---具体判断查阅电缸手册
        IF READ_BIT2(10,node_pdobuff(0,0,$6010,0,6))=1 THEN
            IF READ_BIT2(11,node_pdobuff(0,0,$6010,0,6))=1 THEN
                 PRINT "回零完成,回零动作正常"
                RETURN
            ELSE
                PRINT "回零结束,回零动作异常"
                RETURN
            ENDIF
        ENDIF
        DELAY(10)
        TimeOut = TimeOut-10
    WEND
    IF TimeOut <=0 THEN
        PRINT "回零超时"
    ENDIF
end sub

总线电缸执行定位运动

先向电缸写入目标位置、速度、加减速度参数,再将启动标志(7012h)bit0置ON,执行定位运动。

'iNode - 电缸节点号'
iPos - 目标位置的绝对坐标,单位0.01mm,写100就是1mm'
iSpeed - 运动速度,单位1mm/s'
iAcc - 运动加速度,单位1mm/s/s
'iDec - 运动减速度,单位1mm/s/s
'*****************************SMC电缸定位运动 **************************
global sub SMC_AxisMove(iNode,ipos,iSpeed,iAcc,iDec)
    node_pdobuff(0,iNode,$7021,0,6) = iSpeed		'速度,对应数据字典7021h
    node_pdobuff(0,iNode,$7023,0,6) = iAcc		'加速度,对应数据字典7023h
    node_pdobuff(0,iNode,$7024,0,6) = iDec		'减速度,对应数据字典7024h
    node_pdobuff(0,iNode,$7022,0,7) = ipos		'目标位置,对应数据字典7022h
    '启动标志置1,对应数据字典7012h
    node_pdobuff(0,iNode,$7012,0,5) = SET_BIT(0,node_pdobuff(0,iNode,$7012,0,5))
    delay(100)
    '启动标志复位,对应数据字典7012h
    node_pdobuff(0,iNode,$7012,0,5) = CLEAR_BIT(0,node_pdobuff(0,iNode,$7012,0,5))
end sub

检测总线电缸是否报警

读取6010h的Bit15 ALARM信号,若ALARM信号为ON,说明电缸发生报警。

对应的报警代码输出到6030h数据字典上,最新触发的报警代码会固定输出到6030h子索引1(报警1)上,历史报警依次推送到报警2\3\4。

通过PDO指令读取6030h子索引为1的数据字典,如果该值非0,即可根据具体报警代码对照手册排查故障。

检测总线电缸是否报警1.png

检测总线电缸是否报警2.png

'iNode - 电缸节点号
'***************************** SMC电缸报警检测 **************************
global sub SMC_GetAxisAlm(iNode)
    local alm_code		'定义局部变量
    '判断6010h的bit15 ALARM 是否报警
    if read_bit2(15,node_pdobuff(0,iNode,$6010,0,6)) = 1 then
        alm_code = node_pdobuff(0,iNode,$6030,1,5)	'读取PDO数据赋值给变量
        ?"触发报警,当前报警1具体报警代码:",alm_code
    endif
end sub

09

如何通过偏移指令去读写PDO的使用说明

当遇到一些特殊设备无法使用node_pdobuff指令去读写数据字典时,可以通过PDO偏移指令实现读写功能。读写指令分别是NODE_PDO_WRBUFF(偏移修改PDO)和NODE_PDO_RDBUFF(偏移读取PDO)。

下面以总线电缸设备举例说明该偏移指令的具体用法。

获取PDO配置信息

查看设备zml文件中PDO配置选项,获取目标数据字典在PDO列表中的字节偏移量和数据字节大小。

其中RxPDO对应的PDO字典内容可以通过NODE_PDO_WRBUFF指令修改;

而TxPDO对应的PDO字典内容可以通过NODE_PDO_RDBUFF指令读取。

获取PDO配置信息.png

PDO偏移写入示例:修改电缸速度

若需要修改电缸的速度(对应数据字典7021h),根据索引列表信息可知,7021h在PDO中的字节偏移为6,数据字典大小为2字节。

我们先将要修改的值按小端序字节拆分后依次存入TABLE数组,再通过偏移指令写入从站PDO即可。

PDO偏移写入示例:修改电缸速度1.png

PDO偏移写入示例:修改电缸速度2.png

举个例子:假设要向节点1的电缸写入的速度值是1500,那么对应的十六进制数据是0x05DC,按小端序拆分为2字节后将其写入TABLE(100)、TABLE(101)后再调用PDO偏移修改指令:NODE_PDO_WRBUFF(0,1,6,100,2)。

指令参数对应含义:槽位号0,从站节点为1,将TABLE数组TABLE(100)、TABLE(101)的2字节数据(每个TABLE存储1字节),写入从站PDO偏移6字节的位置。

PDO偏移写入示例:修改电缸速度3.png

PDO偏移读取示例:读取电缸当前位置

若需要读取电缸的当前位置(对应数据字典6020h),根据索引列表信息可知,6020h在PDO中的字节偏移为4,数据字典大小为4字节。

调用偏移读取指令即可直接从PDO对应偏移位置读取位置数据,按小端序字节拆分后依次存入TABLE数组,后续可拼接还原为完整的位置值。

PDO偏移读取示例:读取电缸当前位置1.png

PDO偏移读取示例:读取电缸当前位置2.png

举个例子:假设节点1的电缸当前位置值为80000,那么对应十六进制数据是0x00013880,调用PDO偏移读取指令:NODE_PDO_RDBUFF(0,1,4,100,4)。指令读取后将数据按小端序拆分为4字节,存入对应TABLE(100)~TABLE(103),将TABLE各字节数据并将数据合并的结果如下。

指令参数对应含义:槽位号0,从站节点为1,从从站PDO偏移4字节处读取4字节,数据依次存入TABLE数组TABLE(100)~TABLE(103)位置(每个TABLE存储1字节)。

PDO偏移读取示例:读取电缸当前位置3.png

10

Basic测试程序使用步骤

RTSys软件添加工程项目

①打开RTSys软件,点击菜单栏【文件】→【打开工程】。

Basic测试程序使用步骤1.png

②选择对应文件目录下的zpj文件。

Basic测试程序使用步骤2.png

下载basic程序执行总线初始化

点击【下载到RAM/ROM】把程序下载进控制器,执行总线初始化完成即可让控制器和电缸通讯上。

下载basic程序执行总线初始化.png

实现电缸功能控制

总线初始化成功之后,会执行电缸控制流程,对电缸进行参数初始化后会循环检测SMC_Cmd的值,通过修改SMC_Cmd参数实现对应功能控制。

最后一张.png

Basic电缸控制流程主体代码:

'****************电缸控制流程****************
global SMC_Cmd	'控制指令
SMC_Cmd = 0
global Const SMC_AxisNode = 0
'定义节点号为0
sub_SMC_Init(SMC_AxisNode)		'初始化节点0的SMC电缸参数
while 1
    if SMC_Cmd = 1 THEN
        SMC_Cmd = 0
        SMC_AxisEnAble(SMC_AxisNode,on)		'电缸0 使能
        ?"电缸节点"SMC_AxisNode, "Enable"    elseif SMC_Cmd = 2 THEN
        SMC_Cmd = 0        SMC_AxisEnAble(SMC_AxisNode,off)		'电缸0 关闭使能
        ?"电缸节点"SMC_AxisNode, "disable"
    elseif SMC_Cmd = 3 THEN
        SMC_Cmd = 0
        SMC_AxisHome(SMC_AxisNode)			'电缸0 回零
        ?"电缸节点"SMC_AxisNode, "Datum"
    elseif SMC_Cmd = 4 THEN
        SMC_Cmd = 0
        SMC_AxisRes(SMC_AxisNode)			'电缸0 复位
        ?"电缸节点"SMC_AxisNode, "RESET"
    elseif SMC_Cmd = 5 THEN
        SMC_Cmd = 0
        ?SMC_GetAxisPos(SMC_AxisNode)		'电缸0 读取位置
        ?SMC_AxisNode, "Current Postion is"
    elseif SMC_Cmd = 6 THEN
        SMC_Cmd = 0
        ?"enable",SMC_GetIfServo(SMC_AxisNode)				'电缸0 是否使能
        ?"idle",SMC_GetIfIdle(SMC_AxisNode)					'电缸0 是否静止
        ?"inp",SMC_GetIfInp(SMC_AxisNode)					'电缸0 是否到位
        ?"home",SMC_GetHomeStatus(SMC_AxisNode)			'电缸0 是否回零
        ?"alm",SMC_GetIfAlm(SMC_AxisNode)					'电缸0 是否报警
        ?"almreason",SMC_GetStopReason(SMC_AxisNode)		'电缸0 当前报警原因
        ?"pos",SMC_GetAxisPos(SMC_AxisNode)				'电缸0 当前位置 JOG不计位置
        ?SMC_AxisNode, "Current Status"
    elseif SMC_Cmd = 7 THEN
        SMC_Cmd = 0
        SMC_AxisMove(SMC_AxisNode,100,50,1000,1000)		'电缸0 定位 绝对位置100 速度50 加速度1000 减速度1000
        SMC_AxisMove(SMC_AxisNode,0,50,1000,1000)			'电缸0 定位 绝对位置0   速度50 加速度1000 减速度1000
    endif
wend

教学视频请点击→EtherCAT运动控制器与EtherCAT总线电缸的自定义PDO控制

二维码.webp

正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。

版权所有 工控网 Copyright©2026 Gkong.com, All Rights Reserved