一、Variant介绍
VARIANT数据类型的参数是一个指针或引用,它可以指向各种不同的数据类型的变量(除了实例),VARIANT指针可以是基本数据类型(例如INT、REAL)的对象,也可以是UDT、DTL、strust、ARRAY等数据类型的对象。VARIANT数据类型的操作数不占用背景数据块或工作存储器的空间,但是运行VARIANT指针时占用CPU上的存储空间。
整个介绍降维来说,就是两个意思:
Variant类型就是所有常见数据类型的代名词,给Variant什么数据类型,它就是什么数据类型。
Variant作为FB\FC块的接口不能用于FB的INOUT、OUT接口。相比较FB来说更适用于FC块,即对数据进行临时处理。
二、代码实现描述
该功能块实现的功能为一键转换数据类型,常见的数据类型都可以进行无条件转换,代码如下:
解析输入#IN变量,通过分析输入#IN的数据类型,将变量#IN赋值给特定的中间变量,例如当#IN的数据类型为bool,则将#IN赋值给变量#IN_BOOL,再将#IN_BOOL通过BOOL_TO_DINT指令转换为DINT数据类型并赋值给#TEMP变量,通过分析#OUT的数据类型形成判断条件,执行特定的程序段。
例如当#OUT的数据类型为BYTE,则将#TEMP变量执行DINT_TO_BYTE指令,将#TEMP转换为BYTE数据类型后赋值给变量#OUT_BYTE,最后再将变量#OUT_BYTE赋值给#OUT输出并RETURN
Variant不仅可以用于常用数据类型,可以用于ARRAY数组,例如通过对Array[*] of Bool的分析可将bool类型的数组转换为BYTE、WORD、DWORD。代码如下:
解析输入变量#IN,当#IN的数据类型为ARRAY且元素的数据类型为BOOL,则获取ARRAY的元素长度,通过对ARRAY数组的长度形成判定条件,不同的长度执行不同的程序段,例如当#IN为Array[0..7] of Bool,则变量ARRAY_Lenght=8,再将IN赋值给数值变量#ARRAY_1,然后通过GATHER指令将#ARRAY_1—Array[0..7] of Bool 集合为BYTE数据类型并赋值给输出#OUT,最后RETURN
三、结论
在该功能块添加相应的数据类型处理程序后,我们就可以通过该功能块对大部分常用的数据类型进行数据类型转换。例如将BYTE类型转换为INT,可以直接配置#IN为BYTE数据类型以及#OUT为INT数据类型就可以实现转换,其他的数据类型转换也是一样
四、附加
通过构建数据类型转换功能块,我们就可以基于该功能块构建其他更方便的底层功能块。例如:
缩放指令(将#IN值以#IN_MAX至#IN_MIN的区间缩放为以#OUT_MAX至#OUT_MIN区间的值)
所有的IN\OUT变量都可以先转换为REAL,再由公式计算后得出OUT值
具体公式如下:
OUT = [((FLOAT (IN) – K1)/(K2–K1)) ∗ (HI_LIM–LO_LIM)] + LO_LIM;