技术论坛

Variant使用的不解

作者 主题
侠客

经验值: 708
发帖数: 76
精华帖: 3
主题:【探讨】Variant使用的不解
精编帖 推荐帖


只看楼主 只看精华 只看精编 楼主 2020-04-01 14:28:21

看了很多大师关于参数类型Variant使用的帖子,受益良多,感谢了。

有人说Variant比ANY好用和灵活,我始终不能理解,

ANY能读取实参的首地址,数据类型和长度后,可以访问实参的所有元素,在函数(块)中做自己想要的功能,

而大神的Modbus轮询程序从本质上讲,就是在对从Variant接口复制来的Struct在处理,Variant的实际参数也是ARRAY 的 相同的Struct,然后用Move_BLk_Variant或者VariantGet和VariantOut复制实际值到函数(块)中的背景Struct,这样的方法与建个Struct的参数本质是一致的。

还有大神做了个Variant简单的程序(int,dint,real.../2的程序),无非是不在关注实参的数据类型了,而是在函数中关注。

那么这样的办法比ANY的优势在哪里呢?也许我还没有理解Variant和其相关的指令的灵活运用,希望继续探讨。@各大版主和大神……^^



 
以下网友喜欢您的帖子:

  
重要声明:

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

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

侠客

经验值: 708
发帖数: 76
精华帖: 3
回复:Variant使用的不解
精编帖 推荐帖


只看楼主 只看精华 只看精编 楼主 1楼 2020-04-01 18:43:57
以下是引用小oo鱼在2020-04-01 14:28:21的发言 >楼主

看了很多大师关于参数类型Variant使用的帖子,受益良多,感谢了。

有人说Variant比ANY好用和灵活,我始终不能理解,

ANY能读取实参的首地址,数据类型和长度后,可以访问实参的所有元素,在函数(块)中做自己想要的功能,

而大神的Modbus轮询程序从本质上讲,就是在对从Variant接口复制来的Struct在处理,Variant的实际参数也是ARRAY 的 相同的Struct,然后用Move_BLk_Variant或者VariantGet和VariantOut复制实际值到函数(块)中的背景Struct,这样的方法与建个Struct的参数本质是一致的。

还有大神做了个Variant简单的程序(int,dint,real.../2的程序),无非是不在关注实参的数据类型了,而是在函数中关注。

那么这样的办法比ANY的优势在哪里呢?也许我还没有理解Variant和其相关的指令的灵活运用,希望继续探讨。@各大版主和大神……^^


https://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=135233&cid=1077

将MWX开始的10个Word move到MWX+100开始的10个Word,用ANY很容易实现,请问用Variant及相关指令怎么实现(不能用PEEK/POKE).

MOVE_BLK_VARIANT的scr指向数组和数组的元素,如果指向M区,同时要求

         COUNT      :=1

         SRC_INDEX  :=0

         DEST_INDEX :=0才能正确执行,而且Move的是一个元素,这个比如是不是比如的有问题?

