首页 > 解决方案 > 如何在 codesys/twincat3 中传递扩展类型的数组?

问题描述

假设我有一个抽象功能块AValve,我为各种类型的阀门扩展。我扩展了它AValve以便将其实现为BasicValve. 另外我有一个函数块,它需要一个数组AValve,看起来像这样

FUNCTION_BLOCK ValveDispatch
VAR_IN_OUT
   valves : ARRAY[*] OF AVALVE;
END_VAR

如果我尝试将一个数组传递BasicValve给这个功能块,我会遇到:

无法将类型 'ARRAY [0..5] OF BasicValve' 转换为类型 'ARRAY [*] OF AVALVE' of VAR_IN_OUT 'valve'

考虑到 codesys 可能无法同时处理扩展类型和可变长度数组,我尝试将设置长度数组作为输入,只是为了测试,因为我需要可变长度。这样做会产生一个稍微不同的错误,这似乎意味着同样的事情:

BasicValve 的“ARRAY[0..5]”类型不等于 VAR_IN_OUT“阀门”的“ARRAY [0..5] OF AVALVE”类型

有没有办法让这个工作?将单个扩展对象传递到期望其基本类型的输入中可以正常工作,但似乎不支持使用数组这样做。

标签: twincatcodesys

解决方案


您看到的问题实际上归结为一个非常简单的问题,数组是值数据类型

也就是说,当你试图ARRAY [*] OF FB_Ext通过VAR_IN_OUT你实际做的是创建一个全新的数据类型时ARRAY [*] OF FB_Ext,它不会扩展ARRAY [*] OF FB_Base

如果您在 ST 中查看位级别的数组,问题就ElementSize * ElementCount变得非常清楚,数组本身的大小FB_ExtFB_Base

因此,您将不得不使用指针或接口进行此处理。


TLDR:你想做的事在 ST 是不可能的。

所以这本来是一个评论,但它有点超出了大小限制。而是作为 wiki 发布。


推荐阅读