2. WinCC项目结构与脚本运行环境
在WinCC中写脚本,第一件要弄清楚的事不是语法,而是“脚本在哪里运行、由谁触发、能访问什么”。同一个VBS或C动作,放在全局脚本里和放在画面对象事件里,运行位置、生命周期、可访问的变量范围都不一样。项目类型又决定了脚本能否跨站访问数据。因此,理解项目结构、脚本分类、编辑器和触发器,是后续所有自动化逻辑的地基。
一、三种项目类型与脚本的作用域
WinCC工程按规模与部署方式分为单用户、多用户和分布式三类,它们直接决定脚本能“看到”哪些数据。
- 单用户项目(Single-User):一台计算机同时承担组态、运行和变量采集,所有脚本都在本机运行,脚本可直接访问本项目的全部内部变量与过程变量,是最简单的脚本环境。
- 多用户项目(Multi-User):一台服务器加多台客户机。服务器负责过程连接与归档,客户机只做显示和操作。客户机上的脚本访问的是服务器发布的变量,脚本本身在客户机上执行,因此不能直接读写服务器本地文件或调用服务器上的外部程序。
- 分布式项目(Distributed):多台服务器各自负责一部分过程区域,再通过客户机聚合显示。脚本访问跨服务器变量时必须使用“服务器前缀”限定,例如
@ServerName::TagName形式,否则只能取到本机变量。
实践中的判断原则是:脚本要操作本机资源(文件、串口、本地程序),就放在对应计算机上;脚本只处理数据运算与画面联动,放在客户机即可,可减轻服务器负担。
二、全局脚本与画面脚本
WinCC脚本按存放位置分为两大类,这是初学者最容易混淆的地方。
全局脚本(Global Script)位于“全局脚本”编辑器下,分为C脚本(Global Script C)和VBS脚本(Global Script VBS)。它们独立于画面存在,适合编写与画面无关的通用逻辑,例如定时采集数据、批量写变量、报警联动、与外部数据库交互。全局脚本中的过程(Procedure)可以被画面脚本调用,实现代码复用。
画面脚本依附于具体画面对象,写在对象的“事件”属性中,例如按钮的鼠标单击、输入输出域的数值变化、画面的打开与关闭。它的生命周期与画面绑定,画面关闭后脚本不再运行。画面脚本适合处理与界面直接相关的交互,例如点击按钮切换画面、输入框校验、动态改变对象颜色。
三、脚本编辑器界面
打开全局脚本编辑器后,左侧是导航树,按“项目模块 → 动作/过程”组织;右侧是代码编辑区,提供语法高亮、自动补全和编译检查。C脚本编辑器还带有“编译”按钮,编译通过后动作才会生效。VBS编辑器则提供对象浏览器,可展开当前项目变量、画面对象和系统函数。
画面脚本的编辑入口在画面对象的属性面板中:选中对象 → 事件 → 选择事件类型 → 右键“C动作”或“VBS动作”即可打开对应编辑器。编辑器顶部会显示当前动作的触发条件,这是排查脚本不执行问题的第一处检查点。
四、触发器类型:周期、变量、事件
触发器决定脚本“什么时候跑”。全局脚本动作必须配置触发器,否则不会自动执行。
- 周期触发:按固定时间间隔执行,可选250ms、1s、1min、1h等标准周期,也可自定义。适合定时刷新、周期性采集。周期越短CPU负担越大,需权衡实时性与负载。
- 变量触发:当指定变量的值发生变化时执行。适合“变量一变就处理”的场景,例如液位越限立即记录。注意变量触发是“变化即触发”,若变量频繁抖动会导致脚本高频执行。
- 事件触发:由画面事件或系统事件驱动,例如按钮点击、画面打开、报警到达。画面脚本主要使用事件触发。
一个动作可以配置多个触发器,任一满足即执行。实际工程中常见组合是“周期触发做心跳 + 变量触发做即时响应”。
五、调试工具与诊断窗口
脚本出错时,WinCC提供几处关键诊断入口:
- 全局脚本诊断窗口:在全局脚本编辑器中打开“诊断”视图,可查看动作的编译错误、运行错误及触发次数。
- APDiag(WinCC诊断工具):可查看脚本执行时间、调用堆栈,定位耗时过长的动作。
- 变量仿真与变量表:手动改变变量值,验证变量触发脚本是否按预期响应。
- 消息窗口与日志:脚本中可用
HMIRuntime.Trace(VBS)或printf(C)输出调试信息,配合诊断窗口观察。
下面这张图把项目类型、脚本分类、触发器和诊断路径组织成一张关系图,便于对照记忆。
六、一个可复用的配置检查清单
为避免脚本“写了不跑”,可在每次新建动作后按下面清单核对。以下字段可直接作为工程检查表使用:
| 检查项 | 正确做法 | 常见错误 |
|---|---|---|
| 项目类型匹配 | 跨站变量加服务器前缀 | 客户机脚本直接读服务器本地变量 |
| 脚本存放位置 | 后台逻辑放全局脚本 | 把定时采集写在画面事件里 |
| 触发器配置 | 全局动作必须设触发器 | 动作无触发器,永不执行 |
| 编译状态 | C动作编译通过再运行 | 语法错误未编译,动作不生效 |
| 变量名拼写 | 用对象浏览器插入变量 | 手写变量名大小写不符 |
| 诊断确认 | 看诊断窗口触发次数 | 只看画面无反应就反复改代码 |
举例说明:某多用户项目中,客户机上一个按钮需要把“启动”变量置1。若该变量属于服务器,脚本应写成带服务器前缀的引用;若误写成本机变量,按钮点击后画面无任何反应,诊断窗口也不会报错,因为脚本本身语法正确,只是操作了错误的变量。此时用变量表监视服务器变量即可确认问题所在。这类“无报错但不生效”的问题,正是理解运行环境后最容易快速定位的。
掌握项目类型、脚本分类、触发器与诊断工具这四件事,就能在写第一行代码之前,先判断脚本该放在哪里、由什么驱动、出错时去哪里看。这是WinCC脚本工程化开发的基本功。