首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >plc结构化文本循环延迟

plc结构化文本循环延迟
EN

Stack Overflow用户
提问于 2018-12-03 07:32:45
回答 2查看 1.2K关注 0票数 0

我正在尝试一个循环,它将从100开始,然后下降,直到到达while条件不再成立的点。

我从以下几点开始

代码语言:javascript
复制
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循环,因为系统需要一段时间才能更新,所以我考虑添加一个延迟部分:

代码语言:javascript
复制
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毫秒没有任何事件发生。

EN

回答 2

Stack Overflow用户

发布于 2018-12-05 13:23:42

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

  1. 这意味着“快速运行”不能在这里应用。它的运行速度有多快并不重要,各行的执行总是按顺序进行的。

  1. ,我唯一想要改变的是,循环不是从100到0,而是从0到100,因为我不确定向后循环会很好地工作。然后你所要改变的就是:

织布机(100- PLC_SetLoopChargeValue);

  • You ConvertoReal := INT_TO_LREAL)现在显示所有代码,这是很难判断的,但如果FOR织机是完整的,那就完全没有意义了。您计算了一些变量,但并没有在那里使用它们。您知道不能在FOR循环之外使用它们,对吧?因为在你的FOR循环之外,这些变量总是与上一个循环的值相同。

  • 在你的第二个例子中,你的FOR循环,虽然它可能会工作,但你不应该在循环内使用计时器来运行循环。因为循环是同步的,并且时间是异步的。

  • ,正如我所理解的,你根本不需要WHILE。使用这种方法,其他部分的程序执行将被阻塞,直到100%。据我所知,这可能需要一段时间。所以你必须使用IF

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

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

  • 如果你愿意分享你的全部代码,或者至少部分使用了你的变量,这样整个画面都是可见的,你可能会得到更好的帮助。编辑您的帖子,我将编辑我的评论。
票数 0
EN

Stack Overflow用户

发布于 2019-01-21 16:52:19

有了这个答案,我只是解决了for循环不会每隔50ms执行一次的问题。另一个答案是为什么while循环不能退出,除非在Parrellel线程中没有更改变量Solar_Power_House_W_Solar_PERBatChargePercent

我建议wait是一个庞大的功能块。请注意,Wait.Q的名称区分大小写: FBs可能不等于FBs。我认为这是不执行for循环的主要原因,因为您要检查另一个FB的输出。也许可以检查你的声明列表,看看有没有大小写的替身。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53585663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档