假设我有一个抽象功能块 AValve
我扩展到各种类型的阀门。我扩展了 AValve
为了将其实现为 BasicValve
.另外我有一个函数块,它接受一个数组 AValve
,看起来像这样
FUNCTION_BLOCK ValveDispatch
VAR_IN_OUT
valves : ARRAY[*] OF AVALVE;
END_VAR
如果我尝试传递 BasicValve
的数组进入这个功能块,我遇到了:Cannot convert type 'ARRAY [0..5] OF BasicValve' to type 'ARRAY [*] OF AVALVE' of VAR_IN_OUT 'valves'
考虑到可能 codesys 无法同时处理扩展类型和可变长度数组,我尝试将设置长度数组作为输入,仅用于测试,因为我需要可变长度。这样做会产生一个略有不同的错误,这似乎意味着同样的事情:
Type `ARRAY[0..5] of BasicValve' is not equal to type 'ARRAY [0..5] OF AVALVE' of VAR_IN_OUT 'valves'
有没有办法让我完成这项工作?将单个扩展对象传递到期望其基本类型的输入中可以正常工作,但似乎不支持对数组这样做。
最佳答案
您看到的问题实际上归结为一个非常简单的问题,数组是值数据类型 .
也就是说,当您试图通过 ARRAY [*] OF FB_Ext
时通过 VAR_IN_OUT
您实际上正在做的是创建一个全新的数据类型 ARRAY [*] OF FB_Ext
不扩展 ARRAY [*] OF FB_Base
.
如果您在 ST 中查看位级别的数组,问题就会变得非常清楚,数组本身的大小为 ElementSize * ElementCount
, 所以试图强制使用更大的数据类型 FB_Ext
进入较小的数据空间 FB_Base
不搞砸一切就行不通。
因此,您必须使用指针或接口(interface)来进行此处理。
TLDR : 你想做的事在ST是不可能的。
所以这原本是一个评论,但它有点超出了大小限制。改为作为维基发布。
关于twincat - 如何在 codesys/twincat3 中传递扩展类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69319659/