是用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在不同的调用的时候是不一样的,这样的目的是什么?请大家指点,万分感谢!!!
图片说明:
最佳答案
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