我正在研究一种移动平均算法来分析传感器值,并且这些值存储在一个数组中。但是,Array 的长度是可变的(取决于一台电机的速度)。
如何在 CoDeSys 中创建一个大小可变的数组。如此定义 Array 是错误的:
名称:ARRAY[1...SpeedValue] 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[*] 这样的数组,有开始和结束的关键字,并在实例化时定义实际的开始和结束大小。这与动态内存分配无关,因为大小是在编译时定义的。
我会向您推荐以下帖子。
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);
您还必须在应用程序属性中激活动态内存分配: 应用程序构建选项