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