
简介西门子S7-200 SMART与WINCC 7.4通过MODBUS TCP/IP实现通讯是自动化控制系统中常见的数据交换方式。这份PDF技术笔记面向PLC编程与组态人员完整记录了作者基于实际测试的通讯搭建过程包括PLC端如何调用Modbus TCP服务器功能块、WINCC端如何新建MODBUS TCP/IP驱动并设置CPU类型、服务器IP、端口及从站地址等关键参数同时给出了输入变量、输出变量、32位浮点数、32位/16位有符号数等不同数据类型在WINCC与PLC寄存器地址间的映射示例并特别提示了字类型数据需勾选转换16位值以解决高低字节问题以及当前连接成功但稳定性未知的测试结论。资源为单一PDF文档压缩包仅107KB内容紧凑约225人学习浏览适合需要快速完成S7-200 SMART与WINCC以太网通讯配置的工程师参考尤其有助于理解地址映射和Modbus TCP参数设置。1. 为什么 S7-200 SMART 和 WINCC 7.4 要选 Modbus TCP/IP一条产线上十几台 S7-200 SMART 做单机控制上位机要用 WINCC 7.4 统一监管结果卡在通讯上。SMART 不支持 S7 以太网协议WINCC 自带的 SIMATIC S7 Protocol Suite 连不上它加协议网关要花钱再塞一台 OPC 服务器又多一个故障点。两边其实都自带 Modbus TCP/IP 能力SMART 固件里有 MB_SERVER 指令WINCC 7.4 安装包里带 Modbus TCPIP 通道驱动零额外硬件就能把启停命令、运行状态、温度压力这些过程量传过去。理解这条链路关键是抓住两侧各自的活PLC 把变量映射成 Modbus 对象WINCC 按通道规则定义变量地址中间硬性要求只有 IP 能通、端口 502 不被防火墙拦。调试思路顺着“先 PLC、再链路、后 WINCC”展开。下面按调试顺序把路走一遍。适合手上有 SMART 单机设备要并进 WINCC 项目、又不想在通讯上额外投入的工程师熟悉 OPC UA 但不想为此引入新组件的项目同样适用这条直连路线。2. S7-200 SMART 侧把 PLC 变成 Modbus TCP 服务器方案上让 SMART 做服务器从站WINCC 做客户端主站。服务器侧只需要一条 MB_SERVER 指令但它的地址映射决定了 WINCC 变量地址怎么写所以先讲映射再写程序。2.1 先搞清 Modbus 地址到 SMART 存储区的映射MB_SERVER 把 Modbus 的四类常用对象映射到 SMART 的不同存储区规则如下Modbus 对象功能码地址范围SMART 映射区一句话用途线圈 Coil01/05/1500001 起Q 输出区 Q0.0 起启停、开关命令离散输入 Discrete Input0210001 起I 输入区 I0.0 起现场按钮、限位输入寄存器 Input Register0430001 起AIW 区 AIW0 起模拟量输入保持寄存器 Holding Register03/06/1640001 起V 存储区参数、状态字、浮点保持寄存器最常用读写都走 V 区。一个寄存器等于一个字16 位占 V 区 2 个字节把 HOLD_REG_START 设成 VB0 时40001 对应 VW040002 对应 VW2依次类推。建议开工前先做一张变量规划表把要传的每个点写清楚落在哪个 VW、什么数据类型、WINCC 侧打算用什么地址这张表就是后面联调的基线。2.2 最小程序MB_SERVER 调用与库存储区分配在 STEP 7-Micro/WIN SMART 里建一个新的主程序先分配库存储区程序块上右键 → 库存储区编译器会给出一个建议大小一般在 256 字节量级选择一个与数据区不重叠的 V 区间。不分配这一块编译会直接报错这是第一次上手最常卡住的地方。然后写两个网络。第一个网络做参数初始化第二个网络调用 MB_SERVER// 网络 1初始化 MB_SERVER 参数 LD SM0.0 MOVW 502, VW2000 // 监听端口用标准 Modbus TCP 端口 502 MOVW 2, VW2002 // 允许的最大 IP 连接数 MOVW 1, VW2004 // Modbus 单元号从站号WINCC 侧要一致 MOVW 200, VW2006 // 最大保持寄存器数按变量规划表放宽 MOVD VB0, VD2008 // 保持寄存器起始指针40001 从这里开始 MOVW 200, VW2012 // 实际开放的保持寄存器数量 MOVD VB5000, VD2014 // 指令工作缓冲区避开数据区 // 网络 2调用服务器指令 CALL MB_SERVER, SM0.0, VW2000, VW2002, VW2004, VW2006, VD2008, VW2012, VD2014, VW2100, VW2102参数说明第一个输入 CONNECT 接 SM0.0上电后服务器一直监听需要手动断开通讯时可用一个 M 位控制。IP_PORT 保持 502。如果现场有其它软件占用 502可以换但 WINCC 连接参数要同步改。MODBUS_ID 是单元号默认 1WINCC 通道里填的“从站号”必须和它一致否则 TCP 能连上但报文被丢弃。HOLD_REG_START 指向保持寄存器起始 V 地址。示例里是 VB0意味着 40001 VW0。MAX_HOLD_REG 决定可开放的寄存器数量上限示例给 200 个实际按变量表算宁多勿少。HOLD_REG_PTR 是工作缓冲区不能与数据区、库存储区重叠V 区紧张时优先用末尾空间。ERRORVW2100非 0 表示指令错误PARAM_ERRVW2102非 0 表示参数配置错误联调时在状态表里盯着这两个字能省很多排查时间。不同固件版本下 MB_SERVER 的引脚数量和顺序可能略有差异以 Micro/WIN SMART 指令树里显示的为准。如果指令树里找不到 MB_SERVER先看 CPU 固件版本太老的固件需要先升级升级后再重建库指令。2.3 固定 IP先把 TCP 层打通Modbus TCP 是网络通讯PLC 必须用固定 IP否则 WINCC 重连时找不到设备。在系统块 → 通信里设好 IP出厂默认 192.168.2.1、子网掩码 255.255.255.0下载并重启 CPU。PC 侧先把网卡调成同一网段比如 192.168.2.10然后验证ping 192.168.2.1 -t能持续 ping 通再往下走。ping 不通时先查网线、查网卡是否被虚拟机软件抢占了路由、查 PLC 的 LINK 灯亮不亮不要急着动 WINCC。这一步花五分钟后面能少排查半小时。装了 VM 一类虚拟机的 PC还要留意虚拟网卡把到 PLC 的默认路由抢走的情况必要时先禁用多余网卡。3. WINCC 7.4 侧配好 Modbus TCPIP 通道和变量PLC 侧就绪后剩 WINCC 7.4 的通道配置。WINCC 里的 Modbus TCP/IP 是原生通道比走 OPC 少一层转发轮询行为和异常处理都更直接。3.1 在变量管理里挂上 Modbus TCPIP 驱动打开 WinCC Explorer → 变量管理 → 右键 → “添加新的驱动程序”在文件列表里找到 Modbus TCPIP.chn确认后变量管理树下会多出一个“Modbus TCPIP”通道。提示如果先打开了 WinCC Explorer 再去安装驱动文件需要完全退出项目重新打开驱动列表才会刷新。这是“明明装了驱动却看不到通道”的常见原因。新建连接右键通道 → “新驱动程序连接”名字建议用设备位号比如 SMART_Line01。之后在连接属性里填通讯参数。3.2 连接参数IP、端口、单元号、超时连接属性里需要关心的参数如下参数推荐值说明IP 地址192.168.2.1指向 S7-200 SMART 的固定 IP端口502与 PLC 侧 IP_PORT 一致从站号 / 单元号1与 MB_SERVER 的 MODBUS_ID 一致响应超时2000 ms内网环境下 2 秒足够过短会导致偶发通讯失败重试次数3现场网络不稳时可加大但会放大故障恢复时间启动 WINCC 运行系统后可以在 WINCC 所在机器上确认 TCP 层连接是否建立netstat -ano | findstr 502如果看到到 PLC IP 的 ESTABLISHED 连接说明通道已经握上手如果连接反复出现 TIME_WAIT 或 SYN_SENT问题多半在单元号不一致或者 PLC 侧连接资源被占满。S7-200 SMART 的以太网连接资源有限调试时别同时挂太多客户端Modbus 测试工具、WINCC、触摸屏一起连着CPU 会拒绝新连接。3.3 变量地址写法与数据类型对应在连接下新建变量时关键是“地址”字段。Modbus TCPIP 通道沿用 Modbus 的 5 位地址写法线圈 00001、离散输入 10001、输入寄存器 30001、保持寄存器 40001从哪个地址开始就写哪个数。数据类型由 WINCC 变量类型决定不是由地址决定。WINCC 变量数据类型地址对应 PLC 地址说明启动命令二进制变量00001Q0.0线圈对应 PLC 输出运行状态字无符号 16 位数40001VW0保持寄存器温度浮点数 32 位 IEEE 75440003VD4占用两个寄存器压力设定有符号 16 位数40007VW1216 位写参数地址规划建议从 VW0 开始按顺序排中间预留空位后续加点是改数值而不是改地址。更新周期上画面一直在用的变量用 1 秒或“变化时”采集不常用的参数放到 5 秒以上避免通道被一个画面的快速轮询打满。提示数据格式选错比如把 16 位无符号读成 32 位浮点读出来就是乱值这不一定是通道问题。先按映射表核对变量类型再怀疑协议配置。通道建好后先建一个 16 位测试变量读 VW0 的固定值不要一上来就把几十个变量全部建完。Modbus 通道按变量逐个轮询变量多了以后再改字节序、改地址要重开运行系统调试节奏会被拖慢。4. 地址偏移、字节序与浮点数S7-200 SMART 与 WINCC 7.4 联调最容易翻车的地方4.1 Modbus 地址的 1 基与 0 基偏移Modbus 协议报文里寄存器偏移从 0 开始而厂商文档和工具里的地址写法从 1 开始文档地址报文偏移SMART 存储区400010VW0HOLD_REG_START 指向的首字400021VW240101100VW200WINCC 地址栏里直接填文档地址40001用测试工具时注意换算。很多“读出来全是对的但差一个数”的问题都是把偏移当成了地址。用 mbpoll 这类工具调试时默认从 -r 1 开始读就是 40001不要自作聪明去减 1。4.2 先验证 16 位字节序S7-200 SMART 的字存储是高字节在前big-endian与 Modbus 的通用约定一致但 WINCC 通道在不同版本里可能有字节交换Byte Swap / Word Swap选项不能默认两边一定吻合。联调第一步在 PLC 里给 VW0 写入固定值LD SM0.0 MOVW 16#1234, VW0然后在 WINCC 里建一个无符号 16 位变量地址 40001。读回 46600x1234说明字节序一致显示 133300x3412说明被交换了去连接或变量属性里找字节交换选项改掉。用 0x1234 而不是 1234是因为高字节 0x12、低字节 0x34 一眼就能看出是否颠倒。4.3 32 位浮点数的高低字顺序浮点REAL占用 4 字节在 SMART 的 V 区里是两个字低字在低地址、高字在高地址。例如 VD4 VW4低字 VW6高字映射到 Modbus 后 40003 VW4、40004 VW6也就是低字在前。而多数上位机解析 32 位浮点按“高字在前”处理直接建浮点变量读出来就是天文数字或极小数。第一种处理方式是在 PLC 侧把数据倒好字再放寄存器WINCC 直接建浮点变量// 源浮点放 VD100040001VW0、40002VW2HOLD_REG_STARTVB0 LD SM0.0 MOVW VW1002, VW0 // 高字 - 40001 MOVW VW1000, VW2 // 低字 - 40002说明WINCC 按高字在前解析 40001、40002 两个寄存器所以先传 VW1002。如果画面数值仍然不对把两行 MOVW 对调。注意源地址与目标地址不能重叠目标区不要与其它数据共享。实际工程里保持寄存器起始地址不同偏移要按 2 字节一个寄存器换算。第二种在 WINCC 侧用 C 脚本重组适用于不想改 PLC 程序、或者通道已经按低字在前定义好的情况#pragma option(u32,off) #include apdefap.h void OnClick(char* lpszScreenName, char* lpszPictureName, char* lpszControlName) { unsigned long ulTemp; float fValue; // Reg_Hi 为高字所在寄存器Reg_Lo 为低字所在寄存器按映射表自行对应 ulTemp ((unsigned long)GetTagWord(Reg_Hi) 16) | (unsigned short)GetTagWord(Reg_Lo); memcpy(fValue, ulTemp, 4); SetTagFloat(Tag_Real, fValue); }逻辑说明把高字左移 16 位、低字放进低 16 位拼成 32 位内存布局再用 memcpy 把同一段内存按浮点解释全程不涉及跨机字节序转换结果与 WINCC 自身的浮点解析完全一致。一个画面里有十几个浮点时建议抽成公共函数循环处理别每个变量各写一段。另外32 位值由两个寄存器组成两个 16 位变量的更新周期必须一致否则 WINCC 可能在两次轮询之间读到“高字是新的、低字是旧的”拼出一个错误值。把关联变量放到同一采集周期是很容易被忽略的细节。5. 联调验证先用 mbpoll 把 Modbus TCP/IP 链路打通再开 WINCC 通道5.1 mbpoll 验证链路把问题分成三段WINCC 通道配置出错时很难判断是 PLC 映射错、网络不通还是 WINCC 变量定义错。先用命令行工具 mbpoll 直接从 PC 上读 PLC把问题收敛到“PLC 应答是否正确”。mbpoll -a 1 -t 4 -r 1 -c 10 192.168.2.1参数说明-a 1 是单元号-t 4 表示保持寄存器功能码 03-r 1 从 40001 开始-c 10 连续读 10 个寄存器。返回的数据与 PLC 状态表对照一致说明 PLC 侧映射和网络都通了不一致则是映射或字节序问题这时候还没必要碰 WINCC。mbpoll 带 -w 参数可以写单个寄存器或线圈先写后读能验证 03/06/16 功能的读写路径。链路通了之后在 WINCC 里放一个在线表格或趋势图控件几个关键模拟量曲线连续不跳变才算采集正常。5.2 放行 502 端口处理常见失败现象mbpoll 能通而 WINCC 读不到时优先检查 WINCC 所在机器的 Windows 防火墙。内网环境直接放行 502 端口或把 WINCC 运行程序加入白名单。常见现象对照现象排查方向WINCC 变量状态显示超时/无连接ping、防火墙、从站号能连接但值一直是 0地址写错、更新周期过长值乱跳或差一个数字节序、地址 1 基/0 基偏移运行一段时间后掉线PLC 连接资源占满、超时参数过短5.3 给画面加一个心跳弹窗通讯静默中断也能被发现Modbus 链路中断时 WINCC 通道有报错但值班员通常不会盯着变量状态看。常用做法是做一个心跳监视PLC 里每 500ms 对 VW 心跳寄存器加 1WINCC 画面脚本按 1 秒周期轮询连续几次值不变就弹窗提示。Dim nLast, nCur nCur GetTagWord(HeartBeat) If nCur nLast Then nMiss nMiss 1 If nMiss 5 Then MsgBox Modbus 通讯中断请检查 PLC 与网络 nMiss 0 End If Else nMiss 0 End If nLast nCur说明脚本挂在画面的“打开画面”动作或全局脚本里定时器按 1 秒触发nMiss 用画面属性或全局变量保存。这个办法同时检验了通讯实时性——心跳寄存器不涨说明链路延迟已经大到不可接受。把轮询周期、心跳判定和画面弹窗组合起来断链在几十秒内就会被现场发现而不必等到工艺数据异常才回头查通讯。本文还有配套的精品资源点击获取