一台设备里有三台伺服要联动,节拍要求又不到毫秒级同步,我第一反应就是别再拉那几十根脉冲线和方向线了。最后用的是信捷XD5E的以太网口加MODBUS-TCP协议,一根网线管到底:PLC当主站,三台伺服当从站,触摸屏挂在同一张以太网里,既能在画面上设定目标位置和速度,也能实时看到每台轴的实际位置和报警状态。这篇文章就把整个实践的思路讲透,重点放在网络搭建、寄存器映射、PLC程序组织和触摸屏画面规划上,最后再完整复盘一次现场排错过程,给准备用XD5E做以太网多轴通信的同行做个参考。
1. 为什么最终选了MODBUS-TCP而不是脉冲或总线
1.1 脉冲方案在3轴以上的痛点
多轴控制最常见的做法就是PLC发高速脉冲,伺服工作在脉冲/方向模式。轴数少的时候这方案确实简单,两根输出线加一根公共端就能驱动一台伺服,但轴数一旦超过两台,麻烦立刻冒出来:Y点资源被占、柜内走线越来越密、长距离传输脉冲容易受干扰导致丢脉冲,位置就悄悄偏了。还有一个更头疼的问题是故障难查,现场断一根脉冲线,设备表现出来的是"位置不对",光靠眼睛根本排查不出来,得拿示波器去量波形。
我在模拟项目X里最初也考虑过脉冲方案。三台伺服,每个轴需要脉冲口和方向口,加上原点、限位这些输入输出,PLC的I/O点很快就紧张了。后来算了一下,光是线缆加接线工时,成本已经和走以太网方案差不多。
1.2 MODBUS-TCP为什么够用
很多人一听"以太网通信"就直接跳到EtherCAT这类实时总线,其实没必要上来就上重武器。MODBUS-TCP有以下几点非常契合中小型多轴点位控制:
- 信捷XD5E本体自带以太网口,不用加通信模块,编程软件里配置主站即可。
- 市面几乎所有伺服驱动器都支持MODBUS协议,做到"协议统一",不挑品牌。
- TCP本身就是以太网标准,交换机、网线、水晶头都是现成件,比专用总线卡便宜得多。
- 通信数据量也丰富得多,读取实时速度、当前位置、电流、报警代码都是顺手的事,这在脉冲方案里根本不敢想。
实测下来,我设计的轮询周期在10ms左右,三台伺服一轮循环不超过40ms。对于定位精度要求在0.1mm以内、节拍在几百毫秒的设备,这个响应完全够用。数据监控和故障诊断带来的效率提升,远超那一点点实时性差距。
1.3 什么样的项目不建议这么做
讲句实话,MODBUS-TCP不是万能的。如果你的设备是三轴以上并且要求插补联动、轨迹规划,或者伺服需要严格同步运行,那这方案确实不适合。这种场合老老实实上EtherCAT或者专用运动总线,不要想着用MODBUS扛。点位控制、速度控制、简单同步,这才是MODBUS-TCP最舒服的区间。选型最重要的就是搞清楚需求边界,不是越先进越好。
2. 网络搭建与伺服参数准备:先把物理链路和地址理干净
2.1 网络拓扑与IP规划
我习惯在动手接线前先把IP规划表画出来,贴在电柜图纸上。这个项目里我用了工业交换机把所有设备汇到一张网里,PLC和伺服之间走MODBUS-TCP,电脑和触摸屏也挂在这张网上,调试时不用反复拔线。
模拟项目X的网络设备及IP分配如下:
| 设备 | IP地址 | 子网掩码 | 用途说明 |
|---|---|---|---|
| 信捷XD5E主站 | 192.168.1.10 | 255.255.255.0 | MODBUS-TCP主站 |
| 1号轴伺服 | 192.168.1.21 | 255.255.255.0 | 从站1 |
| 2号轴伺服 | 192.168.1.22 | 255.255.255.0 | 从站2 |
| 3号轴伺服 | 192.168.1.23 | 255.255.255.0 | 从站3 |
| 触摸屏 | 192.168.1.30 | 255.255.255.0 | HMI监控与操作 |
规划时要留意三点:所有设备必须处于同一网段,IP不能重复,伺服本身的站号和IP要一一对应。我见过太多通信故障,最后发现是两台伺服IP写重了。另外,如果这台设备要接入工厂办公网,一定提前找信息部门确认网段,避免跟整个车间的大网冲突。
2.2 伺服驱动器上必须确认的通信参数
我第一次调伺服通信时也走过弯路,以为只要网线一插就能通,结果卡了半个多小时。伺服驱动器要工作在MODBUS-TCP从站模式,通常需要在面板上或者软件里把以下几项设好:
- IP地址、子网掩码要和规划表一致。
- 使能方式选择通信给定,速度/位置给定源选MODBUS寄存器给定。
- 确认该驱动器支持的MODBUS寄存器版本,不同固件版本地址表可能不一样,这是最容易被忽略的坑。
- 如果是纯TCP通信,不需要设波特率,因为不走串口。有人把串口的4800/9600那套习惯带过来,到处找波特率设置,白白浪费时间。
这些参数设完,最好给每台伺服贴一张标签,把IP地址和站号写清楚,后面排查故障能省一半精力。
2.3 触摸屏接入网络的两种接法
触摸屏接入以太网有两种方式。一种是和PLC本体直连,接线简单,适合小系统;另一种是大家都上交换机,我推荐这种。因为调试期间电脑需要同时在线上传下载PLC程序、在线监控伺服参数,触摸屏也需要和PLC保持实时通信,四五个设备在交换机下共存,才是最舒服的状态。
选交换机的时候不用追求带网管功能,但一定要选每个端口都有LED指示灯的,故障排查时有没有灯真的差很多。普通百兆工业交换机完全够跑MODBUS-TCP,注意别在同一个网络上混入摄像头这类持续占用带宽的设备就行。
3. MODBUS-TCP寄存器映射:多轴指令真正落地的关键一公里
3.1 MODBUS读写首先要搞清楚的三件事
MODBUS-TCP看起来简单,就是把寄存器数据放到TCP包里发出去,但真正用起来有三件事必须提前弄清楚。
第一是寄存器读写的功能码。常用的是03读保持寄存器、06写单个寄存器、16(0x10)写多个寄存器。目标速度、目标位置这类数据,一般一个参数占两个寄存器,所以写的时候经常用16功能码一次写两个寄存器。
第二是MODBUS地址与PLC内部软元件的映射关系。信捷XD系列的D区、M区在MODBUS地址里都有固定的映射段,但每款PLC固件的偏移量可能不同,最稳妥的做法就是用MODBUS调试助手直接对PLC的D0、M0等地址去读一遍,确认实际映射关系再写程序。
第三是数据格式。伺服的位置、速度寄存器通常按整型或长整型存放,有的带正负号,有的是补码。如果没有统一约定,现场调出来的数值就会千奇百怪,甚至出现"位置显示很大负值"的诡异现象。
3.2 一个实际项目的伺服寄存器映射表
下面这张表来自模拟项目X里三台伺服的实际配置,我只列出最核心的运行寄存器分组。具体项目一定要根据所用驱动器手册里的MODBUS地址表核对,不能照搬,但结构可以完全参考:
| 寄存器分组 | 数量 | 读写方向 | 内容说明 |
|---|---|---|---|
| 控制字 | 1字 | PLC写伺服 | Bit0使能、Bit1方向、Bit2启动 |
| 状态字 | 1字 | 伺服读给PLC | Bit0使能完成、Bit1报警、Bit2原点完成 |
| 目标速度 | 2字 | PLC写伺服 | 32位数据,速度给定 |
| 目标位置 | 2字 | PLC写伺服 | 32位数据,位置给定 |
| 实际位置 | 2字 | 伺服读给PLC | 32位数据,实时位置反馈 |
| 报警代码 | 1字 | 伺服读给PLC | 故障时显示的具体报警编号 |
把寄存器表整理成上面这种结构,再去写PLC程序时思路会非常清楚。我强烈建议开发阶段先用MODBUS调试助手,直接连接伺服把每个寄存器读一遍、写一遍,做到心里有数。如果这一步跳过,后面程序写完了再来排查数据对不上,会非常痛苦。
3.3 32位数据高低字拆分:最常见的数据坑
伺服的位置、速度寄存器是32位,而MODBUS的一个寄存器只有16位,所以一个参数要拆成两个寄存器。怎么拆、先发哪个字、字节序怎么排,这个坑十个人有九个踩。
我的习惯是先在PLC里定义一对辅助寄存器,比如高位字D和低位字D,然后按"低位寄存器存低16位、高位寄存器存高16位"的约定拼接。但不同厂家的驱动器可能恰恰相反,所以必须先在调试助手里手动写一次验证数据,确认端序后再固定到程序里。整个项目里所有轴、所有程序段统一用同一套约定,不能有的地方拆字、有的地方不拆,否则后面维护的人会晕。
触摸屏上显示32位数据时也要跟PLC保持一致,在画面组态里选择"双字组合"功能并选对字节顺序。实际位置这个值显示不对,八成不是程序算错,而是端序没对齐。
4. PLC程序怎么组织:轮询、使能、写入顺序与故障兜底
4.1 轴功能块与接口变量设计
多轴程序最忌讳的做法,是每个轴单独写一整套梯形图,复制粘贴三遍,后面改逻辑时改一处漏两处。我习惯把每台轴抽象成一个"功能块",输入输出变量统一命名,三台轴只是同一个块的不同实例。
以模拟项目X的1号轴为例,接口变量大概是这样的:
| 变量方向 | 名称 | 数据类型 | 关联说明 |
|---|---|---|---|
| 输入 | 轴1目标速度 | 32位 | 触摸屏设定,单位0.1rpm |
| 输入 | 轴1目标位置 | 32位 | 触摸屏设定,单位脉冲 |
| 输入 | 轴1启动 | 位 | 触摸屏按钮 |
| 输入 | 轴1急停 | 位 | 公共急停信号 |
| 输出 | 轴1实际位置 | 32位 | 显示到触摸屏 |
| 输出 | 轴1状态字 | 16位 | 显示到触摸屏 |
| 输出 | 轴1报警 | 位 | 触发触摸屏报警画面 |
设计好接口变量,梯形图就变成了搬运和判断逻辑,读哪个、写哪个、什么时候写,一目了然。加第四台轴的时候,复制一个块、改一下IP和寄存器地址,半小时就能搞定。
4.2 分时轮询:多轴通信不乱码的关键
MODBUS-TCP虽然快,但主站同时向多个从站发请求,从站的响应也是串行回来的。如果程序里多个通信指令同时触发,轻则通信拥塞,重则数据错乱。我采用分时轮询策略,每10ms只处理一个轴的读操作,三台轴轮流来,大约30-40ms完成一整轮状态刷新。
这样的好处有两个:一是通信占用时间非常均匀,不会出现某个扫描周期突然被通信指令拖住;二是就算某台轴掉线,也只是它自己那个时隙超时,不会阻塞其他轴的读写。轮询周期我宁可设得宽一点,也不追求极限速度。多轴系统的稳定性和可维护性,远比那几毫秒的性能重要。
4.3 伺服使能状态机与写入顺序
伺服使能不是简单置位一个控制字就行。如果上电瞬间直接写"使能+启动",驱动器可能根本没准备好通信,指令就被丢弃了。正确做法是严格按照状态机分步执行:
- 上电后先写控制字=使能位,等待驱动器返回状态字的"使能完成"位。
- 确认使能完成后再写目标速度、目标位置。
- 最后写入"启动"位,指令才会被驱动器正确执行。
如果省掉等待状态字的步骤,你在触摸屏上看到的是"指令发了但轴不动",其实是驱动器压根没接收。梯形图上我通常用几个中间继电器组成状态推进,每个动作完成后置位下一步的启动条件,防止一上来就一股脑把控制字全写完。
4.4 掉线检测与急停兜底
通信控制的设备,最怕的就是运行中通信中断,伺服还在带着负载跑。我在程序里给每台轴加了一个掉线计时器:如果连续超过150ms没有收到状态字回包,就判定该轴通信故障,立即置报警位并切断运行允许。急停回路除了接到PLC输入端,伺服本身的急停输入端子也要接上,双重保护,这个不能省。
通信指令本身一定要设超时时间,避免某一轴掉线后程序一直卡在等待响应的死循环里。我一般把超时设成30ms,连续3次超时再触发掉线标志,这样短暂干扰不会误报警。
4.5 一个可参考的梯形图逻辑片段
用梯形图写时,思路是"条件到位,再发命令",不要写完控制字马上写目标值。下面这段是ST风格的思路示意,信捷XD5E用梯形图实现时也是同样的逻辑顺序:
IF (轴1启动按钮 AND NOT 轴1报警 AND 轴1使能完成) THEN 发送目标速度到伺服; 发送目标位置到伺服; 发送启动命令到伺服; END_IF关键点是"轴1使能完成"这个条件必须存在。我在实际调试时见过很多次,程序里把启动指令写在最上面、伺服使能还没确认,最后怎么按启动键都没反应,就是这个顺序问题。
5. 触摸屏画面:操作、监控、报警的三层设计
5.1 两层数据链路:触摸屏不直接访问伺服
很多新手会把触摸屏变量直接绑定到伺服寄存器,想省掉PLC这一步。我不建议这么干,因为会带来三个问题:一是触摸屏和PLC同时去读写伺服,通信冲突的概率增大;二是触摸屏直接访问伺服时没有逻辑判断,误操作风险高;三是掉线时不好判断是屏的问题还是伺服的问题。
我设计的方案是两层数据链路:触摸屏只跟PLC打交道,PLC把所有伺服数据统一收上来再转发出去。触摸屏看到的寄存器和PLC内部D区对应,而对伺服的控制完全由PLC程序决定。这样既安全,又方便统一做故障处理。
5.2 手动画面与自动画面的功能分区
触摸屏程序我习惯分三个主画面:手动画面、自动画面、报警画面,互相之间通过按钮切换。
手动画面上,每台轴单独一组控件:启动、停止、点动正转、点动反转、目标速度设定、当前位置显示。点动用的是触摸屏的"按下置位、释放复位"功能,按下时给PLC一个M点信号,PLC在该信号有效期间持续向伺服发送点动指令,松开就停,这样手动操作既直观又安全。
自动画面上放一键启动、一键急停、整体运行状态灯,还有三台轴的目标位置、实际位置、报警状态。数据刷新就靠PLC周期写D区,触摸屏上显示双字组合数据,字节序和PLC里保持一致,这个前面已经强调过,这里不再重复。
5.3 报警与状态显示的实用小技巧
报警处理我习惯做成"当报警位触发时直接弹出报警画面",做到有故障第一时间让操作员看到,而不是等他们自己切到报警页去查。PLC侧把每台轴的状态字、报警代码、通信状态汇总成一组寄存器,触摸屏只需要做显示,判断逻辑都在PLC里。
还有一个很实用的小细节:在触摸屏上做一个"当前轴实时位置大字体显示"的窗口,调试人员在柜门前就能直接观察到位置变化,不用一直盯着电脑监控软件。尤其联动调试的时候,这个界面效率非常高。触摸屏程序的维护也非常重要,变量名要和PLC侧的D区规划表对应,我每次做完工程都会导出一份变量对照表存档,方便后续换人接手。
6. 现场调试的一次完整排错:从灰色状态到恢复运行
6.1 故障现象与现场环境
模拟项目X通电调试那天,触摸屏上显示三台轴的状态,2号轴和3号轴都是绿色运行正常,只有1号轴一直是灰色,报警画面也没弹出任何内容。第一反应是通信没通,但2号、3号都正常,说明PLC到交换机的整体链路是通的,问题大概率出在1号轴自身或者PLC对1号轴的通信配置上。
6.2 排查链路:从物理层一路查到通道配置
我没有直接改程序,而是按从底向上的思路一点点排除:
- 先看交换机上1号轴对应的端口指示灯,网线插紧,指示灯正常闪烁,物理层没问题。
- 用电脑直接Ping 1号轴的IP地址,结果不通。这说明问题在1号轴本身,和PLC程序无关。
- 到驱动器面板上看IP配置,发现1号轴的IP地址和2号轴重复了,都是192.168.1.22。两台伺服同一IP,网络协议栈直接冲突,通信自然不稳定。
- 把1号轴IP改成规划表里的192.168.1.21,重新Ping,通了。
- 但触摸屏上1号轴仍然是灰色。再用MODBUS调试助手直接连1号轴,读它的状态字等寄存器,发现寄存器数据正常,说明驱动器的MODBUS从站功能没问题。
- 回到PLC侧检查主站通道配置,发现PLC里1号轴对应的从站号填的也是2号轴的站号,等于PLC一直在跟2号轴通信,读1号轴完全是空的。
把PLC通道表里1号轴的从站号改成实际值后,触摸屏立刻变绿,整个排查过程前后不到二十分钟。
6.3 多轴以太网调试的常见问题汇总
把这次的排错经历和之前项目里的其他坑整理成一张表,遇到类似问题可以直接对照:
| 故障现象 | 常见原因 | 检查方向 |
|---|---|---|
| 某轴长时间灰色/无数据 | IP重复、从站号错误、网线松动 | 先Ping,再查PLC通道配置 |
| 通信偶尔断,运动中途停 | 网线屏蔽差、交换机端口老化、轮询周期过短 | 换线、换端口、调大轮询周期 |
| 位置数值异常大或者负值 | 32位高低字顺序反了 | 用调试助手写已知值验证 |
| 轴使能不成功 | 控制字写完没等使能完成 | 检查状态机步骤 |
| 某一轴掉线导致整个系统卡住 | 通信指令没有超时时间 | 给每条指令加上超时处理 |
| 触摸屏数据刷新慢 | 轮询周期太长或者读的数据量太大 | 减少每次读寄存器数量,调整周期 |
6.4 经验总结:先验证再编程,永远不亏
这次排错最深的体会是:排查通信故障一定要有层次感,不要一上来就翻程序。物理层、IP层、从站参数、PLC配置,一层一层排除,大多数人觉得难的问题都没到程序那一步就解决了。
调试初期一定要耐住性子,先用MODBUS调试助手把要用的伺服寄存器全部验证一遍,确认功能码、字节序、数据范围都没有问题,再动手写PLC程序。这个前置工作多花一天,后面可以少花一周。真正把IP规划、寄存器映射和通信轮询这三个基本功做扎实,多轴以太网控制跟单轴的控制复杂度本质上差别不大,三台轴和六台轴的区别,也就是多复制几个功能块而已。
最后再分享一个实用小习惯:做完每台设备后,把IP规划表、寄存器映射表、触摸屏变量对照表整理成一份配置文档,放到电柜里。调试时顺手,维护时不求人,换人接手也少走弯路。