发布于 2011-10-18 12:39:36
28楼
感觉为了一个乘加操作,专门建立两个专用的DB有点儿浪费,还是用指针比较合适,可以指向DB,也可以指向M存储区。
下面是利用POINTER指针做的FC,试验过了,能得出正确的结果,但是自己感觉比较啰嗦,请大家帮忙优化一下。
L 0 // 清零结果暂存器
T #TMP
L 255
T #INDEX
L #CNT
NEXT: T #NUMBER // 循环
L #INDEX
INC 1
T #INDEX
L P##POINTER1 // 得到第一个指针的地址
LAR1
L 0
L W [AR1,P#0.0] // DB编号
==I // 是不是数据块
JC LBL1 // 不是则跳转,是则打开
T #DBNO1
OPN DB [#DBNO1]
LBL1: L D [AR1,P#2.0] // 得到指向数据的地址
LAR1
L #INDEX // 加上偏移量
L 32
*D
TAR1
+D
LAR1
L D [AR1,P#0.0] // 得到数据,暂存
T #VALUE1
L P##POINTER2 // 得到第二个数据
LAR1
L 0
L W [AR1,P#0.0]
==I
JC LBL2
T #DBNO1
OPN DB [#DBNO1]
LBL2: L D [AR1,P#2.0]
LAR1
L #INDEX
L 32
*D
TAR1
+D
LAR1
L D [AR1,P#0.0]
L #VALUE1 // 乘加
*R
L #TMP
+R
T #TMP
L #NUMBER
LOOP NEXT
L #TMP // 返回值
T #RET_VAL
BE
调用的时候:
CALL FC 100
POINTER1:=DB1.DBD0
POINTER2:=P#M 0.0
CNT :=W#16#5
RET_VAL :=MD200
能学多久,就能活多久。