4. 变量与数据交互:内部变量、外部变量、变量管理、读写变量、数据类型转换、变量前缀与寻址方式

在WinCC(Windows Control Center)组态环境中,变量是连接人机界面(HMI)与自动化控制系统(如S7-1200/1500、S7-300/400或第三方PLC)的桥梁。无论是简单的按钮操作、数值显示,还是复杂的配方管理、趋势归档,本质上都是对变量的读写操作。本章将系统讲解WinCC中变量的分类体系、管理方法、读写机制以及数据类型转换规则,帮助学员建立清晰的变量操作思维,为后续脚本编程和高级画面设计打下坚实基础。

WinCC变量体系与数据交互核心链路 变量分类 内部变量(无PLC关联) 外部变量(连接PLC/驱动) 系统变量(@Cursor等) 变量管理核心操作 1. 创建/删除变量组 2. 定义数据类型与地址 3. 设置采集周期与归档 4. 变量前缀与寻址映射 5. 在线监视与诊断 脚本读写与转换 GetTag/SetTag 读写 GetTagBit/SetTagBit 位操作 数据类型转换(Int↔Float等) 变量前缀(@、#、::) 寻址方式(/符号) 数据交互链路 HMI画面/脚本 → WinCC变量管理 → 通信驱动 → PLC存储区 内部变量:仅存在于WinCC运行系统内存中,用于中间计算与画面逻辑 外部变量:通过通信驱动(TCP/IP、MPI、PROFIBUS)实时同步PLC数据

上图展示了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负担,又保证了画面刷新速度。

经验提醒:当外部变量数量超过500个时,建议将采集周期从默认的250ms调整为1s或更长,并合理分组,避免通信阻塞导致画面卡顿。

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 操作流程

  1. 在变量管理器中右键“新建变量组”,命名如“反应釜控制”。
  2. 在组内新建变量,选择数据类型(如浮点数32位IEEE 754)。
  3. 对于外部变量,选择连接(Connection),填写PLC IP地址、机架/插槽号。
  4. 设置存储地址:符号寻址输入PLC符号名,寻址输入如DB100.DBD12。
  5. 设置采集周期(默认250ms)和归档选项(用于趋势记录)。
风险提示:寻址时务必核对PLC数据块偏移量,一旦错位可能导致读写异常数据,甚至引发设备误动作。建议在PLC侧使用符号名+注释,并在WinCC中勾选“允许符号寻址”。

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。

操作步骤:

  1. 在PLC中定义模拟量输入地址(如PIW256),WinCC中创建外部变量Raw_Temp,数据类型为无符号16位。
  2. 创建内部变量Real_Temp,数据类型为浮点32位。
  3. 在画面“周期执行”脚本中编写:
#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变量操作的核心知识。学员应重点掌握内部变量与外部变量的适用边界,熟练使用变量前缀进行跨组访问,并养成显式类型转换的编程习惯。在实际项目中,建议先规划变量清单(名称、类型、地址、采集周期),再实施组态,可大幅减少后期调试工作量。