临时变量TEMP和L堆栈的对应,还有这个程序实在看不懂了,请大家帮忙看看!

是用FC做的一个功能具体程序如下
网络1
      L     W#16#1002
      T     LW     0
      L     #IN2
      T     LW     2
      L     #IN0
      T     LW     4
      L     #IN1
      SLD   3
      OD    DW#16#84000000
      T     LD     6
网络2
      L     W#16#1002
      T     LW    10
      L     #IN5
      T     LW    12
      L     #IN3
      T     LW    14
      L     #IN4
      SLD   3
      OD    DW#16#84000000
      T     LD    16
网络3
      CALL  "FILL"
       BVAL   :=#TEMP6
       RET_VAL:=#RET_VAL
       BLK    :=#TEMP7
其中两个临时变量TEMP6和TEMP7类型为ANY
具体的调用情况是这样的
      A     M    828.0
      JNB   _009
      CALL  "DataFill"
       IN0    :=60
       IN1    :=DB50.DBW142
       IN2    :=20
       IN3    :=50
       IN4    :=120
       IN5    :=20
       RET_VAL:=DB50.DBW144
_009: NOP   0
这个FC的作用好像是要把DB60的数据规律性的复制到DB50之中,好像是30个字一组,但是我实在看不明白其中的过程,请大神们指点迷津,万分感谢!!!

问题补充:
临时变量是不是和L堆栈的地址默认一一对应的,也就是LW0到LD6就直接对应是TEMP6定义的ANY变量,即使这样我按照程序算下来仍然是一堆数字,毫无头绪,程序里没有给TEMP变量赋值,网络3里却用到了它们
我按照自己的理解算出来一堆数,假设IN1的输入是1100(十进制),最后结果是LD6=8400 0260    LW4=003C     LW2=0014    LW0=1002(全部是16进制)即使把这堆数串起来也是毫无头绪,不知道为什么要左移3位呢?为什么要和84000000做与运算呢,还有IN1和IN4在不同的调用的时候是不一样的,这样的目的是什么?请大家指点,万分感谢!!!

图片说明:

临时变量TEMP和L堆栈的对应,还有这个程序实在看不懂了,请大家帮忙看看!    临时变量TEMP和L堆栈的对应,还有这个程序实在看不懂了,请大家帮忙看看!    临时变量TEMP和L堆栈的对应,还有这个程序实在看不懂了,请大家帮忙看看!    临时变量TEMP和L堆栈的对应,还有这个程序实在看不懂了,请大家帮忙看看!    临时变量TEMP和L堆栈的对应,还有这个程序实在看不懂了,请大家帮忙看看!   

最佳答案

L     W#16#1002   //根据ANY的定义是10是保留,02表示数据类型是字节
      T     LW     0
      L     #IN2        //表示数据的长度
      T     LW     2
      L     #IN0         //DB号
      T     LW     4
      L     #IN1          //ANY指针的起始地址
      SLD   3
      OD    DW#16#84000000   //根据定义做一个DB的数据类型
      T     LD     6
    //以上这段程序就是做一个ANY指针 #TEMP6
      L     W#16#1002
      T     LW    10
      L     #IN5            //数据长度
      T     LW    12
      L     #IN3            //DB号
      T     LW    14
      L     #IN4         //ANY指针的起始地址
      SLD   3       //左移3位的原因是因为32位指针包含位变量,按字节开始就要左移除去位变量的影响,IN4输入的数值表示字节;还是要多了解32位指针的使用
      OD    DW#16#84000000   //根据定义做一个DB的数据类型
      T     LD    16
网络3                     //#TEMP7
       CALL  "FILL"       //调用SFC21 执行数据的复制
       BVAL   :=#TEMP6
       RET_VAL:=#RET_VAL
       BLK    :=#TEMP7
其中两个临时变量TEMP6和TEMP7类型为ANY
具体的调用情况是这样的
      A     M    828.0
      JNB   _009
       CALL  "DataFill"
       IN0    :=60
       IN1    :=DB50.DBW142
       IN2    :=20
       IN3    :=50
       IN4    :=120
       IN5    :=20
       RET_VAL:=DB50.DBW144
_009: NOP   0
       这段程序执行的意思,假如DB50.DBW142的值为10 就是将DB60.DBB10开始的20字节复制到DB50.DBB120开始的20字节里。
    因为没有看到具体变量如何定义的,大概的意思是这样的,最好是在下载中心下载一份关于寻址的资料看看。

提问者对于答案的评价:
首先感谢两位的解答,都很专业,对我的帮助很大,我也不知道确定哪个是最佳答案好,艾星落尘的答案很好的解决了我的燃眉之急,而且是大半夜的作答,万分感谢。阿鸣的答案从更基础的资料方面给予了很多链接地址,帮助也很大,感谢感谢!
从我提问的角度给予选择吧,对不住阿鸣大师了。

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc149791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年6月4日 上午7:27
下一篇 2017年6月4日 上午7:28

相关推荐