Algorithmen
Numerische Algorithmen
Kennlinie, Kennfeld "lookup"
Mit der Funktion lookup()
können aus Kennlinien oder Kennfeldern Daten zu ein bis drei Eingangsgrößen linear interpoliert werden.
L1 = lookup(x, {...});
L2 = lookup(x, y, {...});
L3 = lookup(x, y, z, {...});
// Das Konfigurationsobjekt ist verpflichtend und muss
// auf eine Ressource verweisen:
Lx = lookup(..., {$ref:'myLookupData'});
Das Konfigurationsobjekt folgt einer eigenen Syntax und muss deshalb mittels {$ref:'myLookupData'}
aus dem Ressourcebereich des Mathemoduls bezogen werden. Zwei Formate werden unterstützt: das klassische Text-Format und eine Beschreibung im vereinfachten JSON Format1
Beschreibung der Eingänge / Achsen
Jedem Eingangssignal wird eine Achse zugewiesen. Diese ist durch ihre Einheit <unit>
, einen Startwert <from>
, das Increment <step>
und die Anzahl der Stützstellen <count>
definiert. Die Achsen müssen nicht zwingen in numerisch aufsteigender Folge sortiert sein.
Konfiguration im Textformat (klassisch)
Für jede Achse ist folgende Beschreibung am Anfang des Textblocks hinzuzufügen, also mindestens eine, maximal drei:
IN <unit> <from> <step> <count>
Konfiguration im JSON-Format:
Im JSON Format ist zusätzlich die Angabe eines beschreibenden, informellen Namens <name>
und alternativ zu einer der vorher genannten Werte-Parameter der Endwert <to>
möglich. Es müssen also genau drei der vier Eigenschaften <from>, <step>, <count> oder <to>
definiert werden, die jeweils vierte wird berechnet.
{
axes: [
{ name: <str>, // optional description
unit: <str>, // recommended
// choose 3 as mandatory of the following 4:
from: <dbl>, // left-side value of input axis
step: <dbl>, // increment between interpolation points
count: <uint>, // number of interpolation points
to: <dbl> // right-side value of input axis
}, ...
], ...
}
Beschreibung der Ausgänge
Das Ausgangssignal wird durch eine Einheit <unit>
beschrieben.
Konfiguration im Textformat (klassisch)
Die folgende Definition muss einmal nach der Definition der Eingänge aufgeführt werden:
OUT <unit>
Konfiguration im JSON-Format:
Im JSON Format ist zusätzlich die Angabe eines beschreibenden, informellen Namens <name>
möglich. Statt des JSON Objekts für jeden Ausgang (empfohlen) kann auch nur die physikalische Einheit als String angegeben werden.
{
outputs: [
{ name: <str>, // optional description
unit: <str> // recommended
}, ... // prepared to support vector output in future
<str>, ... // alternative to define output by unit
], ...
Datenfeld
Das Datenfeld besteht aus <dbl>
Werten. Die Reihenfolge der Stützstellen ergibt sich aus folgendem Pseuso-Code:
foreach(z : axis3)
foreach(y : axis2)
foreach(x : axis1)
Value[x,y,z];
Konfiguration im Textformat (klassisch)
Die Datenwerte werden einfach durch Leerzeichen, Tabs oder Zeilenvorschübe beliebig voneinander getrennt und der Reihe nach in die Stützstellen der Kennlinie oder des Kennfeldes eingelesen.
0 42.942 87.924 134.946
184.008 235.11 288.252
... continued up to 161 data points
Konfiguration im JSON-Format:
Im JSON Format werden alle Datenwerte in einem Array aus Fließkommazahlen angegeben.
{
data: [
<dbl>, ...
], ...
}
Zusammenfassung
Konfiguration im Textformat (klassisch)
Kennlinie:
IN kPa 0.0 0.167751 161
OUT l
0
42.942
87.924
134.946
184.008
235.11
288.252
343.434
400.656
459.918
521.22
... continued up to 161 data points
Kennfeld:
IN g/h 0 10000 22
IN 1/min 900 100 10
OUT kW
0.0 40.8 81.6 132.9 185.2 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0 200.0
0.0 40.0 80.0 131.3 184.3 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0 230.0
0.0 38.5 76.9 125.8 182.4 233.5 286.9 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0 310.0
... 7 more rows with 22 data points each
Konfiguration im vereinfachten JSON-Format
Das Konfigurationsobjekt kann auch im vereinfachten JSON Format1 beschrieben werden.
{
axes: [
{ name: <str>, // optional description
unit: <str>, // recommended
from: <dbl>, // left-side value of input axis
step: <dbl>, // increment between interpolation points
count: <uint>, // number of interpolation points
to: <dbl> // right-side value of input axis
}, ...
],
outputs: [
{ name: <str>, // optional description
unit: <str> // recommended
}, ... // prepared to support vector output in future
<str>, ... // alternative to define output by unit
],
data: [
<dbl>, ...
]
}
Bereitstellung als Ressource
Es gibt vielfältige Möglichkeiten, diese Kennlinien oder Kennfeldbeschreibung in den Ressourcen des Mathemoduls aufzunehmen.
Für kleine Kennfelder oder Kennlinien eignet sich die Formatierung als Text-Ressource:
"resources": {
"myLookupData": [
"IN kPa 0.0 0.167751 161"
, "OUT l"
, "0 42.942 87.924 134.946 184.008 235.11 288.252 343.434"
, "400.656 459.918 521.22 584.562 649.944 717.366 785.90745"
, "854.45145 ... and more"
], ...
Alternativ das selbe Kennfeld im vereinfachten JSON Format:
"resources": {
"myLookupData": {
axes: [{ name: "HydroStatPressure", unit: "kPa"
, from: 0.0, step: 0.167751, count: 161 }],
outputs: [{ name: "Volume", unit: "l" }],
data: [
0, 42.942, 87.924, 134.946, 184.008, 235.11, 288.252, 343.434
, 400.656, 459.918, 521.22, 584.562, 649.944, 717.366, 785.90745
, 854.45145, // ... and more
]
}, ...
Für größere Kennfelder oder solche, die in der JSON Konfiguration des smartCORE nicht auftauchen oder lesbar sein sollen, wäre eine verarbeitete Zeichenkette sinnvoll.
Zunächst mit einer Kennfelddatei myLookupData.tab als Datenquelle, die der oben genannten Syntax (Text/Json) folgt:
"resources": {
"myLookupData": {
"decoder": ["file"],
"value": "myLookupData.tab"
}, ...
oder, falls das Kennfeld in komprimierter Form vorliegt:
"resources": {
"myLookupData": {
"decoder": ["file", "unzip"],
"value": "myLookupData.gz"
}, ...
Alternativ können die Daten auch als base64 - String in der Ressource aufgenommen werden:
"resources": {
"myLookupData": {
"decoder": ["base64"],
"value": "Q09MCWcvaAkwCTEwMDAwCTIyDQpST1cJMS9taW4JOTAwCTEw..."
}, ...
... oder die komprimierte Datei als base64 - String:
"resources": {
"myLookupData": {
"decoder": ["base64", "unzip"],
"value": "UEsDBBQAAgAIACt3cUoHOG6qmgEAAD4FAAAcAAAAUF9lZmZf..."
}