[highlight=epc]
//----------------------------------------------------------------------
// Makros für den Enertex EiBPC
//
// Zweck : Makros um aus Stützstellen einen
// linear interpolierten Wert zu ermitteln
//
// Version : V 1.3, März 2012
//
// Autor + Copyright : Bernd Meiners
//
//----------------------------------------------------------------------
//
// // Benutzung: NAME ist hier als eindeutiger Tabellenname gewählt
//
// // Zunächst das "Grundeinstellen" der Parameter, also Name, min und max
// SetupStaticLookupTable( NAME, 0.0f32, 360.0f32 )
//
// // Dann pro Datenpunkt den man haben möchte ein XY-Paar anlegen.
// // Dabei muß darauf Rücksicht genommen werden, das die Werte aufsteigen
// // und keine negative Steigung entsteht.
// AddStaticPoint(NAME, 0.0f32, 100.0f32 )
// AddStaticPoint(NAME, 90.0f32, 100.0f32 )
// AddStaticPoint(NAME, 95.0f32, 10.0f32 )
// AddStaticPoint(NAME, 140.0f32, 10.0f32 )
// AddStaticPoint(NAME, 150.0f32, 30.0f32 )
// AddStaticPoint(NAME, 170.0f32, 40.0f32 )
// AddStaticPoint(NAME, 190.0f32, 40.0f32 )
// AddStaticPoint(NAME, 210.0f32, 30.0f32 )
// AddStaticPoint(NAME, 220.0f32, 10.0f32 )
// AddStaticPoint(NAME, 265.0f32, 10.0f32 )
// AddStaticPoint(NAME, 270.0f32, 100.0f32 )
// AddStaticPoint(NAME, 360.0f32, 100.0f32 )
// // Der tatsächliche Vergleich erfolgt in diesem Makro, dort
// // wir auch der Sonderfall x0 == x1 berücksichtigt.
// DoStaticLookup(NAME)
//
// // Die Berechnung findet dann statt, wenn sich im vorigen Zyklus
// // der Wert für NAME_xin geändert hat.
// // Das Ergebnis findet sich direkt nach dem DoStaticLookup
// // in NAME_yout
:begin SetupStaticLookupTable( Name, XMin, XMax)
:info $Legt die LookupTabelle mit den Grundvariablen an$
// Die Werte für Eingabe und Ausgabe
Name_xin = 0.0f32
Name_yout = 0.0f32
Name_NumPoints = 0u16
Name_Index = 0u16
Name_x0 = 0.0f32
Name_x1 = 0.0f32
Name_y0 = 0.0f32
Name_y1 = 0.0f32
// Bei Änderung immer für neue Berechnung sorgen
if change( Name_xin ) then {
Name_x0 = XMin;
Name_x1 = XMax;
Name_y0 = 0.0f32;
Name_y1 = 0.0f32;
Name_Index = 0u16;
} endif
:end
:begin AddStaticPoint( Name, X0, Y0 )
:info $Fügt ein Wertepaar an die Lookuptabelle an$
:var NameX@
:var NameY@
:var NamePoint@
NameX@ = X0
NameY@ = Y0
NamePoint@ = 0u16
if systemstart() then NamePoint@ = Name_Index endif
// nur neu berechnen, wenn sich der Eingangswert verändert hat
if change( Name_xin ) and !systemstart() then {
if Name_Index == 0u16 then {
Name_x0 = NameX@;
Name_y0 = NameY@;
} endif;
if Name_xin >= NameX@ then {
if NameX@ > Name_x0 then {
Name_x0 = NameX@;
Name_y0 = NameY@;
} endif;
} endif;
if Name_xin <= NameX@ then {
if NameX@ < Name_x1 then {
Name_x1 = NameX@;
Name_y1 = NameY@;
} endif;
} endif;
Name_Index = Name_Index + 1u16;
} endif
if systemstart() then {
Name_NumPoints = max( Name_NumPoints, Name_Index);
Name_Index = Name_Index + 1u16;
} endif
:return
:end
:begin DoStaticLookup( Name )
:info $Führt die Approximation durch$
// jetzt nur noch eine Lineare Approximation
if change( Name_xin ) and !systemstart() then {
if Name_x0 == Name_x1 then {
Name_yout = Name_y0;
} endif;
if Name_x0 < Name_x1 then {
Name_yout = Name_y0 + (Name_y1 - Name_y0) / (Name_x1 - Name_x0) * ( Name_xin - Name_x0);
} endif;
} endif
:return
:end
[/highlight]
//----------------------------------------------------------------------
// Makros für den Enertex EiBPC
//
// Zweck : Makros um aus Stützstellen einen
// linear interpolierten Wert zu ermitteln
//
// Version : V 1.3, März 2012
//
// Autor + Copyright : Bernd Meiners
//
//----------------------------------------------------------------------
//
// // Benutzung: NAME ist hier als eindeutiger Tabellenname gewählt
//
// // Zunächst das "Grundeinstellen" der Parameter, also Name, min und max
// SetupStaticLookupTable( NAME, 0.0f32, 360.0f32 )
//
// // Dann pro Datenpunkt den man haben möchte ein XY-Paar anlegen.
// // Dabei muß darauf Rücksicht genommen werden, das die Werte aufsteigen
// // und keine negative Steigung entsteht.
// AddStaticPoint(NAME, 0.0f32, 100.0f32 )
// AddStaticPoint(NAME, 90.0f32, 100.0f32 )
// AddStaticPoint(NAME, 95.0f32, 10.0f32 )
// AddStaticPoint(NAME, 140.0f32, 10.0f32 )
// AddStaticPoint(NAME, 150.0f32, 30.0f32 )
// AddStaticPoint(NAME, 170.0f32, 40.0f32 )
// AddStaticPoint(NAME, 190.0f32, 40.0f32 )
// AddStaticPoint(NAME, 210.0f32, 30.0f32 )
// AddStaticPoint(NAME, 220.0f32, 10.0f32 )
// AddStaticPoint(NAME, 265.0f32, 10.0f32 )
// AddStaticPoint(NAME, 270.0f32, 100.0f32 )
// AddStaticPoint(NAME, 360.0f32, 100.0f32 )
// // Der tatsächliche Vergleich erfolgt in diesem Makro, dort
// // wir auch der Sonderfall x0 == x1 berücksichtigt.
// DoStaticLookup(NAME)
//
// // Die Berechnung findet dann statt, wenn sich im vorigen Zyklus
// // der Wert für NAME_xin geändert hat.
// // Das Ergebnis findet sich direkt nach dem DoStaticLookup
// // in NAME_yout
:begin SetupStaticLookupTable( Name, XMin, XMax)
:info $Legt die LookupTabelle mit den Grundvariablen an$
// Die Werte für Eingabe und Ausgabe
Name_xin = 0.0f32
Name_yout = 0.0f32
Name_NumPoints = 0u16
Name_Index = 0u16
Name_x0 = 0.0f32
Name_x1 = 0.0f32
Name_y0 = 0.0f32
Name_y1 = 0.0f32
// Bei Änderung immer für neue Berechnung sorgen
if change( Name_xin ) then {
Name_x0 = XMin;
Name_x1 = XMax;
Name_y0 = 0.0f32;
Name_y1 = 0.0f32;
Name_Index = 0u16;
} endif
:end
:begin AddStaticPoint( Name, X0, Y0 )
:info $Fügt ein Wertepaar an die Lookuptabelle an$
:var NameX@
:var NameY@
:var NamePoint@
NameX@ = X0
NameY@ = Y0
NamePoint@ = 0u16
if systemstart() then NamePoint@ = Name_Index endif
// nur neu berechnen, wenn sich der Eingangswert verändert hat
if change( Name_xin ) and !systemstart() then {
if Name_Index == 0u16 then {
Name_x0 = NameX@;
Name_y0 = NameY@;
} endif;
if Name_xin >= NameX@ then {
if NameX@ > Name_x0 then {
Name_x0 = NameX@;
Name_y0 = NameY@;
} endif;
} endif;
if Name_xin <= NameX@ then {
if NameX@ < Name_x1 then {
Name_x1 = NameX@;
Name_y1 = NameY@;
} endif;
} endif;
Name_Index = Name_Index + 1u16;
} endif
if systemstart() then {
Name_NumPoints = max( Name_NumPoints, Name_Index);
Name_Index = Name_Index + 1u16;
} endif
:return
:end
:begin DoStaticLookup( Name )
:info $Führt die Approximation durch$
// jetzt nur noch eine Lineare Approximation
if change( Name_xin ) and !systemstart() then {
if Name_x0 == Name_x1 then {
Name_yout = Name_y0;
} endif;
if Name_x0 < Name_x1 then {
Name_yout = Name_y0 + (Name_y1 - Name_y0) / (Name_x1 - Name_x0) * ( Name_xin - Name_x0);
} endif;
} endif
:return
:end
[/highlight]