在西门子 PLC(如 S7-1200/S7-1500)的博图(TIA Portal)环境中,VARIANT(变体) 是一种通用数据类型,其核心特点是 “可动态存储不同类型的数据,并记录数据的类型信息”。它类似于编程语言中的 “万能类型”,主要用于需要灵活处理多种数据类型的场景(如通用函数块、数据转换工具等)。
动态类型存储VARIANT 变量可以存储几乎所有西门子 PLC 支持的基础数据类型(如 BOOL、INT、DINT、REAL、STRING、ARRAY、STRUCT 等),且在存储数据时会自动记录该数据的类型信息(如 “当前存储的是 INT 类型”“当前存储的是 REAL 类型”)。
例如:同一个 VARIANT 变量,可先存储一个 INT 类型的数值(如 100),后续再存储一个 REAL 类型的数值(如 3.14),变量会自动更新内部的类型标识。
固定长度VARIANT 在 PLC 中占用16 字节固定长度(与存储的数据类型无关),其中包含两部分信息:
数据本身的存储(根据类型动态分配空间,最长不超过 16 字节);
数据类型的标识(记录当前存储的数据属于哪种类型,如 “INT”“REAL” 等)。
兼容性仅支持 S7-1200(固件版本 V4.0 及以上)、S7-1500(固件版本 V2.0 及以上),旧型号 PLC(如 S7-300/400)不支持 VARIANT 类型。
二、VARIANT 的典型用途
VARIANT 的核心价值是 **“通用性”**,解决了 “同一功能块需适配多种数据类型” 的问题,常见场景包括:
通用函数块(FB):例如创建一个 “数据校验” FB,输入参数可能是 INT、REAL、STRING 等不同类型,用 VARIANT 作为输入,可避免为每种类型单独设计 FB。
数据转换工具:实现不同类型数据的动态转换(如将 VARIANT 存储的 INT 转为 REAL),无需提前确定输入类型。
数组 / 列表处理:存储多种类型的数据到同一个数组(如 VARIANT 数组),灵活管理混合类型的数据集合。
三、VARIANT 的使用方法(结合博图指令)
在博图中,需通过系统函数处理 VARIANT 变量(无法直接像普通变量一样赋值或运算),核心函数如下:
函数名称
功能描述
VAR_TYPE 获取 VARIANT 变量当前存储的数据类型(返回类型标识,如 16#0002=INT,16#0005=REAL)。
VAR_SET 向 VARIANT 变量写入指定类型的数据(需明确源数据类型)。
VAR_GET 从 VARIANT 变量中读取数据,并转换为目标类型(需确保类型兼容,否则报错)。
VAR_IS_VALID 检查 VARIANT 变量是否包含有效数据(非空且类型标识正确)。
示例:VARIANT 的基本操作
假设需创建一个 VARIANT 变量,先存储 INT 类型数据,再读取并转换为 REAL:
定义变量:在 DB 块中定义:
Var_Data:VARIANT 类型(存储动态数据);
Int_Value:INT 类型(源数据,如 200);
Real_Value:REAL 类型(目标数据,接收转换后的值);
Type_ID:INT 类型(存储 VARIANT 的类型标识)。
写入数据(VAR_SET):
scl
// 向Var_Data写入INT类型的Int_Value
"VAR_SET"(
Value := "Int_Value", // 源数据(INT类型)
Result := "Var_Data" // 目标VARIANT变量
);
获取类型(VAR_TYPE):
scl
// 读取Var_Data的类型标识(INT类型的标识为16#0002)
"Type_ID" := "VAR_TYPE"(Value := "Var_Data");
读取并转换(VAR_GET):
scl
// 从Var_Data中读取数据,转换为REAL类型并存储到Real_Value
"VAR_GET"(
Value := "Var_Data", // 源VARIANT变量
Result := "Real_Value" // 目标REAL变量
);
// 此时Real_Value的值为200.0
四、注意事项
类型兼容性:使用VAR_GET转换数据时,需确保 VARIANT 存储的类型与目标类型兼容(如 INT 可转为 REAL,但若 VARIANT 存储的是 STRING,直接转为 INT 会报错)。建议先用VAR_TYPE检查类型,再执行转换:
scl
IF "Type_ID" = 16#0002 THEN // 确认是INT类型
"VAR_GET"(Value := "Var_Data", Result := "Real_Value");
ELSE
"Error_Flag" := TRUE; // 类型不兼容,触发错误
END_IF;
存储限制:VARIANT 无法存储超过 16 字节的数据(如长 STRING、大数组),若数据长度超过 16 字节,VAR_SET会返回错误。
使用范围:VARIANT 变量仅支持在 DB 块(全局 DB 或背景 DB)或临时变量(L 区)中定义,不能直接用于过程映像区(I/Q 区)。
性能影响:由于 VARIANT 需要动态处理类型信息,其操作效率略低于固定类型变量,不建议在高频循环(如 1ms 时钟中断)中大量使用。
五、总结
VARIANT 是西门子 PLC 中用于 “动态处理多类型数据” 的灵活工具,通过VAR_SET/VAR_GET等函数实现数据的写入、读取与转换,核心优势是简化通用函数块的设计。使用时需注意类型兼容性和存储限制,适合在需要通用性而非极致性能的场景中使用。