西门子S7-1200 PLC使用MB_CLIENT指令通过Modbus TCP与第三方设备通信时,若指令执行后背景数据块(DB)中STATUS值恒为16#80C8,表示远程设备拒绝连接或目标IP/端口不可达。该错误不涉及协议数据解析失败(如功能码不支持),而是发生在TCP三次握手或初始请求阶段,属于网络层与传输层的前置失败。以下为系统性排查与修复指南,所有步骤均基于TIA Portal V15.1+及固件V4.2+环境验证,无需额外工具,纯靠PLC工程本身完成。
一、确认错误发生的确切上下文
16#80C8是S7-1200 Modbus库定义的特定错误代码,对应文本描述为"Connection refused by remote device"。它仅出现在MB_CLIENT指令的STATUS输出端,且必须同时满足以下两个条件才可判定为该错误真因:
DONE = FALSE且ERROR = TRUE持续为真(非单次扫描);STATUS = 16#80C8在连续多个扫描周期内稳定不变(排除瞬态网络抖动)。
⚠️ 注意:若
STATUS在16#80C8与16#0000之间跳变,说明TCP连接偶发建立成功,问题更倾向网络不稳定或远程设备负载过高,而非配置错误。
二、检查背景数据块(DB)中关键字段的合法性
MB_CLIENT指令依赖背景DB存储连接参数与运行状态。错误16#80C8直接关联以下5个字段的取值,任一非法将导致连接被远程设备主动RST:
-
CONNECT.IP_ADDRESS:必须为标准IPv4点分十进制格式,且不能含空格、前导零、字母或中文字符。
✅ 正确:"192.168.1.100"
❌ 错误:"192.168.01.100"(前导零)、"192.168.1.100 "(尾部空格)、"192.168.1.100.1"(多段) -
CONNECT.PORT:取值范围必须为1至65535的整数,且不得为知名服务端口(如21/22/23/80/443)以外的保留端口——但此处重点是:远程Modbus TCP服务器必须监听该端口。常见错误是误填502(标准Modbus端口)而远程设备实际监听503或8888。 -
CONNECT.RACK与CONNECT.SLOT:此两字段对Modbus TCP完全无效,但在DB结构中若被意外修改为非0,部分旧版固件会触发底层连接校验异常。务必确认二者均为0。 -
MB_MODE:必须为1(读写模式)或2(只读模式)。若设为0或>2,指令将无法启动连接流程,STATUS可能滞留16#80C8。 -
REQ输入端:必须由干净的上升沿脉冲驱动(如P_TRIG),而非持续TRUE。若REQ长期为1,指令反复尝试重连,易被远程防火墙限流并返回Connection refused。
三、验证远程设备网络可达性(PLC侧原生方法)
不依赖笔记本ping,在PLC程序中直接验证,避免“电脑能通但PLC不通”的定位盲区:
- 新建一个
TCON连接测试FB(如TCON_DB),在TCON指令中填入与MB_CLIENT.CONNECT完全相同的IP_ADDRESS和PORT; - 将
TCON的REQ接M0.0(手动测试位),ENO接Q0.0(观察灯); - 下载并在线监控:强制
M0.0 = 1,观察TCON.STATUS:- 若
STATUS = 16#0000→ TCP连接成功,证明网络层通畅,问题在Modbus协议层; - 若
STATUS = 16#8104(Connection timeout)→ 网络路由不通或远程设备关机; - 若
STATUS = 16#8105(Connection refused)→ 与MB_CLIENT的16#80C8完全一致,确认是远程设备未监听该端口或防火墙拦截。
- 若
🔍 关键区别:
TCON的16#8105与MB_CLIENT的16#80C8语义等价,但TCON无Modbus逻辑,可排除协议栈干扰。
四、检查远程设备真实监听状态(免安装工具)
在远程设备所在网络中,用任意一台Windows电脑执行:
- 打开命令提示符(CMD);
- 输入:
netstat -ano | findstr :502(将
502替换为你DB中配置的CONNECT.PORT值); - 查看输出中是否有
LISTENING状态行,且PID列对应进程是否为你的Modbus服务器软件; - 若无任何输出 → 远程设备根本未启动Modbus服务或端口配置错误;
- 若有输出但
PID为4→ 该端口被系统级服务(如HTTP.sys)占用,需更换端口。
五、防火墙与中间设备排查清单
| 检查项 | 操作方式 | 预期结果 |
|---|---|---|
| PLC本体防火墙 | TIA Portal中打开设备配置 → 属性 → 保护 → 防火墙,确认允许来自远程设备的连接已勾选 |
勾选状态 |
| 远程设备操作系统防火墙 | Windows:控制面板 → Windows Defender 防火墙 → 允许应用通过防火墙,找到Modbus服务并勾选专用和公用 |
双勾选 |
| 路由器/交换机ACL | 登录企业级交换机CLI,执行display acl all,确认无规则丢弃源IP(PLC IP)到目的端口(如502)的TCP包 |
无匹配丢弃日志 |
| NAT端口映射 | 若远程设备在私网内,检查出口路由器是否将WAN口某端口(如5020)正确映射至内网IP的502端口 | 映射条目存在且启用 |
六、背景DB结构完整性验证(易忽略的硬伤)
MB_CLIENT指令对DB结构极其敏感。即使字段值正确,若DB声明顺序或数据类型错位,也会导致16#80C8。按以下顺序逐项核对DB变量声明:
// 必须严格按此顺序、类型、名称声明(大小写敏感)
CONNECT : TCON_PARA; // 类型必须为TCON_PARA,非STRUCT自定义
MB_MODE : INT; // 不可用DINT或USINT
REQ : BOOL;
DISCONNECT : BOOL;
MB_DATA_ADDR : UINT;
MB_DATA_LEN : UINT;
MB_DATA_PTR : POINTER;
STATUS : WORD;
DONE : BOOL;
ERROR : BOOL;
⚠️ 致命错误示例:若将
CONNECT声明为STRUCT而非TCON_PARA,或MB_MODE声明为USINT,PLC运行时会静默填充错误内存地址,MB_CLIENT向错误端口发起SYN包,远程设备立即返回RST →16#80C8。
七、终极验证:最小化复现工程
若以上步骤仍无法定位,新建空白PLC项目执行如下操作:
- 创建新DB,按第六节顺序声明全部变量;
- 在OB1中插入
MB_CLIENT,仅连接此DB,其他引脚接常数:MB_MODE := 1REQ := I0.0(接PLC输入点,手动触发)MB_DATA_ADDR := 0MB_DATA_LEN := 1MB_DATA_PTR := P#DB1.DBX0.0 BYTE 2(指向DB1起始地址)
- 下载并强制
I0.0 = 1,观察STATUS; - 若此时
STATUS = 16#0000→ 原工程DB或调用逻辑存在隐式错误; - 若仍为
16#80C8→ 100%确认为网络或远程设备问题。
八、常见修复方案速查表
| 现象 | 直接原因 | 解决动作 |
|---|---|---|
STATUS=16#80C8且TCON也报16#8105 |
远程设备未运行Modbus服务 | 启动远程Modbus软件,确认服务进程存在 |
STATUS=16#80C8但TCON报16#0000 |
MB_CLIENT参数错误(如MB_MODE=0) |
检查MB_MODE是否为1或2,REQ是否为脉冲 |
STATUS=16#80C8且远程netstat显示LISTENING |
远程设备Modbus服务绑定127.0.0.1而非0.0.0.0 |
修改服务配置,监听0.0.0.0或PLC所在网段IP |
DB中IP_ADDRESS为"192.168.1.100 "(含空格) |
字符串末尾空格导致TCP连接解析失败 | 在DB编辑器中双击该字段,删除所有不可见字符 |
| 使用非标端口(如8080)但远程防火墙拦截 | 企业防火墙默认放行502,封禁其他端口 | 在防火墙策略中显式放行该端口TCP入站 |
重置背景DB并重新下载程序后,首次触发REQ,STATUS应在3秒内从16#80C8变为16#0000(连接成功)或16#8104(超时),不再停滞于16#80C8。

暂无评论,快来抢沙发吧!