PLC通过CANopen控制步进电机:H5U实战配置与调试全记录
2026/9/17 3:20:40 网站建设 项目流程

去年接手一台三轴平台机的改造,机器本身不算复杂,但柜子里光输入输出端子就占了很大一片,加上三轴步进电机的脉冲、方向、使能、报警线,线走坦克链里弯来弯去,现场维护的师傅一打开电柜就头疼。客户反馈两个老问题,一是偶尔丢步,二是设备停一段时间再启动,轴要重新校原点,排查起来特别费劲。改造前我把方案过了一遍,最后定了汇川H5U做主站,三台带CANopen接口的步进驱动器走总线控制,把原来一堆脉冲方向线换成一对双绞线,从重新布线到调完差不多三天。这篇文章不是教材,就是这次实战的记录,重点说清楚主站侧怎么配、从站侧怎么设、PDO映射怎么填、建链时序怎么排,以及一些我踩过之后才明白的坑。

1. 为什么是“PLC+CANopen+步进伺服”这个组合

1.1 从脉冲控制到总线控制的现实理由

脉冲控制听起来简单,PLC输出端口发脉冲,驱动器收脉冲,但对多轴设备来说,问题一个接一个。先数一下线缆:每台步进驱动器至少需要脉冲、方向两根高速线,加上使能、报警、抱闸这些杂七杂八的信号,三轴就是十五六根线。线多了之后,布线距离一长,脉冲信号特别容易受干扰,稍微有点电磁环境差,或者屏蔽层接地没做好,就会丢步。再者,脉冲控制时PLC很难实时知道驱动器当前的实际位置、电流、报警代码,只能说“我发出去了多少脉冲”,至于电机实际转没转到位,得靠外部传感器或者驱动器额外反馈IO来判断。

换成CANopen总线之后,硬件上从站之间就用CAN_H、CAN_L两根线手拉手串起来,再带一根参考地,三轴总共用一对双绞线就解决。数据上,PLC不仅能向驱动器下发目标位置和速度,还能通过PDO周期读取驱动器的实际位置、状态字、报警码,设备运行状态一目了然。这是我从脉冲方案切到总线方案最直接的感受——线少了一半以上,信息量翻了不止一倍。

1.2 H5U做主站,CANopen方案的硬件视野

汇川H5U是一款中型PLC,本体的运算能力和轴控指令比较强,但它本身并没有直接引出CANopen接口,需要左侧扩展一块CANopen通信模块来实现主站功能。配置的时候,把这块扩展模块插到H5U左侧,后面接出来的就是CAN_H、CAN_L两个接线端子。

整套系统的拓扑就是一个典型的CAN总线菊花链:H5U主站模块作为链的起点,第一个驱动器靠近主站,从第一个驱动器的CANout接到第二个驱动器的CANin,再从第二个接到第三个,最后在物理最远端的那个驱动器上把终端电阻拨码拨到ON。需要注意,主站模块本身也有终端电阻开关,如果主站和从站距离很近,可以让主站侧也接入终端电阻,但总线最远端那个必须保证有终端电阻。

1.3 这套组合适合解决什么问题

从我实际接触的设备来看,CANopen步进这套方案最适合以下几个场景:轴数在2到8轴之间的小型自动化设备,比如点胶机、锁螺丝机、小型装配线;设备需要经常换型,轴参数需要动态调整;现场电磁环境不太好,脉冲线容易受干扰;或者客户对设备状态监控有要求,需要看到每个轴的当前位置和报警信息。轴数再多、性能要求更高,就得上EtherCAT了,那是另一套玩法。

如果你手里正好是H5U这种中型PLC,对实时性要求没有到微秒级,但要解决线缆多、干扰大、状态不透明的问题,CANopen步进是一个性价比很高的选择。至于要不要选带闭环的步进,那要看负载和精度要求,后面我会单独说。

2. 动手接线前要搞清的CANopen原理

2.1 协议层级结构

CANopen是建立在CAN总线之上的应用层协议。很多人一上来就打开软件配站点,配不通就不知道从哪里查起,问题就出在没搞清这个层级关系。

最底层是物理层,也就是CAN_H、CAN_L一对差分线,还有终端电阻匹配。CAN总线的通信速率由所有节点通过硬件或者软件统一设定,主站、所有从站必须一致,否则谁也听不见谁说话。

