在 CoDeSys 中创建一个可变大小的数组

Creat an array in CoDeSys with changeable size

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

如何在 CoDeSys 中创建大小可变的数组。 这样定义数组是错误的:

名称:数组[1...速度值] OF INT ;

很遗憾地告诉您,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[*] 这样的数组,为开始和结束设置关键字,并在实例化时定义实际的开始和结束大小。这与动态内存分配无关,因为大小是在编译时定义的。

我会向您推荐以下 post。

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

Stefan 逐步描述了可变长度数组的用途。

我不会推荐 Felix 推荐的内容,因为:

首先:您永远不希望扫描时间可变。

其次:如果由于某种原因,让我们说一些东西坏了,并且你想成为数组上限的 SpeedValue 是不可能达到的,那么你要么死锁要么输出错误,而不知道是否出了点问题

在指针和运算符的帮助下可以实现动态数组 "__NEW", "__DELETE":

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

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

您还必须在应用程序属性中激活动态内存分配: Application Build Options