13. TwinCAT 3 Attribute属性:'global_init_slot'使用方法

一、简介

       属性 attribute 'global_init_slot'定义了程序块POU和全局变量GVL列表的初始化顺序。 GVL 或 POU 中的变量是从上到下进行初始化。如果在多个全局变量列表的情况下,初始化顺序是未定义的。如果变量初始值的值直接确定的,比如 nA:INT:=5,这种情况是不需要指定初始化顺序的。但是如果变量之间初始化之间存在依赖关系,则必须使用属性'global_init_slot'为GVL或POU指定初始化顺序。


二、语法说明

       语法:{attribute 'global_init_slot' := '<slot>'}

插入位置

属性作用于整个 GVL POU,因此必须位于 VAR_GLOBAL  POU 声明上方。

<slot>

slot为整数值,定义调用顺序中的位置。

POU(程序、功能块)的缺省值为 50000

GVL全局变量) 的缺省值为 49990

VAR_STAT (静态变量)的缺省值为 49980

值越小,初始化就越早。

常量在变量之前进行初始化。在初始化期间,首先根据 <slot>的值对POUGVL进行排序。然后生成用于初始化常量的代码,之后再生成用于初始化变量的代码。

因此,初始化可分为以下几个阶段:

1. POUGVL按照属性'global_init_slot' 显式定义或者缺省隐式定义的值进行排序;

2. 然后按照排序先对所有常量进行初始化,没有常量的将被跳过;

3. 最后再按照顺序对变量进行初始化。

注意:如果若干 POU GVL 的属性 global_init_slot 的值相同,则仍然没有定义它们的初始化顺序。为了避免影响 TwinCAT 3 系统内部其他定义,<slot>请使用 40000 以上的值。

三、编程示例

       示例中包含 2 个全局变量列表 GVL1 GVL2 以及一个使用来自这两个列表变量的程序 MAINGVL1 使用变量GVL2.nB 来初始化变量 GVL1.nAGVL2.nB GVL2 中使用 1000 的值来初始化。



在这种情况下编译会出错,因为默认属性 global_init_slot 的值是相同都是49990,相当于没有定义初始化顺序,而本例中 GVL2.nB 是需要比 GVL1.nA 先初始化。为避免这种情况,使用 attribute global_init_slot,在初始化顺序中将GVL2 置于 GVL1之前。注意40001 <=  global_init_slot 的值  <= 49989。


本例,在GV2中增加属性,指定初始化顺序{attribute 'global_init_slot' := '40500'},这样就编译就能通过了。


本例中MAIN例的变量nVar1使用GVL2.nA进行初始化,因为POU里默认值是50000大于GVL49990,所以即使没有额外用attribute 'global_init_slot'指定也是没有问题的。

四、附件例程

      例程下载链接:https://tr.beckhoff.com.cn/pluginfile.php/87295/mod_book/chapter/14901/TwinCAT%20global_init_slot.tnzip

      附件中例程把属性注释了,因此编译会报错,自行把//去掉即可。



2024.12.14 俞文升 供稿