介绍VARIANT 数据类型前先对间接寻址做个补充:
S7-1200 和 S7-1500 所有的编程语言都提供以下间接寻址选项:
● 通过指针间接寻址
● ARRAY元素的间接索引
● 通过DB_ANY数据类型间接寻址数据块。
SCL语言中,间接寻址可以通过以下指令读写变量存储区:
● POKE 写入存储器地址
● POKE_BOOL 写入存储器位
● PEEK 读取存储器地址
● PEEK_BOOL 读取存储器位
● POKE_BLK 写入存储区域
Variant指针介绍
VARIANT数据类型的参数是一个指针或引用,是西门子S7-1200/1500系列PLC支持的一种新数据类型,它是一种可以指向基本数据类型、复杂数据类型或者用户自定义类型的引用。
VARIANT 指针可以是基本数据类型(例如,INT 或 REAL)的对象。还可以是 STRING、DTL、STRUCT 类型的 ARRAY、UDT、UDT 类型的 ARRAY。
VARIANT 数据类型的操作数不占用背景数据块或工作存储器中的空间。但是,将占用 CPU 上的存储空间。
西门子S7-300/400支持ANY指针,那么VARIANT 指针与ANY指针有什么区别呢?其实有以下两点:
- 从指向的数据类型来说,ANY支持基本数据类型、字符串等;但不支持数组、用户自定义类型等复杂数据类型;Variant可以引用几乎所有的数据类型(数组、结构、UDT)的变量,比ANY功能强大;
- 从占用的空间来说,ANY需要占用10个字节的存储空间,而Variant不占用背景数据块或者工作存储器的空间。
Variant相关指令
1、TypeOf指令:检查 VARIANT 变量的数据类型。
IF 或 CASE 指令可以检查 VARIANT 变量所指向的变量的数据类型,与其它变量的比较用IF TypeOf <操作数1> = TypeOf <操作数2> THEN ...; END_IF;格式,与某个数据类型比较用“IF TypeOf <操作数1> = 数据类型 THEN...;END_IF;”格式。示例如下:
2、TypeOfElement指令:检查 VARIANT 变量的 ARRAY 元素的数据类型
同TypeOf指令类似,TypeOfElement指令可以查询VARIANT 变量所指向的变量的数据类型,格式为IF TypeOfElements<操作数1> = TypeOF<操作数2> THEN ... END_IF;或IF TypeOfElements<操作数1> = 数据类型 THEN ... END_IF;示例如下:
3、IS_ARRAY指令:检查 ARRAY
IS_ARRAY指令查询 VARIANT指针指向变量的数据类型是不是ARRAY数组,而与前面两个指令不同的是只能使用在IF 指令中。
4、VariantGet/VariantPut指令:
VariantGet指令与VariantPut指令读出与写入VARIANT变量值,比较简单,只需注意读出时SRC 参数具有VARIANT数据类型,DST 参数指定除VARIANT外的任何数据类型并且与VARIANT指向的数据类型相匹配,写入时DST参数具有VARIANT数据类型,SRC参数指定除VARIANT外的任何数据类型并且与 VARIANT 指向的数据类型相匹配。
Variant还有一些其它指令在此就不作详细介绍了。