Skip to main content

部分:顶层

位于模块树第一层的模块称为顶级模块。与其他模块相比,它们具有可以直接从一个或多个任务调用的方法。顶级模块包含以下部分 Toplevel

SEC Toplevel                                        //optional: yes, modifier: [UPDATE]
    GVL_Name := <GVL name>;                         //optional: yes, type: literal
    Default_Application := <default application>;   //optional: yes, type: QID
    Default_POUPool := <TRUE/FALSE>;                //optional: yes, type: BoolFlag
    Pragmas := [<pragma1>, <pragma2>,...];          //optional: yes, type: Pragmalist
    SEC Standard_Task : <task name>                 //optional: yes, modifier: [HIDE,UPDATE]
            Name := <task name>;                        //optional: no, type: ID
            Desc := <task description>;                 //(optional: no, type: Text)
            Flags:= <flag>;                             //(optional: no, type: StdTaskFlags)
    END_SEC
    SEC Custom_Task : <task name>                    //optional: yes, modifier: [UPDATE]
            Priority := <priority>;                     //optional: no, type: Subrange(0 .. 31)
            Interval :=  <interval>;                    //optional: no, type: TimeLiteral)
            Flags:= <flag>;                             //optional: no, type: CustomTaskFlags)
    END_SEC
END_SEC

有关定义类型语法的详细信息,请参阅 部分 模块声明

. 规格:
  • GVL_Name 定义将在其中声明模块实例及其所有子实例的 GVL 的名称。占位符 %Instancename% (大小写拼写无关),将替换为模块实例的实例名称。

  • 参数 Default_Application 定义此模块的所有实例到特定应用程序的应用程序分配。如果定义了默认应用程序,则使用 Default_POUPool 不可能。

  • 参数 Default_POUPool 定义该模块的所有实例到 POU 池的应用程序分配。如果定义了默认 POU 池,则使用 Default_Application 不可能。

  • 参数 Pragmas 包含编译器编译指示列表,该列表将插入到模块的 FB 实例声明之前。

这部分 Standard_Task 定义将执行调用的任务。为此,可以执行三个标准任务: LOW, MEDIUM, 和 HIGH。的定义 Standard_Task 是:

  • Name:默认任务名称,创建模块实例后将定义为任务分配。

  • Desc:任务调用的标识符。这应该简短且有意义(例如: I/O task)。

  • Flags:以下值可以与 | 特点:

    • CREATE_IF_MISSING:任务不存在则创建。

    • READONLY:任务分配是只读的,用户无法更改它。

    • UPDATE_IOS:该任务用于更新I/O。每个 I/O 都可以被覆盖 UpdateInTask 中的参数 IO 部分。

    • NONE:未设置标志。

17. 例子
SEC Standard_Task : MEDIUM
        Name  := MainTask ;
        Desc  := TL.TaskMedium_Desc ;
        Flags := READONLY | CREATE_IF_MISSING ;
END_SEC


通过使用该部分 Custom_Task 一个模块可以定义一个或多个自定义任务。该节的目标必须是模块功能块的方法名称。该方法不能有参数(也不能有参数) INPUT, OUTPUT,也不 INOUT)。

  • Priority:定义任务优先级。

  • Interval:定义任务间隔(数据类型“TIME”或“LTIME”的常量)。

  • Flags:以下值可以与 | 特点:

    • SHARED:出于兼容性原因,此标志仍然存在,但始终隐式假定已设置。这基本上意味着,如果一个任务具有在 Custom_Task 部分已存在,将使用此任务。但是,由于如果不存在具有匹配属性的现有任务,则会创建一个新任务,因此该标志将变得过时。创建的任务名称为 TASK_<ModuleInstanceName>_<MethodName>

    • UPDATE_IOS:该任务将用于更新连接到 ST 表达式或直接连接到模块 I/O 的 I/O。

    • NONE:未设置标志。

模块类中没有指定方法的默认实现。

18. 例子
SEC Custom_Task : Method1
        Priority := 7 ;
        CycleTime := t#14ms ;
        Flags := NONE ;
END_SEC


提示

恰好一项标准或特定任务必须具有 UPDATE_IOS 标志设置。

. 这里要提到一些基本规则,任务是如何生成的:
  • 如果存在标准任务,但没有 CREATE_IF_MISSING 标志设置后,具有指定名称和生成器设置属性的任务应该存在。如果属性与指定的属性不匹配,则会显示一条警告消息。

  • 如果存在标准任务,其中有 CREATE_IF_MISSING 设置标志后,首先生成具有指定属性的任务。现在,每当更改此任务的生成器设置时,都会调整该任务,而不会出现任何警告消息。

  • 不允许引用相同任务名称的不同类型的标准任务。在这种情况下,不会发出错误。

根据配置的标准,在每个顶级实例的定义任务的开始和结束时调用以下方法:

METHOD CallPrioHighStart: BOOL
METHOD CallPrioHighEnd: BOOL
METHOD CallPrioMediumStart: BOOL
METHOD CallPrioMediumEnd: BOOL
METHOD CallPrioLowStart: BOOL
METHOD CallPrioLowEnd: BOOL

每个模块负责调用其子模块实例。不得调用子模块引用。 FB中的默认实现 Module 按照模块树中的位置顺序调用所有子模块实例的相应方法。

提示

SUPER 指针提供对基本功能块实例的访问。因此例如调用 SUPER^.CallPrioHighStart() 可以用来调用方法 Module.CallPrioHighStart() 如果功能块扩展 Module。这样,执行中 Module 将确保调用所有子模块。