第二层是数据链路层,负责CAN帧的收发、仲裁、错误检测。这一层由CAN控制器芯片自动处理,工程师一般不需要干预,但要知道每个CAN帧都有ID,ID越小优先级越高。

第三层才是CANopen的应用层,它规定了报文怎么组织、设备之间怎么通信、设备内部的数据怎么索引。所以排查问题的顺序就出来了:物理层不通,后面全是白搭;波特率不对,控制器会不停报错;应用层配置不对,才会出现“总线有报文但功能不对”这种怪问题。

2.2 对象字典

CANopen设备内部的数据基本都放在对象字典里,你可以把它想象成一个仓库所有的数据都编了号,主站或者其他节点就靠这些编号来读写里面的内容。对象字典的区域划分是有规矩的:

对象范围用途
0x1000 - 0x1FFF通信对象,比如设备类型、节点ID、PDO参数、心跳时间
0x2000 - 0x5FFF制造商特定对象,每个厂家自己定义
0x6000 - 0x9FFF设备行规对象,步进和伺服常用的是CIA402行规,包括控制字、状态字、目标位置、实际位置等

这里我要特别强调0x6000区段的CIA402行规。步进驱动器和伺服驱动器绝大多数都兼容这个行规,也就是说,不管你是哪个牌子的驱动器,只要支持CANopen,控制字大概率都是0x6040,状态字大概率都是0x6041,目标位置大概率都是0x607A。标准化的好处就是这一次调通,下次换牌子也能很快上手。

2.3 NMT状态机与主从建链

CANopen网络中,主站和从站不是对等关系,从站受主站管理。这个“管理”靠的是NMT状态机。从站上电后要经过初始化,然后进入预运行状态,如果主站没有给它发启动命令,它不会主动参与周期通信,更不会执行运动指令。

NMT命令是主站通过CAN-ID 0x000发出去的,数据字节表示命令类型:

NMT命令含义
0x01启动节点,让从站进入运行状态
0x02停止节点,让从站进入停止状态
0x80进入预运行状态
0x81复位节点
0x82复位通信

这个状态机我吃过亏。最开始我把程序下载进去,以为IO映射区里有了数据就能发控制字,结果发现方向指令就像“对着没开机的设备喊话”,一点反应没有。原因就是从站还停在预运行状态,主站没有发启动NMT命令。后面我改成程序一启动先延时几百毫秒,等从站完成初始化,再发NMT启动命令,等从站进入运行状态后再去操作轴,问题马上消失。

2.4 PDO和SDO

对象字典里的数据,有两种读取和写入方式。SDO是“点对点问答式”,适合读参数、写参数、改配置,速度慢但可靠。PDO是“广播式周期传输”,适合实时性要求高的数据,比如控制字、目标位置、实际位置这些周期刷新的变量。

在运动控制场景里,我基本不会在运动中用SDO去刷目标位置,那样延迟太大。正确做法是把控制字、目标位置、轮廓速度这些映射到RPDO,PLC这边周期往输出映射区写;把状态字、实际位置映射到TPDO,PLC周期从输入映射区读。这个思想贯穿整个调试过程,后面配置PDO映射时也遵循这个原则。

3. H5U主站侧的工程配置

3.1 接线与终端电阻

接线看起来简单,但这块恰恰是现场问题的高发区。CANopen用一对双绞线,我强烈建议用带屏蔽层的双绞线,截面积不小于0.5平方毫米,屏蔽层单端接地,最好是接到电柜的接地铜排上。CAN_H接CAN_H,CAN_L接CAN_L,绝对不要接反,接反了节点之间完全不通。

终端电阻是另一个高频坑点。不管网上怎么说,现场经验就是总线物理最远端的两个节点各接一个120欧终端电阻。主站模块如果就在链的一端,把主站的终端电阻拨码拨到ON;从站驱动器上通常有终端电阻拨码,最后一个驱动器拨到ON,中间节点全部保持OFF。很多人容易把所有驱动器的终端电阻都拨到ON,那样总线负载太重,信号会变形,反而出现偶发通讯故障。

3.2 InoProShop工程配置步骤

打开InoProShop,新建工程,选择你手里那台H5U的具体型号。在工程树里找到扩展模块相关的配置项,把CANopen主站模块添加进去。

