西门子Variant变量介绍
为什么要使用Variant?
如果我们在编写FB或者FC块时,使用了输入参数或者输出参数,那么我们必须先给这个参数定义一个数据类型,例如int, real,string等。
而我们要调用这个FC块或者FB块的时候,也必须给对应的形参提供正确数据类型的实参。
但如果有些块的功能,它们逻辑完全一样,只有输入的数据类型不同呢?那我们是不是应该每种数据类型都编写一个块呢?有没有方法可以实现,就算输入不同的数据类型,也能得到对应的结果呢?答案就是我们今天要讲的这个variant数据类型。
简单来说,如果你不确定输入是一个什么类型的数据,你可以先把它定义成variant,然后当你输入实参时,再去判断你输入的数据类型,然后根据不同的数据类型进行不同的操作,最后得出结果。
如何使用Variant?
说得可能比较抽象,那么我们直接举个例子来说明这个variant的用法吧。
假设我要创建一个FB块,它实现一个累加的功能,它的输入是一个数组,这个数组的长度不确定,数组里面元素的数据类型也不确定,要求我们把数组里面的所有项相加起来,得出一个总和。
为了简化这个模型,我们假设输入只有两种数据类型,分别是int和real。
整体思路大概如下。
下面是具体的实现方法。
首先我们先创建一个FB块,选择SCL语言编写。先定义一下输入输出引脚。这里要注意的是,variant只能作为输入或者输入输出,而不能作为输出。
这里我们需要两个输入,分别是arrayInput和start。其中前一个参数是用来接收一个数组对象。而start参数则用来控制求和开始。
如果发生报警,error为true。
sum则是我们的求和结果。
然后其他变量定义如下,具体有什么作用?后面我们使用时会介绍。
开始我们要判断输入对象是不是一个数组?这里我们要用到IS_ARRAY()这个函数,如果是数组的话,返回true,否则返回false。
首先,不是数组的话,我们直接把error置true。
反之,如果结果是数组,接着我们要计算数组的长度。这里用CountOfelements()这个函数。
接着,我们就要判断这个数组它的元素类型。TypeOfElement()就可以实现这个功能。它会返回一个数据类型,然后我们把这个返回值跟int,还有real做对比。
假设它返回的是一个int数组,那么我们就把这个输入的数组赋值给一个int数组。
同理,如果返回的是real数组,那么我就把arrayList赋值给real数组。int数值和real数组,它的求和就比较简单了。这里就忽略不讲了。最后我们求出来的那个和,它是一个int类型,但这样子是不满足需求的。因为假设我们输入的是一个real数组,那么我们不可能输出一个int值的和。
所以我们要把这个int值再转化成variant类型。real写法也是同样道理。那样我们的这个FB块就完成了,下面是具体的写法。
写完之后,我们再创建一个DB块。在里面添加两个数组,分别是int类型和real类型。还有两个和。然后把两个数组按照以下的初始值来给它设定。
最后我们在主程序里面调用两次FB块,并在FB块填入data数据块里面的值。然后使用一个M10.0作为触发按钮。
然后把程序下载到plc里面,点击自动运行,切换到在线监控。然后我们手动把那个M10.0切换成true。可以看到两个fb实例的那个和的值已经出来了。一个是15,另一个是16.5。一个是整形,一个是浮点数。说明这个fb块基本实现它的功能。
