我正在尝试一个循环,它将从100开始,然后下降,直到到达while条件不再成立的点。
我从以下几点开始
While Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO
State_Dis_Charge := false
FOR PLC_SetLoopChargeValue:= 100 TO 0 By -1 DO
ConvertoReal := INT_TO_LREAL(PLC_SetLoopChargeValue);
Divide := ConvertoReal DIV(100);
PLC_SetCharge := Divide;
PLC_Charge := 1500 * PLC_SetCharge;
RB_Charge := PLC_Charge;
Visual_RBPower := 1500 * PLC_SetCharge; (*Charge *)
END_FOR;我认为我遇到的问题是它的周期太快了,所以条件永远不会离开while循环,因为系统需要一段时间才能更新,所以我考虑添加一个延迟部分:
While Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO
State_Dis_Charge := false;
wait(IN:=not wait.Q , PT:=T#50ms);
if Wait.Q Then
FOR PLC_SetLoopChargeValue:= 100 TO 0 By -1 DO
ConvertoReal := INT_TO_LREAL(PLC_SetLoopChargeValue);
Divide := ConvertoReal DIV(100);
PLC_SetCharge := Divide;
PLC_Charge := 1500 * PLC_SetCharge;
RB_Charge := PLC_Charge;
Visual_RBPower := 1500 * PLC_SetCharge; (*Charge *)
END_FOR;
END_IF;
END_WHILE; 我认为它应该如何工作,每50ms 1 for循环应该运行一次。目前,每隔50毫秒没有任何事件发生。
发布于 2018-12-05 13:23:42
您必须考虑到WHILE和FOR是同步执行的。这意味着阻塞。这意味着解释器不会执行下一行,直到上一行结束。
,
织布机(100- PLC_SetLoopChargeValue);
FOR织机是完整的,那就完全没有意义了。您计算了一些变量,但并没有在那里使用它们。您知道不能在FOR循环之外使用它们,对吧?因为在你的FOR循环之外,这些变量总是与上一个循环的值相同。
FOR循环,虽然它可能会工作,但你不应该在循环内使用计时器来运行循环。因为循环是同步的,并且时间是异步的。,
WHILE。使用这种方法,其他部分的程序执行将被阻塞,直到100%。据我所知,这可能需要一段时间。所以你必须使用IF。IF Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO // ....END_IF;
差异是显著的。使用WHILE,它会阻塞你的程序,直到WHILE完成,而其他部分不会被执行这么长时间,在同一个FOR周期内,可能会执行很多次。
发布于 2019-01-21 16:52:19
有了这个答案,我只是解决了for循环不会每隔50ms执行一次的问题。另一个答案是为什么while循环不能退出,除非在Parrellel线程中没有更改变量Solar_Power_House_W_Solar_PER和BatChargePercent。
我建议wait是一个庞大的功能块。请注意,Wait.Q的名称区分大小写: FBs可能不等于FBs。我认为这是不执行for循环的主要原因,因为您要检查另一个FB的输出。也许可以检查你的声明列表,看看有没有大小写的替身。
另一种可能是,您的while循环的条件根本不满足,并且您没有注意到。在这种情况下,当然不会执行for循环。
https://stackoverflow.com/questions/53585663
复制相似问题