西门子和三菱的PLC通讯,我折腾了两天终于搞定了

去年给一个食品包装厂做设备改造,甲方要求把老产线的三菱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实现,地址偏移的标注方式不一样。记住一句话——用之前先看手册的地址映射表,别靠猜。

西门子三菱PLC通讯接线

最终搞定的方案

硬件配置:

  • 三菱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通讯最坑的地方,不是技术本身有多难,而是每个厂家对同一标准的理解都不一样。

三个要点记住了,下次做跨品牌通讯能省一半时间:

  1. 先通物理层: 485通讯第一件事,把终端电阻拨上。接线确认没问题再通电。
  2. 再对参数: 波特率、校验、数据位、停止位,两边严格一致。特别是校验方式,三菱默认偶校验,西门子默认无校验,这个最容易忽略。
  3. 最后读手册: 每个品牌的Modbus地址映射表都不一样。三菱的保持寄存器从40001开始算,但偏移量写法各品牌有差异。老老实实翻手册。

搞过跨品牌PLC通讯的兄弟,你们有没有被哪个牌子的通讯坑过?欢迎在评论区吐槽。


如果觉得有用,欢迎收藏转发

16fl.cn — PLC工控自动化技术分享

上一篇 我用DeepSeek写了一段PLC程序,结果出乎意料
下一篇 PLC国产替代加速,搞工控的兄弟们要注意了