我正在研究移动平均算法来分析传感器值,并将值存储在数组中。但是,Array的长度是变量(取决于一个电机的速度)。
如何在CoDeSys中创建具有可变大小的数组。 定义Array是错误的:
名称:INT的ARRAY [1 ... SpeedValue];
答案 0 :(得分:3)
我很遗憾地告诉您,在Codesys V2 / V3中阵列的大小没有变化。一般的解释是PLC中没有可用的动态内存分配,因为动态内存分配被认为太不可靠。
您唯一的选择是定义一个具有常量 ARRAY [1..N_MAX_SPEED_VALUE] 的数组,然后使用该数组直到 SpeedValue
HandleContactUpdate
对于我自己,我真的被这个限制所困扰。我已多次请求一个功能,定义像ARRAY [*]这样的数组,有开始和结束的关键字,并在实例化时定义实际的开始和结束大小。这与动态内存分配无关,因为大小是在编译时定义的。
答案 1 :(得分:2)
我会推荐你以下帖子。
https://stefanhenneken.wordpress.com/2016/09/27/iec-61131-3-arrays-with-variable-length/
Stefan逐步描述了可变长度数组的可能性。
我不会推荐Felix吸食的东西,因为:
首先:你永远不希望有可变的扫描时间。
第二:如果由于某种原因,让我们说一些事情已经破裂并且你想要成为数组上限的SpeedValue是不可能达到的,那么你要么有一个死锁或一个糟糕的输出而不知道某些东西是什么错
答案 2 :(得分:2)
借助指针和运算符“ __NEW”,“ __ DELETE”可以实现动态数组:
VAR
arrnValues : POINTER TO INT;
SpeedValue : UDINT;
END_VAR
SpeedValue := 100;
arrnValues := __NEW(INT, SpeedValue);
__DELETE(arrnValues);
还必须在“应用程序属性”中激活动态内存分配: Application Build Options