【问题标题】:TwinCAT 3 Task Start/Stop from PLC从 PLC 启动/停止 TwinCAT 3 任务
【发布时间】:2017-01-20 17:38:10
【问题描述】:

每次 PLC 启动时我都需要运行一些代码。此代码只应运行一次,然后在重新启动 PLC 之前不再运行。在允许主 PLC 运行之前,我初始化了一些全局变量并验证了持久数据。这是因为如果其中一些变量设置不正确,机器的操作可能会造成破坏。

有没有办法启动/停止其他 PLC 任务?我注意到 TwinCAT 不支持 PLC 任务的初始化和关闭中断。

【问题讨论】:

    标签: plc twincat


    【解决方案1】:

    TwinCAT 有一个“PlcTaskSystemInfo”结构,其中包含 FirstCycle 的布尔值。您只能使用它来运行初始化代码一次。

    VAR fbGetCurTaskIdx: GETCURTASKINDEX; (* Further example+explanation in Infosys *)
    
    fbGetCurTaskIdx();
    IF _TaskInfo[fbGetCurTaskIdx.index].FirstCycle THEN
      (* Initialization code here *)
    ELSE
      (* Normal code here *)
    END_IF;
    

    【讨论】:

    • 有趣!你知道在 Reset Cold/Origin 上 FirstCycle 是否为真吗?
    • 我 99% 确定 FirstCycle 位在上电和使用复位命令时都是正确的。
    • @felix-keil 下面的程序演示了当同时使用 Rest Cold/Origin 时 FirstCycle 为 TRUE(尝试将 bCheckForFirstCycle 初始化为 TRUE 或 FALSE):VAR fbGetCurTaskIdx: GETCURTASKINDEX; i: INT := 23; bCheckForFirstScan: BOOL := TRUE; END_VAR; fbGetCurTaskIdx(); IF _TaskInfo[fbGetCurTaskIdx.index].FirstCycle AND bCheckForFirstScan THEN (* Initialization code here *) i := 17; ELSE (* Normal code here *) i := i; END_IF;
    • 那是 B 计划,但它不允许初始化中断或程序允许的所有内容。大多数具有初始化中断/程序的 PLC 允许中断/程序违反循环程序的正常时序(例如,循环为 10 ms 的程序将允许初始化程序执行更长的时间,而不会出现循环时间异常)。这对于设置运行速度更快的任务很有用(例如,运动控制任务是 1 毫秒,驱动结构的初始化可能需要 10 毫秒)。
    • @DevLocus 然后看看可用于功能块的 FB_initFB_reinitFB_exit。这些方法不会在正常的任务周期内调用。见Infosys
    【解决方案2】:

    我不知道启动/停止单个 PLC 任务的方法。您可以启动/停止运行时。

    但也许它可以像下面这段代码一样简单,它只会在你的 PLC 启动时运行。

    VAR initialized: BOOL := FALSE;
    
    IF NOT initialized THEN
      (* Run your initialization code here *)
      initialized := TRUE;
    END_IF
    
    (* Rest of your program here *)
    

    编辑:

    我在初始化代码中使用了状态机来帮助解决任务允许时间问题。

    例子:

    VAR
      Initialized : BOOL := FALSE;
      Init_State  : UINT := 0;
    END_VAR
    
    IF NOT Initialized THEN
      (* Initialization State Machine *)
      CASE Init_State OF
        0: (* First step in initialization *)
           Init_State := Init_State + 1;
        1: (* Second step in initialization *)
           Init_State := Init_State + 1;
         .
         .
         .
        n: (* Last step in initialization *)
           Initialized := TRUE;
      END_CASE
    END_IF
    

    【讨论】:

      猜你喜欢
      • 2022-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2022-11-28
      • 2019-05-20
      相关资源
      最近更新 更多