技术论坛

 TIA PORTAL(博图)中的Variant类型

返回主题列表
作者 主题
HwLib(慧兰博)
侠士

经验值: 1037
发帖数: 61
精华帖: 5
楼主    2017-07-05 19:41:15
主题:TIA PORTAL(博图)中的Variant类型 精华帖 

    VARIANT是TIA PORTAL中一种全新的数据类型,仅适用于S7-1200/1500,它被设计用来取代ANY、POINTER类型。VARIANT是一种安全的类型,它不会产生类似于内存访问错误之类的问题。和ANY、POINTER类型一样,VARIANT的意义在于传递参数,也就是作为块的接口,这几种类型的引入极大的提高了PLC编程的灵活性。和ANY、POINTER类型不一样的是它不可以被解析,只能通过系统提供的指令进行操作。

    本质上,Variant和Any及Pointer这三种类型区别并不大,都是属于引用类型,并不占用内存空间,它们访问的是传入参数的地址。也正因为这个原因在DB中是不允许声明Variant类型的变量的。但作为接口参数,在背景DB中允许Variant存在。将背景DB切换为标准访问模式可以发现Variant类型的变量是不占用空间的,它们没有地址偏移,参见下图。

        因此VARIANT一般用于FB/FC接口参数的传递,而它被创建的意义也在于此。VARIANT可以传递除POINTER和ANY以外的任何类型的参数,在使用时首先用指令判断实参的实际类型然后进行读写。

对于SCL编程,TIA Portal提供了四种指令用以判断传入参数的数据类型,如下表所列。

    当我们获得了传入参数的数据,那我们就可以分别调用VariantGet和VariantPut指令去读写该参数的值,下面的变量声明和代码清单演示了这一操作。

    这段代码的功能是先判断变量in3是否属于INT类型,若不是则退出。若是的话,先读出该变量的值并传送到变量Q,再将该变量的值初始化为零。

    由此可见,VARIANT类型在易用性方面较ANY和POINTER类型更强一点。最重要的是,它是安全的,不会发生在运行时指向一个不存在的内存区域的情况。当然在提供安全性的同时,VARIANT类型也牺牲了一定的功能。

通常我们在开发一个带外部参数的FC或FB时都要为其指定相应的数据类型。而常常我们在调用该FC或FB时可能需要传入不同类型的变量。以一个开关选择器模块为例,这个模块有三个数值输入引脚、二个开关信号引脚和一个选择后的输出数值信号引脚,参见下图。

    对于该选择器模块,当我们在调用它时,有时可能传入的变量是整型,有时可能是双整型,而有时可能又是实型。基于这种情况,那我们可能需要分别编写参数类型为整型、双整型、单精度实型和双精度实型的模块来满足不同情况下的调用。而可不可能我们只编写一个模块就能满足不同情况下的调用呢?Variant类型可以满足这样的需求,只要我们将三个输入的数值参数和一个输出的数值参数定义为Variant类型就可以实现。这样我们在调用该模块时将被允许传入整型或双整型等不同类型的变量。

    下面我们以编写一个这样的模块来进一步了解Variant变量的使用。限于篇幅下图贴出了部分代码

    完成模块并调用,并为之分别赋予不同类型的参数。编译并下载到PLC中,可以看到无论是双整型变量还是浮点型变量,该模块都能正确的工作。但缺点也显而易见,就是模块的体积太大了。如前说述,Variant是引用传入参数的地址,因此自身无法做运算,只能将数据移入各种类型的临时变量再做运算。




www.hwlib.com.cn 《TIA PORTAL顶级编程技术》
question
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
1楼    2017-07-06 05:54:22
主题:回复:TIA PORTAL(博图)中的Variant类型

写的不错..

这就是PC编程的泛型吧...

drongh
渔明鱼工
至圣

经验值: 23908
发帖数: 2059
精华帖: 78
2楼    2017-07-06 06:08:50
主题:回复:TIA PORTAL(博图)中的Variant类型

感谢分享,置精吧!

网鱼能够改善伙食,还能释放工作中的压力。
HwLib(慧兰博)
侠士

经验值: 1037
发帖数: 61
精华帖: 5
3楼    2017-07-06 07:44:17
主题:回复:TIA PORTAL(博图)中的Variant类型

