无论Enter使能多少次,Position的值总是在2和3之间跳来跳去,DB1中也只有DB6和DB14中传入了数据。各位能不能帮我检查一下,FC1变量声明如下:
IN: Enter Bool
Length Int
Souce DWord
OUT: DN Bool
ER Bool
File Pointer
IN_OUT: Position Int
TEMP: Input Bool
FC1程序如下:
L P##File
LAR1
L W [AR1,P#4.0]
LAR1
L #Position
L 4
*I
SLW 3
+AR1
A #Enter
AN #DN
FP #input
= L 4.0
A L 4.0
JNB _001
L #Souce
T DBD [AR1,P#20.0]
_001: NOP 0
A L 4.0
JNB _002
L #Position
L 1
+I
T #Position
_002: NOP 0
L #Length
L #Position
==I
= #DN
OB1程序:
A DB1.DBX 0.2
= L 20.0
BLD 103
A M 0.0
JNB _001
CALL FC 1
Enter :=L20.0
Length :=DB1.DBW2
Souce :=MD2
DN :=DB1.DBX0.1
ER :=DB1.DBX0.0
File :=DB1.DBW6
Position:=DB1.DBW4
_001: NOP 0
问题补充:
我的目的是:在Enter的每一个上升沿取Souce(数据类型:Dword)里的数据存入数据块DB1内,
存放地址是从File(数据类型:Pointer)指定的地址开始,
取数据的次数由Length确定,Position是当前取的次数,
当Position=Length时,输出DN位。
最佳答案
L W [AR1,P#4.0]-------应该写成 L D [AR1,P#2.0]
FP #input--------------临时变量不能用于上升/下降沿
L #Position
L 4
*I
SLW 3
+AR1 这时AR1中存储的是6.0+Position的指针地址
T DBD [AR1,P#20.0] 这时计算出的地址不可能是DBD6或DBD14,你是不是写错了,是P#0.0啊
提问者对于答案的评价:
非常感谢您的帮助,
T DBD [AR1,P#20.0] 这句是我想问题是不是出在传送到数据块的数据和指针地址[因为它要占用6个字节(只是我还是不知道这6个字节占用的是哪里的地址)] 重复了,所以把它改为P#20.0 现已经改回P#0.0
还有一个原因是,position 不能定义为IN_OUT变量,不然也是一样在2 3 之间变来变去的,
然后按照你的提示做成功了,再次感谢。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc238598.html