我看了一下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
图片说明:
最佳答案
第一,数据位左移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