我试图有一个循环,它将从100开始并下降,直到它达到while条件不再成立的点。
我开始了
而Solar_Power_House_W_Solar_PER< = …
你必须考虑到这一点 WHILE 和 FOR 同步执行。这意味着阻止。这意味着解释器不会执行下一行,直到前一行完成。
WHILE
FOR
这意味着“跑到快”不能适用于此。它的运行速度并不重要,线的执行总是有序的。
我唯一要做的就是改变并循环不从100到0,反之亦然,从0到100,因为我不确定这种向后是否能正常工作。然后你需要改变:
ConvertoReal := INT_TO_LREAL(100 - PLC_SetLoopChargeValue);
你现在显示所有代码是非常难以判断,但如果 FOR 织机完整它完全没有意义。你计算了一些变量,但你不在那里使用它们。你知道你不能在你的外面使用它们 FOR 循环,对吗?因为你的外面 FOR 循环那些变量将始终与最后一个循环的值相同。
在你的第二个例子中你的 FOR 循环,虽然它可能工作,你不应该使用计时器在循环内运行循环。因为循环是同步的并且是异步的。
据我所知,你不需要任务 WHILE 一点都不使用这种方法,您的程序执行其他部分将被阻止,直到100%。我可以看到这可能需要一段时间。所以你必须使用 IF 。
IF
IF Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO // .... END_IF;
差异很大。同 WHILE 它会阻止你的程序直到 WHILE 在相同的PLC循环中,完成和其他部件将不会执行这么长时间 FOR 可能会执行很多次。
同 IF 如果会运行 FOR 每个PLC循环一次,并且实际上可以改变你的逻辑。
如果你要分享你的完整代码,或者至少使用你在这里拥有变量的部分,以便整个图片都可见,你可能会得到更好的帮助。编辑您的帖子,我将编辑我的评论。
有了这个答案我只会解决你的问题,for循环没有每50ms执行一次。 另一个回答为什么while循环不能退出是正确的,除非变量 Solar_Power_House_W_Solar_PER 和 BatChargePercent 在parrellel线程中没有改变。
Solar_Power_House_W_Solar_PER
BatChargePercent
我建议 wait 是一个TON功能块。请注意,FB的名称区分大小写: wait.Q 可能是不平等的 Wait.Q 。我认为这是你的for循环没有执行的主要原因,因为你检查另一个FB的输出。也许检查你的声明列表中有更高或更低情况的双打。
wait
wait.Q
Wait.Q
另一种可能性是,你没有满足你的while循环条件而你没有注意到。在这种情况下,for循环当然也不会执行。