『7x24小时有问必答』
在工业自动化中,当设备不支持 PROFINET、Modbus TCP 或 OPC UA,或者需要与自定义的上位机(C#/Python)、扫码枪、电子秤、机器人控制器进行纯数据流交互时,开放式用户通信 (Open User Communication, OUC)  中的  TCP 协议  是最灵活的选择。S7-1500 支持作为  TCP Server (监听端)  或  TCP Client (发起端)

---

一、核心概念与适用场景

特性
说明
协议类型
ISO-on-TCP (RFC 1006) 或 原生 TCP/IP。S7-1500 通常使用  ISO-on-TCP  (端口 102 或其他),因为它在 Siemens 生态中更稳定,但也可以配置为纯 TCP。
数据形式字节流 (Byte Stream)。没有固定的数据结构,发送方和接收方必须约定好“通信协议”(如:前2字节是长度,接下来是命令,最后是数据)。
主要指令TCON
  (连接),  TSEN  (发送),  TRCV  (接收),  TDISCON  (断开)。
适用场景
1. 与第三方智能仪表/扫码枪通信。

2. 与自研 C#/Python/MES 系统对接。

3. 传输非标准格式的大数据包。

4. 跨网段/跨防火墙通信(相比 PROFINET 更容易穿透)。
不适用场景
高实时性运动控制(请使用 PROFINET)、简单的启停信号(请使用 IO 或 Modbus)。

---

二、硬件与软件准备

硬件:S7-1500 CPU (任意型号,内置 PN 口即可)。软件:TIA Portal (V15.1 及以上推荐)。网络规划:
PLC IP:  192.168.0.1
对方设备 IP:  192.168.0.100
端口号:自定义 (例如  2000,避免使用 102/502 等常用端口以防冲突)。

---

三、配置步骤详解

第一步:创建通信连接 (TIA Portal)

打开 TIA Portal,进入  设备组态 (Device Configuration)
右键点击 CPU 的 PROFINET 接口 ->  添加新连接 (Add new connection)
选择  TCP  (或者 ISO-on-TCP,通常选 TCP 即可,S7-1500 底层会自动处理)。
配置连接参数:本地设备:选择你的 S7-1500。远程设备:
如果对方在项目中:直接拖拽。
如果对方不在项目中:选择  “未组态的伙伴” (Unspecified partner)
IP 地址:输入对方 IP (如  192.168.0.100)。
端口号:输入约定的端口 (如  2000)。
连接 ID:记住这个 ID (例如  W161),编程时会用到。主动建立连接:

勾选:S7-1500 作为  Client  (主动去连别人)。

不勾选:S7-1500 作为  Server  (被动等待别人来连)。
编译并下载硬件组态。

第二步:编写 PLC 程序 (SCL/LAD)

S7-1500 的 TCP 通信主要依赖四个标准库指令(位于  Instruction > Communication > Open User Communication > TCP)。
所需数据块 (DB)

建议创建一个全局 DB (如  DB_TCP_Com) 来存储状态和缓冲区。
Send_Buffer: Array[0..1023] of Byte (发送数据区)Recv_Buffer: Array[0..1023] of Byte (接收数据区)Conn_Status: BoolError_Code: WordData_Length: Int

场景 A:S7-1500 作为 Server (被动监听)

适用于:PLC 固定不动,上位机/设备主动连接 PLC。
调用  TCON  (建立连接)
由于组态中取消了“主动建立连接”,PLC 不会自动连。你需要在程序中(通常在 OB100 启动组织块或主循环中)调用一次  TCON  来激活监听端口
REQ: 上升沿触发一次。ID: 组态时的连接 ID (如  W161)。CONNECT: 指向一个静态生成的连接数据结构 (TIA Portal 会自动生成,通常在  Static  区域或单独 DB,名为  Conn_Router  或类似,需引用组态生成的参数)。STATUS,  ERROR: 输出引脚,用于监控。注意:一旦  TCON  成功执行且 STATUS 正常,PLC 就开始监听端口,此后无需再调用  TCON,除非连接断开需要重连。
调用  TRCV  (接收数据)
放在主循环 (OB1) 中持续调用。
EN_R:  TRUE  (常通)。ID: 连接 ID。DATA: 指向  Recv_BufferLEN: 输出引脚,表示实际接收到的字节数。NDR (New Data Ready): 上升沿表示收到了新数据。这是处理数据的触发信号ERROR,  STATUS: 错误诊断。
调用  TSEN  (发送数据)
当需要回复数据时调用。
REQ: 上升沿触发 (例如收到数据后,或定时发送)。ID: 连接 ID。DATA: 指向  Send_Buffer  (需先填入数据)。LEN: 要发送的字节数。DONE: 发送完成标志。ERROR,  STATUS: 错误诊断。

场景 B:S7-1500 作为 Client (主动连接)

适用于:PLC 需要主动去连扫码枪、MES 服务器等。
调用  TCON
在程序中持续监测连接状态。如果  STATUS  显示未连接,则触发  REQ  尝试连接。
一旦连接建立 (STATUS  正常),停止触发  REQ
如果连接断开,再次触发  REQ  进行重连。
TRCV  和  TSEN
逻辑与 Server 模式完全相同。只有在连接建立成功后,收发指令才有效。

---

---

四、通信协议设计 (至关重要)

TCP 是流式协议,没有“包”的概念。如果发送方连续发两次 "ABC",接收方可能一次收到 "ABCABC",也可能分成 "A" 和 "BCABC" 收到。必须设计应用层协议,常见方案:
固定长度法:
约定每条消息固定 20 字节。不足补空格或 0。
优点:简单。缺点:浪费带宽,不灵活。分隔符法:
每条消息以特定字符结尾,如  \r\n  (CR LF, ASCII 13, 10) 或  #
PLC 接收时缓存数据,直到检测到分隔符,才算一条完整消息。
长度前缀法 (推荐):
消息结构:[2字节长度][N字节数据]
例如:00 05 H E L L O  表示后面有 5 个字节的数据。
PLC 先读 2 字节得知总长,再读取剩余数据。
在 S7-1500 中处理粘包/拆包
需要使用一个静态缓冲区 (Static Buffer)  和指针。每次  TRCV  收到的数据追加到缓冲区末尾,然后根据协议解析出完整包,解析成功后从缓冲区移除已处理的数据,剩余数据保留等待下一次拼接。

---

五、常见问题与调试技巧

问题
可能原因
解决方案
连接失败 (Status 错误)
IP/端口错误,防火墙
1. Ping 测试连通性。

2. 检查 Windows 防火墙是否拦截了端口。

3. 确认  TCON  中的 IP 和端口与对方一致。

4. 确认一方是 Server (监听),一方是 Client (主动)。
收不到数据 (NDR 不亮)
对方未发送,或协议不匹配
1. 使用  Wireshark  抓包,看 TCP 包是否到达 PLC。

2. 检查对方是否调用了  Send

3. 检查  TRCV  的  ID  是否正确。
数据乱码
字节序 (Endianness)
S7-1500 是大端模式 (Big-Endian)。如果对方是 PC (小端),传输 Int/Real 时需要交换字节顺序 (SWAP 指令)。ASCII 字符串通常不受影响。
粘包/数据错乱
未处理流式特性
必须在 PLC 内实现缓冲区管理逻辑,按“长度前缀”或“结束符”切割数据,不要直接用  TRCV  的长度作为一条消息的长度。
TSEN 报错
连接断开,缓冲区满
检查  STATUS  代码。如果是连接断开,需重新调用  TCON。确保  Send_Buffer  大小足够。
调试神器:Wireshark
在 PC 上安装 Wireshark。
过滤条件:tcp.port == 2000
可以看到 TCP 三次握手是否成功,以及具体的 Payload 数据(十六进制),这是排查“发了但 PLC 没收到”或“PLC 收了但解析不对”的最有效手段。

---

六、TCP vs 其他协议对比

特性
TCP (开放式用户通信)
Modbus TCP
PROFINET
OPC UA
配置难度
中 (需写代码处理协议)
低 (有现成指令/库)
极低 (组态即可)
高 (证书/信息模型)
灵活性极高
  (自定义任何格式)
低 (受限于寄存器映射)
中 (受限于 GSD/IO 映射)
高 (结构化数据)
实时性
中 (取决于代码效率)
极高
数据语义
无 (纯字节,需自行定义)
弱 (地址 + 值)
强 (变量名)
最强
  (元数据丰富)
典型用途
非标设备、扫码枪、自定义上位机
变频器、电表、老式仪表
PLC 之间、PLC 与分布式 IO
MES、SCADA、云端、视觉

七、总结

S7-1500 的  TCP 通信  是解决“非标集成”的万能钥匙。
核心:正确使用  TCON/TRCV/TSEN  指令。难点:应用层协议的设计与解析(处理粘包、拆包、字节序)。建议:
尽量使用  长度前缀 + 内容  的协议格式。
务必使用  Wireshark  进行底层抓包验证。
对于简单的读写需求,优先考虑  Modbus TCP  (S7-1500 有内置库  MB_CLIENT/MB_SERVER),只有当 Modbus 无法满足时才使用原生 TCP。
对于复杂的结构化数据交互,优先考虑  OPC UA
通过精心设计的 TCP 通信,S7-1500 可以与世界上任何支持网络通信的设备“对话”。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码