添加完模块后,右侧会出现总线配置界面。第一步设置主站通信参数,波特率选1Mbps,与从站保持一致;节点ID不用设置,因为主站在CANopen网络中节点ID一般是0或者特殊保留,这一项看软件里怎么处理,跟着做就行。第二步在总线下面添加从站设备,点击扫描或者手动添加,手动添加时输入从站的节点ID。

我习惯在添加完每个从站后,立刻给它改一个容易识别的名字,比如Axis1、Axis2、Axis3,这样后面配置IO映射和写程序时不会搞混。这一步看起来不起眼,但轴多了之后能省大量时间。

3.3 主站参数与从站节点表

主站启动方式一般分两种,手动和自动。很多资料建议直接勾选自动启动,但我实际用下来,在第一次调试阶段最好不要勾。原因在于自动启动时,PLC一运行就会初始化网络,如果从站还没准备好,或者某个从站没上电,主站可能直接报网络错误,后面想单独调试某一根轴都困难。

我的做法是先把自动启动关掉,程序上电后先延时,再手动触发NMT启动命令,确认总线上的从站都上线了,再往下走。等整个系统稳定无误后再考虑打开自动启动,让PLC上电后自动进入运行状态。

另外,H5U的CANopen配置里一般会给每个从站分配输入输出映射区,这个区域就是PDO数据对应的PLC内部地址。比如Axis1的TPDO数据映射到输入区的某个地址,RPDO数据映射到输出区的某个地址。记录好这些地址,后面写运动逻辑时直接操作它们就行。

4. 步进伺服从站的CANopen配置与PDO映射

4.1 驱动器侧先设好节点ID和波特率

主站配好之后,开工的第一件事就是把每台驱动器的节点ID设成唯一值。我用三台驱动器,节点ID分别设为1、2、3,并在电柜里贴上标签。这一步千万别省,后面程序里全部按节点ID来识别轴,一旦设重了,主站根本分不清谁是谁,通讯时好时坏,排查非常痛苦。

波特率要和主站一致。驱动器侧一般通过面板参数或者拨码设置,常见的选项有1M、500K、250K。现场总线长度短于40米我直接用1M,长度再长就降到500K。注意,改完节点ID和波特率之后,驱动器必须重新上电才能生效,这个细节很容易被忽略。

4.2 从站关键对象字典

在跑运动之前,至少要认识下面这几个CIA402对象:

索引名称数据类型作用
0x6040控制字uint16控制驱动器使能、运行、复位
0x6041状态字uint16显示驱动器当前状态
0x6060模式选择int81位置模式,3速度模式,6回零模式
0x6064实际位置int32编码器反馈位置,周期读取
0x607A目标位置int32位置模式下写入目标位置
0x6081轮廓速度uint32定位运行速度
0x6083 / 0x6084轮廓加速度/减速度uint32梯形加减速
0x6098回零方式int8选择回零方式
0x6099回零速度uint32数组子索引1找开关速度,子索引2找零点速度

这里有个值得注意的地方。不同驱动器厂家在0x2000到0x5FFF这段制造商区域里放了很多自己的参数,比如细分、电流、电子齿轮比,这些参数建议在驱动器面板或者厂家的调试软件里先设好,没有必要在PLC侧通过SDO去改,免得把地址张冠李戴。

4.3 PDO映射如何配

PDO映射是整个CANopen运动控制里最关键的一步。我先说思路:PLC要周期发给驱动器的数据,塞进RPDO;驱动器周期反馈给PLC的数据,塞进TPDO。

我惯用的映射方案是这样:

RPDO1映射内容:

  • 0x6040 控制字,uint16,占2字节
  • 0x607A 目标位置,int32,占4字节
  • 0x6081 轮廓速度,uint32,占4字节

TPDO1映射内容:

  • 0x6041 状态字,uint16,占2字节
  • 0x6064 实际位置,int32,占4字节

这样RPDO一共10字节,TPDO一共6字节,都是固定映射,数据长度不超8字节的乘数,配置起来很干净。在InoProShop的从站配置界面里,把RPDO1和TPDO1的子索引列表逐条填上,然后编译下载到PLC。

