技术论坛

七十二变的孙悟空──VARIANT

作者 主题
至圣

经验值: 18406
发帖数: 6291
精华帖: 137
主题:【分享】七十二变的孙悟空──VARIANT
精华帖精华帖星级3级 推荐帖


只看楼主 只看精华 楼主 2016-12-12 15:22:32

在S7-1200/1500的数据类型中,VARIANT是不太好理解的。请看它的在线帮助:

“VARIANT 类型的参数是一个可以指向不同数据类型变量(而不是实例)的指针。 VARIANT 指针可以是基本数据类型(例如,INT 或 REAL)的对象。 还可以是 STRING、DTL、STRUCT 类型的 ARRAY、UDT、UDT 类型的 ARRAY。 VARIANT 指针可以识别结构,并指向各个结构元素。VARIANT 数据类型的操作数不占用背景数据块或工作存储器中的空间。但是,将占用 CPU 上的存储空间。”

“VARIANT 类型的变量不是一个对象,而是对另一个对象的引用。 在函数的块接口中的 VAR_IN、VAR_IN_OUT 和 VAR_TEMP 部分中,VARIANT 类型的单个元素只能声明为形参。 因此,不能在数据块或函数块的块接口静态部分中声明,例如,因为各元素的大小未知。 所引用对象的大小可以更改。”

“可使用 VARIANT 来生成常规函数块或函数。 调用某个块时,可以将该块的参数连接到任何数据类型的变量。 调用某个块时,除了传递变量的指针外,还会传递变量的类型信息。 块代码随后可以根据运行期间传递的变量类型来执行。”

 

英语词典对Variant的解释:变体、多样的。

百度中的解释:“在VB中,Variant 数据类型是所有没被显式声明(例如 Dim、Private、Public 或 Static等语句)为其他类型变量的数据类型。”

 

下面是我做的实验:

在一个项目中生成一个全局数据块“数据块_1”,在数据块中生成一些复合数据类型的变量(见下图)。

生成FB1,其输入参数“变体”的数据类型为Variant。在OB1中调用FB1,实验表明,可以将输入参数“变体”的实参设置为简单数据类型的变量,还可以设置为数据块_1中的字符串、数组1、结构1、结构1中的元素,结构1.数组2和它的元素,数据类型为DTL的“日时”和它的元素,结构1.时间和它的元素,但是不能将“变体”的实参设置为字符串“串1”中的元素。

实验可知,在FB的接口区,可以生成Input、InOut和Temp类型的Variant变量,但是不能生成Output和Static类型的Variant变量。

 

做过实验后,就比较好理解在线帮助中的话了。下面是我对VARIANT的理解:

1)VARIANT是可以指向不同数据类型的变量的指针。它几乎可以指向所有数据类型的变量。数据类型ANY的功能够强大了,它可以指向几乎所有的简单数据类型,和连续的地址区,但是不能像VARIANT一样,指向复合数据类型。VARIANT比ANY(任意)还要ANY,简直就是一个七十二变的孙悟空!

2)因为VARIANT 数据类型的操作数的“实际”数据类型是可变的,甚至其实参“各元素的大小未知。所引用对象的大小可以更改。”所有它不像Pointer和ANY那样,其实参有固定的字节数,所以“VARIANT 数据类型的操作数不占用背景数据块或工作存储器中的空间。”

3)“除了传递变量的指针外,(VARIANT)还会传递变量的类型信息。”

以VARIANT变量“百变”的实参“"数据块_1".结构1.时间.HOUR”(DB2.DBB53)为例,它包含了变量的地址和各级的数据类型。

4)如果变量的实参是复合数据类型(包括多层嵌套的复合数据类型)或它的元素,或者变量或元素的大小可变,必须使用VARIANT指针。



追求完美
以下网友喜欢您的帖子:

  
重要声明:

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

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

至圣

经验值: 13937
发帖数: 2008
精华帖: 43
回复:七十二变的孙悟空──VARIANT
推荐帖


只看楼主 只看精华 1楼 2016-12-12 16:02:22

在S7-1500硬件平台下,VARIANT 已经完全可以替代ANY的功能了。

VARIANT 常用相关指令有

1;检查数据类型

TypeOf,TypeOfElements,EQ_Type,NE_Type,EQ_ElemType,NE_ElemType

2:数组相关指令

IS_ARRAY,CountOfElements

3 读写VARIANT指向的数据

VariantGet,VariantPut

4:数据传送

MOVE_BLK_VARIANT

5:和DB_ANY数据类型的转换

VARIANT_TO_DB_ANY,DB_ANY_TO_VARIANT


就像廖老师 所说的 比ANY 还要ANY,关键它还不占用工作内存,所以在S7-1500平台下 可以抛弃ANY 了!



人生就像一场旅行!
以下网友喜欢您的帖子:

  
版主

经验值: 69053
发帖数: 12266
精华帖: 59
回复:七十二变的孙悟空──VARIANT
推荐帖


只看楼主 只看精华 2楼 2016-12-12 16:04:37

感谢老师分享经验

any指针还没怎么学会呢...


Q群:https://jq.qq.com/?k=9BDuEgf6
以下网友喜欢您的帖子:

  
至圣

