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决定。
下面是我的回帖:
调用SFC 20,一般我们直接使用SRCBLK的指针格式的实参,DBx是数据块的地址:
CALL "BLKMOV"
SRCBLK :=P#DBx.DBX0.0 BYTE 10
RET_VAL:=MW12
DSTBLK :=P#DB100.DBX0.0 BYTE 10
氢气侠写的代码也可以实现同样的功能,但是工作量太大。
氢气侠的用法当然也有好处,程序不容易读懂,有一定程度的保密性。
氢气:我举这个例子目的是告诉大家ANY的用法,不止局限于以类似“P#DB1.DBX0.0 BYTE 10”这样的格式去使用它。而是要根据ANY数据类型的结构去打造自己的“ANY数据”,此数据在作为参数传递的同时,还可以用于间接寻址。例如上例中,数据源地址不是固定的,究竟是哪个DB块,由MW10决定,而MW10可以是HMI传递过来的数据。比如程序中有90个配方,分别存储与DB1~DB90中,究竟将哪个配方传送至DB100中使用,由MW10(HMI)决定。所以程序这样书写跟保密性无关。
另外ANY的魅力不仅在于“重构”,还在于将其“解析”(通常都是这种用法),“解析”后可以得到其中的地址、长度、数据类型等信息。
下面是我的回帖:
氢气侠的方法的确有很大的灵活性,佩服!
[/URL] [/URL]
最后修改:2013/11/1 20:49:58