设备改造项目里,最磨人的不是写程序,而是新老设备“语言不通”。汇川H5U本身是EtherCAT主站,步科那批驱动器走的却是CANopen协议,两边压根不是一个语系。把伺服全换成EtherCAT版本,成本高、交货周期长,还要动机械接线;不换硬件,H5U又没法直接控制。这个项目我前后花了两天半把它打通,核心做法就是中间加一条“翻译桥”——EtherCAT转CANopen网关,让H5U像控制普通总线轴一样,去控制老旧的步科CANopen伺服。
这个方案非常适合产线升级、多品牌设备混用、以及想保留存量伺服硬件的项目。只要你会组态网关、会配置H5U的EtherCAT从站,再捋清楚CiA 402标准里的控制字和状态字,整条链路就能跑起来。下面我把这个项目的完整思路、实操过程和踩坑记录都写出来。
1. 项目整体设计与方案选型思路
1.1 为什么会出现“EtherCAT主站控CANopen伺服”这种组合
汇川H5U在中小型设备里用得非常广,它自带EtherCAT主站,可以挂伺服、挂IO、挂视觉相机,同步性能和组网便利性都比脉冲方案好一个档次。但问题恰恰出在“存量资产”上:很多设备上一代用的是步科伺服,接口是CANopen,不是EtherCAT。产线升级时,控制器换了H5U,伺服却不可能说换就换。
这种情况在设备配套厂、终端工厂的改造项目里非常普遍。伺服电机、减速机、机械结构都是好的,只为了通讯接口不同就把整台伺服淘汰,既不划算也不环保。所以真正合理的思路不是“谁好就用谁”,而是“怎么让新旧两边能对话”。
从技术角度说,EtherCAT和CANopen虽然差异很大,但都有一个共同点:它们都支持CANopen over EtherCAT(CoE)的设备行规。很多标准伺服对象字典都是从CiA 402来的,只是底层传输方式不同。这就给协议转换留下了空间。
1.2 方案对比:换伺服、脉冲替代、还是协议网关
我列过一张选型对比表,当时就贴在项目记录里,现在整理出来直接给大家参考。
| 方案 | 成本 | 工期 | 控制效果 | 风险 |
|---|---|---|---|---|
| 整批更换EtherCAT伺服 | 高,要买新驱动器和电机 | 长,涉及机械装配 | 好,统一总线控制 | 接线和机械改动大 |
| H5U发脉冲控制原伺服 | 低,只需加脉冲口模块 | 短 | 一般,实时性略差,还得处理脉冲反馈 | 走线多,抗干扰一般 |
| EtherCAT转CANopen网关 | 中,只有一个网关成本 | 短,软件配置为主 | 较好,仍是总线周期控制 | 多一层协议转换,调试要细致 |
最终我选了第三个方案。网关方案能在不换伺服、不改机械的前提下,让H5U以总线周期方式下发目标位置、读取实际位置和状态字,调试好了之后,控制精度和响应速度完全够用。当然也要说清楚,它不可能达到EtherCAT直连那么多轴时的极限同步性能,但常规工艺动作、点位运动、简单插补场景完全没问题。
选型时还要考虑网关本身的兼容性。市面上这类EtherCAT转CANopen网关不少,有的偏通用,有的带专用API。我当时用的是一款国产通用网关,支持用户导入EDS文件,也支持把CANopen对象手动映射到EtherCAT过程数据里。汇川原厂也有配套模块,思路大同小异。
1.3 整条通讯链路是怎么跑的
整个系统的数据流可以这样理解:H5U作为EtherCAT主站,每个通讯周期(比如1ms或2ms)把“控制字+目标位置”等数据写到EtherCAT总线上;网关作为从站收到这些数据后,转换成CANopen的RPDO报文,通过CAN总线发给步科伺服;步科伺服执行运动的同时,把自己的“状态字+实际位置”通过TPDO报文发回网关,网关再把数据打包进EtherCAT过程数据回传给H5U。
从PLC程序角度看,H5U和伺服之间就像在读写一组IO寄存器:程序往输出区写目标位置,从输入区读实际位置。真正复杂的转换都在网关内部完成了。这也是“协议网关”类方案最大的价值——上层应用不用关心底层协议栈,只需要按CiA 402标准去控制设备。
2. 协议攻坚:EtherCAT与CANopen的“翻译”细节
2.1 EtherCAT侧:周期、映射和从站状态机
EtherCAT的技术核心在于主站和从站之间通过标准以太网帧传输过程数据,从站硬件在报文经过时直接提取或插入数据,响应非常快。对H5U来说,配置EtherCAT从站本质上就是三件事:导入从站的XML描述文件、配置过程数据映射、设置通讯周期和DC同步。
XML文件里面其实包含了从站支持的所有同步管理器(SM,SyncManager)和PDO映射信息。网关的XML里会写明:输出过程数据区域有哪些字,输入过程数据区域有哪些字,分别对应CANopen侧的哪些PDO。H5U导入XML之后,AutoShop会自动生成对应的IO映射地址,我们就能直接在程序里用这些地址。
EtherCAT从站有四个运行状态:INIT、PREOP、SAFEOP、OP。程序下载后,主站会按顺序把从站切换到OP状态,这个过程一旦失败,通讯就起不来。大多数现场问题都出在从站进不了OP,后面我会单独展开讲。
2.2 CANopen侧:对象字典、SDO、PDO和NMT
CANopen是建立在CAN总线上的高层协议,核心是“对象字典”。每一个数据项都有一个16位的索引,比如控制字是6040h,目标位置是607Ah,实际位置是6064h。通讯方式主要分两类:SDO用于参数配置(读写对象字典),PDO用于实时过程数据交换。
SDO是一问一答的确认式通讯,慢一点,但可靠。PDO是广播式的,主站周期发送RPDO给从站,从站周期或事件触发TPDO回报数据,速度快,但配置完之后内容基本就固定了。实际控制伺服时,我们大多用PDO跑实时数据,SDO只用来设置运行模式、读取异常码这类低频操作。
CANopen还有一个NMT状态机。从站上电后从初始化,被主站切到Pre-Operational,然后再切到Operational才开始收发PDO。如果网关配置里漏了启动NMT这一步,或者伺服站号没对上,后面发什么PDO都是白搭。
2.3 网关到底“翻译”了什么
网关本质上是两个通讯协议的桥。EtherCAT侧它是从站,CANopen侧它是主站。每一帧EtherCAT过程数据到达后,网关固件把里面映射好的字段取出来,重新组帧成CANopen RPDO发送出去;收到TPDO后再反向填充到EtherCAT过程数据里。
这中间有几个容易出问题的地方。第一个是字节序。EtherCAT和CANopen都默认小端,但经过网关转换后,16位、32位数据的字节顺序可能会被改,干扰我们的位置换算。第二个是数据长度。32位的目标位置在CANopen里是4个字节,但在EtherCAT过程数据里也可能是4个字节,如果映射表没对准,读回来的数据就是乱的。第三个是同步方式。网关是透明转发还是自己维护CANopen主站状态机,直接决定了伺服能否正确进入使能状态。
我当时用的网关提供了一个组态软件,可以手动建立“EtherCAT输出区字偏移”和“CANopen对象”的对应关系,比如“输出区第0字对应RPDO1里的6040h,第1-2字对应607Ah”。配置完生成XML给H5U用。这个环节是整条链路的关键,映射表一旦错了,后面全是玄学问题。
2.4 步科伺服必须用到的几个对象字典
不管步科还是其他品牌,只要是CiA 402标准伺服,下面的对象字典基本都是通用的:
| 对象索引 | 名称 | 方向 | 说明 |
|---|---|---|---|
| 0x6060 | 运行模式 | 主站→伺服 | 1:PP位置模式,8:CSP周期同步位置模式 |
| 0x6061 | 模式显示 | 伺服→主站 | 当前生效的运行模式 |
| 0x6040 | 控制字 | 主站→伺服 | 控制使能、触发运动 |
| 0x6041 | 状态字 | 伺服→主站 | 反映伺服状态和到位信息 |
| 0x607A | 目标位置 | 主站→伺服 | 位置模式下目标位置 |
| 0x6064 | 实际位置 | 伺服→主站 | 编码器反馈实际位置 |
如果你问步科官方,他还会告诉你一大堆厂家自定义参数,但玩转上面这六个,基础控制已经够用了。重点是理解控制字和状态字,它们是CiA 402状态机的“门把手”。
2.5 控制字、状态字和使能顺序
很多新手栽在“使能”这一关。CiA 402规定,从初始状态到伺服正常使能,控制字按顺序写入是有讲究的。一个典型的使能流程:
- 控制字写0x06:执行Shutdown(故障复位后关主电)
- 控制字写0x07:进入Switch On Disabled→Ready to Switch On
- 控制字写0x0F:进入Operation Enabled
其中每一步之间最好加一点延时,或者轮询状态字确认到位。状态字也是一个16位字,bit0表示Ready to Switch On,bit1表示Switched On,bit2表示Operation Enabled,bit3表示故障,bit5表示快速停止,bit6表示Switch On Disabled,bit10表示目标位置到达。我们判断伺服是否正常运行,主要读状态字第3位是不是0,第2位是不是1。
如果跳过使能顺序,直接给0x0F,很多驱动器会不理你。这不是协议需求,而是驱动器出厂固件就是这么设计的,保护机制。我用过几个品牌,基本都遵循这套状态机,所以建议按标准流程走。
3. 实操记录:从硬件接线到H5U程序跑起来
3.1 硬件清单和准备工作
做这个项目需要准备的东西不算多,但每一样都得提前到位:
- 汇川H5U PLC本体,固件版本支持EtherCAT主站
- EtherCAT转CANopen网关,带组态软件和配套说明书
- 步科伺服驱动器+电机(原有的),确认驱动器带CANopen通讯口
- CAN总线通讯线,建议双绞屏蔽线
- 两个120欧终端电阻(CAN总线首尾各一个)
- 标准网线若干,用于EtherCAT级联
- 步科伺服的EDS描述文件,这是网关组态的必备文件
动手前我建议先把所有设备的说明书和EDS、XML等文件放在同一个文件夹里。尤其是步科那部分,不同型号、不同批次的EDS文件可能都有差异,直接用错版本会留下很大隐患。
3.2 硬件接线和驱动器拨码设置
EtherCAT那边很简单,H5U的EtherCAT OUT口用网线接到网关的IN口,网关的OUT口如果有下一台从站再继续级联。注意EtherCAT对网线质量没有想象中那么挑剔,但建议使用至少CAT5E规格的屏蔽网线,现场电磁环境复杂时能少很多麻烦。
CANopen这边就讲究了。网关的CAN_H、CAN_L分别接步科伺服的CAN_H、CAN_L,屏蔽层单端接地。步科伺服驱动器面板上通常有拨码开关,用来设置CANopen站号和通讯波特率。站号必须和网关中配置的从站地址一致,波特率也要一致,常见的有125K、250K、500K、1M。这个设置完成后要重新上电才生效,很多朋友调试半天发现改了没反应,其实缺的就是一次重启。
CAN总线末端一定记得放终端电阻。整条链路如果网关和伺服是两个端点,就在两端各并一个120欧电阻。我见过不止一次“通讯时好时坏”“走一段时间掉线”的问题,十有八九都是终端电阻没放或者放错了位置。
3.3 网关组态:映射表和XML生成
先打开网关厂家的组态软件,新建工程,选择“CANopen主站”模式。加载步科伺服的EDS文件之后,软件会自动识别服务器支持的对象字典和PDO映射。但自动识别不代表自动好用,我们要手动确认两处关键配置:
第一处是CANopen通讯参数。从站地址填和拨码一样的站号,波特率保持和拨码一致。第二处是PDO映射表。以位置控制为例,我配置了一个RPDO给主站输出,内容为控制字6040h(16位)和目标位置607Ah(32位);再配一个TPDO给伺服反馈,内容为状态字6041h(16位)和实际位置6064h(32位)。
映射表保存后,组态软件会生成一个EtherCAT从站描述XML文件。这个文件就是H5U认识网关的“身份证明”,我习惯把它另外复制一份放在项目备份里,后面H5U那边导入要用。
3.4 H5U侧配置:导入XML和过程数据映射
在AutoShop里新建工程,选好H5U型号后,在EtherCAT配置页添加从站,选择“从XML文件导入”,把刚才网关生成的XML加进来。导入成功以后,软件会显示出网关占用的输入输出长度,这个长度就是网关在EtherCAT过程数据区域里占用的“槽位”。
我把H5U和网关的通讯周期设成了1ms。这个周期对CANopen链路来说已经属于比较极限的节奏,因为CANopen的PDO本身也要占用总线时间。如果你的CANopen波特率只有250K,建议把周期放到2ms或4ms,给网关留够转换时间。H5U支持每个从站单独设置周期,不需要全局统一。
配置完成后,程序里就能看到一组IO映射地址,比如输出区QW0是控制字,QD2是目标位置,输入区IW0是状态字,ID2是实际位置。具体地址要看工程实际分配,但逻辑就是这个逻辑。建议先把这些地址做成带注释的全局变量,后面程序写起来就整洁很多。
3.5 PLC程序核心逻辑:使能、触发运动和读取反馈
控制程序我推荐用结构化文本写逻辑,用梯形图做操作面板,两者配合效率最高。核心逻辑拆开来看就是三块:使能状态机、位置触发、以及反馈监控。
使能部分,我写了类似下面这样的逻辑:
// 假设计算机启动完成后,先执行一次使能序列 IF bEnableCmd AND NOT bEnabled THEN // 第一步:Shutdown QW_CtrlWord := 16#0006; // 延时约50ms QW_CtrlWord := 16#0007; // 延时约50ms QW_CtrlWord := 16#000F; bEnabled := TRUE; END_IF位置触发部分,用到的是PP(轮廓位置)模式。先把运行模式设为1,再写目标位置,然后通过翻转控制字的bit4来通知驱动器“这是一个新的目标点”。
// 设置PP模式 QD_Mode := 1; QD_TargetPos := 50000; // 目标位置,单位见驱动器设置 // 触发:bit4从0到1代表接受新位置 QW_CtrlWord := 16#000F; // 先保持使能,bit4=0 QW_CtrlWord := 16#001F; // bit4=1,触发 QW_CtrlWord := 16#000F; // 复位bit4,准备下一次有些驱动器对“先复位再置位”的顺序要求不太一样,如果发现不触发,就换一下顺序试试。反正原理就是让bit4产生一个上升沿。
反馈部分就简单了,直接读状态字和实际位置变量,放在人机界面和报警逻辑里。我还用了状态字的bit10作为“到位”信号,这样能在运动但还没到目标时,程序里做一些后续动作的延迟。
3.6 单位换算和电子齿轮别踩坑
位置单位转换是很多项目后期改来改去的根源。步科伺服的实际位置对象6064h,单位取决于驱动器的电子齿轮比和编码器分辨率。比如电机编码器是2500线,四倍频后一圈是10000个脉冲;如果驱动器里设了电子齿轮比,程序里的1个单位可能对应多个脉冲。
我的习惯是把电子齿轮比设成“用户单位直接等于0.1mm”或者“0.01度”,这样H5U程序里的目标位置就直接是工艺单位,不用在PLC里再乘系数。如果电子齿轮比设置复杂,那就必须把换算公式写进程序设计文档里,别只留在脑子中。
还有一个小经验:CANopen里的32位位置数据有正负,如果伺服反馈的位置突然变成很大的负数,通常是字节序或符号位处理错了,优先检查网关映射和H5U的数据类型。
4. 常见问题与排查技巧实录
4.1 故障现象速查表
下面这张表是我调试这类跨协议总线项目时最常遇到的几类问题,可以直接当速查手册用。
| 故障现象 | 可能原因 | 排查思路 |
|---|---|---|
| H5U从站状态一直停在PREOP,进不了OP | XML导入错误、网关固件版本不兼容、周期配置不当 | 查看H5U诊断里的AL状态码,升级网关固件,重新导入XML |
| 伺服根本没有反应,状态字一直是0 | 使能顺序不对、运行模式没设置、PDO映射没对上 | 先用SDO读6061h确认模式,用面板监控状态字 |
| 通讯偶尔断一下,走一会就报错 | 终端电阻缺失、CAN总线布线过长、周围变频器干扰 | 检查终端电阻,缩短CAN分支,双绞屏蔽线单端接地 |
| 电机动了,但位置和指令对不上 | 电子齿轮比设置错误、字节序问题、PP触发信号时序不对 | 单步写入一个固定位置,读回6064h对比换算 |
| 网关配置保存后,H5U里导入报错 | XML版本和AutoShop版本不匹配 | 用厂家最新版组态软件重新生成XML |
4.2 案例分享:进不了OP状态,折腾了一天
第一次调试时,H5U那边始终卡在PREOP,从站状态指示灯闪烁,怎么都进不了OP。一开始我怀疑是XML问题,重新导入了好几次没效果;又怀疑周期设置太短导致网关处理不过来,从1ms改到4ms还是不行。
后来我用网线直连网关,发现网关固件版本很老,厂家官网已经出了新版,而且新版说明里明确写了“修复若干EtherCAT从站兼容性问题”。升级固件后再重新生成XML,一次就进了OP。
这类问题是最磨人的,因为你从应用层根本看不出是哪里不对。我的建议是:拿到网关第一件事先看固件版本,去官网比对是否有更新。很多国产网关出厂固件都比较旧,和汇川H5U这种新固件PLC配合时容易出兼容性小问题。
4.3 案例分享:CANopen站号拨到了0
第二台伺服怎么都通讯不上,但网关上电时扫描从站又好像能看到设备。排查一圈,发现步科伺服驱动器的站号拨码拨到了0。CANopen协议里,站号0一般被用作广播地址,一些驱动器会忽略来自站号0的PDO报文,所以通讯始终建立不起来。
这个案例提醒我:不管是拨码开关还是软件配置,从站地址一定不要在0,而且每次改完要断电重启。另外,如果现场有多台伺服,最好做一张“站号-工艺位置-设备编号”对照表贴在电柜里,不然过一个月就没人记得哪个地址是哪台轴了。
4.4 案例分享:位置触发不灵,原来是bit4时序问题
程序跑起来了,使能也正常,但每次发目标位置,电机只动了一下就停,下一次触发响应不稳定。我在线监控控制字,发现虽然我把bit4置1之后又复位了,但PLC扫描周期太快,驱动器可能根本没有捕捉到bit4的上升沿。
后来我在置位和复位之间加了两个扫描周期的延时,让bit4高电平保持足够时间,问题立刻解决。不同驱动器对触发信号最小保持时间的要求不一样,常见做法是保持至少1-2ms。这种问题在线监控波形不好抓,因为太快,得用逻辑分析仪或CAN调试工具才能看清楚。
4.5 改造项目的调试顺序建议
最后分享一下这类改造项目的调试节奏。我强烈建议按“从底层到应用”的顺序来,不要跳步:
- 先用伺服驱动器面板或厂家调试软件点动电机,确认电机、编码器、抱闸等硬件正常
- 用网关的调试功能或CAN分析工具,单独和伺服走CANopen通讯,用SDO写对象字典,确认总线通、站号对
- 在H5U里配好EtherCAT,把网关切到OP,观察是否有通讯报警
- 直接在PLC程序里手动给控制字和目标位置变量,观察电机是否能按预期动作
- 全部通过后,再封装成自己的运动控制功能块,接上自动流程
我见过很多人一上来就把H5U、网关、伺服一次性全配好,然后出了问题根本不知道先从哪一层找。分层调试虽然花一点时间,但能帮你快速定位问题在哪一段,综合算下来反而是最快的方式。
这个项目做完以后,我的一个深切感受是:总线协议不同并不是设备改造的“拦路虎”,关键是先把标准设备行规和底层通讯逻辑弄明白。CiA 402的使能顺序、对象字典、PDO映射,这些知识在EtherCAT直连伺服时能用,在CANopen伺服上同样能用。下次你再遇到H5U配其他品牌、其他协议的伺服,这套思路一样适用,无非是把中间那层“翻译”换成对应的另一种网关而已。