
简介本资源是一份面向工业自动化工程师与西门子PLC初学者的实用技术文档聚焦S7-1200在Modbus TCP通信中同时作为客户端与服务器的双重角色实现方案解决多设备协同通信场景下的双向数据交互难题。文档以Step 7 V16为开发环境详细涵盖服务器端与客户端的数据区规划、连接参数配置含IP、端口、ID等关键项、子程序结构设计及主程序整合逻辑并特别强调ID冲突导致单侧通信失败的典型排错要点具备强实操指导性。资源为单文件Word文档.docx共1个文件大小610KB内容精炼、图文结合便于快速查阅与工程复用。目前已有596人学习下载适合正在调试Modbus TCP双模通信、需规避常见配置陷阱的现场工程师与进阶学习者。1. S7-1200 同时作为 Modbus TCP 客户端和服务器不是“二选一”而是现场真实需求的硬性约束在一条产线改造项目中你手头的 S7-1200 PLC 需要一边从第三方能源计量表支持 Modbus TCP 服务端读取电表数据一边又要向上位 SCADA 系统仅支持 Modbus TCP 客户端主动连接提供本机采集的温度、压力等工艺参数——此时PLC 既不能只做客户端也不能只做服务器。它必须在同一以太网口、同一 IP 地址下同时响应外部 Modbus 请求Server 模式又主动发起对其他设备的读写Client 模式。这不是高级功能演示而是工业现场常见的多协议桥接场景。S7-1200固件 V4.0 及以上原生支持该能力但需严格区分通信资源、避免端口冲突、正确配置 TCON 连接与 DB 块映射。本文面向已掌握基本 TIA Portal 编程的工程师聚焦可复现的双模共存配置路径不讲原理堆砌只解决“为什么编译报错”“为什么客户端连不上”“为什么服务器收不到请求”三类高频问题。2.1 为什么必须用 TCON 连接管理器而非传统开放式用户通信S7-1200 的 Modbus TCP 功能并非通过“开放式用户通信OUC”指令块实现而是依赖底层TCONTCP Connection连接管理器统一调度。OUC 仅支持单向通信如仅发送或仅接收且无法同时维护多个并发连接而 Modbus TCP Client/Server 均需长期保活连接、处理事务 ID、响应超时重传这些均由 TCON 自动完成。若强行用 OUC 模拟 Modbus 协议将面临 CRC 校验失败、PDU 解析错误、无连接状态管理等致命缺陷。提示TIA Portal V16 及以上版本中“Modbus TCP” 功能块如MB_CLIENT和MB_SERVER必须绑定到已配置的 TCON 连接实例否则编译直接报错ERROR 3005: Invalid connection reference。这是初学者最常卡住的第一步。TCON 连接分为两类被动连接Passive用于 Server 模式监听指定端口默认 502等待外部客户端连接主动连接Active用于 Client 模式向目标 IP:Port 发起连接请求。二者不可复用同一 TCON 实例。一个 TCON 只能是 Active 或 Passive不能既是。因此双模运行的前提是创建两个独立的 TCON 连接对象。2.1.1 在 TIA Portal 中创建两个 TCON 连接的具体步骤打开项目 → 设备配置 → CPU → “属性”选项卡 → 左侧导航栏展开“通信” → 点击“连接”点击右上角“添加新连接”按钮 → 类型选择“TCP 连接”→ 点击“确定”在连接列表中双击新建连接默认名Connection_1打开属性窗口连接名称改为TCON_Server语义化命名便于后续引用连接类型勾选“被动连接服务器”本地端口输入502标准 Modbus TCP 端口若被占用可改503但需同步告知上位系统远程地址留空Server 不指定远端激活连接勾选必须启用才能监听再次点击“添加新连接” → 类型仍为“TCP 连接”双击第二个连接Connection_2→ 属性设置连接名称改为TCON_Client连接类型勾选“主动连接客户端”远程地址填写目标设备 IP如192.168.0.100远程端口填写目标设备 Modbus TCP 服务端口通常502本地端口留空由系统自动分配临时端口激活连接勾选点击“确认”保存所有设置 → 下载硬件组态到 PLC。注意两个 TCON 必须使用不同连接名称如TCON_Server/TCON_Client后续功能块调用时将直接引用此名称。若名称拼写错误或未激活MB_SERVER将始终处于STATUS 16#8001连接未建立状态。2.2 MB_SERVER 功能块的参数配置与数据映射逻辑MB_SERVER块负责响应外部 Modbus 请求其核心是将 PLC 内部数据区DB 块映射为 Modbus 寄存器地址空间。S7-1200 支持四种寄存器类型线圈0x、离散输入1x、保持寄存器4x、输入寄存器3x。实际工程中90% 的上位系统只读写保持寄存器4x因此重点配置该区域。2.2.1 创建映射 DB 块并定义结构需新建一个全局 DB 块如DB_ModbusMap结构必须严格匹配 Modbus 地址偏移// DB_ModbusMap 的数据结构DB 块内部 // 注意Modbus 地址 40001 对应 DB 中第 0 个 WORD即 MW0 // 地址 40002 对应 MW2以此类推每个 WORD 占 2 字节 // 因此 DB 结构按 WORD 数组定义而非 INT 或 REAL // 以下定义 100 个保持寄存器对应 40001~40100 HR_Array : ARRAY[0..99] OF WORD; // 必须是 WORD 类型INT 会导致字节序错乱 HR_Status : WORD; // 可选用于反馈服务器运行状态如 0OK, 1忙提示Modbus 协议中保持寄存器Holding Register为 16 位无符号整数0~65535对应 PLC 的WORD数据类型。若误用INT有符号当值 32767 时上位系统会显示负数若用REAL则需按 IEEE754 规则拆成两个连续 WORD增加复杂度且易出错。新手务必坚持WORD数组。2.2.2 MB_SERVER 块调用与关键参数说明在主程序如OB1中调用MB_SERVER// OB1 中调用 MB_SERVER( EN : TRUE, CONNECT : TCON_Server, // 必须与 TCON 名称完全一致 MODE : 0, // 0标准模式支持全部功能1精简模式仅读写保持寄存器 UNIT_ID : 1, // Modbus 从站地址上位系统连接时需指定此 ID STATUS : MB_Server_Status, // 输出状态字用于诊断 DONE : MB_Server_Done, // 上升沿表示本次响应完成 ERROR : MB_Server_Error, // 错误代码如 16#8002非法功能码 // 以下四个参数指向 DB_ModbusMap 中的具体区域 HR_START_ADDR : 0, // 映射起始地址Modbus 地址 40001 对应此处 0 HR_NBR_OF_REGS : 100, // 映射寄存器数量40001~40100 共 100 个 HR_DATA_PTR : P#DB_ModbusMap.DBX0.0 WORD 100, // 指针DB_ModbusMap 的 HR_Array 起始地址 // 其他寄存器若不用设为 0 或空指针 COIL_START_ADDR : 0, COIL_NBR_OF_COILS : 0, COIL_DATA_PTR : 0, DISCRETE_INPUT_START_ADDR : 0, DISCRETE_INPUT_NBR_OF_INPUTS : 0, DISCRETE_INPUT_DATA_PTR : 0, INPUT_REGISTER_START_ADDR : 0, INPUT_REGISTER_NBR_OF_REGS : 0, INPUT_REGISTER_DATA_PTR : 0 );参数含义常见错误CONNECTTCON 连接名称拼写错误如TCON_Server写成TCON_Server_导致STATUS16#8001HR_START_ADDRModbus 地址偏移量设为1会导致上位系统读40001实际访问MW2数据错位HR_DATA_PTR指针语法必须精确P#DB_ModbusMap.DBX0.0 WORD 100中WORD 100表示 100 个 WORD缺一不可2.3 MB_CLIENT 功能块的轮询控制与异常处理机制MB_CLIENT主动向目标设备发起读写请求其难点在于避免阻塞主循环、处理连接中断、防止重复请求。S7-1200 不支持异步回调必须用状态机轮询。2.3.1 构建安全轮询状态机State Machine定义一个静态变量MB_Client_StateINT 类型在OB1中按顺序执行// 状态定义建议用符号常量 // #IDLE 0, #CONNECTING 1, #READING 2, #WRITING 3, #ERROR_RECOVER 4 CASE MB_Client_State OF 0: // IDLE 状态准备发起新请求 IF Timer_1s.Q THEN // 使用 1 秒定时器触发轮询 MB_Client_State : 1; Timer_1s.IN : FALSE; END_IF; 1: // CONNECTING检查连接状态若未连通则尝试连接 IF NOT TCON_Client.CONNECTED THEN // TCON 连接由系统自动管理此处仅检测 // 若长时间未连可加计数器触发报警 ELSE MB_Client_State : 2; END_IF; 2: // READING读取目标设备保持寄存器如 40001~40010 MB_CLIENT( EN : TRUE, CONNECT : TCON_Client, MODE : 3, // 3读保持寄存器Function Code 03 UNIT_ID : 1, // 目标设备从站地址 READ_ADDR : 0, // 从 Modbus 地址 40001 开始读 NBR_OF_REGS : 10, // 读 10 个寄存器 DATA_PTR : P#DB_TargetData.DBX0.0 WORD 10, // 存入 DB_TargetData 的前 10 个 WORD STATUS : MB_Client_Status, DONE : MB_Client_Done, ERROR : MB_Client_Error ); IF MB_Client_Done THEN MB_Client_State : 0; // 读取完成回到 IDLE ELSIF MB_Client_Error 0 THEN MB_Client_State : 4; // 进入错误恢复 END_IF; 4: // ERROR_RECOVER断开重连 延迟重试 IF MB_Client_Error 16#8001 THEN // 连接失败 TCON_Client.DISCONNECT : TRUE; // 主动断开 Timer_Retry.IN : TRUE; // 启动 5 秒重试定时器 IF Timer_Retry.Q THEN Timer_Retry.IN : FALSE; MB_Client_State : 1; // 重新尝试连接 END_IF; END_IF; END_CASE;提示MB_CLIENT的DONE信号仅表示本次请求已发出并收到响应无论成功与否必须结合ERROR输出判断结果。常见错误码16#8001连接失败、16#8003超时、16#8004非法地址。若忽略ERROR程序会持续用旧数据更新导致监控失真。2.3.2 MB_CLIENT 与 MB_SERVER 的数据协同设计Client 读取的数据如DB_TargetData常需经 PLC 运算后再通过 Server 提供给上位系统。例如Client 读取电表DB_TargetData中的MW0当前有功功率PLC 计算MW0 * 0.95得到修正值将结果写入DB_ModbusMap.HR_Array[0]上位系统通过 Server 读40001即得修正后功率。此过程无需额外通信指令纯内存赋值即可// 在 OB1 中 Client 读取完成后立即执行 IF MB_Client_Done AND MB_Client_Error 0 THEN DB_ModbusMap.HR_Array[0] : DB_TargetData.Power_Value * 100; // 乘100转为整数保留两位小数 END_IF;3. 本地仿真验证用 Modbus Poll 模拟客户端 Modbus Slave 模拟服务器脱离真实设备也能验证双模逻辑是否正确。推荐组合Modbus PollWindows 客户端 Modbus SlaveWindows 服务器 S7-1200 仿真PLCSIM Advanced V4.0。此方案规避了物理接线与 IP 冲突专攻逻辑闭环。3.1 PLCSIM Advanced 中的网络配置要点PLCSIM Advanced 默认使用虚拟网卡PLCSIM_ADV_NIC其 IP 需手动设置并与仿真软件匹配在 Windows 设置 → 网络适配器中找到PLCSIM_ADV_NIC右键 → “属性” → “Internet 协议版本 4 (TCP/IPv4)” → “属性”设置静态 IP192.168.0.1子网掩码255.255.255.0关键在 TIA Portal 中CPU 的以太网接口 IP 必须设为同一网段如192.168.0.2且网关留空仿真环境无路由。注意若使用默认 DHCPPLCSIM 会随机分配 IP如169.254.x.x导致 Modbus Poll 无法 ping 通。必须强制静态 IP 并确保与仿真网卡同网段。3.2 Modbus Poll 配置 Server 模式连接 S7-1200 的 MB_SERVERModbus Poll 作为客户端连接 S7-1200 的 MB_SERVER打开 Modbus Poll →Connection→Connect选择Connection Type:TCP/IPIP Address: 输入 S7-1200 仿真 IP192.168.0.2Port:502与 TCON_Server 的本地端口一致Unit ID:1与 MB_SERVER 的 UNIT_ID 一致点击OK状态栏显示Connected即成功。然后配置读取寄存器Read→Read Holding RegistersStarting Address:0对应 Modbus 地址 40001Quantity:10点击Edit→Data Display→ 选择Hex或Decimal查看DB_ModbusMap.HR_Array[0..9]的实时值。若看到数值随 PLC 程序变化如手动修改DB_ModbusMap.HR_Array[0]证明 Server 模式生效。3.3 Modbus Slave 配置 Client 模式反向连接 S7-1200 的 MB_CLIENTModbus Slave 作为服务器供 S7-1200 的 MB_CLIENT 连接打开 Modbus Slave →Connection→ConnectConnection Type:TCP/IPIP Address:127.0.0.1本机回环因 MB_CLIENT 连接的是本机仿真环境Port:502Modbus Slave 默认监听端口点击OK。在 Modbus Slave 中预置测试数据Setup→Read/Write Registers→Holding Registers在0000地址填入12340001填入5678此时DB_TargetData的MW0和MW2应被 MB_CLIENT 读取并显示。提示若 MB_CLIENT 的STATUS持续为16#8003超时检查 Modbus Slave 是否已Connected且防火墙未阻止502端口。Windows 防火墙需放行modbusslave.exe的入站连接。4. 现场部署必调的 3 个参数与 2 类典型故障排查双模运行在真实产线中最常遇到的不是功能缺失而是参数微调不到位引发的隐性故障。以下三个参数直接影响稳定性必须根据现场网络质量调整两类故障现象有明确根因可快速定位。4.1 三个必须现场实测调整的关键参数参数位置推荐初始值调整依据过大/过小后果MB_CLIENT 的 TIMEOUTMB_CLIENT块输入参数1000毫秒测量目标设备响应时间用 Wireshark 抓包看Request→Response间隔过小如200ms网络抖动即超时频繁报错过大如5000ms轮询周期拉长数据刷新延迟TCON 连接的 KEEPALIVETCON 连接属性 → “高级”选项卡60秒查看交换机 ARP 老化时间通常 300~3600 秒过小10s心跳包过多占带宽过大300s链路中断后 5 分钟才检测到Client 长期挂起MB_SERVER 的 MAX_CLIENTSMB_SERVER块输入参数4统计同时连接的上位系统数量SCADA、HMI、MES 各占 1 个过小1第二台 HMI 连接被拒绝过大16消耗 PLC 连接资源影响其他 TCP 通信提示MAX_CLIENTS并非并发请求数而是最大允许的 TCP 连接数。一个上位系统即使发 100 个请求也只占用 1 个连接。若现场有 3 台 HMI 1 套 SCADA设为4即可无需预留冗余。4.2 故障现象Client 能连 Server 但读不到数据Server 能连 Client 但写不进数据此类问题 80% 源于地址映射错位或数据类型不匹配而非网络问题。验证步骤如下抓包确认协议层是否正常在 PLC 侧 PC 安装 Wireshark过滤tcp.port 502观察Client 请求Modbus Request: Read Holding Registers, start0, quantity10Server 响应Modbus Response: Read Holding Registers, data1234 5678...若请求发出但无响应 → 检查MB_SERVER的CONNECT名称与 TCON 是否匹配若请求与响应均有但数据为0000 0000→ 检查HR_DATA_PTR指向的 DB 地址是否正确。交叉验证 DB 块内容在 TIA Portal 在线监视中直接查看DB_ModbusMap.HR_Array[0]的值Server 输出DB_TargetData的值Client 输入若DB_TargetData有值而DB_ModbusMap.HR_Array[0]无更新 → 检查 Client 读取后的赋值语句是否被跳过如MB_Client_Done条件不满足。强制写入测试在DB_ModbusMap.HR_Array[0]中手动输入9999用 Modbus Poll 读40001若显示9999→ Server 正常在 Modbus Slave 中修改0000为8888观察DB_TargetData.MW0是否变为8888→ Client 正常。最终确认Client 与 Server 的数据流向是单向内存拷贝不存在“双向绑定”。所有协同逻辑必须显式编写赋值语句这是 S7-1200 双模编程最易忽视的底层事实。本文还有配套的精品资源点击获取