twincat - 如何在 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”类型
有没有办法让这个工作?将单个扩展对象传递到期望其基本类型的输入中可以正常工作,但似乎不支持使用数组这样做。
解决方案
您看到的问题实际上归结为一个非常简单的问题,数组是值数据类型。
也就是说,当你试图ARRAY [*] OF FB_Ext
通过VAR_IN_OUT
你实际做的是创建一个全新的数据类型时ARRAY [*] OF FB_Ext
,它不会扩展ARRAY [*] OF FB_Base
。
如果您在 ST 中查看位级别的数组,问题就ElementSize * ElementCount
变得非常清楚,数组本身的大小FB_Ext
为FB_Base
因此,您将不得不使用指针或接口进行此处理。
TLDR:你想做的事在 ST 是不可能的。
所以这本来是一个评论,但它有点超出了大小限制。而是作为 wiki 发布。
推荐阅读
- azure - 在 terraform for Azure 中创建 VPC 的语法是什么?
- flutter - Flutter web passwordless login does not trigger auth state change
- windows - Inno Setup:创建自定义表单
- amazon-web-services - 使用 AWS CLI 返回 _all_ ip 地址列表
- python - 显示额外的精灵?
- azure - 在 Azure Devops 预定义变量中访问 github 用户名
- amazon-s3 - 尝试使用 Ghost S3 存储时出现权限错误,兼容模式
- unit-testing - “意外的令牌 <” 将 'npm test' 与 vue-dropdowns 和 Vue + jest 一起使用
- c# - System.MissingMethodException - CoreOptionsExtension.get_WarningsConfiguration()
- javascript - 根据内容最多的一张调整所有卡片的高度