4. 变量与数据交互:内部变量、外部变量、变量管理、读写变量、数据类型转换、变量前缀与寻址方式
在WinCC(Windows Control Center)组态环境中,变量是连接人机界面(HMI)与自动化控制系统(如S7-1200/1500、S7-300/400或第三方PLC)的桥梁。无论是简单的按钮操作、数值显示,还是复杂的配方管理、趋势归档,本质上都是对变量的读写操作。本章将系统讲解WinCC中变量的分类体系、管理方法、读写机制以及数据类型转换规则,帮助学员建立清晰的变量操作思维,为后续脚本编程和高级画面设计打下坚实基础。
上图展示了WinCC变量体系的整体框架。从图中可以看出,变量管理处于核心位置,向上承接HMI画面与脚本的读写请求,向下通过通信驱动与PLC进行数据交换。理解这一链路是掌握变量操作的前提。
4.1 内部变量与外部变量的本质区别
4.1.1 核心原理
内部变量(Internal Tags)仅存在于WinCC运行系统的内存中,不与任何PLC或外部设备通信。它们主要用于:画面元素之间的逻辑联动、脚本计算的中间结果、用户登录状态、系统时间戳等临时数据。内部变量不占用PLC资源,读写速度极快,但断电后数据丢失(除非配置了保持性)。
外部变量(External Tags)通过通信驱动程序与PLC的存储区(如M区、DB块、I/Q区)建立映射关系。每个外部变量必须指定:通信驱动程序(如SIMATIC S7-1200/1500)、PLC站地址、数据类型、存储区域及偏移地址。外部变量的值实时或周期性地与PLC同步,是HMI与自动化系统交互的主要通道。
4.1.2 判断方法
| 对比维度 | 内部变量 | 外部变量 |
|---|---|---|
| 数据存储位置 | WinCC运行系统内存 | PLC存储区(M/DB/I/Q) |
| 通信开销 | 无 | 占用通信带宽,受采集周期影响 |
| 断电保持 | 默认不保持 | 取决于PLC存储区属性 |
| 适用场景 | 画面逻辑、中间计算、临时状态 | 工艺参数、设备状态、报警值 |
| 创建位置 | 变量管理 → 内部变量 | 变量管理 → 外部变量(需选驱动) |
4.1.3 实战场景
某水处理项目中,需要计算两台泵的累计运行时间差。若直接使用外部变量存储计算结果,会频繁占用PLC通信资源。正确做法是:在WinCC中创建内部变量Pump1_RunTime和Pump2_RunTime,通过脚本每秒累加一次,再计算差值显示在画面上。这样既减轻了PLC负担,又保证了画面刷新速度。
4.2 变量管理与寻址方式
4.2.1 变量管理器的组织结构
WinCC的变量管理器(Variable Management)采用树形结构,根节点下包含“内部变量”和已安装的通信驱动程序(如“SIMATIC S7-1200/1500”)。每个驱动下可创建多个变量组(如“电机控制”、“温度采集”),变量组内再定义具体变量。合理的分组能显著提升工程维护效率。
4.2.2 变量前缀与寻址规则
在WinCC脚本(C脚本或VBS脚本)中,访问变量需遵循特定前缀规则:
- 无前缀:直接写变量名(如
Motor_Start),适用于当前画面所属的变量管理器的变量。 - @前缀:访问系统变量(如
@CursorX、@Time)。 - #前缀:在画面对象属性动态对话框中,引用当前画面或对象范围的变量。
- ::前缀:跨变量管理器访问,格式为
::变量组.变量名(如::电机控制.Motor_Speed)。
外部变量的寻址方式分为寻址和符号寻址。寻址直接指定存储区及偏移(如DB10.DBD4),符号寻址则使用PLC中定义的符号名(如"Pump_Speed")。建议优先使用符号寻址,便于跨平台移植和工程阅读。
4.2.3 操作流程
- 在变量管理器中右键“新建变量组”,命名如“反应釜控制”。
- 在组内新建变量,选择数据类型(如浮点数32位IEEE 754)。
- 对于外部变量,选择连接(Connection),填写PLC IP地址、机架/插槽号。
- 设置存储地址:符号寻址输入PLC符号名,寻址输入如
DB100.DBD12。 - 设置采集周期(默认250ms)和归档选项(用于趋势记录)。
4.3 脚本读写变量与数据类型转换
4.3.1 读写变量的标准方法
在C脚本中,最常用的读写函数为GetTag和SetTag,其变体包括GetTagBit、SetTagBit(位访问)、GetTagWord、SetTagDWord等。VBS脚本则使用HMIRuntime.Tags("变量名").Read和.Write方法。
// C脚本示例:读取外部变量并写入内部变量
#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
float fSpeed = GetTagFloat("::反应釜控制.搅拌速度");
float fScale = GetTagFloat("ScaleFactor");
SetTagFloat("DisplaySpeed", fSpeed * fScale);
}
4.3.2 数据类型转换的陷阱
WinCC变量类型与PLC数据类型并非一一对应。常见转换场景包括:
- 整数与浮点:
GetTagInt返回16位整数,GetTagFloat返回32位浮点。若PLC使用INT(16位)而WinCC定义为Float,需先读取再强制转换。 - BCD码转换:某些仪表输出BCD码,需通过脚本逐位解析。
- 字符串与数值:使用
sprintf或sscanf进行格式化转换。
SetTagInt("Tag", (int)fValue),并考虑四舍五入策略。
4.3.3 案例拆解:温度采集与线性转换
背景:某热处理炉使用PT100热电阻,通过变送器输出4-20mA信号,接入PLC模拟量模块(0-27648对应0-1000℃)。WinCC需显示实际温度值。
初始现象:画面直接显示原始整数值(如13824),操作员无法理解。
分析过程:需将原始值转换为工程量。转换公式为:实际温度 = (原始值 / 27648) × 1000。
操作步骤:
- 在PLC中定义模拟量输入地址(如PIW256),WinCC中创建外部变量
Raw_Temp,数据类型为无符号16位。 - 创建内部变量
Real_Temp,数据类型为浮点32位。 - 在画面“周期执行”脚本中编写:
#include "apdefap.h"
void OnCycle()
{
int iRaw = GetTagWord("Raw_Temp");
float fTemp = (float)iRaw / 27648.0f * 1000.0f;
SetTagFloat("Real_Temp", fTemp);
}
结果对比:转换前画面显示13824,转换后显示500.0℃,与实际温度一致。
复盘经验:模拟量转换务必考虑变送器量程和PLC模块分辨率,且脚本执行周期应小于PLC采集周期,避免数据滞后。
4.4 常见误区与总结复盘
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 滥用外部变量存储中间结果 | 通信负载高,画面响应慢 | 使用内部变量进行中间计算 |
| 忽略数据类型匹配 | 数据溢出、精度丢失 | 严格匹配PLC数据类型,必要时显式转换 |
| 变量命名无规范 | 工程维护困难,脚本易错 | 采用“设备_属性”命名法,如Pump1_Speed |
| 未设置采集周期 | 默认250ms可能过频或过疏 | 根据信号变化速度调整(如温度1s,转速100ms) |
| 符号寻址与寻址混用 | 移植时地址错乱 | 统一使用符号寻址,并在PLC侧维护符号表 |
本章从变量分类、管理架构、读写方法到类型转换,系统梳理了WinCC变量操作的核心知识。学员应重点掌握内部变量与外部变量的适用边界,熟练使用变量前缀进行跨组访问,并养成显式类型转换的编程习惯。在实际项目中,建议先规划变量清单(名称、类型、地址、采集周期),再实施组态,可大幅减少后期调试工作量。