程序如下:

  L     P##PointerAddr

      LAR1

      L D [ AR1 , P#6.0 ]

      T     #StartAddr

      L     10                   //Count

_001: T     #LENs

      L     #StartAddr

      L     P#100.0              //offset

      +D

      T     #DstAddr

      L MW [ #StartAddr]

      T MW [ #DstAddr]

      L     #StartAddr

      L     P#2.0

      +D

      T     #StartAddr

      L     #LENs

      LOOP  _001



 
以下网友喜欢您的帖子:

  
版主

经验值: 76166
发帖数: 19135
精华帖: 378
回复:Variant使用的不解
精编帖 推荐帖


只看楼主 只看精华 只看精编 2楼 2020-04-01 22:57:24

最大优势就是优化编程


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

  
至圣

经验值: 11065
发帖数: 1222
精华帖: 35
回复:Variant使用的不解
精华帖精华帖星级2级 精编帖 推荐帖


只看楼主 只看精华 只看精编 3楼 2020-04-01 23:25:04

MOVE_BLK_VARIANT

         COUNT      :=1

         SRC_INDEX  :=0

         DEST_INDEX :=0

如果SRC/DEST是非数组,只能是这样设置才能正确执行程序。


楼主非要按照300/400的编程思想,来使用PORTAL,还不让用PEEK/POKE。PORTAL都去指针化,推荐符号编程了,使用POK_BLK不正好可以很方便的达到楼主的要求吗?

想更好的使用PORTAL,请楼主忘记300/400的编程方式吧。





Keep calm and carry on!!!
以下网友喜欢您的帖子:

  
至圣

经验值: 12543
发帖数: 1843
精华帖: 0
回复:Variant使用的不解
推荐帖


只看楼主 只看精华 只看精编 4楼 2020-04-02 09:20:14
以下是引用YiMoon在2020-04-01 23:25:04的发言 >3楼

MOVE_BLK_VARIANT

         COUNT      :=1

         SRC_INDEX  :=0

         DEST_INDEX :=0

如果SRC/DEST是非数组,只能是这样设置才能正确执行程序。


楼主非要按照300/400的编程思想,来使用PORTAL,还不让用PEEK/POKE。PORTAL都去指针化,推荐符号编程了,使用POK_BLK不正好可以很方便的达到楼主的要求吗?

想更好的使用PORTAL,请楼主忘记300/400的编程方式吧。




说的很好。


邮箱 yongquancun@126.com
以下网友喜欢您的帖子:

  
侠客

经验值: 708
发帖数: 76
精华帖: 3
回复:Variant使用的不解
精编帖


只看楼主 只看精华 只看精编 楼主 5楼 2020-04-02 13:49:21
以下是引用YiMoon在2020-04-01 23:25:04的发言 >3楼

MOVE_BLK_VARIANT

         COUNT      :=1

         SRC_INDEX  :=0

         DEST_INDEX :=0

如果SRC/DEST是非数组,只能是这样设置才能正确执行程序。


楼主非要按照300/400的编程思想,来使用PORTAL,还不让用PEEK/POKE。PORTAL都去指针化,推荐符号编程了,使用POK_BLK不正好可以很方便的达到楼主的要求吗?

想更好的使用PORTAL,请楼主忘记300/400的编程方式吧。




感谢回复,我正是希望摒弃300的编程方式,才来救助是否有其他的途径来解决的。

我想能不能从这个点来挖掘Variant的用法,因为相比较ANY,我对Variant及相关指令理解不透彻。函数接口中的Variant参数只是将实参整体的引入到了函数,还没有对其分解,(除了使用序列化指令可以分解成数组),Variantget要求输入输出数据类型一致,例如如果实参是结构体,则要求函数内部有与其对应的结构体,那么,着样的操作与使用结构体作为函数的参数有何区别呢,自然就没有发挥出Variant的所谓优势。到目前为止我只觉得序列化和反序列化比较有实际用途,与AT功能差不多。

@YiMoon能继续举例说明Variant的用法吗


 
以下网友喜欢您的帖子:

  
至圣

经验值: 11065
发帖数: 1222
精华帖: 35
回复:Variant使用的不解
精编帖 推荐帖


只看楼主 只看精华 只看精编 6楼 2020-04-02 19:24:13
以下是引用小oo鱼在2020-04-02 13:49:21的发言 >

感谢回复,我正是希望摒弃300的编程方式,才来救助是否有其他的途径来解决的。

我想能不能从这个点来挖掘Variant的用法,因为相比较ANY,我对Variant及相关指令理解不透彻。函数接口中的Variant参数只是将实参整体的引入到了函数,还没有对其分解,(除了使用序列化指令可以分解成数组),Variantget要求输入输出数据类型一致,例如如果实参是结构体,则要求函数内部有与其对应的结构体,那么,着样的操作与使用结构体作为函数的参数有何区别呢,自然就没有发挥出Variant的所谓优势。到目前为止我只觉得序列化和反序列化比较有实际用途,与AT功能差不多。

@YiMoon能继续举例说明Variant的用法吗

不要为了使用VARIANT而VARIANT,有些场合是不适合的。像这种地址的操作,本来VARIANT的设计就是用来处理符号编程方式 的。为什么PORTAL要设计PEEK/POKE指令,就是来处理地址操作的。

楼主可以看下专家的讲解:崔工说事连载

https://www.ad.siemens.com.cn/club/bbs/PostStory.aspx?a_id=1615579&b_id=84&s_id=&num=3#anch




Keep calm and carry on!!!
以下网友喜欢您的帖子:

  
侠客

经验值: 708
发帖数: 76
精华帖: 3
回复:Variant使用的不解


只看楼主 只看精华 只看精编 楼主 7楼 2020-04-03 09:15:28

感谢继续指导,我同意你及崔工的观点,至于说Variant比ANY还any我持保留意见。

确实Variant比ANY可以指向更多是数据类型,但是不能向ANY直接访问指向实参的元素,而是得在函数中建立对应的数据类型,然后复制到这个区域,在进一步分解访问,这与结构体作为参数效果一样,最大的优势是将多个函数合并到了一个函数中处理,因为根据数据类型做了分类程序和再处理。

同时我也认为ANY会淹没在由绝对寻址向符号寻址的历史洪流中。



 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2865
发帖数: 367
精华帖: 3
回复:Variant使用的不解


只看楼主 只看精华 只看精编 8楼 2020-04-03 17:58:49

你为什么要关注地址呢?除了IO使用到地址外,其他地方都与地址无关。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 11065
发帖数: 1222
精华帖: 35
回复:Variant使用的不解


只看楼主 只看精华 只看精编 9楼 2020-04-03 19:08:04
any占用了10字节的地址,可以定义数据区的起始地址和长度,variant引用的数据是取决于目标数据,无法人为规定从哪里开始和长度。
因为portal没有实际地址,符号访问不像地址,可以有规律连续操作,因此只能借助副本来操作(纯个人理解)

Keep calm and carry on!!!
以下网友喜欢您的帖子:

  
至圣

经验值: 20123
发帖数: 2775
精华帖: 23
回复:Variant使用的不解


只看楼主 只看精华 只看精编 10楼 2020-04-03 20:32:50



看看上面的表,最右栏VARIANT具有“or type data block",而ANY它没有,它没有,它没有。


Less is more……
以下网友喜欢您的帖子:

  
至圣

经验值: 20123
发帖数: 2775
精华帖: 23
回复:Variant使用的不解


只看楼主 只看精华 只看精编 11楼 2020-04-03 21:30:15

另外,VARIANT可以在FB/FC接口中"Temp"下声明使用,而ANY却不可以。


Less is more……
以下网友喜欢您的帖子:

  
至圣

经验值: 16722
发帖数: 1309
精华帖: 2
回复:Variant使用的不解
推荐帖


只看楼主 只看精华 只看精编 12楼 2020-04-03 23:10:32

对我来说太难了


同一个问题ID下,已经先回答此问题的人,如再参考我答案而修改自己答案的,就是王八蛋!
以下网友喜欢您的帖子:

  
侠客

经验值: 708
发帖数: 76
精华帖: 3
回复:Variant使用的不解


只看楼主 只看精华 只看精编 楼主 13楼 2020-04-07 11:33:49
以下是引用YiMoon在2020-04-03 19:08:04的发言 >9楼:any占用了10字节的地址,可以定义数据区的起始地址和长度,variant引用的数据是取决于目标数据,无法人为规定从哪里开始和长度。 因为portal没有实际地址,符号访问不像地址,可以有规律连续操作,因此只能借助副本来操作(纯个人理解)

感谢回复和讨论,我在使用时觉得序列化和反序列化比较有用,在其他场合我个人觉得与结构体的用法比较类似,优势是在指定实参时不在关心实参的数据类型,而是到了所用到的函数中关心。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 11065
发帖数: 1222
精华帖: 35
回复:Variant使用的不解


只看楼主 只看精华 只看精编 14楼 2020-04-07 16:25:48

序列化和反序列化,多用在UDT定义的结构中,使用还是有它的局限性的


Keep calm and carry on!!!
以下网友喜欢您的帖子:

  
版主

经验值: 76166
发帖数: 19135
精华帖: 378
回复:Variant使用的不解


只看楼主 只看精华 只看精编 15楼 2020-04-07 22:53:42

说到底就是参数传递的方法。


首先要明确的是:

一,优化编程将是主流

二,VARIANT,DB_ANY,ARRAY是间址寻址的主要工具



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

  
侠圣

经验值: 2818
发帖数: 163
精华帖: 1
回复:Variant使用的不解


只看楼主 只看精华 只看精编 16楼 2020-04-08 13:15:48

博途里就是要弱化绝对地址这个概念,强调符号寻址。


厚积薄发
以下网友喜欢您的帖子:

  
侠圣

经验值: 2146
发帖数: 200
精华帖: 0
回复:Variant使用的不解


只看楼主 只看精华 只看精编 17楼 2020-05-27 10:02:24

涨知识了,谢谢


 
以下网友喜欢您的帖子:

  
游侠

经验值: 363
发帖数: 29
精华帖: 0
回复:Variant使用的不解


只看楼主 只看精华 只看精编 18楼 2020-08-14 15:42:15
以下是引用YiMoon在2020-04-01 23:25:04的发言 >3楼

MOVE_BLK_VARIANT

         COUNT      :=1

         SRC_INDEX  :=0

         DEST_INDEX :=0

如果SRC/DEST是非数组,只能是这样设置才能正确执行程序。


楼主非要按照300/400的编程思想,来使用PORTAL,还不让用PEEK/POKE。PORTAL都去指针化,推荐符号编程了,使用POK_BLK不正好可以很方便的达到楼主的要求吗?

想更好的使用PORTAL,请楼主忘记300/400的编程方式吧。




这段程序输入接口就一个PointerAddr,PointerAddr类型是any吗?StartAddr和DstAddr是临时变量,类型为Dint吗?L D [ AR1 , P#6.0 ] 这段怎么理解?谢谢


 
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:Variant使用的不解


只看楼主 只看精华 只看精编 19楼 2020-08-16 08:34:34
以下是引用小oo鱼在2020-04-03 09:15:28的发言 >7楼

感谢继续指导,我同意你及崔工的观点,至于说Variant比ANY还any我持保留意见。

确实Variant比ANY可以指向更多是数据类型,但是不能向ANY直接访问指向实参的元素,而是得在函数中建立对应的数据类型,然后复制到这个区域,在进一步分解访问,这与结构体作为参数效果一样,最大的优势是将多个函数合并到了一个函数中处理,因为根据数据类型做了分类程序和再处理。

同时我也认为ANY会淹没在由绝对寻址向符号寻址的历史洪流中。


可以 再看看REF


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

  
收起
Variant使用的不解
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。