最近做了个产线升级项目客户手里的旧设备用的是步科CANopen伺服但控制PLC坏了新换的控制器是汇川H5U。问题一下就来了H5U原生只带EtherCAT主站口而步科伺服的通讯口是CANopen这两种总线根本不通用怎么办呢这其实是个很典型的存量设备改造场景。H5U作为汇川小型PLC里的运动控制主力走的是EtherCAT总线而很多老设备上的伺服只支持CANopen。这篇文章我就把这套方案从头到尾拆开讲包括硬件怎么选、步科伺服那排拨码开关到底怎么设、CANopen对象字典里该配哪些关键参数、H5U侧怎么组态和写程序最后再聊聊调试过程中踩过的坑。无论你是刚入门的PLC新人还是正在做旧设备改造的电气工程师这套思路都值得收藏。1. 项目概述与需求拆解为什么EtherCAT主站要带CANopen伺服1.1 场景还原控制层升级执行层不动先说说这种需求最常见的几个来源。第一种是控制PLC损坏替换。旧产线用步科AASD-30A之类的伺服跑了五六年没毛病但上位控制器坏了。市场上买不到当年的老型号只能换新控制器。汇川H5U性价比高、小型机里运动控制能力强采购自然倾向于选它。可问题来了旧伺服没有EtherCAT口只有CANopen口。第二种是设备改造升级。原有脉冲控制做得稀烂没有位置反馈报警也不及时。客户想把整个运动控制系统升级成总线控制但出于成本考虑又不想把伺服电机全部换掉于是要求新PLC兼容旧伺服。第三种是新设备但客户指定要用现有的伺服库存。这个就更现实了仓库里还有十来台步科CANopen伺服先用了再说。这三种场景都指向同一个技术断桥H5U主站走EtherCAT步科伺服从站走CANopen协议不同物理层也不同。1.2 三条技术路径对比面对这个断桥到底有哪几条路可以走我实际接触下来靠谱的方案就三种。方案一是把伺服全部换成支持EtherCAT的型号。这是最彻底的解法步科FD系列、FS系列都有EtherCAT版本。好处是系统架构最干净调试最方便实时性也是最好的。坏处就是费钱如果设备上有四五个轴换下来成本不低。方案二是加一个EtherCAT转CANopen网关。网关在H5U这边是EtherCAT从站在步科伺服那边是CANopen主站。H5U把过程数据发给网关网关翻译成CANopen报文再去控制伺服。这是典型的存量改造方案硬件成本可控但调试复杂度会高一些实时性也会打折扣。方案三最土直接用H5U的脉冲输出口比如H5U-1614MTD带差分脉冲输出接步科伺服的高速脉冲口。这个方案接线简单、编程也简单但总线控制的所有优势都没了没法在线改伺服参数、拿不到伺服实际位置、没有诊断信息、线缆多且容易受干扰。列个对比表更直观。方案硬件成本调试工作量实时性推荐场景更换EtherCAT伺服最高最低最高100us-1ms周期新项目、预算充足EtherCAT转CANopen网关中等中等中等1ms-5ms周期旧设备改造、存量伺服H5U脉冲口控制最低较低较低依赖脉冲频率小设备、单轴、低要求我个人的建议是如果是新项目能选EtherCAT伺服就直接选别给自己找麻烦。如果确实是存量设备改造那就认认真真做好网关方案控制周期放宽到2ms以上一样能稳定跑。2. 系统架构与硬件选型先把链路搭明白2.1 整体链路拓扑这里我以网关方案为主线来讲因为这是标题里“CANopen伺服”最直接对应的做法。H5U这台PLC的EtherCAT网口用网线连接到网关的EtherCAT口网关另一侧通过CANopen总线连接步科伺服驱动器。如果有多台CANopen伺服就用菊花链方式挂在同一条CANopen总线上每台伺服分配不同的站号总线的两端需要接120欧姆终端电阻。用文字描述就是H5U EtherCAT主站 - 网线 - EtherCAT转CANopen网关EtherCAT从站角色CANopen主站角色 - CANopen总线双绞线 - 步科伺服1 - 步科伺服2 - ... - 终端电阻这里有个关键点很多人会忽略网关在EtherCAT侧是从站在CANopen侧是主站。也就是说网关既要被H5U“管理”又要去“管理”下面那串CANopen伺服。这个角色定位搞清楚了后面看问题就好理解多了。2.2 为什么总线方案越来越主流我见过很多工程师还在用脉冲方案觉得稳定踏实。但说实话总线控制已经是板上钉钉的趋势了。脉冲方案最痛的三个点第一线缆多。一个脉冲轴至少要脉冲、方向、使能三根信号线再加上编码器反馈线多轴的时候走线非常痛苦。第二参数没法在线管理。伺服参数要拿电脑连伺服驱动器去改PLC根本不知道伺服那边发生了什么。第三没有诊断能力。伺服报警了PLC只能靠开关量输入去猜根本拿不到详细故障码。EtherCAT和CANopen这类总线方案就不一样。PLC可以直接读写伺服的对象字典使能状态、实际位置、电流、报警代码统统能通过报文拿到。调试的时候坐在电脑前面就能把伺服的参数全部摸一遍效率跟脉冲方案完全不是一个级别。当然总线方案也有学习成本尤其是CANopen的PDO映射和EtherCAT的从站组态新手第一次搞会有点懵。但一旦搞通了后面再遇到底层逻辑完全一样的方案就轻车熟路了。2.3 网关选型的几条硬指标网关这东西水很深。我踩过一次坑之后总结出几条经验。一是确认网关是否提供ESI/XML从站描述文件。H5U组态的时候必须导入这个文件才能识别网关。有些小厂网关只给个PDF说明书不给XML这就很坑。买之前一定要问清楚。二是看网关支不支持在线修改CANopen参数。好的网关自带配置软件可以在电脑上配置CANopen从站列表、PDO映射、对象字典然后把配置下载到网关里。没有这个能力的网关基本上只能做透明传输调试起来会让你怀疑人生。三是问清楚网关的CANopen主站速率范围。常见的有125k、250k、500k、1M步科伺服通常支持这些但要确认两边能不能匹配上。四是看网关能否同时驱动多台CANopen从站。如果下面要挂5台以上伺服网关的报文处理能力就很关键了。3. 步科伺服侧准备拨码开关、对象字典与预调试3.1 伺服驱动器面板那排拨码开关到底是什么热词里有人问“伺服编码器那排开关是什么”这个问题挺多人问的。其实那不是编码器上的开关而是伺服驱动器面板上靠近编码器接口位置的那排拨码开关负责设置CANopen通讯参数。步科AASD-30A这一代伺服驱动器前面板上通常有几组小拨码开关常见的功能是这么分配的站号设置CANopen节点地址。这组开关用二进制或BCD码组合来确定伺服在CANopen总线上的地址范围一般在0到127之间。比如把拨码拨到5那这台伺服就是站号5。每条总线上每台伺服站号必须唯一否则通讯必乱。波特率设置。一般有两到三位开关用来选择CANopen波特率常见档位是125k、250k、500k和1M。网关或者CANopen主站的波特率必须和伺服设定一致。我常用500k兼容性比较好距离适中、抗干扰也不错。终端电阻开关。有些伺服驱动器上直接有终端电阻拨码拨到ON位置表示内部120欧姆终端电阻接入总线。CANopen总线物理层的规则是两端各接一个120欧姆电阻如果伺服正好在总线末端就把这个开关拨到ON不在末端就拨到OFF。这个很容易被忽略网上很多“伺服通讯时好时坏”的案例最后都是终端电阻没接对。不同型号的步科伺服拨码开关的位置和组合含义不完全一样。有的驱动器没有拨码是用面板按键进参数菜单设置的。所以拿到伺服驱动器第一步永远是看说明书看它“通讯参数”那一章怎么写的别凭经验乱拨。3.2 CANopen对象字典这些索引号必须记牢伺服接入CANopen后所有数据都在对象字典里。所谓“控制伺服”本质就是读写对象字典里的各个索引值。步科伺服常用的对象索引基本遵循CiA 402标准我列一下必须掌握的对象索引名称作用0x6040控制字控制伺服使能、启动等状态机切换0x6041状态字读取伺服当前状态0x6060操作模式切换位置/速度/扭矩模式0x607A目标位置位置模式下写入目标位置0x6064实际位置读取伺服当前实际位置0x606C实际速度读取伺服当前实际速度0x6081速度分子电子齿轮比分子0x6082速度分母电子齿轮比分母0x60FF目标速度速度模式下写入目标速度这里面0x6040和0x6041是最核心的。控制字往0x6040里写不同的值伺服的状态机就会切换0x06关闭电源状态Shutdown0x07切换电源ONSwitch On0x0F使能运行Enable Operation实际用的时候常规顺序是先把0x6040写0x06再写0x07最后写0x0F。每一步之间最好隔个几十毫秒让伺服状态机稳定切换。从0x6041状态字里能看到伺服当前状态最关键的位是第0位“准备就绪”和第1位“电源开启”。状态字读到0x2231这种值的时候基本可以确认伺服已经被使能了。操作模式0x6060也是必设项。1代表位置模式PP8代表周期同步位置模式CSP。在CANopen网关场景下如果网关做的是传统CANopen主站一般用PP模式比较多如果网关支持CSP模式那控制方式会更接近EtherCAT伺服那种周期同步方式。3.3 上总线之前先用工具验证伺服我强烈建议正式接入H5U之前先用CAN分析仪把伺服单独调通了。不然到时候PLC读不到伺服、伺服没反应你就不知道问题出在PLC组态还是伺服配置排查起来非常头疼。用CAN分析仪接上伺服的CANopen口电脑上配合CAN调试软件。先把波特率和站号确认好然后做三个动作。第一个动作是读对象字典。用SDO读0x1000设备类型、0x1001错误寄存器能正常读出来说明物理层和CANopen协议层都是通的。第二个动作是测试使能。用SDO发送0x60400x06间隔50ms后发送0x60400x07再间隔50ms后发送0x60400x0F。然后读0x6041看看状态字是否已经变成使能状态。第三个动作是位置测试。先把0x6060设成1位置模式再往0x607A里写一个不大的目标位置比如1000脉冲再写0x60400x1F带“启动”位的使能命令观察电机是不是转了一个角度。这几个动作做完基本可以确定这台伺服在CANopen层面是健康的。后续接H5U出问题你就可以放心地把注意力放在EtherCAT和网关的配置上。4. 汇川H5U EtherCAT主站配置与程序编写4.1 工程组态导入XML从站文件H5U的编程软件是AutoShop属于InoProShop平台部分版本直接叫InoProShop。打开软件新建工程选择正确的PLC型号比如H5U-1614MTD。然后是EtherCAT组态。在软件里找到“设备组态”或“EtherCAT配置”这一类入口里面能看到EtherCAT主站的图标。右键可以扫描从站如果网线和网关已经连好了有可能直接扫出来如果没有扫出来就手动添加从站导入网关或者伺服的XML/ESI文件。从站文件导入后软件会识别出设备名、版本号、支持的过程数据对象。此时要注意从站在线版本和XML版本是否匹配如果固件升级过最好从设备厂商拿到最新的XML文件重新导入。对于网关方案这里要特别说一句你在H5U里看到的是网关这个EtherCAT从站而不是步科伺服。伺服是被网关“隐藏”在后面的一堆CANopen对象。H5U通过读写网关的过程数据间接控制伺服。网关的过程数据一般会开放多个字节区域分别对应CANopen的TPDO/RPDO内容你要在网关的配置软件里把过程数据映射定义好H5U这边才能对症下药。4.2 轴配置把网关数据映射成运动轴如果用的是直接连接EtherCAT版本步科伺服H5U导入了伺服XML后软件会自动把伺服从站映射为轴。但用网关方案时H5U看到的是一堆PDO数据块不一定能自动生成“轴”对象很多时候就要手动把实际位置、目标位置、控制字、状态字这些数据关联起来。这个环节的复杂度和网关本身有很大关系。好一点的网关比如支持CANopen转EtherCAT协议的设备它会把CANopen的0x6040、0x607A这些对象直接映射到EtherCAT过程数据里你可以在H5U里把网关的设备数据块分配到轴控制变量上。但有些网关只做“透传”它把CANopen的原始报文打包成EtherCAT数据H5U这头拿到的是一堆原始帧那就非常麻烦了需要你自己解析报文。所以我还是建议在选网关这个环节就把“过程数据映射”这件事问清楚。直接问卖家“我下面挂的是CIA 402伺服从站你的网关能不能把0x6040、0x607A、0x6064这些对象直接映射到EtherCAT过程数据里头”能正面回答且提供映射工具的才是你需要的网关。H5U轴组态生成后会为每个轴分配轴号。轴参数里有单位换算、限位使能、回原方式、加减速时间常数等项目这几个要设置准确定位才稳。4.3 编写使能与定位程序H5U的运动控制指令遵循PLCopen规范在AutoShop里用ST语言写起来非常顺手。下面是核心程序的示例框架。先写使能逻辑把轴置为可运行状态(* 轴使能 *) MC_Power_0.Axis : Axis1; MC_Power_0.Enable : TRUE; MC_Power_0();再将位置模式、绝对定位等动作写成触发执行的方式(* 绝对定位 *) IF bStartMove THEN MC_MoveAbsolute_0.Axis : Axis1; MC_MoveAbsolute_0.Execute : TRUE; MC_MoveAbsolute_0.Position : dTargetPos; (* 单位用户单位 *) MC_MoveAbsolute_0.Velocity : dMoveSpeed; (* 用户单位/秒 *) MC_MoveAbsolute_0.Acceleration : dAcc; (* 用户单位/秒² *) MC_MoveAbsolute_0.Deceleration : dDec; (* 用户单位/秒² *) MC_MoveAbsolute_0.Jerk : 0; (* 0表示不限制加加速度 *) MC_MoveAbsolute_0(); bStartMove : FALSE; END_IF如果是在网关CANopen方案里你可能会发现H5U的轴对象并不是伺服本身而是在H5U内存里搭了一个“虚拟轴”由你通过I/O映射把虚拟轴的数据写到网关的过程数据里。这种写法也能跑但响应上比原生EtherCAT轴多一层周转。调试的时候稍微耐心一点逻辑上不复杂。4.4 单位换算与电子齿轮比这里最容易算错步科伺服分辨率常见的是131072脉冲/转17位编码器。如果机械部分有减速机和丝杠那位置单位换算就绕不开电子齿轮比。举个例子。假设电机直连一个10mm导程的丝杠减速比是10:1用户希望程序里以0.01mm为单位发位置指令。先算电机转一圈负载端走多少毫米负载端移动 丝杠导程10mm / 减速比10 1mm也就是说电机转一圈负载走1mm。编码器反馈是131072个脉冲对应电机一圈。所以1mm对应131072个编码器脉冲。如果程序里一个用户单位想表示0.01mm那么每个用户单位对应的编码器脉冲数就是131072 / (1mm / 0.01mm) 131072 / 100 1310.72个用户单位脉冲可是1310.72不是整数电子齿轮的分子分母没法直接写小数。怎么处理呢实际在H5U或者伺服驱动器里配置电子齿轮比通常是用“电机编码器分辨率”和“每转用户分辨率”两个参数来配。按上面的案例电机每转编码器脉冲是131072而每转用户脉冲应该是100因为1mm/0.01mm100个用户单位。所以电子齿轮分子131072分母100。如果伺服支持分子分母分别设置就填这两个数。写程序的时候你还得确认自己操作的是哪个单位。有些配置下PLC直接下发“用户单位”有些配置下PLC下发的还是“编码器脉冲”。搞错单位最常见的结果就是位置差10倍、100倍一跑就撞限位或者走不到位。我自己的习惯是所有设备统一用“用户单位”也就是工程上能看懂的毫米或度换算工作全部放到电子齿轮比里处理。PLC里只跟毫米打交道调试的时候思路非常清晰。4.5 H5U侧调试界面怎么看H5U软件有在线轴状态表可以看到每个轴的实际位置、目标位置、跟随误差、状态字这些关键运行量。还有监视窗口能直接观察过程数据里的每个映射变量。调试的时候先打开“轴表”确认伺服使能之后状态字位正确实际位置能跟着控制器指令变化。如果轴表里的数据一直是0先查过程数据映射是不是配错了如果数据有值但电机不动再去查伺服那边0x6040的控制字是不是真的写进去了。5. 通讯调试与常见问题排查实录5.1 从站掉线和通讯失败的排查顺序做总线控制最怕的就是“时好时坏”和“完全不通”。我把常见问题整理成一张速查表建议收藏。现象可能原因排查方法H5U扫描不到EtherCAT从站网线问题、从站未上电、XML版本不匹配换网线、查供电、看从站LED、核对XMLEtherCAT能通讯但CANopen伺服无反应网关的CANopen主站没有正常工作用网关配置软件看CANopen主站状态检查波特率和站号伺服时断时续CANopen终端电阻没接、线缆过长、干扰大确认总线两端120欧姆终端电阻布线远离动力线电机不能使能控制字未按0x06-0x07-0x0F顺序发送检查PLC里的使能程序用CAN分析仪确认伺服接收到的控制字使能一瞬间报警伺服参数与指令不匹配、急停回路断开看伺服面板报警代码查对应说明书实际位置和目标位置对不上电子齿轮比或单位换算错误核对电子齿轮分子分母用实际转动角度反推运动过程中有顿挫感加减速时间过短、伺服刚性参数不匹配适当增大加减速时间检查伺服刚性参数排查总线问题有个通用原则从物理层往协议层一层一层查。先看灯设备有没有通电、link灯亮不亮再看参数波特率、站号、终端电阻对不对最后才看协议报文有没有发出来、数据有没有写进去。5.2 Wireshark抓EtherCAT报文怎么看这个环节比较进阶但值得掌握。EtherCAT报文的以太网类型是0x88A4用Wireshark在PC上接一个交换机或者利用网卡的混杂模式确实能抓到EtherCAT数据帧。但这里有个前提要说清楚EtherCAT协议对实时性要求很高Wireshark这种软件抓包本身会引入延迟所以抓到的报文只能用来“看结构”不能用来评估实时性。如果你需要确认H5U到底发没发给从站数据、PDO数据值对不对用Wireshark抓一下是够用的。抓包的时候要留意EtherCAT头里的ADP和ADO字段那是寻址信息。数据区里的PDO内容默认是按位排列的需要在Wireshark里按照从站XML文件里的PDO映射做人工解码。第一次看不懂很正常抓几次、对着XML里的映射表看慢慢就形成感觉了。比Wireshark更友好的方案是用汇川自带的调试工具或者双通道EtherCAT分析仪类似TwinCAT的Scope。不过那些工具门槛稍高新手上路先用Wireshark看个热闹再决定要不要上专业工具。5.3 视觉定位配合总线伺服时的经验很多项目是视觉引导伺服定位比如机械臂抓取、点胶、贴合。视觉相机比如康耐视Insight把坐标通过TCP或者以太网发给PLCPLC再把坐标换算后下发到伺服轴。这个场景下我吃过一个教训把PLC当成纯转发器视觉坐标来了原封不动丢给伺服结果不同批次产品的位置总是有微小偏差。后来想明白了视觉坐标系、机械坐标系、伺服坐标系三者之间必须做标定变换。视觉给的是像素坐标或者相机坐标PLC里要先经过旋转、平移、缩放换算成机械坐标再转成伺服用户单位这样定位精度才能真正上去。总线伺服的好处在这一刻就体现出来了ERP里要改标定参数直接在线写伺服或者PLC变量就行不用像脉冲方案那样停机改参数。这个优势在日常维护和小批量产线切换里能省非常多时间。5.4 网关桥接方案的实时性边界网关方案绕了一大圈实时性到底够不够坦诚说EtherCAT原生伺服可以轻松做到1ms甚至更快的周期同步但经过网关转CANopen之后最快也只能做到和CANopen总线一个量级。CANopen在500k波特率下报文长度和从站数量决定了总线的负载。挂三五台伺服2ms到5ms的周期通常问题不大但如果轴数多、报文又长CANopen总线的负载会上升容易出现报文延迟甚至丢帧。所以网关桥接方案不太适合高同步多轴联动比如电子凸轮、高速飞剪这种场景。如果现场要的是“多轴同步插补”我劝你别省这点钱直接上EtherCAT伺服。网关方案更适用的是那些“单轴定位、精度要求不高、动作不复杂”的场合。6. 实操心得与扩展建议6.1 我踩过的三个大坑第一个坑是网关买晚了。项目进场才发现现场CANopen伺服和H5U之间没办法直接通讯临时找渠道买网关白白等了两天。这里给个建议只要项目里出现两种不同总线提前把桥接设备准备好别指望现场再解决。第二个坑是CANopen终端电阻。刚接网关那会儿一台伺服的通讯时断时续检查了所有参数都没发现问题最后发现是终端电阻开关没拨对。CANopen总线的物理层规则是两端接120欧姆这是硬规矩不是可选配置。第三个坑是单位换算。第一次用H5U发绝对定位指令位置直接差了131倍。因为伺服内部一位等于一个编码器脉冲而程序里当成毫米发了。后来统一用用户单位加电子齿轮比配置这类问题基本消失了。6.2 从单轴扩展到多轴的平滑路径这套方案如果以后要扩展路径其实很顺。H5U作为EtherCAT主站支持挂多台伺服从站。如果直接把其余伺服也换成EtherCAT版本那整个运动控制系统就全部统一到EtherCAT总线上组态、编程、调试体验完全一致。原来那台CANopen伺服如果还不想扔就继续挂在网关下面当“特殊通道”。这种混搭架构听起来不那么“纯粹”但在实际自动化改造项目里非常实用既有新总线的实时性又照顾了现有资产的复用还能让改造分阶段进行。6.3 再说点大实话我个人做过的项目里真正用网关去桥接CANopen伺服的其实不算多因为但凡预算允许直接上EtherCAT伺服是最省事的。网关方案最大的意义在于那些“不得不兼容”的现场。如果你正在犹豫要不要用网关方案我的建议是先算一笔账比较一下换伺服的成本加上停工损失和买网关的成本加上调试工时。大部分情况下算完账答案就出来了。最后再分享一个小技巧无论用哪种方案第一次上电时千万不要把速度设快。位置指令先给到一小段比如一个毫米速度设成平时的十分之一观察电机方向和反馈确认没问题再恢复正常参数。这个习惯救过我好几次一次半圈调试就能避免撞机事故。