就是这个意思!

只不过泛型是高级编程语言中的概念,搞自动化的不一定清楚,所以没提出来。

www.hwlib.com.cn 《TIA PORTAL顶级编程技术》
月雨风云
至圣

经验值: 10630
发帖数: 2355
精华帖: 10
4楼    2017-07-06 07:58:46
主题:回复:TIA PORTAL(博图)中的Variant类型

感谢分享,总结的不错!

学无止境
周杰伦
至圣

经验值: 13749
发帖数: 2032
精华帖: 16
5楼    2017-07-06 08:15:23
主题:回复:TIA PORTAL(博图)中的Variant类型

感谢分享.

工控毁我青春!
v_wind
侠圣

经验值: 2551
发帖数: 299
精华帖: 3
6楼    2017-07-06 09:46:17
主题:回复:TIA PORTAL(博图)中的Variant类型

真的不错,谢谢分享这样的小知识点。

西门庆庆
游士

经验值: 188
发帖数: 20
精华帖: 1
7楼    2017-07-07 11:43:13
主题:回复:TIA PORTAL(博图)中的Variant类型
谢谢慧大师的分享,辛苦了!
你们好
question
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
8楼    2017-07-07 18:22:43
主题:回复:TIA PORTAL(博图)中的Variant类型

自己测试了一下,发现楼主的程序有问题啊. output区是不能设定Variant类型的,只有inout才可以.

但从图上,楼上明显是用的output.


另外 IF 语句最好不要这么用, 要用if  elsif


另外在temp 区变量可以选择Variant, 不明白为啥? Variant是不能直接赋值给temp变量的.




drongh
HwLib(慧兰博)
侠士

经验值: 1037
发帖数: 61
精华帖: 5
10楼    2017-07-08 14:57:37
主题:回复:TIA PORTAL(博图)中的Variant类型

程序没有问题,贴图足以说明了

www.hwlib.com.cn 《TIA PORTAL顶级编程技术》
question
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
12楼    2017-07-09 08:00:11
主题:回复:TIA PORTAL(博图)中的Variant类型

我在V14 SP1 下简单写了一下, 程序如下:





和你的程序是不一样的, output 是不能Variant的,只能用inout

drongh
question
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
13楼    2017-07-09 08:06:56
主题:回复:TIA PORTAL(博图)中的Variant类型

看来我明白了,楼主是建在FC中的,我建在FB中的,两个参数声明有点不一样...



drongh
yming
至圣

经验值: 127368
发帖数: 22003
精华帖: 824
22楼    2017-09-25 21:02:22
主题:回复:TIA PORTAL(博图)中的Variant类型

楼主只是研究一下Variant这个类型而写的程序。

其实,真正使用并不需要去判断数据类型

为什么?

因为 指令 VariantGet 指令在获取值的时候,就会检查数据类型是否正确。不正确,它就不传送!

既然如此,就不用去判断。

使用Variant的主要原因,正如楼主说的那样,是为了能用一个函数、函数块来实现(TIA未提供的)某种功能、某种计算。并且要求它能接受不同的数据类型。

而针对上述具体的某种功能、计算,往往数据类型是有限的。比如计算,数据类型就是整型、双整型、单精度实型和双精度实型这几种。你只需要声明这几个类型的TEMP局部变量,用VariantGet逐一获得对应的值即可,反正类型不对,不传送,ENO=0;只有正确的(唯一的)ENO=1。余下的计算处理就明确了数据类型。

,处理结束时,就把结果给VariantPut输出即可。(通常,计算Input 是啥,结果也是相同数据类型)

这种方法,确实如楼主所说,占用不少存储区。如果只是占用程序存储区,而不是工作存储区,还是可以接受的。(这点是我猜的。因为当你调用这个功能或功能块的时候,数据类型已经确定了。编译后,TIA不会把你没用到的也放到工作存储区中。就像基本指令MOVE,它各种有效数据类型都接受,但绝不会把所有类型的MOVE功能,都放到工作存储区中的。)

所以,就像Zane 版主所说那样,其实Variant就是个对变量的解释说明,更形象的如kayan大侠说的“更像个管道”。



学而时习之,不亦说乎?温故而知新,不亦乐乎?
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。