300中BLKMOVE块移动指令疑问

我看了一下SFC20块移动指令一般是这样使用的:
CALL "BLKMOV"
SRCBLK :=P#M 50.0 BYTE 8
RET_VAL:=MW80
DSTBLK :=P#M 150.0 BYTE 8
但是我的这个使用了一个功能块来表示这个块数据移动功能,详见图片,对于这个功能块中的程序,我有几点不理解
第一,数据位左移3位再与或上DW#16#84000000这个数值的作用是啥,是用来干吗的?
第二,     最后的调用BLKMOVE是这样写的(如下),这种格式如何能让程序执行例子中的调用?SRCBLK后面不是要输入源数据块?为何我的这个程序里面是#Q_POINT?(貌似例子那种表达方式是指针吧,后面的是移动长度)。DSTBLK两者对比也是这种疑问,还请大神帮忙解释一下
       CALL  "BLKMOV"
       SRCBLK :=#Q_POINT
       RET_VAL:=#TEMP_RET_VAL
       DSTBLK :=#Z_POINT

图片说明:

300中BLKMOVE块移动指令疑问   

最佳答案

第一,数据位左移3位再与或上DW#16#84000000这个数值的作用是啥,是用来干吗的?
因为这里用到了ANY指针,而这个地址数据包含了位地址,所以左移动3位是为了排除位地址的干扰,比如你写入从第三个字节开始,如果直接 写入3的话不移动3位,那么就是从0.3开始,是错误的。加上DW#16#84000000,是因为这里用到的是DB块的数据,所以要按照ANY指针的要求进行数据的填写
第二:这个问题,我觉得要先看懂之前的两段程序,一个是设定数据来源的ANY指针,一个是设定数据目标地址的ANY指针,
L  W#16#1002
T  LW0                //第一个字节的格式和数据的类型,字节为单位
L  #Length          
T  LW2                 //数据的长度
L  #Source_DB 
T  LW4                 //数据来源的DB号
L  #Source_DBB         //从来源的DB块复制数据的起始地址
SLD 3
OD DW#16#84000000      //双字的逻辑或以后形成了ANY指针的地址格式
T  LW6                 //生成以后的指针地址

L  W#16#1002          //第一个字节的格式和数据的类型,字节为单位
T  LW10          
L  #Length    
T  LW12                //数据的长度
L  #Destination_DB
T  LW14                 //复制地址到目的DB块号
L  #Destination_DBB
SLD 3
OD DW#16#84000000
T  LW16                 //生成以后的指针地址
Q_POINT和Z_POINT在TEMP里进行了定义分别对应的地址是LW0和LW10
ANY指针的格式
第0个字节;10H,也就是16进制的10,时固定的格式
第1个字节:数据的类型,
第2个字节和第3个字节:数据的长度
第4个和第5个字节:DB块号,或者0
第6个到最后一个字节,是一个双字:这个是地址的指针。

要明白这段程序,先要了解ANY指针的运用,见资料里的ANY部分,其实应该整篇都看看,就能理解为什么要坐移动三位了,间接寻址的部分。
https://support.industry.siemens.com/cs/document/79632832/s7-300和s7-400寻址?dti=0&lc=zh-CN

提问者对于答案的评价:
谢谢各位热心解答,这几天没时间看,等有空了再研究一下

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

(3)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年6月5日
下一篇 2017年6月5日

相关推荐