在工业自动化中,当设备不支持 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_Buffer。LEN: 输出引脚,表示实际接收到的字节数。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 可以与世界上任何支持网络通信的设备“对话”。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!