3. WinCC内部变量与过程变量联合使用
内部变量与过程变量的分工
WinCC 中的变量分为两类:内部变量不连接 PLC,由 WinCC 自身读写,适合保存画面切换状态、当前登录用户、权限等级等运行期数据;过程变量通过通信通道映射到 PLC 地址,用于反映设备真实状态。本案例的目标是让两者协同工作:内部变量负责“界面与权限”,过程变量负责“设备状态”,并在画面中形成联动。
下面先明确本案例使用的变量清单与地址映射,再实现联动逻辑。
| 变量名 | 类型 | 连接/地址 | 数据类型 | 用途 |
|---|---|---|---|---|
| CurrentScreen | 内部变量 | — | 无符号 16 位 | 记录当前画面编号,用于画面切换 |
| CurrentUser | 内部变量 | — | 文本 8 位字符集 | 保存当前登录用户名 |
| UserLevel | 内部变量 | — | 无符号 8 位 | 权限等级:0=操作员,1=工程师,2=管理员 |
| Pump_Run | 过程变量 | S7-300, DB1.DBX0.0 | 二进制(BOOL) | 泵运行状态反馈 |
| Valve_Open | 过程变量 | S7-300, DB1.DBX0.1 | 二进制(BOOL) | 阀门开到位反馈 |
| Tank_Level | 过程变量 | S7-300, DB1.DBW2 | 有符号 16 位 | 储罐液位(0~27648 对应 0~100%) |
创建内部变量
在 WinCC 项目管理器的“变量管理”中,右键“内部变量”选择“新建变量”,依次建立 CurrentScreen、CurrentUser、UserLevel。内部变量不需要选择驱动和地址,只需指定数据类型和初始值。建议将 CurrentScreen 初始值设为 1,UserLevel 初始值设为 0,避免画面启动时出现未定义状态。
创建过程变量
在“变量管理 → SIMATIC S7 Protocol Suite → MPI”下新建连接,命名为“S7_300_Line1”,然后在该连接下新建 Pump_Run、Valve_Open、Tank_Level 三个过程变量,分别填写上表中的地址。创建完成后打开变量仿真或连接实际 PLC,观察“质量代码”列是否变为“良好”,确认通信正常。
联动逻辑设计
联动的核心是:内部变量决定“谁能操作、在哪个画面操作”,过程变量决定“操作对象当前是什么状态”。具体规则如下:
- 画面切换按钮写入 CurrentScreen,画面窗口根据 CurrentScreen 的值切换显示内容。
- 登录按钮写入 CurrentUser 和 UserLevel;UserLevel 控制操作按钮的“允许操作”属性。
- 泵和阀门的图形对象绑定 Pump_Run、Valve_Open,用颜色表示状态;只有 UserLevel ≥ 1 时,操作按钮才可点击。
- 液位棒图绑定 Tank_Level,并按 0~27648 线性映射到 0~100%。
关键实现:按钮与画面窗口的联动
以“画面切换按钮”为例,在按钮的鼠标点击事件中写入 C 脚本:
// 画面切换按钮:点击后切换到工艺流程画面
SetTagWord("CurrentScreen", 2);
画面窗口的“画面名称”属性使用动态对话框,选择“变量”方式,绑定 CurrentScreen,并配置值范围:1 对应主画面,2 对应工艺流程画面,3 对应报警画面,4 对应趋势画面,5 对应参数设置画面。
权限控制按钮的脚本如下:
// 登录按钮:根据输入的用户名设置权限等级
char* user = GetTagChar("CurrentUser");
if (strcmp(user, "admin") == 0)
SetTagByte("UserLevel", 2);
else if (strcmp(user, "engineer") == 0)
SetTagByte("UserLevel", 1);
else
SetTagByte("UserLevel", 0);
泵操作按钮的“允许操作”属性绑定 UserLevel,动态对话框配置为:UserLevel ≥ 1 时允许操作,否则禁用。这样操作员只能查看,工程师和管理员才能下发指令。
过程变量状态显示
泵图形对象的填充颜色通过动态对话框绑定 Pump_Run:值为 1 时填充绿色(运行),值为 0 时填充灰色(停止)。阀门对象同理绑定 Valve_Open。液位棒图的“过程驱动连接”选择 Tank_Level,并设置线性映射:变量值 0 对应 0%,27648 对应 100%。
常见问题与排查
- 过程变量质量代码不是“良好”:检查 MPI 连接参数、PLC 地址是否正确,以及 PLC 是否处于运行状态。
- 内部变量写入后画面无变化:确认动态对话框绑定的变量名拼写一致,且变量类型匹配(如 CurrentScreen 为无符号 16 位)。
- 权限按钮始终可点击:检查“允许操作”动态对话框的表达式是否使用了 UserLevel,并确认比较运算符正确。
- 液位显示跳变或超范围:确认 Tank_Level 的数据类型为有符号 16 位,且映射范围与 PLC 侧一致。