TwinCAT 3结构化文本泛型特性使用疑问:实例化编译报错排查
TwinCAT 4026.19.0泛型函数块实例化数组参数类型不匹配问题
我定义了如下泛型函数块:
FUNCTION_BLOCK FB_GenericsTest VAR_GENERIC CONSTANT SIZE: INT := 1; END_VAR
并为其实现了FB_Init方法:
METHOD FB_Init: BOOL VAR_INPUT bInitRetains: BOOL; bInCopyCode: BOOL; x: ARRAY[0 .. SIZE - 1] OF INT; END_VAR
在主程序中用不同泛型参数两次实例化该函数块时,一次成功一次失败:
PROGRAM MAIN VAR CONSTANT SIZE_1: INT := 1; SIZE_2: INT := 2; END_VAR VAR a: ARRAY[0 .. SIZE_1 - 1] OF INT; b: FB_GenericsTest<SIZE_1>(a); c: ARRAY[0 .. SIZE_2 - 1] OF INT; d: FB_GenericsTest<SIZE_2>(c); END_VAR
实例化变量d时报错:
Error C0032: Cannot convert type 'ARRAY [0..(SIZE_2 - 1)] OF INT' to type 'ARRAY [0..(SIZE - 1)] OF INT'
尽管SIZE_2和传入后SIZE的常量值都应为2。
经测试发现,编译器似乎始终使用VAR_GENERIC CONSTANT变量的初始值1来确定数组大小,而非传入的泛型参数值。这个初始值是Beckhoff官方推荐设置的,不设置会触发警告,省略的话默认值为0。
泛型的核心作用就是实现函数块的参数化,但当前场景下无法实现预期效果,这是TwinCAT 4026.19.0编译器的bug吗?还是我在使用这个新特性时存在误用?
内容的提问来源于stack exchange,提问作者Apollo3zehn
相关产品推荐
相关产品推荐

