技术论坛

TIA PORTAL(博图)中的Variant类型

作者 主题
侠士

经验值: 1037
发帖数: 61
精华帖: 5
主题:【分享】TIA PORTAL(博图)中的Variant类型
精华帖精华帖星级4级 推荐帖


只看楼主 只看精华 楼主 2017-07-05 19:41:15

    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顶级编程技术》
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1405594&b_id=66&s_id=0&num=30

奇侠

经验值: 5455
发帖数: 841
精华帖: 5
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 1楼 2017-07-06 05:54:22

写的不错..

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


drongh
以下网友喜欢您的帖子:

  
至圣

经验值: 23905
发帖数: 2059
精华帖: 78
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 2楼 2017-07-06 06:08:50

感谢分享,置精吧!


网鱼能够改善伙食,还能释放工作中的压力。
以下网友喜欢您的帖子:

  
侠士

经验值: 1037
发帖数: 61
精华帖: 5
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 楼主 3楼 2017-07-06 07:44:17
以下是引用question在2017-07-06 05:54:22的发言 >1楼

写的不错..

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

就是这个意思!

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


www.hwlib.com.cn 《TIA PORTAL顶级编程技术》
以下网友喜欢您的帖子:

  
至圣

经验值: 10630
发帖数: 2355
精华帖: 10
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 4楼 2017-07-06 07:58:46

感谢分享,总结的不错!


学无止境
以下网友喜欢您的帖子:

  
至圣

经验值: 13749
发帖数: 2032
精华帖: 16
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 5楼 2017-07-06 08:15:23

感谢分享.


工控毁我青春!
以下网友喜欢您的帖子:

  
侠圣

经验值: 2551
发帖数: 299
精华帖: 3
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 6楼 2017-07-06 09:46:17

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


 
以下网友喜欢您的帖子:

  
游士

经验值: 188
发帖数: 20
精华帖: 1
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 7楼 2017-07-07 11:43:13
谢谢慧大师的分享,辛苦了!
你们好
以下网友喜欢您的帖子:

  
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 8楼 2017-07-07 18:22:43

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

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


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


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





drongh
以下网友喜欢您的帖子:

  
侠士

经验值: 1037
发帖数: 61
精华帖: 5
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 楼主 10楼 2017-07-08 14:57:37
以下是引用question在2017-07-07 18:22:43的发言 >8楼

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

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


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


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




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


www.hwlib.com.cn 《TIA PORTAL顶级编程技术》
以下网友喜欢您的帖子:

  
游侠

经验值: 556
发帖数: 116
精华帖: 0
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 11楼 2017-07-08 23:38:31
楼主能发下梯形图应用V指针的例子吗?或者说V指针在梯形图里面是怎么用的?实际项目
全球 Woai020. aqlxghao
以下网友喜欢您的帖子:

  
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 12楼 2017-07-09 08:00:11
以下是引用HwLib(慧兰博)在2017-07-08 14:57:37的发言 >10楼

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

以下是引用question在2017-07-07 18:22:43的发言 >8楼:自己测试了一下,发现...

引用8楼详细内容:

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

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


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


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




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





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


drongh
以下网友喜欢您的帖子:

  
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
回复:TIA PORTAL(博图)中的Variant类型
推荐帖


只看楼主 只看精华 13楼 2017-07-09 08:06:56

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




drongh
以下网友喜欢您的帖子:

  
侠圣

经验值: 3441
发帖数: 385
精华帖: 3
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 14楼 2017-07-09 14:06:33

一直对Variant类型的用法不是很明白,现在明白多了,谢谢楼主分享!!


技术是带动社会进步的主要动力
以下网友喜欢您的帖子:

  
至圣

经验值: 14828
发帖数: 666
精华帖: 0
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 15楼 2017-07-09 21:41:30

写的真好!学习一下!


相信自己可以适应一切
以下网友喜欢您的帖子:

  
侠客

经验值: 912
发帖数: 84
精华帖: 0
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 16楼 2017-07-13 16:55:14


感谢分享,学习一下



 
以下网友喜欢您的帖子:

  
侠士

经验值: 1196
发帖数: 72
精华帖: 0
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 17楼 2017-07-19 16:28:54


算是对Variant有个更深的认识了,感谢分享


Just do it
以下网友喜欢您的帖子:

  
至圣

经验值: 37446
发帖数: 5133
精华帖: 47
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 18楼 2017-09-03 21:53:24
以下是引用question在2017-07-07 18:22:43的发言 >8楼

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

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


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


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




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



这个问题我也好奇,能不能把INPUT输入的Variant直接赋值给temp变量?



工业起重机防摇摆 QQ:404136820 AntiSwayControl
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 19楼 2017-09-04 08:59:51

感觉可以写出类似高级语言中多态的样子


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠圣

经验值: 3003
发帖数: 455
精华帖: 0
回复:TIA PORTAL(博图)中的Variant类型


只看楼主 只看精华 20楼 2017-09-04 09:35:09

感谢分享,一直在学习TIA,太多的东西不懂了


Automation
以下网友喜欢您的帖子:

  
收起
TIA PORTAL(博图)中的Variant类型
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。