经验值: 17966
发帖数: 2974
精华帖: 7
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 3楼 2016-12-12 18:09:29

 没用过S7-1500的PLC ,学习了!


 
以下网友喜欢您的帖子:

  
版主

经验值: 76206
发帖数: 19147
精华帖: 378
回复:七十二变的孙悟空──VARIANT
推荐帖


只看楼主 只看精华 4楼 2016-12-12 19:02:23

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现


Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
至圣

经验值: 13749
发帖数: 2032
精华帖: 16
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 5楼 2016-12-12 20:42:36

@pkh2006  这里需要你


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

  
侠士

经验值: 1119
发帖数: 76
精华帖: 0
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 6楼 2016-12-13 09:04:00


                       


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 6141
发帖数: 879
精华帖: 11
回复:七十二变的孙悟空──VARIANT
推荐帖


只看楼主 只看精华 7楼 2016-12-13 09:31:22
以下是引用Zane在2016-12-12 19:02:23的发言 >4楼

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

当然是我最推崇的序列化和反序列化


不过如果输入只是DB块号,那要求建的DB是需要以UDT建立,然后DB_ANY_TO_VARIANT,然后序列化,再反序列化


 
以下网友喜欢您的帖子:

  
版主

经验值: 76206
发帖数: 19147
精华帖: 378
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 8楼 2016-12-13 10:15:36
以下是引用pkh2006在2016-12-13 09:31:22的发言 >7楼

当然是我最推崇的序列化和反序列化


不过如果输入只是DB块号,那要求建的DB是需要以UDT建立,然后DB_ANY_TO_VARIANT,然后序列化,再反序列化

以下是引用Zane在2016-12-12 19:02:23的发言 >4楼:@Letham @Automa...

引用4楼详细内容:

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

呵呵,题意的内涵就是不能使用UDT


Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
奇侠

经验值: 6141
发帖数: 879
精华帖: 11
回复:七十二变的孙悟空──VARIANT
推荐帖


只看楼主 只看精华 9楼 2016-12-13 10:38:46
以下是引用Zane在2016-12-13 10:15:36的发言 >8楼

呵呵,题意的内涵就是不能使用UDT

以下是引用pkh2006在2016-12-13 09:31:22的发言 >7楼:当然是我最推崇的序...

引用7楼详细内容:

当然是我最推崇的序列化和反序列化


不过如果输入只是DB块号,那要求建的DB是需要以UDT建立,然后DB_ANY_TO_VARIANT,然后序列化,再反序列化

以下是引用Zane在2016-12-12 19:02:23的发言 >4楼:@Letham @Autom...

引用4楼详细内容:

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

我说了,如果输入要求是DB块号,就得要UDT的DB块


如果不要求DB块号,那要求若干个全局数据块和指定DB,都是非优化的,然后都写成P#... BYTE ...,然后用反序列化传送或者MOVE_BLK_VARIANT


如果若干个全局数据块又是优化的,有不是UDT或者STRUCT,那无法实现。(也不能说无法实现,但是太麻烦,有一个变量,用一次序列化。)


但问题是既然这么去做,还不如把这个块放入UDT或者STRUCT会更简单,还不用出现非优化块,因为2.0的序列化和反序列化已经不要求是非优化的BYTE数组了


 
以下网友喜欢您的帖子:

  
至圣

经验值: 13937
发帖数: 2008
精华帖: 43
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 10楼 2016-12-13 11:16:29
以下是引用Zane在2016-12-13 10:15:36的发言 >8楼

呵呵,题意的内涵就是不能使用UDT

以下是引用pkh2006在2016-12-13 09:31:22的发言 >7楼:当然是我最推崇的序...

引用7楼详细内容:

当然是我最推崇的序列化和反序列化


不过如果输入只是DB块号,那要求建的DB是需要以UDT建立,然后DB_ANY_TO_VARIANT,然后序列化,再反序列化

以下是引用Zane在2016-12-12 19:02:23的发言 >4楼:@Letham @Autom...

引用4楼详细内容:

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

如果允许使用非优化DB,我会首先想到POKE_BLK。


人生就像一场旅行!
以下网友喜欢您的帖子:

  
奇侠

经验值: 6141
发帖数: 879
精华帖: 11
回复:七十二变的孙悟空──VARIANT
推荐帖


只看楼主 只看精华 11楼 2016-12-13 12:06:02
以下是引用Letham在2016-12-13 11:16:29的发言 >10楼

如果允许使用非优化DB,我会首先想到POKE_BLK。

以下是引用Zane在2016-12-13 10:15:36的发言 >8楼:呵呵,题意的内涵就...

引用8楼详细内容:

呵呵,题意的内涵就是不能使用UDT

以下是引用pkh2006在2016-12-13 09:31:22的发言 >7楼:当然是我最推崇的序...

引用7楼详细内容:

当然是我最推崇的序列化和反序列化


不过如果输入只是DB块号,那要求建的DB是需要以UDT建立,然后DB_ANY_TO_VARIANT,然后序列化,再反序列化

以下是引用Zane在2016-12-12 19:02:23的发言 >4楼:@Letham @Auto...

