是用FC做的一个功能具体程序如下
网络1
LW#16#1002
TLW0
L#IN2
TLW2
L#IN0
TLW4
L#IN1
SLD3
ODDW#16#84000000
TLD6
网络2
LW#16#1002
TLW10
L#IN5
TLW12
L#IN3
TLW14
L#IN4
SLD3
ODDW#16#84000000
TLD16
网络3
CALL"FILL"
BVAL:=#TEMP6
RET_VAL:=#RET_VAL
BLK:=#TEMP7
其中两个临时变量TEMP6和TEMP7类型为ANY
具体的调用情况是这样的
AM828.0
JNB_009
CALL"DataFill"
IN0:=60
IN1:=DB50.DBW142
IN2:=20
IN3:=50
IN4:=120
IN5:=20
RET_VAL:=DB50.DBW144
_009:NOP0
这个FC的作用好像是要把DB60的数据规律性的复制到DB50之中,好像是30个字一组,但是我实在看不明白其中的过程,请大神们指点迷津,万分感谢!!!
问题补充:
临时变量是不是和L堆栈的地址默认一一对应的,也就是LW0到LD6就直接对应是TEMP6定义的ANY变量,即使这样我按照程序算下来仍然是一堆数字,毫无头绪,程序里没有给TEMP变量赋值,网络3里却用到了它们
我按照自己的理解算出来一堆数,假设IN1的输入是1100(十进制),最后结果是LD6=84000260LW4=003CLW2=0014LW0=1002(全部是16进制)即使把这堆数串起来也是毫无头绪,不知道为什么要左移3位呢?为什么要和84000000做与运算呢,还有IN1和IN4在不同的调用的时候是不一样的,这样的目的是什么?请大家指点,万分感谢!!!
图片说明:
20ac46817bdab8158525cc7dfb302c90
e3706560c1de4758f270192d10054fcCEabca653098805b6535cb52d3447c6e6
aBF2a8bd67b877fd5c509364bed84187
最佳答案
LW#16#1002//根据ANY的定义是10是保留,02表示数据类型是字节
TLW0
L#IN2//表示数据的长度
TLW2
L#IN0//DB号
TLW4
L#IN1//ANY指针的起始地址
SLD3
ODDW#16#84000000//根据定义做一个DB的数据类型
TLD6
//以上这段程序就是做一个ANY指针#TEMP6
LW#16#1002
TLW10
L#IN5//数据长度
TLW12
L#IN3//DB号
TLW14
L#IN4//ANY指针的起始地址
SLD3//左移3位的原因是因为32位指针包含位变量,按字节开始就要左移除去位变量的影响,IN4输入的数值表示字节;还是要多了解32位指针的使用
ODDW#16#84000000//根据定义做一个DB的数据类型
TLD16
网络3//#TEMP7
CALL"FILL"//调用SFC21执行数据的复制
BVAL:=#TEMP6
RET_VAL:=#RET_VAL
BLK:=#TEMP7
其中两个临时变量TEMP6和TEMP7类型为ANY
具体的调用情况是这样的
AM828.0
JNB_009
CALL"DataFill"
IN0:=60
IN1:=DB50.DBW142
IN2:=20
IN3:=50
IN4:=120
IN5:=20
RET_VAL:=DB50.DBW144
_009:NOP0
这段程序执行的意思,假如DB50.DBW142的值为10就是将DB60.DBB10开始的20字节复制到DB50.DBB120开始的20字节里。
因为没有看到具体变量如何定义的,大概的意思是这样的,最好是在下载中心下载一份关于寻址的资料看看。
提问者对于答案的评价:
首先感谢两位的解答,都很专业,对我的帮助很大,我也不知道确定哪个是最佳答案好,艾星落尘的答案很好的解决了我的燃眉之急,而且是大半夜的作答,万分感谢。阿鸣的答案从更基础的资料方面给予了很多链接地址,帮助也很大,感谢感谢!
从我提问的角度给予选择吧,对不住阿鸣大师了。