【问题标题】:How can I make an atomic statement in Twincat3 PLC?如何在 Twincat3 PLC 中进行原子语句?
【发布时间】:2021-12-17 09:07:21
【问题描述】:

我正在使用相互通信的快速循环(0.5 ms 循环时间)和慢速循环(10 ms 循环时间)。 如何使输入和输出保持一致?

考虑下面的示例,我希望 SlowLoop 中的分配是原子的,以确保来自 FAST 循环的两个引用输入与来自同一循环的值相对应。

示例

快速循环 [0.5 毫秒]

FAST_CNT = some rising edge detection
FAST_RUNIDX += 1

慢循环 [10 毫秒]

<-- Atomic Operation
pulseCount = FAST_CNT
elapsedTicks = FAST_RUNIDX 
Atomic Operation -->

【问题讨论】:

    标签: plc twincat


    【解决方案1】:

    任何需要“原子”的东西,您都需要处理一个对象(STRUCT 或 FUNCTION_BLOCK)。 在这种情况下,由于没有关联的逻辑,STRUCT 应该可以很好地完成这项工作。

    TYPE st_CommUnit :
    STRUCT
        Count       : UINT;
        Index       : UINT;
    END_STRUCT
    END_TYPE
    

    然后,您可以使用 %Q* 和 %I* 寻址将此 STRUCT 显示为任务之间的输入或输出。

    - Fast Task - 
    SourceData AT %Q* : st_CommUnit
    
    - Slow Task - 
    TargetData AT %I* : st_CommUnit
    

    使用这个你最终得到一个可链接的对象,这样你就可以链接:

    • 整个单元
    • 每个单独的组件

    【讨论】:

      【解决方案2】:

      如果您使用具有不同周期时间的两个不同任务,可能还运行在不同的内核上,您需要一种方法来在执行读/写操作时同步这两个任务。

      为了以原子方式访问数据,请使用 Beckhoff 提供的同步 FB,例如 FB_IecCriticalSection。 更多信息请访问 infosys 网站:

      https://infosys.beckhoff.com/english.php?content=../content/1033/tc3_plc_intro/45844579955484184843.html&id=

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-24
        • 2017-11-01
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 2021-05-20
        • 2020-06-29
        • 1970-01-01
        相关资源
        最近更新 更多