【问题标题】:Create a simple Look UP Table in TwinCAT在 TwinCAT 中创建一个简单的查找表
【发布时间】:2021-06-15 20:57:21
【问题描述】:

如何在 TwinCAT3 中创建一个简单的 LUT(查找表),例如我有这样的数据:

(1,1)
(2,4)
(3,9)
(4,16)
...

我想创建一个使用上述数据计算新数据的函数,y=f(x) 将是一个函数,它为输入1.5 提供结果2.25

【问题讨论】:

    标签: plc twincat


    【解决方案1】:

    具体你要找的函数是:FB_CTRL_LIN_INTERPOLATION

    但是这是一个付费库,所以我建议如果这是一个一次性或简单的项目,可能需要编写自己的版本。


    以下是我以前使用过的插值程序的简单版本,但我建议您不要只是复制/粘贴检查:

    • 如果目标值高于/低于范围,您的代码应该怎么做?
    • 您的代码是否需要处理乱序数组?
    • 如何捕获 div/0 错误?
    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
    

    【讨论】:

    • 如果目标值高于/低于范围,你的代码应该怎么做?回答:就我而言,我不需要外推。您的代码是否需要处理乱序数组?答:一般形式是的,它需要,但在这种情况下,我可以忽略它们。你如何捕捉除以零错误?答:是的,可以通过异常处理来解决。
    【解决方案2】:

    您提供的样本数据描述了一个多项式,y=x^2。我假设您的实际数据有点复杂。根据您的应用程序和数据的粗糙度,在两个周围点之间进行线性插值可能会或可能不会足够。如果您希望使用给定的数据在 x=1.5 处得到 y=2.25,那么它就行不通了。

    更高准确度的一种选择是进行最小二乘多项式曲线拟合。您可能必须编写自己的代码,因为我在付费库之外还没有看到用于此的 ST 函数。

    这个链接很好地解释了这个过程: https://neutrium.net/mathematics/least-squares-fitting-of-a-polynomial/

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多