quote:以下是引用氢气在2013-10-22 09:38:22的发言:quote:以下是引用Automann在2013-10-21 18:05:16的发言:quote:以下是引用氢气在2013-10-21 17:09:53的发言:quote:以下是引用Automann在2013-10-18 07:25:41的发言:
对ANY数据类型的错误理解的分析
最近看到有个下面的帖子(ANY指针可以这么用么?):
各位好,最近学习一下ANY指针,写了段测试代码,但是无法执行,请问是不是ANY指针不能这么使用呢?谢谢!
代码如下:
L P##TEMP0
LAR1
L W#16#1001
T W [AR1,P#0.0]
L W#16#0
T W [AR1,P#2.0]
L W#16#0
T W [AR1,P#4.0]
L DW#16#81000000
T D [AR1,P#6.0]
SET
A [AR1,P#0.0]
= Q 0.0
下面是我的分析:
楼主上面这段代码实际上是在填写ANY的10个字节的值,虽然辛苦,做的却是无用功。问题在于他没有理解ANY的使用方法。
ANY是参数类型,只是用来作块的输入、输出参数。在调用逻辑块时, ANY用于将任意的数据类型传递给声明的形参。ANY的实参可以是单个的任意地址,也可以是一片连续的地址区,例如P#DB1.DBX0.0 INT 50(DB1中从DW0开始的50个整数)。但是ANY的10个字节的值是操作系统根据块的实参的值自动生成的,而不是用户生成的。我们可以用寄存器间接寻址读取ANY的10个字节中包含的大量信息,例如实参的基本数据类型,数据块的编号,重复因子(变量的个数),地址区的起始地址等等。
其实ANY指针的值完全可以由用户自行生成,作为实参传给功能块的输入参数,这样就能实现“变址寻址”。例如使用SFC20将不同DB块的值传递给DB100:
L P##TempAny
LAR1
L W#16#1001 //数据类型BYTE
T W [AR1,P#0.0]
L W#16#10 //重复因子
T W [AR1,P#2.0]
L MW 10 //确定DB块
T W [AR1,P#4.0]
L DW#16#84000000 //DB存储区
T D [AR1,P#6.0]
CALL "BLKMOV"
SRCBLK :=#TempAny
RET_VAL:=MW12
DSTBLK :=P#DB100.DBX0.0 BYTE 10
这样,就实现了将某个DB块中前10个字节传送到DB100中,究竟是哪个DB,完全由MW10决定。关于间接寻址的相关内容,参考论坛其它帖子,或者下载中心文档F0595,这里不做过多讨论。
调用SFC 20,一般我们直接使用SRCBLK的指针格式的实参,DBx是数据块的地址:
CALL "BLKMOV"
SRCBLK :=P#DBx.DBX0.0 BYTE 10
RET_VAL:=MW12
DSTBLK :=P#DB100.DBX0.0 BYTE 10
氢气侠写的一大堆代码也可以实现同样的功能,但是工作量太大,也容易出错,比如说 数据类型BYTE 好像应该是W#16#1002,而不是16#1001。
氢气侠的用法当然也有好处,程序不容易读懂,有一定程度的保密性。
谢谢指正!确实是W#16#1002。
我举这个例子目的是告诉大家ANY的用法,不止局限于以类似“P#DB1.DBX0.0 BYTE 10”这样的格式去使用它。而是要根据ANY数据类型的结构去打造自己的“ANY数据”,此数据在作为参数传递的同时,还可以用于间接寻址。例如上例中,数据源地址不是固定的,究竟是哪个DB块,由MW10决定,而MW10可以是HMI传递过来的数据。比如程序中有90个配方,分别存储与DB1~DB90中,究竟将哪个配方传送至DB100中使用,由MW10(HMI)决定。所以程序这样书写跟保密性无关。
另外ANY的魅力不仅在于“重构”,还在于将其“解析”(通常都是这种用法),“解析”后可以得到其中的地址、长度、数据类型等信息。参考间接寻址的官方连接:
http://support.automation.siemens.com/CN/view/zh/24519683
其中的问题:如何计算ANY 型指针的偏移量或改变指针?
如何设置带有"ANY"或"POINTER"数据类型的功能块?
说明了如何将ANY数据类型“重构”与“解析”。更多间接寻址或ANY数据类型应用也可参考下载中心F0670和F0595或者相关书籍。
关于间接寻址的内容,请大家移步至坛子:主题:应用探讨——西门子指针编程使用探讨
http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=936225&s_id=0&num=142#anch
这里就不做深入探讨了,而是更多关注于数据结构方面的内容。
氢气侠的方法的确有很大的灵活性,佩服!