高手给看下:
L P#1.0
T MD 10
L P#2.0
T MD 20
OPN DB1
L 20
M2: T MW 30 //循环20次
LAR1 MD 10 //把P#1.0给AR1
LAR2 MD 20 //把P#2.0给AR2
L DBD [AR1,P#4.0]
L DBD [AR1,P#0.0]
-R
L DBD [AR1,P#0.0]
/R
T MD 100 //将相差的值比例给MD100
L MD 100
ABS
T MD 100 // 绝对值
A(
L DBD [AR1,P#2.0] // 如果这个值不等于0
L 0.000000e+000
<>R
)
A(
L MD 100 //且 MD100小于MD200
L MD 200
<R
)
= M [AR2,P#0.0] // 则 让M 这个位 置1
L MD 10 // 循环结束前 MD10 偏移30.0
L P#30.0
+D
T MD 10
L MD 20
L P#0.1
+D
T MD 20 //循环结束前 MD20 偏移0.1
L MW 30
LOOP M2 // MW30 不为0则继续循环
主要实现 (DB1.DBD5-DB1.DBD1)/DB1.DBD1 <MD200 然后 再符合之后条件 将 M2.0 置1
同样 (DB1.DBD35-DB1.DBD31)/DB1.DBD31 <MD200 然后 再符合之后条件 将 M2.1 置1
以此类推, 但是 监控发现,虽然20个循环都复合条件,但是 只有 M2.0置1. 其他M2.1等之后的全部是0 ,在FC中调用的 不是在FB。
是不是哪里写错了, 第一次用STL 望指点一二。 循环是正常的,只是 M [AR2,P#0.0] 这里 只有 M2.0置1 ,其他的M2.1包括之后的 条件满足也不置1.
产品版区:SIMATIC S7-300(F)/S7-400(F/H/FH)
悬赏西币:10 | 解决时间:2016-05-29 09:43:05 | 提问者: 怀念过去 - 毕业实践员  第4级
最佳答案
L MD 10 // 循环结束前 MD10 偏移30.0
L P#30.0
+D
T MD 10
L MD 20
L P#0.1
+D
T MD 20 //循环结束前 MD20 偏移0.1
L MW 30
这部分也错了。地址寄存器不能简单的加数字进去,地址偏移错了,所以后几次循环的条件都取错了
建议你以后地址分配,双字的话按4的倍数来分配,这样循环好写很多
按照你的要求,提供一个参考程序,我测试了没问题,完全符合你的要求,自己改下循环次数就可以。
L 0
T MW 30
OPN DB 1
M1: L MW 30
L 3
<I
JCN RET
L MW 30
L 240
*I
LAR1
L MW 30
SLD 0
LAR2
A(
L DBD [AR1,P#1.0]
L 0.000000e+000
<>R
)
JCN NEXT
L DBD [AR1,P#5.0]
L DBD [AR1,P#1.0]
-R
L DBD [AR1,P#1.0]
/R
ABS
T MD 100
A(
L MD 100
L MD 200
<R
)
= M [AR2,P#2.0]
NEXT: L MW 30
L 1
+I
T MW 30
JU M1
RET: NOP 0
回答者:
yoda
-
初级技术员  第5级
2016-05-26 12:33:53
提问者对于答案的评价:
不错,还提供了另一种的解决思路,很感谢。