填映射时有几个注意点:映射项的总长度不能超过PDO允许的最大长度,8字节的PDO你塞了10字节肯定报错;在一个PDO里,数据类型最好按字节对齐,顺序乱了容易读错;每次修改映射,从站必须重新上电,否则新映射不生效。

5. 启动建链硬时序与使能流程

5.1 上电后的标准建链顺序

我第一次调试时以为只要配置正确,上电就能用,结果被现实教育了。CANopen从站上电后要经历初始化,然后自动进入预运行状态。预运行状态下,从站只会响应SDO和NMT,不会收发PDO数据。主站必须先把从站切换到运行状态,PDO数据才会开始流动。

正确顺序是:

  1. 系统上电,等至少500毫秒,让所有从站完成初始化。
  2. 主站发送NMT启动节点命令(0x01),从站进入运行状态。
  3. 主站选择运行模式,写入0x6060,位置模式写1。
  4. 写控制字,让驱动器先经过0x06、0x07,到达0x0F使能状态。
  5. 使能成功后再写入目标位置和速度,触发运动。

这个时序我在程序里用状态机来实现,比用一连串延时可靠得多。我写过一个小型的启停状态机,上电→延时→NMT启动→模式选择→使能→待机,每一步判断上一步的结果再往下走,一旦哪一步失败就报警。

5.2 控制字与状态字的使能流程

CIA402状态机对于第一次接触的人来说有点绕,但它是有规律的。控制字0x6040的bit0是“允许上电”,bit1是“允许使能”,bit2是“快速停止”,bit3是“允许运行”。要让电机真正使能,要按顺序给0x06、0x07、0x0F这三个值:

步骤控制字值状态字预期
10x060x21_,Switch on disabled
20x070x23_,Ready to switch on
30x0F0x27_,Operation enabled

每一步之后最好轮询一次状态字0x6041,确认状态到位再发下一步。有的驱动器卡得没那么严,给0x0F就直接使能了,但严谨一点没有坏处。设备做多了之后我发现,很多偶发的“电机不动作”就是使能时序不对,看起来给了0x0F,实际上驱动器还在中间状态没走完。

故障复位也有固定套路。当状态字里出现Fault位时,需要把控制字从0x00切到0x80,再切回0x00,然后重新走一遍0x06-0x07-0x0F。这个操作在调试阶段很常用,我习惯在触摸屏上放一个“复位”按钮,触发后先发0x80,延时100毫秒再走正常使能流程。

5.3 关于“自动启动”的取舍

前面提到H5U主站有自动启动选项,我再展开说一下。自动启动的逻辑是PLC运行后自动执行网络启动,好处是省程序,坏处是没防护。现场如果有一台从站因为急停被切电而没上线,自动启动会一直报错,程序无法往下走,整个设备直接趴窝。

我经过几次折腾之后,最终选择了“半自动”方案:主站的自动启动关闭,PLC程序里写一段启动逻辑,先尝试NMT启动所有从站,然后用SDO去读每个从站的状态字,读完确认全部在线后,再放开后续操作权限给触摸屏。这样即使某台轴没上电,其他轴也能单独调试,设备不至于全锁死。

6. 点位运动、回原点与调试路径

6.1 一次完整的点位定位

使能之后,做个最简单的定位任务。先确保模式是位置模式,0x6060写1。然后按下列顺序写:

  1. 写目标位置0x607A,比如50000,这里单位是用户单位,取决于驱动器内部的电子齿轮和细分配置。
  2. 写轮廓速度0x6081,比如每分钟多少用户单位,或者每秒多少用户单位,看厂家定义。
  3. 写轮廓加速度0x6083和减速度0x6084。
  4. 控制字0x6040先给0x0F,然后给0x1F启动运动。

这里有个细节:0x6040的bit4是“新目标位置锁存”的触发位。很多驱动器要求你先给0x0F,再在写入目标位置后把控制字改成0x1F,这样驱动器才会把新的目标位置当成一次新运动去执行。如果你一直给0x0F,目标位置改了也可能不触发运动。

定位过程中,我习惯在PLC程序里周期读取TPDO反馈的状态字和实际位置,把状态字里“目标到达”这一位用来判断运动是否完成。不同驱动器对“目标到达”位的定义略有差别,但CIA402里一般有对应位,以手册为准。

6.2 回原点怎么触发

