西门子S7-1200Modbus TCP主从通讯#读写数据,可与支持Modbus TCP的设备进行无缝连接。 含程序、软件、说明书。

搞工控的兄弟应该都绕不开Modbus协议,今天咱们来唠唠西门子S7-1200玩转Modbus TCP主从通讯的实战姿势。这PLC自带网口支持Modbus TCP协议栈,不用额外买模块就能和第三方设备愉快玩耍,真香!

先祭出祖传配置三件套:TIA Portal V15.1、PLC固件V4.2以上、以及支持Modbus TCP的从站设备(比如变频器或仪表)。重点来了,记得在设备视图里给PLC的以太网口勾选"允许来自远程伙伴的PUT/GET访问",这个不打开的话后面通讯绝对扑街。

主站编程用MB_CLIENT功能块,老司机建议直接在OB1里调用。看这段代码:

MB_CLIENT(
    REQ := "DataSend",  //触发信号
    MB_MODE := 0,       //0=读 1=写
    MB_DATA_ADDR := 16#100, //寄存器地址
    MB_DATA_LEN := 2,   //读取长度
    DATA_PTR := P#DB1.DBX0.0 BYTE 4); //数据存放区

这里藏着几个坑:DATAPTR必须用指针格式,建议在DB里建个数组变量;MBDATA_ADDR是16进制数,别手抖输成十进制。曾经有个兄弟寄存器地址写成256,结果设备直接给他甩了个超时错误。

西门子S7-1200Modbus TCP主从通讯#读写数据,可与支持Modbus TCP的设备进行无缝连接。 含程序、软件、说明书。

从站配置更带劲,打开PLC属性→防护与安全→连接机制,勾选"允许来自远程伙伴的PUT/GET访问"。关键操作是调用MB_SERVER功能块,注意这个块必须放在循环中断OB里,比如OB30:

MB_SERVER(
    MB_HOLD_REG := P#DB2.DBX0.0 WORD 10); //保持寄存器映射区

这里寄存器地址映射直接关系到外部设备访问的地址,比如HoldingRegister 40001对应DB2.DBW0。遇到过最离谱的翻车现场是DB块没设置成非优化访问,导致地址对不上,设备读出来的都是乱码。

调试阶段推荐用Modbus Poll/Modbus Slave这对黄金搭档。抓包时重点看Transaction ID字段——正常通讯时这个值应该递增,如果卡住不动说明PLC可能没响应。曾经有个项目因为从站响应超时设置太短,主站疯狂重发导致网络风暴,最后把Timeout从300ms调到1000ms才解决。

最后给个忠告:Modbus TCP的502端口记得在防火墙里放行。之前有次在现场死活连不上,最后发现是甲方IT把端口封了,简直吐血。完整程序框架和硬件组态建议参考西门子官方手册的A5E03771939章节,这玩意比百度到的野教程靠谱多了。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