0

我试图有一个循环,它将从 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;     

我认为它应该如何工作是每 50 毫秒 1 个 for 循环应该运行。目前,每 50 毫秒没有任何事情发生。

4

2 回答 2

0

有了这个答案,我只能解决您的问题,即 for 循环不是每 50 毫秒执行一次。Solar_Power_House_W_Solar_PER除非变量并且BatChargePercent未在并行线程中更改,否则为什么无法退出 while 循环的其他答案是正确的。

我建议wait是一个 TON 功能块。请注意,FB 的名称区分大小写:wait.Q可能是不相等Wait.Q的。我认为这是您的 for 循环未执行的主要原因,因为您检查了另一个 FB 的输出。也许检查您的声明列表中是否有大写或小写的双打。

另一种可能性是,您的 while 循环条件根本没有得到满足,您也没有注意到。在这种情况下,for 循环当然也不会被执行。

于 2019-01-21T08:52:18.793 回答
0

您必须考虑这一点WHILEFOR同步执行。这意味着阻塞。这意味着解释器不执行下一行,直到上一行完成。

  1. 这意味着“跑得快”在这里不能适用。不管它运行多快,行的执行总是有序的。

  2. 我唯一会改变和循环的不是从 100 到 0,而是从 0 到 100,反之亦然,因为我不确定这向后是否能正常工作。然后你必须改变的一切:

    ConvertoReal   := INT_TO_LREAL(100 - PLC_SetLoopChargeValue);
    
  3. 您现在确实显示了所有代码,这很难判断,但如果FORloom 完成,那完全没有意义。你计算了一些变量,但你没有在那里使用它们。你知道你不能在你的FOR循环之外使用它们,对吧?因为在您的FOR循环之外,这些变量将始终与最后一个循环的值相同。

  4. 在您的第二个示例中,您的FOR循环虽然可能有效,但您不应使用计时器在循环内运行循环。因为循环是同步的,时间是异步的。

  5. 据我了解,您根本不需要WHILE的任务。使用这种方法,您的其他部分的程序执行将被阻止直到 100%。如我所见,这可能需要一段时间。所以你必须使用IF.

    IF Solar_Power_House_W_Solar_PER <= OneHundred AND BatChargePercent < OneHundred DO
        // ....
    END_IF;
    

    差异是显着的。使用WHILE它会阻塞您的程序直到WHILE完成,并且其他部分不会执行这么长时间,在同一个 PLC 周期中FOR可能会执行很多次。

    IF如果每个 PLC 周期运行FOR一次,实际上并不会改变您的逻辑。

  6. 如果您要分享您的完整代码或至少部分使用您在此处的变量以便整个图片可见,您可能会得到更好的帮助。编辑您的帖子,我将编辑我的评论。

于 2018-12-05T05:23:42.347 回答