签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
在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
在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 了!
感谢老师分享经验
any指针还没怎么学会呢...
没用过S7-1500的PLC ,学习了!
@Letham @Automann
出个题:
若干个全局数据块,要求根据数据块的块号将对应的数据块的内容拷贝到指定的全局数据块A。
数据块A与其他数据块的结构不一定相同,只是数据长度相同
要求:1200/1500通用指令实现
@pkh2006 这里需要你
当然是我最推崇的序列化和反序列化
不过如果输入只是DB块号,那要求建的DB是需要以UDT建立,然后DB_ANY_TO_VARIANT,然后序列化,再反序列化
引用4楼详细内容:
呵呵,题意的内涵就是不能使用UDT
引用7楼详细内容:
我说了,如果输入要求是DB块号,就得要UDT的DB块
如果不要求DB块号,那要求若干个全局数据块和指定DB,都是非优化的,然后都写成P#... BYTE ...,然后用反序列化传送或者MOVE_BLK_VARIANT
如果若干个全局数据块又是优化的,有不是UDT或者STRUCT,那无法实现。(也不能说无法实现,但是太麻烦,有一个变量,用一次序列化。)
但问题是既然这么去做,还不如把这个块放入UDT或者STRUCT会更简单,还不用出现非优化块,因为2.0的序列化和反序列化已经不要求是非优化的BYTE数组了
如果允许使用非优化DB,我会首先想到POKE_BLK。
引用8楼详细内容:
我不推崇PEEK POKE的原因就是它只能在SCL中使用,并且引脚过多,还得是非优化块,和S7-1200/1500主推的优化块背道而驰
个人认为PEEK POKE是和移植项目息息相关,没有移植,完全可以没有这几个块
个人觉得S7-1200/1500的SCL不再支持DB[].DBB[],这种S7-300/S7-400的格式,而是换成PEEK POKE这种非常麻烦的做法,本意就是叫大家知难而退,都换成优化块,用VARIANT,结果大家都开始研究PEEK POKE的使用,DB块一上来就取消优化......
引用10楼详细内容:
STL也可以使用PEEK/POKE,只不过STL是运行在虚拟环境下,所以在S7-1500 也可以认为 只有SCL支持PEEK/POKE吧
我喜欢10楼的办法,用POKE_BLK指令。
干货上架了,必须赞一个!
我是抄答案高手...
在 STEP 7 (TIA Portal) 中如何复制存储区和结构体数据?.docx
呵呵啦,没这么简单的啦!回家等答案吧!
,最近不经常用plc,有时间学习
至今为止还没用过portal,vbs倒是偶尔用一下。
scl和stl用惯了,所有变量需要先声明才能使用,初初使用vbs时反而不习惯,因为vbs只有一种变量,就是variant,它既可以是bool型,也可以是int型,还可以是real型……,,只要添加接口名称,根本不需要声明就可以使用。
凹凸曼也用用vbs,然后再来比较一下?
就是原来STEP 7的block_move加 any指针的功能,我出的题有人能做出来吗?
S7-1200/S7-1500通用哦!
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录