去年给一个食品包装厂做设备改造,甲方要求把老产线的三菱FX3U和新采购的西门子S7-1200连起来。听起来很简单对吧?Modbus RTU嘛,串口通讯,标准协议。结果我连着搞了两天,差点把头发薅光了。今天就把我踩过的坑一个一个说清楚,免得兄弟们走弯路。
项目背景
甲方是一家佛山禅城的食品包装厂,原来产线用的是三菱FX3U-64MR控制输送带和封口机。去年新上了一台自动称重和贴标设备,用的是西门子S7-1200(1214C)。两台设备之间有数据交换需求:
- 三菱这边要把产品计数(D100)发给西门子
- 西门子那边要把称重结果(比如重量超标的标记)回传给三菱
- 两边还要做一个联锁:三菱产线停了,西门子那边也要跟着停
甲方采购说:”都是PLC,用根线一连不就行了?”我听完笑了笑,心里想——兄弟你太天真了。
第一个坑:硬件接线就出幺蛾子
三菱FX3U本体带一个编程口(RS422),要做Modbus RTU通讯必须加一个FX3U-485ADP-MB通讯扩展板。而西门子S7-1200本体集成了一个RS485接口(在板子上标的是X20,3/8针脚),但要打开它的Modbus RTU功能,还得在程序里调MB_COMM_LOAD指令。
接线是这样的:
三菱FX3U-485ADP-MB(端子排) → 西门子S7-1200 RS485(RJ45口)
SDB(B线/正极) → 针脚3(B线/正极)
SDA(A线/负极) → 针脚8(A线/负极)
SG(信号地) → 针脚5(GND接地)
看起来没啥问题对吧?但第一次上电后,两边死活通不上。排查了一个小时才发现:三菱的485ADP-MB模块侧面的终端电阻拨码开关没拨上去。 两个设备距离只有3米,但485通讯必须两端加终端电阻,不然信号反射会搞死你。拨上去,立竿见影。
教训: 不管距离多远,做485通讯先把终端电阻拨上。这个细节我每次都会忘,每次都要被坑一次。
第二个坑:通讯参数不一致
接好线之后,两边参数我设的是:9600波特率、8数据位、1停止位、无校验。西门子那边用MB_COMM_LOAD设置,三菱这边用特殊寄存器D8120设置。
三菱D8120的设置值怎么算呢?根据FX3U的手册,格式是:
b15-b9:通讯方式设置
b8:起始位
b7-b5:数据长度、校验方式
b4-b0:波特率
96, N, 8, 1 → 无校验8位数据 → 查表D8120 = H0081
也就是K129
我设了D8120 = K129,西门子那边设了9600-8-N-1。看着挺整齐,对吧?但还是通不上。
最后翻手册对比发现:三菱Modbus RTU的默认数据格式是8位数据+偶校验+1停止位,不是无校验。 而西门子的MB_COMM_LOAD默认是无校验。虽然我两边都设了无校验,但三菱那边还有个隐藏设置——D8400(ModRTU专用特殊寄存器),里面的CRC校验优先级设置跟D8120有冲突。把这个也整对了才搞定。
| 参数 | 三菱FX3U | 西门子S7-1200 |
|---|---|---|
| 波特率 | 9600 | 9600 |
| 数据位 | 8 | 8 |
| 校验 | 无校验(D8120=H0081) | 无校验 |
| 停止位 | 1 | 1 |
| 协议 | Modbus RTU 从站 | Modbus RTU 主站 |
| 站号 | 1 | (主站不需要) |
第三个坑:地址映射不一样
好不容易能通讯上了,读数据又出问题了。西门子的MB_MASTER指令读回来的数据全是0,但三菱那边D100明明有数值。
这事闹了半天才发现:三菱Modbus从站的地址映射和西门子的理解不一样。
三菱FX3U的Modbus从站功能里,D寄存器的映射地址是这样的:
- D100作为Modbus保持寄存器,对应的地址是40101(40001起始+100偏移)
- 但西门子MB_MASTER的DATA_PTR参数里,你要填的是PLC内部的地址,不是Modbus地址
正确做法:西门子MB_MASTER读三菱D100,要把DATA_ADDR设为40101(不是100),MB_MODE设为0(读),DATA_LEN设为1个字。这个数字100要小心——三菱手册里写的是”保持寄存器40001开始,D100对应地址100″,但实际Modbus协议里的地址是40001+100=40101。我试了三遍才试对。
教训: 不同品牌的Modbus实现,地址偏移的标注方式不一样。记住一句话——用之前先看手册的地址映射表,别靠猜。

最终搞定的方案
硬件配置:
- 三菱FX3U-64MR + FX3U-485ADP-MB(Modbus从站,站号1)
- 西门子S7-1200 1214C + CM1241 RS485模块
- 通讯线:两芯屏蔽双绞线,两端各一个120欧姆终端电阻
- 线长不超过50米(实际只有5米,绰绰有余)
软件配置:
- 三菱:D8120=H0081(9600,无校验,8位,1停止),打开从站功能M8411
- 西门子:MB_COMM_LOAD初始化,MB_MASTER读40101(三菱D100)写40001(三菱D200)
- 联锁:西门子每200ms轮询一次三菱的M100(产线运行信号),如果M100=OFF则西门子产线停机
给兄弟们总结一下
跨品牌PLC通讯最坑的地方,不是技术本身有多难,而是每个厂家对同一标准的理解都不一样。
三个要点记住了,下次做跨品牌通讯能省一半时间:
- 先通物理层: 485通讯第一件事,把终端电阻拨上。接线确认没问题再通电。
- 再对参数: 波特率、校验、数据位、停止位,两边严格一致。特别是校验方式,三菱默认偶校验,西门子默认无校验,这个最容易忽略。
- 最后读手册: 每个品牌的Modbus地址映射表都不一样。三菱的保持寄存器从40001开始算,但偏移量写法各品牌有差异。老老实实翻手册。
搞过跨品牌PLC通讯的兄弟,你们有没有被哪个牌子的通讯坑过?欢迎在评论区吐槽。
如果觉得有用,欢迎收藏转发
16fl.cn — PLC工控自动化技术分享