Linearinterpolation diskreter INT-Werte
Dieser 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 x ist. Das heißt, die Funktion verbindet nacheinander die einzelnen Stützstellen und ermittelt aus dem Eingangswert x den zugehörigen Ausgangswert y.
Eingang
Aktivierung der Funktion (bei EN = TRUE wird die Funktion bei jedem SPS-Zyklus abgearbeitet)
Eingangswert x
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
Ausgangswert y
ENO wird auf TRUE gesetzt, sobald die Funktion abgearbeitet ist. Hilfreich bei der Kaskadierung von Bausteinen mit EN-Funktion.
Wir empfehlen, anstelle von diesem F-Befehl den entsprechenden FP7-Befehl zu verwenden: FP_SCALE
Die Funktion kann verwendet wenden für:
die Linearisierung von Messwerten z. B. bei nichtlinearen Sensoren
die Ermittlung der Vorlauftemperatur y einer Heizung in Abhängigkeit von der Außentemperatur x
usw.
wenn die Anzahl an Stützstellen nicht zwischen 2... 100 liegt oder die x-Werte keine homogen steigende Reihenfolge (x1 < x2 < x3...) haben.
wenn die Anzahl an Stützstellen nicht zwischen 2... 100 liegt oder die x-Werte keine homogen steigende Reihenfolge (x1 < x2 < x3...) haben.
Ist der Eingangswert x kleiner als die x-Koordinate der ersten Stützstelle (P1: x < x1), wird der Ausgang yauf 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 yauf 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: x-Werte (ARRAY[1..z] OF INT oder ARRAY[0..z-1] of INT)
Element: y-Werte (ARRAY[1..z] OF INT oder ARRAY[0..z-1] of INT)
Wichtige Informationen:
x-Werte
Die x-Werte müssen in homogen steigender Reihenfolge (x1 < x2 < x3 < ...) eingetragen sein. Sind gleiche x-Werte vorhanden (z.B. x2 = x3 = x4) werden die Stützstellen P2(x2,y2) und P3(x3,y3) ignoriert.
Um einen Berechnungsüberlauf in der Funktion zu vermeiden, müssen benachbarte Stützstellen folgende Bedingungen erfüllen:
|ya - yb| < 32767 |x - xb| < 32767 |(ya - yb)*(x - xb)| < 32767 |xa - xb| < 32767 |
Diese Funktion kann ausschließlich ganze Zahlen verarbeiten. Nachkommastellen bei der Berechnung des Funktionswertes y werden abgeschnitten. Wenn beispielsweise an der Stelle x, y = 511,13, gibt die Funktion 511 zurück.
Im SDT-Pool wird ein strukturierter Datentyp angelegt in dem die Anzahl der Stützstellen und die xy-Wertepaare deklariert werden.
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
start: BOOL:=FALSE;
(*avtivates the function*)
input_value: INT:=0;
(*input_value x*)
measured_value: Interpolation_8 (X_values := [-5,5,15,20,30,42,45,50],Y_values := [5,-5,10,2,2(5),0,2]);
(*number of reference
points*)
output_value: INT:=0;
(*output_value y*)
@'': @'';
END_VAR
Hier wurde die Eingangsvariable measured_value von Typ des oben angelegten SDT deklariert. Die Belegung der x-Werte und y-Werte wurde bereits im POE-Kopf vorgenommen. Statt dessen können Sie im Rumpf auch die x-Werte und y-Werte verändern indem Sie einen Wert auf die Variable z.B. Measuredvalues.X_Values[1] für x schreiben.
Wenn die Variable start auf TRUE gesetzt wird, wird die Funktion ausgeführt. Sie berechnet für den Eingangswert an der Stelle x den Ausgangswert y durch lineare Interpolation zwischen den benachbarten Stützstellen die in der Variablen measured_value gespeichert sind.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,F282_SCAL!,Instance,15,0,22,5,,?DEN?Dx?Dxy_data?AENO?Cy);
B(B_VARIN,,input_value,13,2,15,4,);
B(B_VARIN,,measured_value.referencepoints,13,3,15,5,);
B(B_VAROUT,,output_value,22,2,24,4,);
B(B_CONTACT,,start,6,1,8,3,);
L(8,2,15,2);
L(1,2,6,2);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
F282_SCAL(input_value, measured_value.referencepoints, output_value);
END_IF;