plc结构化文本循环延迟

时间:2018-12-02 23:32:45

标签: plc structured-text

我正在尝试建立一个循环,该循环将从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毫秒没有任何反应。

2 个答案:

答案 0 :(得分:0)

您必须考虑WHILEFOR是同步执行的。这意味着阻止。这意味着解释器在上一行完成之前不会执行下一行。

  1. 这意味着“快速运行”不能在此处应用。不管运行多快,行的执行总是有序的。

  2. 我唯一要更改的内容不是从100到0循环,而是从0到100循环,因为我不确定此后退是否可以正常工作。然后您需要更改的所有内容:

    ConvertoReal   := INT_TO_LREAL(100 - PLC_SetLoopChargeValue);
    
  3. 您现在要显示所有代码,这是非常困难的判断,但是如果FOR织机完成,则完全没有意义。您可以计算一些变量,但不要在其中使用它们。您知道不能在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,则FOR每一个PLC周期运行一次,实际上并不会改变您的逻辑。

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

答案 1 :(得分:0)

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

我建议wait是TON功能块。请注意,FB的名称区分大小写:wait.Q可能不等于Wait.Q。我认为这是您的for循环未执行的主要原因,因为您检查了另一个FB的输出。也许检查您的申报单中是否包含大小写加倍的双打。

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