【发布时间】:2021-06-15 20:57:21
【问题描述】:
如何在 TwinCAT3 中创建一个简单的 LUT(查找表),例如我有这样的数据:
(1,1)
(2,4)
(3,9)
(4,16)
...
我想创建一个使用上述数据计算新数据的函数,y=f(x) 将是一个函数,它为输入1.5 提供结果2.25。
【问题讨论】:
如何在 TwinCAT3 中创建一个简单的 LUT(查找表),例如我有这样的数据:
(1,1)
(2,4)
(3,9)
(4,16)
...
我想创建一个使用上述数据计算新数据的函数,y=f(x) 将是一个函数,它为输入1.5 提供结果2.25。
【问题讨论】:
具体你要找的函数是:FB_CTRL_LIN_INTERPOLATION
但是这是一个付费库,所以我建议如果这是一个一次性或简单的项目,可能需要编写自己的版本。
以下是我以前使用过的插值程序的简单版本,但我建议您不要只是复制/粘贴检查:
Raw : REAL;
PairCnt : INT := 0;
PairArr : ARRAY [1..MAX_PAIRS, 0..1] OF REAL;
i : UDINT;
Out : REAL;
// Default value just in case no pairs exist
Scale := 0;
FOR i := 1 TO ( MAX_PAIRS - 1 ) DO (* -1 for looking at i+1 *)
IF Raw > PairArr[ i, 0 ] AND_THEN
Raw < PairArr[( i+1 ), 0 ] THEN
Out := ((( Raw - PairArr[ i, 0 ])/( PairArr[( i+1 ), 0 ] - PairArr[ i, 0 ])) * (PairArr[( i+1 ), 1 ] - PairArr[ i, 1 ])) + PairArr[ i, 1 ];
ELSE
Out := PairArr[( i+1 ), 1 ];
END_IF
END_FOR
【讨论】:
您提供的样本数据描述了一个多项式,y=x^2。我假设您的实际数据有点复杂。根据您的应用程序和数据的粗糙度,在两个周围点之间进行线性插值可能会或可能不会足够。如果您希望使用给定的数据在 x=1.5 处得到 y=2.25,那么它就行不通了。
更高准确度的一种选择是进行最小二乘多项式曲线拟合。您可能必须编写自己的代码,因为我在付费库之外还没有看到用于此的 ST 函数。
这个链接很好地解释了这个过程: https://neutrium.net/mathematics/least-squares-fitting-of-a-polynomial/
【讨论】: