Linearinterpolation diskreter Werte durchführen
Dieser FP-Befehl ermittelt an der Stelle x den Funktionswert y durch Linearinterpolation zwischen den benachbarten Stützstellen Pw(xw, yw) und Pw+1(xw+1, yw+1). Hier ist w die nächste Stützstelle, deren x-Wert kleiner als der Eingangswert s1_x ist. Das heißt, die Funktion verbindet nacheinander die einzelnen Stützstellen und ermittelt aus dem Eingangswert s1_x den zugehörigen Ausgangswert d_y.
Eingang
Eingangswert
Bei 16-Bit-SPS-Typen: (INT, DINT, REAL)
Bei 32-Bit-SPS-Typen: (INT, DINT, UINT, UDINT, REAL, LREAL)
Ordnen Sie diesem Eingang das erste Element des benutzerdefinierten SDT zu, d.h. die Anzahl der xy-Werte. Siehe Beschreibung der SDT-Struktur unten.
Ausgang
Ergebnis
Bei 16-Bit-SPS-Typen: (INT, DINT, REAL)
Bei 32-Bit-SPS-Typen: (INT, DINT, UINT, UDINT, REAL, LREAL)
Anwendungsbeispiele:
Linearisierung von Messwerten, z. B. bei nichtlinearen Sensoren
Ermittlung der Vorlauftemperatur y einer Heizung in Abhängigkeit von der Außentemperatur x
wenn der mit dem Index-Modifizierer definierte Bereich größer ist als der zulässige Bereich
wenn die Anzahl der Stützstellen außerhalb des Bereichs von 2–256 liegt.
wenn s2_xyData außerhalb des zulässigen Bereichs liegt
wenn die x-Werte der Stützstellen nicht in aufsteigender Reihenfolge vorliegen
wenn der mit dem Index-Modifizierer definierte Bereich größer ist als der zulässige Bereich
wenn die Anzahl der Stützstellen außerhalb des Bereichs von 2–256 liegt.
wenn s2_xyData außerhalb des zulässigen Bereichs liegt
wenn die x-Werte der Stützstellen nicht in aufsteigender Reihenfolge vorliegen
Ist der Eingangswert x kleiner als die x-Koordinate der ersten Stützstelle (P1: x< x1), wird der Ausgang y auf die y-Koordinate der ersten Stützstelle gesetzt (Ausgang y = y1, waagrechte gestrichelte Linie links oben in der Grafik).
Ist der Eingangswert x größer als die x-Koordinate der letzten Stützstelle (P8: x > x8), wird der Ausgang y auf die y-Koordinate der letzten Stützstelle gesetzt (Ausgang y = y8, waagrechte gestrichelte Linie rechts oben in der Grafik).
SDT für die xy-Wertepaare (Stützstellen P1, P2, ...):
Die Stützstellen (P1, P2, ...) werden der Funktion durch eine Variable vom Type SDT übergeben, die die Anzahl der Stützstellen und die xy-Wertepaare enthält (Anzahl; x1, x2, ...; y1, y2; ...).
Element: Variable vom Datentyp ARRAY[1..z] OF INT (bei 16-Bit-SPS-Typen: INT, DINT, REAL; bei 32-Bit-SPS-Typen: (INT, DINT, UINT, UDINT, REAL)) oder ARRAY[0..z-1] of INT (bei 16-Bit-SPS-Typen: INT, DINT, REAL; bei 32-Bit-SPS-Typen: (INT, DINT, UINT, UDINT, REAL)), die die x-Werte enthält. Hier steht z als Platzhalter für die Anzahl an Stützstellen (siehe 1. Eintrag).
Element: Variable vom Datentyp ARRAY[1..z] OF INT (bei 16-Bit-SPS-Typen: INT, DINT, REAL; bei 32-Bit-SPS-Typen: (INT, DINT, UINT, UDINT, REAL)) oder ARRAY[0..z-1] of INT (bei 16-Bit-SPS-Typen: INT, DINT, REAL; bei 32-Bit-SPS-Typen: (INT, DINT, UINT, UDINT, REAL)), die die y -Werte enthält. Hier steht z als Platzhalter für die Anzahl an Stützstellen (siehe 1. Eintrag).
FP_SCALE unterstützt die folgenden Datentypen:
Bei 16-Bit-SPS-Typen (FP-Sigma, FP-X): INT, DINT, REAL
Bei 32-Bit-SPS-Typen (FP7): INT, DINT, REAL, UINT, UDINT
Verwandte F-Befehle: F282_SCAL, F283_DSCAL, F354_FSCAL
Mit einem strukturierten Datentyp (SDT) können zusammengesetzte Datentypen definiert werden. Ein SDT wird zunächst im SDT-Pool angelegt und dann wie die Standardtypen (BOOL, INT usw.) in der globalen Variablenliste oder im POE-Kopf verarbeitet.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden. Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
VAR
bStart: BOOL:=FALSE;
iInput: INT:=50;
xy_data: xy_data_dut;
iScaledOutput: INT:=0;
@'': @'';
END_VAR
Wenn die Variable bStart auf TRUE gesetzt wird, wird die Funktion ausgeführt.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bStart,4,2,6,4,);
B(B_F,FP_SCALE!,,17,1,25,6,,?DEN?Ds1_x?Ds2_xyData?AENO?Cd_y);
B(B_VARIN,,iInput,15,3,17,5,);
B(B_VAROUT,,iScaledOutput,25,3,27,5,);
B(B_VARIN,,xy_data.iNumberOfValues,15,4,17,6,);
L(1,0,1,6);
L(1,3,4,3);
L(6,3,17,3);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (bStart) then
FP_SCALE(s1_x := iInput,
s2_xyData := xy_data.iNumberOfValues,
d_y => iScaledOutput);
END_IF;