回零方式0x6098我常用的是17、18和35。17表示靠正限位或原点开关找零点,18表示反方向找,35最简单,把当前位置设为零点。在带限位开关的设备上,我用方式17配合回零速度0x6099的子索引1和2。

回零时先切模式0x6060为6,再写回零方式0x6098,接着写回零速度0x6099,最后控制字从0x0F切到0x1F触发回零。整个过程里电机先找开关,再离开开关找零点脉冲,最终停在真实零点上。

触发回零之后别急着往下走,一定要轮询状态字里的“回零完成”位。我遇到过一种情况,回零方式没配对,驱动器在限位上来回撞,触摸屏上看起来电机一直在转,实际上是回零没成功,在程序里加了状态判断之后,这种问题第一时间就能发现。

6.3 推荐的最小验证路径

给第一次做CANopen步进调试验证的朋友一条最小路径,这套流程我自己每次都用:

  1. 先不接电机负载,只给驱动器通电,用厂家调试软件单机验证驱动器本身能转。
  2. 接上CAN总线,用主站在预运行状态下SDO写0x6060、0x6040,先把使能打通。
  3. 使能OK后再配PDO映射,用PLC程序操作映射区做一次点动。
  4. 点动OK后做一次绝对定位,确认目标位置和速度单位换算。
  5. 最后做回零,确认限位和零点逻辑。

这条路径每一步都能快速定位问题出在机械、驱动器还是通信,避免一上来就把所有环节揉在一起,出了问题无从下手。

7. 实测中踩过的坑与排查链路

7.1 通讯不上的排查链路

通讯不上是最常见的问题,我按照从物理层到应用层的顺序排查,基本没有盲区:

现象排查动作
主站报节点缺失先查CAN_H、CAN_L是否接反,再说波特率
偶发通讯中断量终端电阻,总线两端是否都有120欧
某个节点时而在线时而不在重点查该节点的地址拨码和接线端子是否松动
所有节点都不在线先查主站模块是否被系统识别,再查CAN线连接

有一次设备发到客户现场,通讯时好时坏,我从软件配置排查到驱动器参数,折腾了大半天,最后发现是电柜里的CAN线有一段和动力线扎在同一个线槽里,而且没屏蔽层。把CAN线单独走线、换成屏蔽双绞线之后问题彻底消失。这件事给我一个教训:总线方案再先进,物理层布线不规范,后面全是隐患。

7.2 状态字卡在FAULT的处理

调试时驱动器报FAULT是最频繁遇到的问题。常见原因有这么几类:电机线U/V/W相序接错,编码器线接触不良,驱动器内部报过流或过压,还有使能时控制字时序不对。

处理步骤我一般这样走:先读0x603F错误代码,或者看驱动器面板报警代码,确认故障类型;再根据故障类型处理机械和电气问题;最后用控制字0x80做故障复位,重新走使能流程。注意,故障复位之后必须等到状态字里的Fault位清零,才能继续往下发指令,否则你给了0x0F它也不会执行。

我遇到一次很隐蔽的问题,驱动器每次使能后一运动就报过流,查电机线没接错,查电流参数也没问题,最后发现是电机抱闸没打开,机械上把电机憋住了。所以排查FAULT时,别只盯着电气参数,先确认机械能不能动。

7.3 偶发断连与干扰处理

偶发断连比完全不通更让人头大。它的本质多半是物理层信号质量差,或者某个节点在总线上的状态不稳定。处理手段无非这么几板斧:线缆用屏蔽双绞线,屏蔽层单端接地;CAN线和动力线分槽走线,离变频器、开关电源远一点;总线两端终端电阻确认到位;把波特率从1M降到500K试试,往往能立竿见影。

还有一个容易被忽略的点,就是CANopen的节点电源。如果每个驱动器的控制电源来自不同的开关电源,而开关电源之间没有共地,CAN通讯很容易出现数据错乱。现场处理时我会把CANopen相关节点的参考地统一接在一起,这个问题能少一大半。

做这类项目多了之后,我的体会是,CANopen本身并不复杂,复杂的是工程现场的各种组合问题。接线规范、时序严谨、调试有步骤,大部分坑都能避开。上面这套流程我后来复制到了好几个项目上,几乎都是按同样的路子一遍过,希望对你也有参考价值。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询