做西门子项目的人,只要把Smart 200和WinCC放在一起,就一定会碰到通信这件事。我第一次做的时候,图省事,直接在WinCC里一个一个建变量——电机状态、阀门开度、温度、压力,十几台设备下来,变量表拉到怀疑人生,画面组态更是改一个设备就得把绑定关系全部翻一遍。后来一个老工程师点拨了我一句:“你用结构变量试试。”从那以后,Smart与WinCC通信我基本固定走结构变量这条路,省下的时间不是一点半点。
这篇文章就是把整套做法原原本本分享出来,包括通信链路怎么搭、PLC侧地址怎么规划、WinCC结构类型怎么建,还有实际操作中踩过的坑。适合正在做小型自动化项目、准备用Smart 200配上位机组态的工程师参考,也适合已经建了几百个散变量想换思路的朋友。先把结论放在前面:Smart与WinCC通信,核心难点不在于“连不上”,而在于“变量组织得好不好”,结构变量方法解决的就是后半件事。
1. 为什么Smart和WinCC通信要用结构变量
1.1 从“每个变量都手工建”的痛说起
我刚入门那会儿,项目里有一台设备带8台泵,每台泵要有运行、故障、手自动、设定压力、实际压力、频率反馈、温度,这就将近7个变量,8台泵就是56个变量。WinCC变量管理器里建到一半,我就开始头晕,因为变量的命名、地址、数据类型全部靠手敲,敲错一个地址,画面上那个棒图就永远不动,排查起来能把人逼疯。
更麻烦的是,画面组态和变量是强绑定的,一个泵的状态指示灯要连“1号泵运行”,另一个泵的指示灯要连“2号泵运行”,每连一次都得去变量列表里翻一遍。如果中途发现PLC侧地址整体偏移了,比如原来规划的VW0改成VW10,那就得回WinCC里把所有相关变量地址全部改一遍,改漏一个,运行时就可能读到别人家的数据。这种散变量模式,在小项目里勉强能用,一旦设备超过五台,维护成本就开始失控。
1.2 结构变量到底解决什么问题
WinCC里的“结构类型”和“结构变量”,你可以理解成C语言里的结构体。先定义一个结构类型叫“泵”,里面打包好运行、故障、手自动、设定压力、实际压力、频率反馈这些成员,每个成员有明确的数据类型。然后创建结构变量时,直接选择这个结构类型,生成一个实例,比如“1号泵”“2号泵”“3号泵”。
这样做的好处非常直观。第一,变量的定义一次完成,同类设备不需要反复建,只需复制实例;第二,变量的地址有规律可循,1号泵从VW0开始,2号泵从VW16开始,偏移量固定,检查起来一目了然;第三,画面组态可以复制,一个泵做好的画面元素,复制给其他泵时只需要换结构变量名,不用重新一个个绑变量。打个比方,散变量就像通讯录里几百个没分组的联系人,找一个人得翻半天;结构变量就像按公司、按部门整理好的通讯录,想找谁直接翻到对应组织就完了。
1.3 通信链路选型:OPC是Smart与WinCC之间最稳的桥
明确了变量组织方式,接下来是通信链路本身。Smart 200是西门子的小型PLC,WinCC经典版(V7.x/V8.x)没有直接内置针对S7-200 SMART的TCP通信驱动,这是很多新手卡住的地方。市面上能看到几种路数:一种是PLC侧走Modbus TCP,WinCC用Modbus TCP驱动去读,但Smart里要写Modbus通信指令,WinCC侧变量没有符号名,全是寄存器地址,和结构变量思路其实是背道而驰的;另一种是直接用开源库Snap7写上位机程序,灵活但开发量大,不适合传统WinCC项目。
最稳的做法,是在中间加一个PC Access SMART。这是西门子官方为S7-200 SMART准备的OPC服务器软件,PLC通过以太网连到电脑,PC Access SMART作为OPC服务器把PLC的V区变量暴露出来,WinCC通过OPC通道去读。这样链路是“Smart 200 -> PC Access SMART -> WinCC”,每一层都不需要自己写驱动,而且OPC服务器里的变量是带符号名的,WinCC结构变量的成员可以精确匹配到符号名,不会搞错地址。这也是后面能顺利使用结构变量的前提。
2. 通信链路搭建:PC Access SMART + WinCC OPC
2.1 硬件与软件准备
做这套通信,硬件很简单:一台S7-200 SMART PLC(SR20、ST40都行,反正自带以太网口),一根普通网线,一台装了Windows的电脑。软件方面需要四样:STEP 7-Micro/WIN SMART(PLC编程软件,版本建议V2.5以上)、PC Access SMART(OPC服务器)、WinCC V7.x或V8.x(组态和运行环境),另外确认电脑的以太网口能正常使用。
装软件的时候有个经验,PC Access SMART和WinCC尽量都“以管理员身份运行”,后面OPC条目管理器里能不能看到服务器,很多时候就是权限问题。WinCC本身安装也比较挑环境,如果电脑上还有其他工控软件,最好先确认依赖的组件版本不冲突,否则后面排通信问题会分不清是软件本身坏了还是通信没通。
2.2 PLC侧通信参数设置
给PLC设置IP地址,这一步在STEP 7-Micro/WIN SMART里完成。打开软件,连接PLC后,在“通信”菜单里找到“设置IP地址”,给PLC分配一个和电脑同网段的固定IP,比如电脑是192.168.0.2,PLC就设成192.168.0.10。设完以后用PING命令验证一下,能PING通说明物理链路正常。
Smart 200的以太网口默认支持S7通信协议,PC Access SMART使用的就是这条通道,一般情况下不需要额外勾选什么远程访问选项。但如果你在PC Access SMART里发现PLC状态一直是“不可达”,而编程软件又能正常下载程序,可以检查一下系统块里的通信设置,看是否限制了远程访问。另外,PLC必须处于运行状态,STOP状态下虽然有些变量能读,但逻辑不跑,数据也不更新,调试时会误导人。
2.3 PC Access SMART配置OPC变量
PC Access SMART是这套链路里承上启下的一层,它的工作就是把PLC的地址变成一个一个带名字的OPC变量。打开软件后,新建项目,在左侧树里添加一个“S7-200 SMART”站点,填上PLC的IP地址。接着在站点下面建立变量文件夹,开始加变量。
这里的变量类型要和PLC侧真正想读的数据对上:PLC里VW100是整数,就建一个“字”类型的变量,地址填VW100;如果是VD102的浮点数,变量类型就选“浮点”,地址填VD102;如果是单个位,地址填V100.0。如果一个项目变量很多,手动一个个建太容易出错了,PC Access SMART支持导入STEP 7-Micro/WIN SMART的符号表,导入后变量名直接就是符号表里的名字,这一步强烈建议用,能省大量时间。
变量建完以后,选中站点下方的变量文件夹,观察“质量”栏。显示“Good”说明OPC通信已经通了,显示“Bad”就说明PC Access SMART访问不到PLC,先解决通信再往下走。我遇到过一种情况,变量数量建得很多,PC Access SMART一次轮询不过来回,个别变量偶尔变Bad,这就是变量数量太大的信号。
2.4 WinCC中建立OPC通道与连接
WinCC侧的配置,核心是在变量管理里添加OPC通道。打开WinCC Explorer,找到“变量管理”,右键选择“添加新的驱动程序”,在驱动列表里选择“OPC”通道。添加成功后,OPC通道下面会有“OPC Groups”节点,右键“系统参数”,会弹出OPC条目管理器,这里能扫描到电脑上已经安装的OPC服务器。
在服务器列表里找到PC Access SMART对应的服务器,不同版本显示名称可能会略有差异,但一般能看到S7-200相关字样或PC Access SMART的标识。选中服务器后,就能看到刚才在PC Access SMART里建的变量树,把需要的变量勾选导入到WinCC连接中。导入后,这些变量会作为普通的WinCC过程变量出现在连接下,可以单独设置刷新周期。
WinCC的OPC通道底层走的是OPC DA协议,运行时要求PC Access SMART必须处于打开状态,而且不能最小化到托盘后被杀掉,我遇到过有人为了省内存把PC Access SMART从任务管理器里结束掉,结果WinCC画面全灰的情况。这个细节虽然不起眼,但在项目交付时很容易栽跟头。
3. PLC侧地址规划与WinCC结构类型设计
3.1 PLC侧用符号表和V区做结构布局
结构变量的底层基础,是PLC侧的地址规划。Smart 200没有S7-1200/1500那种完整的UDT自定义类型,但我们完全可以用V区地址偏移模拟出“结构体”的效果。思路很简单:给每一类设备划定一段连续的V区地址,设备内部再按固定顺序分配字段。
比如规划一台泵的数据区从VB0开始,占16个字节:
| 字段 | 地址 | 数据类型 | 说明 |
|---|---|---|---|
| 状态字 | VW0 | 字 | 位0运行、位1故障、位2手自动 |
| 设定压力 | VD2 | 浮点 | 单位MPa |
| 实际压力 | VD6 | 浮点 | 单位MPa |
| 频率给定 | VW10 | 字 | 对应0~27648 |
| 温度 | VW12 | 字 | 单位0.1℃ |
这样定义以后,第二台泵从VB16开始,偏移量正好16个字节,第三台泵从VB32开始。地址有规律,PLC程序里写起来也顺手,上位机无论是建OPC变量还是建WinCC结构变量,都能一眼看出每个设备的字段位置。关键是,这种规划必须在写PLC程序之前就定下来,等程序都写完了再改地址,返工量非常大。
在STEP 7-Micro/WIN SMART的符号表里,把这些地址加上有意义的符号名,比如“泵1_状态字”“泵1_设定压力”,这样PLC程序里用的是符号名,PC Access SMART导入符号表后也不需要重新命名,链路从上到下都是同一套名字,出问题的概率自然低。
3.2 WinCC中创建结构类型
WinCC侧开始建结构类型。在WinCC Explorer的变量管理列表里,找到“结构类型”页签,右键新建一个结构类型,我习惯命名为“Pump”。然后在右侧结构属性表里添加成员,每个成员都要指定数据类型:
| 成员名 | 数据类型 |
|---|---|
| 运行 | 二进制变量 |
| 故障 | 二进制变量 |
| 手自动 | 二进制变量 |
| 设定压力 | 浮点32位IEEE 754 |
| 实际压力 | 浮点32位IEEE 754 |
| 频率给定 | 无符号16位数 |
| 温度 | 无符号16位数 |
这个结构类型一旦建好,后面创建结构变量时只需要下拉选择。有一次我图快,在一个结构类型里塞定了不同类型设备的字段,比如泵和阀共用一个结构类型,结果地址怎么排都对不上,最后只能拆成两个结构类型。结构类型一定要按“同一类设备”来定义,宁可多建几个类型,也不要混用。
3.3 结构变量与OPC地址的映射规则
结构类型定义好以后,开始创建结构变量。在“变量管理”里右键“新建变量”,数据类型选择“结构类型”,下拉选中“Pump”,变量名填“1号泵”。确认后,展开“1号泵”,能看到刚才定义的所有成员自动生成了,每个成员本质上还是一个独立的WinCC变量,可以单独设置过程变量地址。
这里的操作要点是,每个结构变量成员的“地址”需要和OPC通道里的变量对上。双击“1号泵”下的“设定压力”,在变量属性对话框的“参数”页里,选择连接“OPC”,然后在地址栏里指定PC Access SMART里的对应项,比如“站点/泵1/设定压力”。这样“1号泵.设定压力”就指向了PLC的VD2地址。
如果设备很多,一个个填成员地址确实还有工作量,但好处是所有的地址都在结构变量内部有规律地对应着,不容易错。而且类似设备之间可以复制结构变量再改名,只要把成员地址里的设备编号改掉就行,比从头建几百个散变量还是要快得多,也更清晰。
3.4 一个电机对象从PLC到画面的完整映射示例
我以一个电机对象为例,把整条链路串起来,方便理解。PLC侧规划四个字段:运行位、故障位、电流反馈、转速给定。地址如下:
| 项目 | PLC地址 | PC Access SMART变量 | WinCC结构变量成员 |
|---|---|---|---|
| 运行 | V110.0 | 电机1/运行 | 1号电机.运行 |
| 故障 | V110.1 | 电机1/故障 | 1号电机.故障 |
| 电流 | VD112 | 电机1/电流 | 1号电机.电流 |
| 转速 | VD116 | 电机1/转速 | 1号电机.转速 |
PLC程序里,电机运行状态放到V110.0,电流值放到VD112。PC Access SMART里对应建四个变量,导入符号表后名称一目了然。WinCC结构变量“1号电机”的成员分别绑定这四个OPC变量。画面上放一个圆形指示灯,动态属性里连接“1号电机.运行”,一个棒图连接“1号电机.电流”,画面运行后就能实时反映电机状态。
这套映射关系最大的价值在第二台电机:PLC侧地址偏移到VW126,PC Access里复制四个变量改名,WinCC里复制结构变量改名,画面复制一份改一下结构变量名,从底层到画面十分钟搞定。换作散变量的方式,又得从头建十几个变量、绑十几处画面,高下立判。
4. 结构变量的进阶用法与画面组态技巧
4.1 用结构变量提高画面重复组态效率
画面组态是结构变量方法收益最明显的地方。典型做法是画好一个设备对象,包含指示灯、棒图、按钮,把每个元素的“过程变量”属性连到这个结构变量的成员上,比如“1号泵.运行”“1号泵.频率给定”。然后以这个设备对象为模板,选中后直接复制,粘贴出第二台泵,再把新泵所有元素的变量引用从“1号泵”改成“2号泵”。
有些版本里,可以通过“动态向导”批量修改画面对象的变量连接,让复制出来的画面对象自动切换到新的结构变量名。用熟之后,一个包含20台设备的监控画面,从一个模板开始扩展,不到半天就能组态完。这套做法和TIA里Faceplate的思路是一致的,WinCC经典版虽然没有真正的面板类型,但结构变量+复制改名的操作,已经能模拟出七八成的效果。
4.2 结构变量与报警、趋势、脚本的结合
结构变量的收益不止在画面上,报警记录、变量记录和脚本编程都能沾光。
报警记录里可以按结构变量的成员建立报警,比如“1号泵.故障”“2号泵.故障”都走同一套报警文本模板,用通配符或者统一的消息文本管理,不需要每条报警都单独编写。变量记录里归档趋势曲线时,可以一次选中结构变量的多个成员,批量建立归档变量,省去一个个从变量管理器里翻找的麻烦。
脚本方面更明显。WinCC的C脚本和VBS脚本访问变量时,可以用“结构变量.成员”这种带点号的名字,比如GetTagBit("1号泵.运行")。由于结构变量的命名规律很强,脚本里可以用循环处理多台设备,写一套代码就完成了20台泵的数据处理。举个例子,用VBS遍历5台泵的运行状态并汇总:
Dim i For i = 1 To 5 If HMIRuntime.Tags("泵" & i & ".运行").Read Then totalRun = totalRun + 1 End If Next这种脚本在散变量模式下几乎写不出来,因为变量名各自为政,毫无规律可循。结构变量把名字统一了,脚本才有发挥空间。这也是结构变量隐藏价值最大的地方。
4.3 字节对齐与数据类型匹配的避坑经验
结构变量用得好不好,很大程度上取决于PLC侧的地址规划是否严谨。最容易踩的坑就是字节对齐和数据类型匹配。
Smart 200的V区里,WORD和DWORD都是按大端方式存储的,PC Access SMART和WinCC的OPC通道一般会自动处理字节序,但如果你用脚本去直接读原始字节再自己拼数,就一定会遇到高字节在前还是低字节在前的问题。我建议普通项目不要自己去拼,直接用OPC的对应数据类型,让中间层处理。
地址对齐要特别注意。定义结构时,REAL类型要放在4字节对齐的地址上,比如VD0、VD4、VD8,不要出现VD1这种跨边界的地址。虽然Smart 200本身能访问,但有些OPC通道对非对齐地址支持不好,容易读到错误数据。另外,前一个字段的结束位置就是后一个字段的开始位置,规划时一定要拿计算器算清楚,比如VW0后面接VD2,是刚好接上的,但VW0后面如果接VD3,就把两个变量的地址重叠了,运行时数据会互相覆盖,画面数值忽大忽小,查起来非常费劲。
数据类型匹配也是个高频问题。PC Access SMART里的“字”对应WinCC的无符号16位数,“浮点”对应WinCC的浮点32位IEEE744,BOOL对应二进制变量。只要有一处类型选择错误,画面显示就会异常或者干脆不更新。我的习惯是建一张地址规划表,表格里同时列出PLC地址、数据类型、OPC变量名、WinCC结构成员,四列对照着填,不容易错。
5. 常见故障排查与通信优化实录
5.1 WinCC连不上PC Access SMART怎么办
这是被问得最多的一个问题。WinCC能打开,画面能运行,但所有变量都显示不可用或灰掉。排查顺序是这样的:第一,先PING PLC的IP,PING不通就是物理链路或IP设置问题,查网线、查防火墙、查IP是否同网段;第二,打开PC Access SMART,看变量质量是不是Good,如果显示Bad,问题出在PC Access和PLC之间,和WinCC无关;第三,确认PC Access SMART处于打开状态,WinCC的OPC通道在运行时需要这个服务器进程在场;第四,确认WinCC的OPC连接是否选择了正确的服务器,如果电脑上装了多个OPC服务器,很容易选错。
如果连WinCC本身都启动不了,或者提示“无法启动基本应用程序”,那已经不是通信问题了,是WinCC安装、授权或者环境被破坏导致的,先单独解决WinCC的安装和授权问题,再回来配通信。我见过有人折腾通信几个小时,最后发现根本是WinCC运行系统没起来,属于底层没打好地基就盖楼。
5.2 变量显示异常、数值跳变的排查思路
结构变量模式下,变量显示异常最常见的原因就是地址重叠和类型不匹配。地址重叠在PLC侧规划阶段就应该避免,但如果后期改动过PLC程序,或者WinCC结构变量的成员地址是手工填的,就很容易出这种问题。排查时先把WinCC变量和PC Access SMART变量逐个对照,确认地址没有重复、没有越界。
数值跳变的另一个常见原因是刷新周期设置过短。WinCC默认的变量更新周期是1秒,如果你把结构变量的大量成员都设成“连续更新”或“250ms”,再加上PC Access SMART本身轮询速度有限,通信负载一上来,某些变量就会出现延迟或瞬断,画面上看就是数值跳变。常规场景1秒足够,画面需要快速响应的关键变量单独设置短周期,不要全员拉满。
还有一个容易忽略的点,WinCC画面对象绑定的变量一旦结构变量改名,旧引用会变成灰变量,画面运行后虽然不报错,但数据不刷新。改结构变量名后,一定要去画面里检查所有绑定是否跟着更新,我吃过这个亏,改了三个设备名,漏改了一个,现场调试时那个设备的温度曲线一直是一根直线。
5.3 通信性能优化与刷新周期设置
PC Access SMART本质上走的是轮询机制,变量越多,单轮时间越长。项目变量超过两三百个以后,通信性能问题就会显现出来。优化手段有几个方向:第一,PC Access SMART里尽量把变量定义成连续地址的数据块,减少碎片化的小变量,轮询效率会高不少;第二,WinCC里把结构变量成员的刷新周期分层,重要的状态位和报警用短周期,趋势类数据用长周期;第三,一个OPC连接下变量太多时,可以拆成多个OPC连接,分别接不同设备或不同区域,分散轮询压力。
如果项目规模再大,比如一个WinCC要连多台Smart 200,建议每台PLC在PC Access SMART里单独建站点,WinCC里也建独立的OPC连接,这样哪一路通信出问题,可以单独排查单独重启,不会整个画面全灰。实测下来,这种分而治之的结构,比把所有PLC都塞到一个OPC连接里要稳定得多。
最后再分享一点个人体会。Smart与WinCC通信这件事,设备和软件选型其实没什么可纠结的,OPC是标准答案。真正拉开项目差距的,是你在开工第一天有没有花两小时把地址规划和结构类型定下来。我后来做类似项目,第一步永远是画一张“设备-地址-OPC-结构变量”的对应表,表画完,后面全是体力活。结构变量这个方法,其实逼着你先想清楚数据模型再动手,这个思考过程,比省下的时间还值钱。