L_UMTP_2DInterpolation
Dieser Funktionsbaustein dient der sequenziellen 2D-Interpolation auf eine rechteckigen Fläche. Er ist eine Verallgemeinerung des FB L_UMTP_BilinearInterpolation auf die Interpolationsvektoren für x und y und die Auswahl der Interpolationsart für die Koordinatenrichtungen x und z: Stückweise linear und kubischer Spline mit Hermite- oder natürlichen Randbedingungen.
Berechnungsverfahren im FB:
-
Erste Interpolation in x-Richtung zur Ermittlung eines Stützstellenvektors. Die Berechnung zur Rechenzeitoptimierung wird nur bei lrx-Änderung oder einer FALSEäTRUE-Flanke am Eingang xEnable durchgeführt.
-
Zweite Interpolation in y-Richtung zur Ermittlung des Ergebnisses lrz.
Liegen lrx oder lry außerhalb der Minimal- bzw. Maximalwerte von alrX bzw. alrY, werden die Eingangswerte limitiert. Dies bedeutet, dass keine Extrapolation durchgeführt wird.
alrX und alrY müssen streng monoton steigend sein.
Werden die Basisdaten der Interpolation (Anzahl der Stützpunkte, Werte in alrX, alrY oder alrZ oder eInterpTypeX/Y) geändert, ist am Eingang xEnableerneut eine FALSEäTRUE-Flanke erforderlich.
Der Funktionsblock kann auch zur Durchführung einer 1D-Interpolation (lrz = f(lrx) ) verwendet werden. Dazu muss diNumOfYValues auf 1 gesetzt werden.
|
|
Funktion: 2D-Interpolation
|
L_UMTP_2DInterpolation |
|||||||
|---|---|---|---|---|---|---|---|
|
BOOL |
— |
|
xEnable |
xValid |
|
— |
BOOL |
|
ARRAY [*] OF LREAL |
— |
|
alrX |
xError |
|
— |
BOOL |
|
DINT |
— |
|
diNumOfXValues |
eErrorID |
|
— |
L_IE1P_Error |
|
L_UMTP_InterpolationType |
— |
|
eInterpTypeX |
lrz |
|
— |
LREAL |
|
ARRAY [*] OF LREAL |
— |
|
alrY |
|
|
|
|
|
DINT |
— |
|
diNumOfYValues |
|
|
|
|
|
L_UMTP_InterpolationType |
— |
|
eInterpTypeY |
|
|
|
|
|
ARRAY [*,*] OF LREAL |
— |
|
alrZ |
|
|
|
|
|
LREAL |
— |
|
lrx |
|
|
|
|
|
LREAL |
— |
|
lry |
|
|
|
|
Eingänge
|
Name Datentyp |
Informationen/mögliche Einstellungen |
|
|---|---|---|
|
xEnable BOOL
|
TRUE |
Interpolation durchführen |
|
FALSEäTRUE |
Wenn Werte in alrX, alrY, alrZ, die Anzahl der zu verwendenden Stützstellen oder die Art der Interpolation für x oder y geändert werden, ist eine positive Flanke am Eingang xEnable erforderlich. |
|
|
alrX ARRAY [*] OF LREAL |
Stützpunkte in x-Richtung
|
|
|
diNumOfXValues DINT |
Optional: Anzahl von Werten aus alrX und Zeilen in alrZ, die für die Interpolation ausgewertet werden sollen |
|
|
eInterpTypeX L_UMTP_InterpolationType |
Art der Interpolation in x-Richtung |
|
|
alrY ARRAY [*] OF LREAL |
Stützpunkte in y-Richtung
|
|
|
diNumOfYValues DINT |
Optional: Anzahl von Werten aus alrY und Spalten in alrZ, die für die Interpolation ausgewertet werden sollen |
|
|
eInterpTypeY L_UMTP_InterpolationType |
Art der Interpolation in y-Richtung |
|
|
alrZ ARRAY [*,*] OF LREAL |
Werte an den Interpolationspunkten z = z(x,y) 2D-Matrix mit variabler Dimension, max. 10 × 10 Einträge. Die Dimensionen von alrX, alrY und alrZ müssen übereinstimmen. |
|
|
lrx LREAL |
Auszuwertende x-Koordinate |
|
|
lry LREAL |
Auszuwertende y-Koordinate |
|
Ausgänge
|
Name Datentyp |
Wert/Bedeutung |
|---|---|
|
xValid BOOL |
Eingabewerte sind plausibel und Berechnung von lrz erfolgreich |
|
xError BOOL |
Es ist ein Fehler aufgetreten |
|
eErrorID L_IE1P_Fehler |
Detaillierte Fehlerinformationen |
|
lrz LREAL |
Interpolierter Wert lrz = lrz(lrx,lry), basierend auf den Stützpunkten alrX, alrY und alrZ |
Anwendungsbeispiel
|
(* Deklaration *) alrX : ARRAY[1..10] OF LREAL; alrY : ARRAY[1..10] OF LREAL; alrZ : ARRAY[1..10,1..10] OF LREAL; fb2DInterp1 : L_UMTP_2DInterpolation; lry : LREAL;
(* Implementierung *) // Stützpunkte für die Interpolation - x-Richtung alrX[1] := 0.0; alrX[2] := 1.0;
// Stützpunkte für die Interpolation - y-Richtung alrY[1] := -4.0; alrY[2] := -2.0; alrY[3] := 2.0; alrY[4] := 4.0; alrY[5] := 6.0; alrY[6] := 10.0;
// Stützpunkte für die Interpolation - z-Werte alrZ[1,1] := 11.0; alrZ[2,1] := 15.0; alrZ[1,2] := 8.0; alrZ[2,2] := 13.0; alrZ[1,3] := 8.0; alrZ[2,3] := 11.0; alrZ[1,4] := 3.0; alrZ[2,4] := 7.0; alrZ[1,5] := 5.0; alrZ[2,5] := 8.0; alrZ[1,6] := 5.0; alrZ[2,6] := 9.0;
// fb aufrufen fb2DInterp1(xEnable := TRUE, alrX := alrX, diNbrOfXValues := 1, // 1D-Interpolation eInterpTypeX := L_UMTP_InterpolationType.Linear, alrY := alrY, diNbrOfYValues := 6, // Verwendung der ersten 6 Werte eInterpTypeY := L_UMTP_InterpolationType.Linear, alrZ := alrZ, lrx := 0.3, lry := lry); |
Die folgende Grafik zeigt die Interpolationsergebnisse zum Vergleich der verfügbaren Interpolationstypen.
|
|
Vergleich der verschiedenen Interpolationstypen (in y-Richtung) für das obige Codebeispiel für verschiedene lry-Werte bei lrx := 0.3;