登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:ANY指针可以这么用么?(二)

点击:2512 回复:3

氢气:其实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决定。
下面是我的回帖:
调用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
13-11-01 19:45
进来看看
13-11-01 20:35
指针都是什么功能能用上?我就在历史事件记录上使用过。
13-11-02 08:47
谢谢分享
14-12-03 15:02

工控新闻

更多新闻资讯