简介:西门子S7-200 SMART PLC与WinCC 7.4通过Modbus TCP/IP协议直接通信的测试资料,面向工业自动化现场工程师和上位机组态人员。文档基于实际试验,介绍了SMART PLC调用Modbus TCP服务器库功能块的编程方法,以及WinCC侧添加MODBUS TCP/IP驱动、设置连接参数的完整过程,并给出输入/输出、浮点数、有符号数等变量的地址映射示例,可帮助读者绕过OPC方式实现设备直连。资源包为单个PDF文件,大小107KB,内容精炼,便于快速查阅。已有225人学习/下载。对准备实施SMART与WinCC通信的工程师而言,这份资料提供了从配置步骤、参数设置到变量对应关系的实战参考,尤其适合用于验证通信稳定性和排查高低字节顺序等细节问题。
1. WINCC 7.4 读不到 S7-200 SMART 数据?先分清谁是客户端
做过西门子集成的人都有体会:S7-200 SMART 自带的以太网口确实支持 Modbus TCP/IP 通讯,但 WINCC 7.4 的原生驱动列表里根本没有 Modbus TCP 这一项。翻遍 WINCC 的通讯驱动程序,能看到 SIMATIC S7 Protocol Suite、SIMATIC S5、OPC 等条目,唯独没有直接指向 200 SMART 的选项。所以很多人第一次做这个题目,卡住的地方不是 PLC 侧的程序,而是 WINCC 这一侧不知道用哪条路把数据接进来。
这个标题实际上在讲一条很典型的集成路径:S7-200 SMART 作为 Modbus TCP 服务器(或客户端),WINCC 7.4 借助 SIMATIC NET 的 OPC 服务器做中转,最终在 WINCC 变量管理里通过 OPC 通道读写 PLC 数据。简单说就是「PLC 走 Modbus TCP,WINCC 走 OPC,中间由 SIMATIC NET 协议栈把两种协议桥接起来」。这套方案不依赖第三方控件,全部用西门子官方组件完成,适合存量 200 SMART 设备往上位机做监控、报表、弹窗报警等场景。下面从通讯架构讲起,把 PLC 库调用、SIMATIC NET 组态、WINCC 变量绑定和排错一条线走完。
2. 通讯链路拆解:为什么 200 SMART 侧用库,WINCC 侧用 OPC
2.1 S7-200 SMART 的 Modbus TCP 实现方式
S7-200 SMART 从固件版本 V2.2 开始内置了 Modbus TCP 库指令,不需要额外买通讯模块,直接调用 MBUS_SERVER 或 MBUS_CLIENT 即可。这个库和 S7-200 时代的 Modbus 库思路一脉相承,但参数化方式有明显差别——SMART 的库需要你手动分配库存储区(V 区),而且每个连接占用一个 PORT 实例。
库指令在软件里的位置:项目树 -> 库 -> Modbus TCP (Slave) 或 Modbus TCP (Master)。注意 SMART 的库分为 EN 和 ENI 使能版本,IEC 模式下用带 ENI 的版本,LAD 模式下两者都能用。大部分现场程序沿用 LAD,所以下文按 MBUS_SERVER 的标准调用方式讲。
调用 MBUS_SERVER 需要填 4 个关键参数,直接决定通讯能不能通:
| 参数 | 含义 | 建议设置 |
|---|---|---|
| EN | 使能位 | SM0.0 常 ON,让服务器一直监听 |
| PORT | 以太网口号 | 固定填 0,200 SMART 只有一个以太网口 |
| IP_Port | 监听端口号 | 默认 502,如果现场有冲突可改,但 WINCC 侧要对应改 |
| HoldStart | 保持寄存器起始地址 | 指向 V 区某个偏移,比如 &VB3000 |
| MaxIQ | 可访问 I/Q 点位数的 16 倍 | 填 16(意味着可访问 0~15 的 I/Q 位) |
| MaxAI | 可访问模拟量通道数 | 按实际填,没用到就填 0 |
| MaxHold | 保持寄存器字数 | 按实际 V 区大小填,比如 1000 |
| HoldStart | 保持寄存器起始地址 | 指向 V 区某个偏移,比如 VB3000 |
多数人第一次失败的原因出在MaxHold和库存储区分配上。MBUS_SERVER 会在 HoldStart 指定的地址向后占用 MaxHold 个字,如果这个区域和你业务程序里的 V 区地址重叠,PLC 侧数据就会被库指令周期性改写,表现为数据跳变、通讯偶尔成功偶尔失败。另外库存储区分配必须在「库存储区」对话框里指定一个独立的 V 区段,通常从 VB0 开始预留 300 字节左右,不能再被业务程序使用。
2.2 为什么选 SIMATIC NET 而不是直接用第三方 OPC
WINCC 7.4 读 Modbus TCP 有几种路:用 SIMATIC NET 的 OPC 服务器、装第三方的 Modbus OPC 网关、或者用 WINCC 的 Open Development Kit 自己写通道。后两者要么收费,要么开发量大,现场调试周期不可控。常见做法是选 SIMATIC NET——它是西门子官方的通讯平台,WINCC 7.4 和老版本一样内置了 OPC 客户端通道,和 SIMATIC NET 同源,兼容性最稳妥。
SIMATIC NET 在 WINCC 7.4 这个场景里的实际作用是一个协议转换网关:它内部集成了 Modbus TCP 客户端(也就是它去连接 200 SMART 的 502 端口),同时对外提供 OPC DA 或 OPC UA 服务接口,WINCC 的 OPC 通道连到 SIMATIC NET 上,三层链路一次打通。
这里有个容易被忽略的点:SIMATIC NET 的版本必须和 WINCC 7.4 配套。WINCC 7.4 对应 SIMATIC NET V13 或 V14 都能用,但安装顺序必须是先装 SIMATIC NET,再装 WINCC。如果顺序反了,WINCC 的 OPC 通道在变量管理里能看到,但连接 SIMATIC NET 的 OPC 服务器时会报「接口未注册」之类的错。如果你打算用 OPC UA 方式连接,SIMATIC NET 从 V13 SP2 起支持 UA,但 WINCC 7.4 的 OPC UA 通道需要单独授权,性价比不如 OPC DA,现场大多走 OPC DA。
2.3 S7-200 SMART 作服务器时 WINCC 侧的地址映射关系
Modbus TCP 的地址模型和 S7 的地址模型不是一一对应的,这一步是很多人换算出错的重灾区。200 SMART 作为 Modbus TCP 服务器时,遵循标准 Modbus 映射:
- 00001~09999:输出线圈,映射到 Q 区,按位访问。对应 WINCC 侧写成 %Q0.0 这种格式,但走 Modbus 时要换算成 0 起始的位地址,比如 Q0.0 对应 Modbus 地址 00001。
- 10001~19999:输入状态,映射到 I 区,按位访问。I0.0 对应 10001。
- 30001~39999:输入寄存器,映射到 AI 区,按字访问。AIW0 对应 30001。
- 40001~49999:保持寄存器,映射到 V 区,按字访问。这是最常用的区域,VW 地址和 Modbus 地址的换算方式是
40001 + (VW 偏移量 / 2)。
举一个实际换算例子:PLC 里用 VW100 存温度值,那么保持寄存器的 Modbus 地址就是 40001 + 100/2 = 40051。而 WINCC 侧的 OPC 变量 Item 格式是MB_SERVER_连接名.保持寄存器地址,具体写法在 SIMATIC NET 的 OPC Scout 里能看到,后面第 4 章会详细展开。
提示:200 SMART 的 Modbus 库在伺服模式下只支持最多 8 个同时连接,超过后新的连接请求会被拒绝。如果现场有 HMI、触摸屏、上位机同时在线,要规划好连接数,必要时让触摸屏走 SMART 自己的 HMI 协议,只有 WINCC 走 Modbus TCP。
3. PLC 侧配置实操:从库调用到 IP 地址规划
3.1 最小可用配置:200 SMART 作 Modbus TCP 服务器
在 STEP 7-Micro/WIN SMART 里新建项目,把 MBUS_SERVER 指令拖进主程序,填写参数时注意:HoldStart指向的必须是 V 区地址,因为 200 SMART 的 Modbus 保持寄存器本质上就是 V 区。下面是常用的一段启动逻辑:
// 网络段1:初始化 Modbus 服务器参数 LD SM0.1 // 首次扫描 CALL MBUS_SERVER, SM0.0, 0, 502, &VB1000, 16, 0, 1000这段代码在第一次扫描时启动 Modbus TCP 服务器,监听 502 端口,保持寄存器区域从 VB1000 开始,共 1000 个字(覆盖 VW1000~VW2999)。MaxIQ 填 16 表示允许上位机读写 Q0.0~Q1.7 共 16 个位输出,MaxAI 填 0 表示不允许访问模拟量(如果上位机要读 AIW,这里要填实际通道数的两倍以上)。
参数说明里需要特别留意SM0.1只在首次扫描为 ON,所以 MBUS_SERVER 的 EN 端如果直接接 SM0.1,服务器只会在启动瞬间被调用一次,而不是持续监听。正确写法是 EN 端接 SM0.0(常 ON),首次扫描只是用来做初始化。上面代码里把 MBUS_SERVER 放在 SM0.1 后面是错误的示范,实际应该这样写:
// 正确写法:MBUS_SERVER 在每个扫描周期都被调用,内部自己处理初始化 LD SM0.0 CALL MBUS_SERVER, SM0.0, 0, 502, &VB1000, 16, 0, 1000库指令的 EN 端保持常 ON,MBUS_SERVER 内部通过 SM0.1 的首次扫描逻辑自行完成参数装载,这是和普通子程序最大的区别。每次调用都会刷新监听状态字,上位机断开重连时不需要重启 PLC。
3.2 使用库存储区避免数据冲突
在 STEP 7-Micro/WIN SMART 里调用完库指令后,软件会弹窗提示「为库指令分配存储区」,点击建议地址按钮,系统自动推荐一个 V 区范围。如果自动分配的地址和你程序中手工使用的 V 区重叠,运行时会报错或数据错乱,所以建议手动指定到一段独立区域,例如 VB0~VB299。
分配完成后,HoldStart不能落在库存储区范围内。比如库存储区占用了 VB0~VB299,那么保持寄存器起始地址应从 VB300 以后开始。实际项目里我习惯把保持寄存器放在 VB1000 之后,前面全部留给系统数据和库存储区,这样无论怎么加程序都不会越界。
3.3 IP 地址规划与通讯测试
200 SMART 的 IP 地址在系统块 -> 以太网端口里设置。这里有一个常见坑:200 SMART 默认 IP 是 192.168.2.1,子网掩码 255.255.255.0,而 WINCC 所在电脑通常在不同网段(比如 192.168.1.x)。要么把 PLC 改成电脑同网段,要么给电脑加一个 192.168.2.x 的辅助 IP。两种做法都行,但建议直接修改 PLC 的 IP,因为 Modbus TCP 通讯双方必须在同一广播域内,且中间如果有防火墙,要放行 502 端口。
设置完 IP 后用电脑 ping 一下 PLC 地址确认链路通畅。注意 200 SMART 默认允许 icmp 回显,如果 ping 不通优先检查物理链路和电脑网卡的子网掩码,不要急着改程序。
4. SIMATIC NET 组态与 OPC 服务器建立
4.1 在 SIMATIC NET 里新建 Modbus TCP 连接
打开 SIMATIC NET 的 Station Configuration Editor(在开始菜单里找),在这里面新建一个 PC Station,然后插入两个关键组件:IE General(以太网卡)和OPC Server。注意组件的顺序有讲究:IE General 是物理层接口,OPC Server 是应用层服务,两者必须在同一站名下才能互相绑定。
接下来打开 NetPro 组态界面(在 PC Station 上右键 -> Open Object),在连接列表里新建一个连接。关键设置如下:
- 连接类型选择
Modbus TCP/IP或者TCP/IP(取决于 SIMATIC NET 版本,V13 之后统一叫 TCP/IP,然后在下方属性里指定为 Modbus 模式)。 - 在「地址」栏填入 200 SMART 的 IP 地址,端口号填 502。
- 在「块参数」里设置数据块的大小,这个决定了单个请求能读写多少字。常见设置为 DB 编号 1,起始地址 0,长度对应 PLC 侧 MaxHold 的值。
组态完成后点编译下载,把组态写入 PC Station。这一步如果报错,九成是 IE General 指向的网卡不对——一定要选物理网卡,不要选「Microsoft Loopback Adapter」之类的虚拟网卡。
4.2 用 OPC Scout 验证连接通断
SIMATIC NET 安装后会附带一个 OPC Scout(开始菜单 -> SIMATIC -> OPC Scout),这是调试阶段最重要的工具,因为 WINCC 的变量连接本质上和 OPC Scout 访问的是同一个 OPC 服务器,OPC Scout 能读到数据,WINCC 就一定能读到。
打开 OPC Scout,添加 OPC 服务器(通常是OPC.SimaticNet.1或者SiemensOPC.Server.2,具体看版本),然后在左侧浏览树里展开 Modbus TCP 连接。你会看到类似Connection_1的条目,展开后出现MODBUS节点,再展开就是具体的寄存器区域:Coils、DiscreteInputs、InputRegisters、HoldingRegisters。
双击 HoldingRegisters 下的条目,在 Item ID 对话框里输入地址,格式要注意:SIMATIC NET 的 Modbus 地址是零起始的,所以 PLC 侧 VW100 对应保持寄存器 100(而不是 40051),Item ID 写成HoldingRegisters.100。把 Quality 列拉出来看,如果显示Good,说明链路已经通了;如果显示Bad,回到第 2 章检查 PLC 侧库参数,特别是 MaxHold 和 HoldStart 的一致性。
4.3 WINCC 加装 OPC 通道的注意事项
WINCC 7.4 的项目在新建的时候默认集成了 OPC 通道,但要在变量管理里手动添加 OPC 组。右键点击变量管理 -> 添加新的驱动程序,选择OPC.chn(OPC DA 2.0 通道)。这里有个常见问题:WINCC 弹出来的系统参数里需要填 OPC 服务器名和电脑名称(或 IP),很多人填 localhost 也能通过,但在重启后可能连不上。正确的写法是在系统参数里选择「本地服务器」选项,然后在下拉框里选 OPC.SimaticNet.1。
注意:SIMATIC NET 的 PC Station 如果配置为「非组态模式」(没有下载组态),OPC 服务器不会启动。安装完 SIMATIC NET 后,需要在 Station Configuration Editor 里确认站名前的灯是绿色,OPC Server 组件的状态是「运行中」。
5. WINCC 变量连接与画面绑定的完整步骤
5.1 在 WINCC 变量管理里逐个建立通讯变量
WINCC 里添加 OPC 通道后,在 OPC 组下新建变量,变量类型可以选择「原始数据类型」。连接 OPC 项目的关键动作是:在变量属性 -> 连接 -> 项目名 后面的浏览按钮里,打开 OPC Item 浏览器。在这个浏览器里能直接看到 OPC Scout 里见过的那个树——连接名 -> MODBUS -> HoldingRegisters。选中需要的寄存器地址,WINCC 会自动生成 Item ID。
这里必须提醒一个 DWORD 和 WORD 的转换问题:200 SMART 的 VW 是 16 位,WINCC 变量类型选WORD或INT才能配对。如果硬选成DWORD,读取宽度变成 32 位,会把相邻两个 VW 合并成一个值,数据自然不对。现场最容易出现的情况是:温度显示正常但压力显示乱码,多半就是这个原因。
变量建立的批量操作也值得说一句:如果点位超过 50 个,逐个点击 OPC Item 浏览器会非常低效。常见做法是先用 Excel 把变量名、数据类型、Modbus 地址整理成清单,然后在 WINCC 里用「导入变量」功能,格式选 CSV,一次性建成所有变量。这个功能在变量管理右键菜单里,导出和导入的格式要一致,第一次导入失败多半是因为 CSV 里的变量名带了空格或中文符号。
5.2 画面弹窗与趋势图的变量引用方式
WINCC 的画面对象绑定变量后,运行时能不能刷新,取决于 OPC 通道内部是否对该 Item 建立了订阅。WINCC 的 OPC 通道默认对画面中引用的变量建立订阅,但以下几个场景会自动断开订阅:
- 画面弹窗关闭一次后,如果弹窗里的变量不是全局变量而是本地变量,WINCC 会在弹窗关闭时释放这些变量引用,再次打开弹窗时重新连接。如果此时 OPC 服务器没有正确响应,就会出现「弹窗关闭一次就打不开」的现象。解决办法是弹窗里的变量全部用全局变量(在变量管理里建),不要用画面内的局部连接。
- 趋势图控件如果绑定的是归档变量而不是实时变量,控件启动时不会主动订阅 OPC 实时通道,画面看起来「没数据」,需要手动触发一次归档或在趋势控件属性里勾选「在线显示」。
这一段的排错逻辑是:先看变量管理里变量名的质量符号——绿色对勾表示通讯正常,黄色感叹号表示通讯中断,然后去 OPC Scout 里对照同样的 Item ID,如果在 Scout 里 Good 而在 WINCC 里 Bad,问题一定出在 WINCC 侧的数据类型或访问路径上,而不是 PLC。
5.3 循环脚本与数据刷新的取舍
WINCC 里有两种方式让画面数据持续更新:一是变量本身的触发器(默认是 1 秒),二是画面对象属性里的循环脚本。这两者叠加使用会导致通讯负载翻倍。
如果遇到画面数据显示缓慢,不要急着调小循环脚本周期,而是先看变量管理里 OPC 通道的「更新周期」设置。OPC 通道默认更新周期是 1 秒,把周期调成 500ms 就能改善大部分画面的实时性,不需要动脚本。
只有涉及画面弹窗、动态隐藏显示这类 UI 逻辑时,才建议用循环脚本,且脚本里不要直接读写 OPC 变量。循环脚本的标准写法是:脚本内部读取一个内存变量,然后根据值控制画面对象的 Visible 属性。这样通讯数据只走 OPC 到变量这一条路,脚本只是做 UI 层的搬运工。
6. 连接诊断三板斧:断言、VAT 和 OPC Scout 对照法
通讯调试最大的痛点是你不知道问题出在 PLC 侧、SIMATIC NET 侧还是 WINCC 侧,所以必须用分层对照的方法快速定位。
第一板斧:关掉 WINCC 运行系统,只开 OPC Scout,去读 PLC 的保持寄存器。如果 Scout 里 Quality 为 Good,说明 PLC 和 SIMATIC NET 的 Modbus TCP 链路是通的,问题收敛到 WINCC 通道配置上。如果 Scout 里 Bad,回到 PLC 侧,用 STEP 7-Micro/WIN SMART 的状态表(VAT)在线监控 MBUS_SERVER 的 Done 位和 Error 位。Done 位是 M0.8(取决于你调用的库实例位置),Error 码常见值含义如下:
| Error | 含义 | 处理方式 |
|---|---|---|
| 0 | 无错误 | 继续查网络 |
| 1 | 保持寄存器起始地址越界 | 检查 HoldStart 是否在 V 区有效范围内 |
| 2 | MaxHold 设置过大 | 缩小保持寄存器范围,通常不超过 2000 |
| 3 | 端口号被占用 | 换一个端口(保守起见换 502 之外的),WINCC 侧同步修改 |
| 4 | 连接数超限 | 减少同时连接的客户端数量 |
第二板斧:用 Wireshark 抓 eth0 网卡的流量,过滤条件tcp.port == 502,看是否有 Modbus TCP 请求帧发出。如果 PLC 侧状态表正常但抓不到包,问题在主机的防火墙——Windows 防火墙默认会拦外部客户端发来的入站请求,需要把 SIMATIC NET 的 IE General 绑定网卡设为「专用网络」并放行 TCP 502 端口。这一步经常被忽略,因为 OPC Scout 连本机 SIMATIC NET 时走的是内部回环,数据没经过物理防火墙,所以测试全通,但 WINCC 实际运行时就超时。
第三板斧:在 200 SMART 程序里加一个心跳线圈,比如把 SM0.5(1 秒时钟)送到 Q0.0,上位机侧读这个位当作通讯健康标志。WINCC 画面做一个图形对象绑定这个变量,颜色变化就说明通讯活着,颜色不变说明链路断了。这套做法在判断「Modbus 连接正常但数据不同步」的场景里特别有效——如果心跳在变但业务数据不变,问题大概率出在数据类型或地址换算上,而不是通讯本身。
最后补一个关于 S7-200 SMART 作客户端的场景:如果用 200 SMART 主动去读其他 Modbus 服务器,调用 MBUS_CLIENT,需要用一个定时器周期性触发,典型的写法是 SM0.5 上升沿触发一次读操作,读完后把 Done 位接到下一次触发的使能条件上,形成轮询。但这个场景通常出现在 PLC 和第三方设备互读的场景,WINCC 与 200 SMART 的通讯更适合用服务器模式,读写都由 WINCC 主动发起,时序更可控。
本文还有配套的精品资源,点击获取