3

我正在研究一种移动平均算法来分析传感器值,并且这些值存储在一个数组中。但是,Array 的长度是可变的(取决于一台电机的速度)。

如何在 CoDeSys 中创建一个大小可变的数组。如此定义 Array 是错误的:

名称:ARRAY[1...SpeedValue] OF INT ;

4

3 回答 3

3

很遗憾地告诉您,Codesys V2/V3 中的数组大小是不可更改的。一般的解释是 PLC 中没有可用的动态内存分配,因为动态内存分配被认为太不可靠。

您唯一的选择是使用常量ARRAY[1..N_MAX_SPEED_VALUE]定义一个数组,然后使用该数组直到SpeedValue

VAR
    arrnValues          : ARRAY[1..N_MAX_SPEED_VALUE] OF INT;
END_VAR
VAR CONSTANT
    N_MAX_SPEED_VALUE   : INT := 100; (*Max Array Size*)
END_VAR

对于我自己来说,我真的被这个限制所困扰。我已经多次请求一个特性,定义像 ARRAY[*] 这样的数组,有开始和结束的关键字,并在实例化时定义实际的开始和结束大小。这与动态内存分配无关,因为大小是在编译时定义的。

于 2016-09-27T18:10:36.120 回答
2

我会向您推荐以下帖子。

https://stefanhenneken.wordpress.com/2016/09/27/iec-61131-3-arrays-with-variable-length/

Stefan 逐步描述了使用可变长度数组可以做什么。

我不会推荐 Felix 的建议,因为:

第一:你永远不想有可变的扫描时间。

第二:如果由于某种原因,让我们说有些东西坏了,并且您想成为数组上限的 SpeedValue 无法达到,那么您要么出现死锁,要么输出错误,而不知道是否有问题

于 2016-11-29T02:16:45.813 回答
2

借助指针和运算符“__NEW”、“__DELETE”,可以实现动态数组:

VAR
     arrnValues : POINTER TO INT;
     SpeedValue : UDINT;
END_VAR

SpeedValue := 100;
arrnValues := __NEW(INT, SpeedValue);
__DELETE(arrnValues);

您还必须在应用程序属性中激活动态内存分配: 应用程序构建选项

于 2020-04-09T15:33:42.150 回答