【问题标题】:plc structured text loop delayplc结构化文本循环延迟
【发布时间】:2019-01-21 16:52:18
【问题描述】:

我正在尝试创建一个循环,它将从 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 毫秒没有任何事情发生。

【问题讨论】:

  • 嗨托尼!由于您没有提供完整的示例,因此有点难以理解代码。有必要拥有软件的所有声明。但我可以立即明白为什么它没有跳出循环。您似乎没有更改变量 Solar_Power_House_W_Solar_PER 也没有更改变量 BatChargePercent。 WHILE 循环开始时他们持有的任何值都是他们将保留的值。
  • 是的,这是更大代码的一部分。 Solar_Power_House_W_Solar_PER 是根据仪表读数计算的百分比,这将确定它是否进入或退出循环。更详细地说,当它运行时,条件得到满足,因此它在每个 for 循环周期中将充电率更改 1%。问题是它的循环速度太快,例如当它在不到一秒的时间内从 100% 变为 30% 时,系统对变化的反应不够快,因此它会循环回到 100% 并一遍又一遍地下降。所以我尝试添加延迟,但它会导致问题
  • Solar_Power_House_W_Solar_PER, OneHundredBatChargePercent 必须在循环内更改,否则循环将永远不会结束。

标签: plc structured-text


【解决方案1】:

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

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

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

    ConvertoReal   := INT_TO_LREAL(100 - PLC_SetLoopChargeValue);
    
  3. 您现在确实显示了所有代码,这很难判断,但如果 FOR loom 完成,那完全没有意义。你计算了一些变量,但你没有在那里使用它们。你知道你不能在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 if 将在每个 PLC 周期运行一次 FOR,实际上并不会改变您的逻辑。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多