属性 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>的值对POU、GVL进行排序。然后生成用于初始化常量的代码,之后再生成用于初始化变量的代码。
因此,初始化可分为以下几个阶段:
1. POU、GVL按照属性'global_init_slot' 显式定义或者缺省隐式定义的值进行排序;
2. 然后按照排序先对所有常量进行初始化,没有常量的将被跳过;
3. 最后再按照顺序对变量进行初始化。
注意:如果若干 POU 或 GVL 的属性 global_init_slot 的值相同,则仍然没有定义它们的初始化顺序。为了避免影响 TwinCAT 3 系统内部其他定义,<slot>请使用 40000 以上的值。
示例中包含 2 个全局变量列表 GVL1 和 GVL2 以及一个使用来自这两个列表变量的程序 MAIN。GVL1 使用变量GVL2.nB 来初始化变量 GVL1.nA,GVL2.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大于GVL的49990,所以即使没有额外用attribute
'global_init_slot'指定也是没有问题的。
例程下载链接:https://tr.beckhoff.com.cn/pluginfile.php/87295/mod_book/chapter/14901/TwinCAT%20global_init_slot.tnzip
附件中例程把属性注释了,因此编译会报错,自行把//去掉即可。
2024.12.14 俞文升 供稿