twincat - 如何在 codesys/twincat3 中传递扩展类型的数组?

标签 twincat codesys

假设我有一个抽象功能块 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/

相关文章:

string-conversion - REAL/LREAL 到带有科学记数法结构化文本的字符串

oop - 如何在 CoDeSys 中放置自定义功能 block 的实例?

c# - 在 C# 中定义 extern "C"函数

c# - 在 c# 中使用多个线程从 TwinCat 遍历非二进制树状结构

twincat - 如何使功能 block 方法的输入可选?

twincat - 有没有办法增加 Twincat 3 中的堆栈大小

plc - 倍福 TwinCAT : disadvantages of using C++ instead of Structured Text

twincat - 如何将 BIT2 类型链接到变量?