引用4楼详细内容:

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

我不推崇PEEK POKE的原因就是它只能在SCL中使用,并且引脚过多,还得是非优化块,和S7-1200/1500主推的优化块背道而驰


个人认为PEEK POKE是和移植项目息息相关,没有移植,完全可以没有这几个块


个人觉得S7-1200/1500的SCL不再支持DB[].DBB[],这种S7-300/S7-400的格式,而是换成PEEK POKE这种非常麻烦的做法,本意就是叫大家知难而退,都换成优化块,用VARIANT,结果大家都开始研究PEEK POKE的使用,DB块一上来就取消优化......


 
以下网友喜欢您的帖子:

  
至圣

经验值: 13937
发帖数: 2008
精华帖: 43
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 12楼 2016-12-13 12:29:24
以下是引用pkh2006在2016-12-13 12:06:02的发言 >11楼

我不推崇PEEK POKE的原因就是它只能在SCL中使用,并且引脚过多,还得是非优化块,和S7-1200/1500主推的优化块背道而驰


个人认为PEEK POKE是和移植项目息息相关,没有移植,完全可以没有这几个块


个人觉得S7-1200/1500的SCL不再支持DB[].DBB[],这种S7-300/S7-400的格式,而是换成PEEK POKE这种非常麻烦的做法,本意就是叫大家知难而退,都换成优化块,用VARIANT,结果大家都开始研究PEEK POKE的使用,DB块一上来就取消优化......

以下是引用Letham在2016-12-13 11:16:29的发言 >10楼:如果允许使用非优化...

引用10楼详细内容:

如果允许使用非优化DB,我会首先想到POKE_BLK。

以下是引用Zane在2016-12-13 10:15:36的发言 >8楼:呵呵,题意的内涵就...

引用8楼详细内容:

呵呵,题意的内涵就是不能使用UDT

以下是引用pkh2006在2016-12-13 09:31:22的发言 >7楼:当然是我最推崇的...

引用7楼详细内容:

当然是我最推崇的序列化和反序列化


不过如果输入只是DB块号,那要求建的DB是需要以UDT建立,然后DB_ANY_TO_VARIANT,然后序列化,再反序列化

以下是引用Zane在2016-12-12 19:02:23的发言 >4楼:@Letham @Aut...

引用4楼详细内容:

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

STL也可以使用PEEK/POKE,只不过STL是运行在虚拟环境下,所以在S7-1500 也可以认为 只有SCL支持PEEK/POKE吧


人生就像一场旅行!
以下网友喜欢您的帖子:

  
游侠

经验值: 495
发帖数: 9
精华帖: 0
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 13楼 2016-12-13 12:46:58


我喜欢10楼的办法,用POKE_BLK指令。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10630
发帖数: 2355
精华帖: 10
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 14楼 2016-12-13 12:58:33

干货上架了,必须赞一个!


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

  
侠士

经验值: 1438
发帖数: 86
精华帖: 0
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 15楼 2016-12-13 17:14:26
以下是引用Zane在2016-12-12 19:02:23的发言 >4楼

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

我是抄答案高手...


在 STEP 7 (TIA Portal) 中如何复制存储区和结构体数据?.docx


以下网友喜欢您的帖子:

  
版主

经验值: 76206
发帖数: 19147
精华帖: 378
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 16楼 2016-12-14 00:16:33
以下是引用Qomolangma在2016-12-13 17:14:26的发言 >15楼

我是抄答案高手...


在 STEP 7 (TIA Portal) 中如何复制存储区和结构体数据?.docx

以下是引用Zane在2016-12-12 19:02:23的发言 >4楼:@Letham @Automa...

引用4楼详细内容:

@Letham @Automann 


出个题:


若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。


数据块A与其他数据块的结构不一定相同,只是数据长度相同


要求:1200/1500通用指令实现

呵呵啦,没这么简单的啦!回家等答案吧!


Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
游侠

经验值: 450
发帖数: 72
精华帖: 0
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 17楼 2016-12-14 14:19:26

 

,最近不经常用plc,有时间学习


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

  
至圣

经验值: 19409
发帖数: 2077
精华帖: 73
回复:七十二变的孙悟空──VARIANT
推荐帖


只看楼主 只看精华 18楼 2016-12-15 14:55:34

至今为止还没用过portal,vbs倒是偶尔用一下。

scl和stl用惯了,所有变量需要先声明才能使用,初初使用vbs时反而不习惯,因为vbs只有一种变量,就是variant,它既可以是bool型,也可以是int型,还可以是real型……,,只要添加接口名称,根本不需要声明就可以使用。

凹凸曼也用用vbs,然后再来比较一下?


大道至简,知易行难
以下网友喜欢您的帖子:

  
版主

经验值: 76206
发帖数: 19147
精华帖: 378
回复:七十二变的孙悟空──VARIANT


只看楼主 只看精华 19楼 2016-12-17 15:34:36

就是原来STEP 7的block_move加 any指针的功能,我出的题有人能做出来吗?


S7-1200/S7-1500通用哦!


Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
收起
七十二变的孙悟空──VARIANT
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。