S7-200 SMART 开放式用户通信(OUC)深度指南:TCP/ISO-on-TCP编程(下)
三、通信流程:客户端 vs 服务器,两步走!
OUC 的通信流程分 “客户端模式”(PLC 主动连设备)和 “服务器模式”(PLC 等设备连),现场最常用的是客户端模式(比如 PLC 连视觉系统)。
1. 客户端模式流程(PLC 主动连远程设备)
以 “PLC(客户端)用 TCP 连机器人(服务器)” 为例:
- 初始化:首次扫描清空 TCON/TSEND/TRECV 参数表,设置后台通信时间(50ms);
- 建连接:上升沿触发 TCON(A/P=1,连接类型 = 11,远程 IP = 机器人 IP,远程端口 = 机器人端口);
- 查状态:等待 TCON 的 Done 位(D=1),确认连接建立;
- 数据收发:上升沿触发 TSEND(发 PLC 的设备状态),常使能 TRECV(收机器人的执行结果);
- 断连接:设备停机时,上升沿触发 TDCON,断开连接。
2. 服务器模式流程(PLC 等远程设备连)
以 “PLC(服务器)用 TCP 连 PC(客户端)” 为例:
- 初始化:同客户端,TCON 参数表 A/P=0(被动),远程 IP=0.0.0.0,本地端口 = 1024;
- 等待连接:调用 TCON(REQ=1 一次),PLC 进入 “等待连接” 状态(A=1);
- 建立连接:PC 端发起连接后,TCON 的 D=1,连接建立;
- 数据收发:同客户端;
- 断连接:PC 断开或 PLC 停机时,执行 TDCON。
四、最实用:OUC 常见错误代码与解决方法
OUC 报错时,先看指令参数表的 “错误代码”(字节 0 的高 5 位 + 字节 1),以下是 5 个现场高频错误:
错误代码(十六进制) | 错误原因 | 解决步骤 |
0x0100 | 参数非法(最常见):1. 连接类型填错(如 TCP 填 19)2. 连接 ID=655353. 本地端口被占用 | 1. 核对连接类型代码(TCP=11,UDP=19,ISO-on-TCP=12)2. 改连接 ID 为 0~655343. 换本地端口(如从 1024 换为 2000) |
0x0500 | 连接失败:1. 远程设备断电 / 断网2. 远程 IP / 端口错3. 远程设备拒绝连接 | 1. ping 远程 IP,确认网络通断2. 核对远程 IP 和端口(比如机器人端口是否设为 5000)3. 检查远程设备是否允许 PLC 的 IP 连接 |
0x1800(错误代码 24) | 无待决操作:1. TDCON 断开已断开的连接2. TSEND 调用时连接未建立 | 1. 断连前先查 TCON 的 D 位,确认连接存在2. 等 TCON 的 D=1 后再调用 TSEND |
0x0A00 | 缓冲区溢出(TRECV):接收缓冲区容量<远程发送字节数 | 1. 增大 TRECV 的 “数据长度”(缓冲区容量)2. 让远程设备分批次发送(每次≤1024 字节) |
0x0B00 | 连接被远程设备断开 | 1. 检查远程设备是否异常(如机器人急停)2. 重新调用 TCON 建连 |
五、实战案例:PLC(客户端)用 TCP 连 PC
以 “PLC 发送设备状态(VB100~VB102,3 字节),接收 PC 控制指令(VB200~VB201,2 字节)” 为例,写完整程序。
1. 硬件配置
- PLC IP:192.168.2.10,本地端口:1024;
- PC IP:192.168.2.50,PC 端用 “网络调试助手” 设为 TCP 服务器,端口:5000。
2. 程序编写(LAD 梯形图)
Network 1:初始化(首次扫描)
// 首次扫描 FILL +0, VW0, 50 // 清空参数表(VB0~VB49,足够存4条指令) MOVB 50, SMB30 // 后台通信时间设为50ms |
Network 2:上升沿触发 TCON(建连接)
// 启动按钮(按下触发建连) // 上升沿 // 建连触发标志 // 配置TCON参数表(VB0起始,TCP客户端) // 位7=A/P=1(主动),位0=REQ=1 // 连接ID=10 // 连接类型=TCP(11) // 远程IP:192.168.2.50(0xC0,0xA8,0x02,0x32) // 远程端口=5000 // 本地端口=1024 TCON VB0 // 执行建连 M0.0 // 复位触发标志 |
Network 3:发送触发标志
SM0.5 // 1秒脉冲 EU // 上升沿 V0.7 // TCON完成位(D=1,连接建立) VB10.5 // TSEND无错误(E=0) = M0.1 // 发送触发标志 |
Network 4:TSEND 发送设备状态(1 秒一次)
// 配置TSEND参数表(VB10起始,连接ID=10) MOVB 1, VB11 // 位0=REQ=1 MOVW 10, VW12 // 连接ID=10(与TCON一致) MOVW 3, VW14 // 数据长度=3字节(VB100~VB102) MOVD &VB100, VD16 // 数据指针=VB100 TSEND VB10 // 执行发送 MOVB 0, M0.1 // 复位触发标志 |
Network 5:TRECV 接收 PC 指令(常使能)
VB0.7 // 连接建立(D=1) VB20.5 // TRECV无错误(E=0) M0.2 // 接收使能标志 // 配置TRECV参数表(VB20起始,连接ID=10) MOVW 10, VW22 // 连接ID=10 MOVW 2, VW24 // 缓冲区容量=2字节(VB200~VB201) MOVD &VB200, VD26 // 数据指针=VB200 TRECV VB20 // 常使能接收 |
Network 6:TDCON 断开连接
I0.1 停止按钮(按下断连) 配置TDCON参数表(VB30起始,连接ID=10) MOVB 1, VB31 位0=REQ=1 MOVW 10, VW32 连接ID=10 TDCON VB30 执行断连 |
六、常见问题 Q&A(现场踩坑总结)
- Q:TCP 连接建立后,远程设备突然断网,PLC 能自动重连吗?
A:不能!PLC 会保持 “连接丢失” 状态,需程序判断 TCON 的错误位(E=1),然后重新触发 TCON 建连(比如用定时器每隔 5 秒重试一次)。
- Q:UDP 发送时,每次都要填远程 IP 和端口吗?
A:是的!UDP 是无连接协议,没有 “固定连接”,每次发送都需在 TSEND 参数表中指定远程 IP 和端口(字节 10~15)。
- Q:TRECV 接收 TCP 数据时,为什么一次收到多批数据?
A:TCP 是 “流协议”,不区分消息边界 —— 若远程设备快速发多个小消息,PLC 会把它们合并成一个大消息。解决:自定义消息格式(比如前 2 字节是 “消息长度”,PLC 按长度拆分数据)。
最后
OUC 指令的核心是 “灵活但需严谨”—— 它能解决跨品牌通信的痛点,但参数配置、连接管理、错误处理都需要手动把控。如果你的现场遇到 “PLC 连不上视觉系统”“UDP 发送丢包” 这类问题,不妨按 “查连接 ID→核参数表→看错误代码” 的步骤排查,基本都能定位问题。
如果还有特殊场景(比如用 ISO-on-TCP 连西门子 1500),欢迎在评论区留言,咱们一起拆解解决方案!