程序如下,仿真的时候,运行了大概2秒钟CPU就STOP了。就运行了这一段程序,没有其他的。
OPN DB 20
L P#DBX 0.0
T MD 100
L 6
next: T MW 0
LAR1 MD 100
L MD 100
L P#4.0
+D
LAR2
A(
L D [AR1,P#0.0]
L D [AR2,P#0.0]
<D
)
JCN _000
TAR1
T MD 100
JU _002
_002: L MW 0
LOOP next
LAR1 MD 100
L D [AR1,P#0.0]
T MD 104
_000: TAR2
T MD 100
JU _002
另外,我想问一下,跳转标号后面相当于是一段子程序,平时是不执行的。但是,判断有两个结果,判断结果为真,我想执行一个标号后面的程序,判断结果为假,我也要执行另一个标号后面的程序。但是关键的是,判断完了之后我还要继续执行其他的,但是又不能写在标号程序与跳转的地方。一般,除了LOOP外 标号程序是不是放在程序段的最后啊,为什么?
就是如上面的代码所示,我的_002是想放在那个判断之后要一直执行的,但是判断的地方又要用跳转,不知道该怎么写,才能互不影响。
最佳答案
程序写的太复杂了,我看你这段程序的目的就是找出DB20.DBD0~DBD20这连续6个双字的最小值,但是你犯了3个严重错误:
1.你的_002放在了循环外面且循环结束后并没有跳过_002,导致你的循环结束后又通过_002跳回到循环中造成死循环,这是导致当机的根本因素。
2.你的程序得不到正确结果,因为你的指针是MD100,每次循环MD100都应该增加p#4.0的,但是由于你的跳转结果不确定,导致你的指针MD100有可能保持不变或者是增加了p#4.0(如果是TAR1就没有变,如果是TAR2就增加了),这样的话可能循环结束,你也就比较了DB20.DBD0和DB20.DBD4,根本无法比较所有数值。
3.你每次比较完只是保存了指针,并没有保存数值,这样就算指针是每次都增加了p#4.0,但是你的MD104中得到的也就是最后一次比较的最小值而已。
如果的确是需要得到最小值,可以按下面程序来做:
OPN DB 20
LAR1 P#DBX 0.0
L D [AR1,P#0.0]
T MD 104
L 5
next: T MW 0
L D [AR1,P#4.0]
L MD 104
<D
JCN _000
L D [AR1,P#4.0]
T MD 104
_000: +AR1 P#4.0
L MW 0
LOOP next
提问者对于答案的评价:
谢谢,看来你的STL语言用的很好啊,像你学习,我也正在学习STL中!加油!!!
最佳答案作者回复:
慢慢来,建议你学习使用仿真程序PLCSIM,直接在电脑上测试程序,这样就方便多了。
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc238297.html