一个做水处理项目的朋友问我:厂里有一台西门子S7-1200,上位机要用Modbus TCP读取数据,S7-1200能不能做从站?当然能。S7-1200从固件V4.0开始就原生支持Modbus TCP通信,不用额外买通讯模块。
这篇文章把从站配置的步骤拆细了写,照着做就能搞定。

一、硬件要求和软件准备
- PLC:西门子S7-1200(任何CPU型号都行,固件版本≥V4.0)
- 软件:TIA Portal V16及以上版本
- 库文件:Modbus TCP库指令(TIA Portal自带,不需要额外下载)
二、组态步骤
第1步:在TIA Portal中新建项目,添加S7-1200 CPU。双击设备组态,设置PLC的IP地址(比如192.168.1.10)。
第2步:在程序块中调用Modbus TCP库指令。S7-1200做从站,只需要一条指令:
"MB_SERVER" DB: "MB_SERVER_DB" CONNECT: "Connection_Data" IP_PORT: 502 MB_HOLD_REG: "Modbus_Data" NDR: "NDR" DR: "DR" ERROR: "Error" STATUS: "Status"
第3步:创建连接数据块”Connection_Data”,配置如下:
// 连接数据块参数 Connection_Data.InterfaceId: 64 (PLC的PROFINET接口) Connection_Data.ID: 1 (连接ID,随便设) Connection_Data.ConnectionType: 16 (TCP连接)
第4步:创建保持寄存器数据块”Modbus_Data”,数据类型为Array[0..99] of Word,共100个字,对应Modbus地址40001-40100。
三、上位机测试
PLC程序下载好之后,用Modbus调试工具测试:
- 打开ModScan或类似的Modbus调试软件
- 填写PLC的IP地址(192.168.1.10),端口502
- 从站ID填255(S7-1200默认)
- 功能码03(读取保持寄存器),起始地址0,读取10个寄存器
如果一切正常,应该能读到寄存器里预先写入的数据。
四、常见问题
Q:连接不上,Ping不通PLC?
A:检查网线、IP地址、子网掩码。PLC和上位机必须在同一网段。
Q:MB_SERVER报错,STATUS=16#8080?
A:连接数据块参数不对。检查InterfaceId是否为64,ConnectionType是否为16。
Q:能连接但读不到数据?
A:检查Modbus地址映射。S7-1200的保持寄存器从40001开始,对应DB块的索引0。
Q:多个上位机同时读,会不会冲突?
A:S7-1200的MB_SERVER同时支持多个客户端连接(最多8个),不会冲突。
五、实际项目心得
这套方案我用在过好几个项目里——水处理、空压机监控、光伏逆变器数据采集。S7-1200做从站,上位机用组态王或者Python都能轻松对接。
需要注意一点:Modbus TCP是开放性协议,如果PLC暴露在公网上,要注意网络安全。我一般会加一个工业防火墙,或者通过VPN隔离。遇到过的情况是,上位机直接连PLC没问题,但中间隔了好几层交换机,就要注意通讯超时时间的设置。
S7-1200走Modbus TCP做从站,你配过吗?遇到过什么坑?