.. highlightlang:: us .. index:: OnGridAddFormulaChannel .. index:: Formeln .. index:: Formelinterpreter .. _formelinterpreter-1---einfuhrung: .. _formula-interpreter: Formelinterpreter 1 - Einführung ================================ Mit dem Formelinterpreter können einer Messdatendatei (NC-Datei) zusätzliche Kanäle zugefügt werden (Rechenkanäle). Beispiel: Enthält eine Datei die Kanäle ``n_Motor`` und ``Md_Motor``, kann mit Hilfe des Formelinterpreters der Kanal ``Leistung = (n_Motor * Md_Motor) / 9549.3`` erzeugt werden. Falls Messdaten der Kanäle ``n_Motor`` oder ``Md_Motor`` geändert werden, kann der Formelinterpreter die abhängigen Kanäle aktualisieren. Bei MDF-, Famos- oder ASAM-ODS-Daten können innerhalb einer Formel Kanäle mit unterschiedlicher Anzahl Datenpunkte verwendet werden. In diesem Fall werden die Kanäle durch lineare Interpolation auf die Auflösung des ersten in der Formel auftretenden Kanal interpoliert. Der Ergebniskanal wird dann zur Zeitgruppe des Kanals zugefügt, der die höchste Anzahl an Datenpunkten besitzt. Falls in einer Formel ein Zeitkanal verwendet wird, z. B. integral(time, mstrom), wird automatisch der Zeitkanal der Zeitgruppe ausgewählt, zu dem der Kanal ``mstrom`` gehört. Der in der Formel angegebene Zeitkanal (z. B. ``time`` oder ``time21``) muss in der Datendatei existieren. Bei allen anderen Datendateien muss die Anzahl der Datenpunkte aller in der Formel genutzten Kanäle identisch sein. Das Ergebnis der Berechnung ist ein neuer Kanal in der NC-Datei mit einer Punktanzahl, die der Punktanzahl der Messkanäle entspricht. Innerhalb von Formeln können globale Attribute der NC-Datei verwendet werden, z. B. ``Hubvol = 2000``. Falls eine Formel keine Messkanäle enthält, wird die Kanallänge auf die Länge des ersten Kanals in der NC-Datei gesetzt (Kanal mit der dimid = 0). .. us.bug Konstantentabelle beschreiben Wenn Formeln definiert sind, die als Operanden wieder Rechengrößen enthalten, kann die Abarbeitung der Formelliste nicht wahllos erfolgen. Der Formelinterpreter erzeugt bei jeder Ausführung zuerst eine sortierte Formelliste. Am Anfang der Liste befinden sich nur Formeln, die aus Messgrößen berechnet werden können. Dann folgen die Rechengrößen, die wiederum Rechengrößen als Eingangsgrößen enthalten können, die schon weiter oben in der Liste enthalten sind. Formeln, die Messgrößen oder andere Formeln enthalten, die nicht berechnet werden können, bzw. nicht gemessen wurden, werden ignoriert. Falls die NC-Datei einen Kanal enthält, der auch in der Formelliste vorhanden ist, wird der Kanal als Rechengröße behandelt, auch wenn er gemessen wurde. Der Formelinterpreter setzt die Werte alle Kanäle, die berechnet werden können auf den Wert Missing, bevor die Formeln ausgewertet werden. Die Funktionsweise des Formelinterpreters soll anhand von einfachen Beispielen gezeigt werden. Beispiel 1: Die Messdatei enthält die Kanäle mit den Namen M1, M2 und M3. .. list-table:: :header-rows: 1 * - M1 - M2 - M3 * - 1 - 5 - 2 * - 2 - 6 - 2 * - 3 - 7 - 3 * - 4 - 8 - 3 Der Formelinterpreter kennt die Formelkanäle F1 und F2, die wie folgt definiert sind: :: F1 = M1 + M2 F2 = F1 * M3 F2 ist von F1 abhängig und kann erst berechnet werden, nachdem F1 berechnet worden ist. Der Formelinterpreter berechnet zuerst die Formel F1 und dann die Formel F2. Das Ergebnis der Berechnung ist dann: .. list-table:: :header-rows: 1 * - M1 - M2 - M3 - F1 - F2 * - 1 - 5 - 2 - 6 - 12 * - 2 - 6 - 2 - 8 - 16 * - 3 - 7 - 3 - 10 - 30 * - 4 - 8 - 3 - 12 - 36 Falls der Messkanal M1 in der NC-Datei fehlt, kann die Formel F1 nicht berechnet werden. Wenn F1 nicht berechnet werden kann, wird auch F2 nicht berechnet. Wenn die Formeln nicht berechnet werden können, werden auch keine Kanäle in der NC-Datei angelegt. Die NC-Datei würde in diesem Fall wie folgt aussehen: .. list-table:: :header-rows: 1 * - M2 - M3 * - 5 - 2 * - 6 - 2 * - 7 - 3 * - 8 - 3 Für einen Formelkanal können mehrere alternative Formeln definiert werden. Beispiel: :: F1 = M1+M2 (F1_a) F1 = M1+M3 (F2_b) Bei dieser Art von Formeln wird genau eine Formel ausgewertet, um den Formelkanal zu berechnen. Welche der alternativen Formeln ausgewertet wird, hängt von der Priorität der Formel ab. Der Formelname, beispielsweise F1_a für die Formel F1 bestimmt die Priorität, da die Formeln alphabetisch sortiert werden. F1_a steht in der Formelliste deshalb vor F1_b und hat damit die höhere Priorität. Wenn beide Formeln berechnet werden können, wird die Formel F1_a ausgewertet und F1_b wird ignoriert. Falls F1 mit der Formel F1_a nicht berechnet werden kann, beispielsweise weil der Kanal M2 nicht vorhanden ist, wird F1 über die Formel F1_b berechnet. Für eine Rechengröße können mehrere alternative Formeln definiert werden. Siehe auch :ref:`alternative_formula`. Es können auch alternative Formeln definiert werden, die rekordbasiert arbeiten. Dazu wird vor den Namen der Formel noch ein Dollar-Zeichen gesetzt. Bei diesem Formeltyp werden alle Formeln nacheinander ausgewertet. Die Formel mit der höchsten Priorität wird als erste Formel ausgewertet. Falls das Formelergebnis nach der Anwendung der Formel noch Missing-Werte enthält, wird die nächste Formel auf die noch nicht berechneten Records angewendet. Das wird mit allen alternativen Formeln wiederholt, bis alle Werte berechnet sind, bzw. bis alle alternativen Formeln abgearbeitet sind. Beispiel für rekordbasierte alternative Formeln: .. code-block:: none F1 = M1+M2 ($F1_a) F1 = M1+M3 ($F2_b) Beispiel-Daten: .. list-table:: :header-rows: 1 * - M1 - M2 - M3 * - 1 - 5 - 2 * - 2 - 6 - 2 * - 3 - 7 - 3 * - 4 - 8 - 3 Ergebnis-Daten: .. list-table:: :header-rows: 1 * - M1 - M2 - M3 - F1 * - 1 - 5 - 2 - 6 * - 2 - Missing - 2 - 4 * - 3 - 7 - 3 - 10 * - 4 - 8 - 3 - 12 Bei diesem Beispiel werden die Formeln wie folgt ausgewertet. Die Formel F1_a berechnet die Rekords 1, 3, 4. Rekord 2 kann nicht berechnet werden, da M2[2] den Wert Missing enthält. Die Formel F1_b berechnet die Werte für F1 und trägt das Ergebnis für die Rekords in die Datei ein, die noch den Wert Missing enthalten. F1_b berechnet für den Wert F1[2] den Wert 4 und trägt das Ergebnis in die NC-Datei ein. Alternative Formeln können nicht mit dem Formeleditor erzeugt werden. Sie können über eine Formeltabelle mit Hilfe von Excel definiert werden oder als UniScript-Datei erzeugt werden. .. _ein-beispiel: Ein Beispiel ------------ * Importieren Sie die Datei :file:`test1.xls` aus dem Verzeichnis :file:`c:\\Programme\\UniPlot\\Samples`. Klicken Sie die Schaltfläche **>>**, um folgende Darstellung zu erhalten: .. image:: S:/uniplot-obj/images/nc-data-browser1-de.* * Klicken Sie mit der rechten Maustaste einen Kanalnamen an. In dem folgenden Menü wählen Sie den Befehl **Formelkanal zufügen**. Sie erhalten folgendes Dialogfeld: .. image:: S:/uniplot-obj/images/dateneditor-formula-dlg.* Geben Sie im Formel-Textfeld die folgende Formel ein: ``Power = (EngSpd * SAETrq)/9550`` Die Formel erzeugt den Kanal ``Power``, der die Leistung berechnet. * Drücken Sie :guilabel:`OK`. Wenn Sie den neuen Kanal ``Power`` markieren und dann nochmal den Befehl **Formelkanal zufügen** wählen, können Sie die Formel ändern. .. _the-add-formula-channel-dialog-box: .. _beschreibung-des-formel-eingabe-dialogfelds: Beschreibung des Formel-Eingabe Dialogfelds ------------------------------------------- .. image:: S:/uniplot-obj/images/dateneditor-formula-dlg.* Gesicherte Formeln Dieses Kombinationsfeld zeigt die letzten 128 Formeln an, die Sie eingegeben haben. Über die Schaltfläche **Zufügen** können Sie den Text in das Editierfeld übertragen und dort ändern. Funktion Zeigt die innerhalb von Formeln zulässigen Funktionen an. Um eine Funktion auszuwählen öffnen Sie die Liste und klicken auf die gewünschte Funktion. Die Funktion wird an der Cursorposition in den Formeltext eingefügt. Eine Liste der vordefinierten Funktionen finden Sie im Kapitel :ref:`funktionen-in-formeltabellen`. Hier wird auch beschrieben, wie Sie neue Funktionen definieren können. Kanäle Zeigt die Kanäle der aktiven NC-Datei an. Wenn Sie aus der Liste einen Kanalnamen auswählen, wird der Name an der Cursorposition in den Formeltext angehängt. Globale Attribute werden mit der Vorsilbe ``Attribut:`` sowie ihrem Wert an die Liste der Kanäle angehängt. Falls Konstante definiert sind, werden sie am Ende der Kanalliste angezeigt. Operatoren In einer Formel können die Operatoren ``+``, ``-``, ``*``, ``/`` verwendet werden. Klicken Sie auf die entsprechende Schaltfläche um den Operator an der Cursorposition in den Formeltext einzufügen. Großes Editierfeld Hier kann die Formel in der Form:: NeuerKanalName = Ausdruck eingegeben werden. Die Formel beginnt mit dem zu erzeugenden Kanalnamen. Dem Namen folgt ein Gleichheitszeichen. Daran anschließend folgt der Formelausdruck. Leerzeichen innerhalb einer Formel werden ignoriert. Falls der neue Kanalname mit einem Kanalnamen in der NC-Datei übereinstimmt, wird der Kanal in der NC-Datei überschrieben. Weitere Informationen über Formeln finden Sie im Kapitel :ref:`definition-von-formeln` SI-Einheit Wenn die Option markiert ist, werden alle in der Formel verwendeten Kanäle vor der Berechnung in SI-Einheiten konvertiert. Das Formelergebnis wird in die im Element *Einheit* angegebene Einheit konvertiert. Dei verwendeten Einheiten müssen in der Einheitentabelle eingetragten werden, siehe :ref:`overview-units`. Formel nur berechnen wenn Es können Bedingungen definiert werden, die in diesem Kombinationsfeld angezeigt werden. Z. B. Diesel, Saug, TurboDiesel, TurboSaug. Falls die Bedingung nicht erfüllt ist, wird die Formel nicht berechnet. Siehe :ref:`definition-einer-bedingung`. Missing-Value Behandlung Nur bei bestimmten Sonderfällen sollten Sie diese Option abschalten. Beispielsweise, wenn Sie die Funktion ``replace_missing()`` verwenden möchten. Einheit Geben Sie den Einheiten-Text für den Kanal ein: (``kW``, ``1/min``,...). Die Einheit dient nur zur Information, Sie wird bei der Berechnung nicht berücksichtigt. Kommastellen Geben Sie die Anzahl der Nachkommastellen ein, mit der der Kanal angezeigt werden soll. Beschreibung Hier können Sie eine Beschreibung der Formel eingeben. Die Beschreibung erscheint in der Formelliste (:ref:`extrasformel-liste`). Kommentar Hier können sie einen Kommentar eingeben. Formel registrieren Wenn Sie diese Option nicht einschalten, wird die eingegebene Formel nur einmal ausgeführt. Die Formel wird im erzeugten Formelkanal in der NC-Datei gespeichert. Zum Bearbeiten der Formel markieren Sie den Formelkanal mit der rechten Maustaste und wählen im folgenden Menü den Befehl **Formelkanal zufügen** aus. Wenn Sie diese Option einschalten, wird die Formel in die Formelliste eingetragen. Für die Formel wird im Formel-Verzeichnis eine Skript-Datei erzeugt. Die Datei hat den Namen der Formel mit dem Vorsilbe ``_fi_``, gefolgt von dem Formelnamen, gefolgt von der Namenserweiterung :file:`.ic`, z. B. :file:`_fi_Power.ic`. Die Datei wird im ersten Verzeichnis gespeichert, das im Dialogfeld :ref:`formel-konfiguration` eingetragen ist. Alle Formeln aus einem Verzeichnis werden ab UniPlot R2016 in einer Librarydatei gespeichert. Die Datei hat den Namen :file:`formula.icl9`. Die Library wird im Formelverzeichnis gespeichert. OK Mit :guilabel:`OK` wird die eingegebene Formel überprüft und die Berechnung ausgeführt. Falls die Formel einen Fehler enthält oder ein Kanalname unbekannt ist, wird eine Fehlermeldung ausgegeben. Korrigieren Sie dann den Fehler und drücken erneut :guilabel:`OK`. .. _formula-location-identifier: .. _definition-von-formeln: .. _defining-formulas: Definition von Formeln ---------------------- Eine Formel darf die folgenden Elemente enthalten: * Klammern ``()``. Die Anzahl der Klammerebenen ist nicht begrenzt. * Die Operatoren ``+``, ``-``, ``*``, ``/``, ``**``, also die 4 Grundrechenarten und Potenzierung. Als Potenzoperator kann anstatt ``**`` auch das Zeichen ``^`` verwendet werden. Achtung: Anstatt ``**`` oder ``^`` sollten Sie besser die Funktion ``pow()`` (siehe :ref:`funktionen-in-formeltabellen`) verwenden. * Zahlen der Form 1.23, 1e12, -13. Als Dezimaltrennzeichen ist nur der Punkt erlaubt (kein Komma). * Namen von gemessenen Kanälen bzw. anderen Formeln. Die Namen müssen mit einem Unterstrich oder Buchstaben (nur a-z und A-Z, keine Umlaute, kein ß) beginnen. Dem ersten Zeichen können Buchstaben, Ziffern und Unterstriche folgen. Groß- und Kleinbuchstaben werden unterschieden. Ab UniPlot R2013.11 können Formeln definiert werden, die für mehrere gleiche Kanäle verwendet werden können. Beispiel: Für jeden Zylinder eines Motors wird ein Drucksignal ``p_cyl_1`` bis ``p_cyl_4`` gemessen. Anstatt nun vier Formeln für jeden Ergebniskanal definieren zu müssen, kann nun eine Formel definiert werden die die Messstellen 1 bis 4 in der Form ```` im Variablennamen enthält. Der Name für die Druckkanäle ist dann beispielsweise ``p_cyl_``. Der Messstellenbezeichner ```` muss im Ergebniskanal ebenfalls vorhanden sein, beispielsweise: ``p_cyl_smooth``. .. code-block:: none p_cyl_smooth = smooth(p_cyl_) Es können Formeln mit bis zu drei Messstellenbezeichnern definiert werden. Ein Messstellenbezeichner beginnt mit einem Winkel ``<`` gefolgt von einem bis drei Kleinbuchstaben (a bis z), gefolgt von einem Winkel ``>``. Messstellenbezeichner mit einem Buchstaben stehen für die Werte 1 bis 9. Zwei Buchstaben stehen für die Werte 01 bis 99. Drei Buchstaben stehen für die Werte 001 bis 999. Falls ein Kanalname mehrere Messstellenbezeichner enthält, sollten diese durch einen Buchstaben oder einen Unterstrich getrennt sein. Beispiel: Abgastemperatur eines Motor mit zwei Bänken: ``T_b``. ``c`` könnte die Zylindernummer sein und ``b`` die Banknummer. Die in einer Formel auf der rechten Seite vom Gleichheitszeichen definierten Messstellenbezeichner müssen im Ergebniskanal ebenfalls auftreten: .. code-block:: none p__ = T * X Kanalnamen mit Messstellenbezeichnern können in der Einheitentabelle ebenfalls verwendet werden. Siehe :ref:`units-channel-sheet`. * Funktionsaufrufe wie z. B. ``abs()`` (siehe :ref:`funktionen-in-formeltabellen`). * Innerhalb einer Formel können Konstanten verwendet werden, die in der Konstanten-Tabelle vorhanden sind (siehe :ref:`die-konstantentabelle`). Gültige Formeln sind z. B. :: a = B_20 * F_ko_EWG a = B_20 * Rho_20 * 1000 / P_EWG a = c_Anteil / 100 a = pow(5.9 + 23.333 * ( rho_15 - 0.72 ) + 111.111 * ( rho_15 - 0.72 ), 2) während die folgenden Formeln ungültig sind: :: a = (n_Motor * Md_Motor) / 9550,0 Das Dezimaltrennzeichen ist der Punkt. Die Zahl 9550,0 ist nicht erlaubt. :: a = 100 * B_20 / V-ACT Das Zeichen ``"-"`` im Kanalnamen ist nicht erlaubt. * Ab R2013.12 können auch Formeln mit Zwischenergebnissen eingegeben werden:: a1 = M1+M2 a2 = M1+M3 M_Result = a1 * a2 Die Formel erzeugt den Kanal ``M_Result``. Für die Zwischenergebnisse ``a1`` und ``a2`` wird kein Kanal erzeugt. In diesem Beispiel steht jede Berechnung in einer Zeile. Falls die Berechnung eines Zwischenergebnisses mehrere Zeilen benötigt, muss die Berechnung mit einem Semikolon beendet werden. In diesem Fall muss aber jede Berechnung mit einem Semikolon abgeschlossen werden. Beispiel:: a1 = M1+ M2; a2 = M1+M3; M_Result = a1 * a2; .. _alternative_formula: Alternative Formeln ------------------- Falls es für die Berechnung einer Formel unterschiedliche Berechnungswege, z. B. wegen unterschiedlicher Messtechnik am Prüfstand, können alternative Formeln definiert werden. Um zwei oder mehr alternative Formeln zu erzeugen, gehen Sie wie folgt vor: Erzeugen Sie zuerst mit Hilfe des Formeleditors :ref:`beschreibung-des-formel-eingabe-dialogfelds` die entsprechen Formeln, wobei Sie z. B. den Namen des Ergebniskanals mit ``_a``, ``_b``, etc. erweitern (Beispiel: Tcalc_a, Tcalc_b, Tcalc_c). Wenn Sie die Formeln erstellt haben, öffnen Sie mit UniPlot die UniScript-Dateien im Formelverzeichnis, z. B. _fi_Tcalc_a.ic und ändern den Namen des Formelergebnisses von Tcalc_a in Tcalc und von Tcalc_b in Tcalc, etc. Sie finden die zu ändernden Namen im return-Wert sowie in der letzten Zeile der Funktion (erster Parameter von set_ch. Hier wurde der Name schon von Tcalc_a in Tcalc geändert:: def _fi_Tcalc_a(bInfo) { ssChannels = "TOEL1, SB"; if (bInfo) { return ["Tcalc"; .. // <---- "°C"; .. ""; .. ssChannels; .. ""; .. "%.2lf"]; } _fich_Tcalc_a = ch("TOEL1", "TOEL1"); _fich_SB = ch("SB", "TOEL1"); _fich_T_Calc = _fich_Tcalc_a .* _fich_SB; set_ch("Tcalc", _fich_Tcalc_a, ssChannels); // <---- } Speichern Sie die Änderungen der Dateien und wählen danach das Kommando **Extras=>Aktualisiere Formelliste**. .. _funktionen-in-formeltabellen: .. _functions-in-formulas: Funktionen in Formeltabellen ---------------------------- In Formeln der Formeltabelle können Funktionsaufrufe durchgeführt werden. Z. B. berechnet die Formel ``sqrt( 98.15 / (T_Ansaug + 273.15) )`` die Wurzel aus ``98.15 / (T_Ansaug + 273.15)``. In den folgenden Funktionsbeschreibungen stehen die Parameternamen ``c``, ``c1``, ``c2`` für Kanalnamen und der Parametername ``value`` für eine einzelne Zahl, z. B. ``1.23``. .. index:: abs (Formel-Funktion) abs(c) ^^^^^^ Berechnet die Beträge der Elemente von ``c``. .. index:: atan (Formel-Funktion) atan(c) ^^^^^^^ Berechnet den Arkustangens ``c``. .. index:: atan2 (Formel-Funktion) atan2(c_y, c_x) ^^^^^^^^^^^^^^^ Berechnet die Zwei-Argumenten-Version des Arkustangens. Die Vorzeichen von ``c_y`` und ``c_x`` werden benutzt um einen Hauptwert im dazugehörigen Quadranten zu berechnen. .. index:: cos (Formel-Funktion) cos(c) ^^^^^^ Berechnet den cosinus von ``c``. .. index:: counter (Formel-Funktion) counter() ^^^^^^^^^ Erzeugt eine Zahlenreihe ``1, 2, 3, ...`` für die erste Dimension. counter(Kanalname) ^^^^^^^^^^^^^^^^^^ Erzeugt eine Zahlenreihe ``1, 2, 3, ...`` für die Dimension, zu der der Kanal mit dem angegebenen Namen gehört. .. index:: fft_filter (Formel-Funktion) fft_filter(time, c, rsFreqCutOffBelow, rsFreqCutOffAbove) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Der Zeitkanal time muss in Sekunden definiert sein. Falls time nicht mit konstanter Abtastfrequenz erfasst wurde, werden die Daten neu interpoliert und die Abtastfrequenz bestimmt. Von den Daten wird eine FFT berechnet. Die Frequenzen, die größer und kleiner als die Grenzen sind, werden auf 0 gesetzt. Für das Ergebnis wird die inverse FFT berechnet. Falls die Daten neu interpoliert wurden (Schritt 1), wird das Ergebnis wieder auf die Original-Abtastung interpoliert. .. index:: tan (Formel-Funktion) tan(c) ^^^^^^ Berechnet den Tangens von ``c``. .. index:: log (Formel-Funktion) log(c) ^^^^^^ log berechnet den natürlichen Logarithmus von ``c``. .. index:: log10 (Formel-Funktion) log10(c) ^^^^^^^^ log10 berechnet den dekadischen (Basis 10) Logarithmus von ``c``. .. index:: exp (Formel-Funktion) exp(c) ^^^^^^ Berechnet ``e^c``. .. index:: int (Formel-Funktion) int(c) ^^^^^^ Schneidet die Nachkommastellen von ``c`` ab. .. index:: find_plateau (Formel-Funktion) find_plateau(ctime, cData, dy_tolerance, min_len, max_len, y_min_threshold, y_max_threshold) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Findet horizontale Abschnitte (Plateaus) in Daten. Ein Plateau wird gefunden, wenn die Daten sich innerhalb der angegebenen Toleranz befinden und das Plateau mindestens die Länge min_len besitzt. Maximal ist das Plateau max_len lang. Es werden nur Plateaus gefunden, die im Bereich von y_min_threshold bis y_max_threshold liegen. Die Rampen zwischen den Plateaus werden auf 0 gesetzt. Plateaus enthalten keine missing-Werte. Jedes Plateau wird mit einem konstanten Wert markiert, beginnend mit 1, Inkrement 1. Parameter: .. list-table:: :header-rows: 1 * - Name - Description * - ctime - Name des Zeitkanals. * - cData - Name des Y-Kanals. * - dy_tolerance - Toleranz in der Einheit von cData. * - min_len - Minimum-Länge eines Plateaus in der Einheit von ctime. * - max_len - Maximum-Länge eines Plateaus in der Einheit von ctime. * - y_min_threshold - Es werden nur Plateaus gefunden die größer als dieser Grenzwert sind. * - y_max_threshold - Es werden nur Plateaus gefunden die kleiner als dieser Grenzwert sind. Beispiel: Findet im Drehzahl-Kanal speed die Bereiche mit konstanter Drehzahl mit einer Toleranz von 30 1/min. Findet nur Bereiche die zwischen 92 und 97 Sekunden lang sind und deren Drehzahl zwischen 800 und 10000 1/min liegt. ``index = find_plateau(time, speed, 30, 92, 97, 800, 10000)`` .. index:: get_val_at (Formel-Funktion) get_val_at(c, i) ^^^^^^^^^^^^^^^^ Liefert den Wert des i-ten Elementes des Kanals ``c``. ``i = 1`` liefert den ersten Wert. ``i = -1`` liefert den letzten Wert. Beispiel: ``SZ2 = get_val_at(SZ, -1)`` .. index:: len (Formel-Funktion) len(c) ^^^^^^ Liefert als Wert die Anzahl der Elemente des Kanals ``c``. Beispiel: ``mean = sum(c)/len(c)``. .. index:: max (Formel-Funktion) max(c) ^^^^^^ Liefert den größten Wert von Kanal ``c``. max(c1, c2), max(c1, c2, ..., c5) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Liefert einen Kanal mit dem Maximum von bis zu fünf Kanälen. Beispiel: ``r[i] = max(c1[i], c2[i])``. max(c1, r) ^^^^^^^^^^ Liefert einen Kanal dessen Elemente ``r[i] = max(c1[i], r)`` sind. .. index:: min (Formel-Funktion) min(c) ^^^^^^ Siehe `max(c)`_. min(c1, c2), min(c1, c2, ..., c5) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Siehe `max(c1, c2), max(c1, c2, ..., c5)`_. min(c1, r) ^^^^^^^^^^ Siehe `max(c1, r)`_. .. index:: mean (Formel-Funktion) mean(c) ^^^^^^^ Liefert den Mittelwert von Kanal ``c``. .. index:: pow (Formel-Funktion) pow(c, value) ^^^^^^^^^^^^^ Berechnet ``c^value``. .. index:: PI (Formel-Funktion) PI() ^^^^ Liefert die Zahl PI (3.1415926535897931). .. index:: quantile (formula function) quantile(c1, q) ^^^^^^^^^^^^^^^ Liefert das Quantile des Kanals c1. Der Quantilwert q muss im Intervall 0 bis 1 liegen. Für q = 0.5 liefert die Funktion den Median. Für q = 1 das Maximum. .. index:: rand (Formel-Funktion) .. _rand_formula: rand() ^^^^^^ Erzeugt Zufallszahlen im Bereich 0 bis 1.0. Beispiel: ``r = (time-time) + srand(99) * rand()``. .. index:: replace_missings (Formel-Funktion) replace_missings(c1, c2) ^^^^^^^^^^^^^^^^^^^^^^^^ Ersetzt "Missing Values" des Kanals ``c1`` durch die entsprechenden Werte des Kanals ``c2``. Um diese Funktion anwenden zu können, muss im Eingabedialog die Option **Missing-Value Behandlung** abgeschaltet sein (siehe :ref:`beschreibung-des-formel-eingabe-dialogfelds`). replace_missings(c1, value) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Ersetzt "Missing Values" des Kanals ``c1`` durch den Wert ``value``. .. index:: shift_points (Formel-Funktion) shift_points(c, nPoints, rsMissing) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Verschiebt die Werte des Kanals ``c`` um nPoints. Ein positiver Wert verschiebt nach rechts und ein negativer Wert nach links. Die fehlenden Werte werden auf ``rsMissing gesetzt``. Beispiel: ``c = [1, 2, 3, 4, 5]`` gibt für ``nPoints = -2`` und ``rsMissing = 0`` den Vektor ``[3, 4, 5, 0, 0]`` zurück. .. index:: std (Formel-Funktion) std(c) ^^^^^^ Berechnet die Standardabweichung des Kanals ``c``. .. index:: sin (Formel-Funktion) sin(c) ^^^^^^ Berechnet den Sinus von ``c``. .. index:: sqrt (Formel-Funktion) sqrt(c) ^^^^^^^ Berechnet die Quadratwurzel des Kanals ``c``. Falls der Kanal Werte kleiner als 0 enthält, werden Missing-Value-Werte eingetragen. .. index:: srand (Formel-Funktion) srand(r) ^^^^^^^^ Setzt den Zufallszahlengenerator auf einen definierten Wert, siehe auch :ref:`rand_formula`. .. index:: sum (Formel-Funktion) sum(c) ^^^^^^ Liefert als Wert die Summe der Elemente des Kanals ``c``. .. index:: cumsum (Formel-Funktion) cumsum(c) ^^^^^^^^^ Liefert als Wert die kumulierte Summe der Elemente des Kanals ``c``. .. index:: diff (Formel-Funktion) diff(c) ^^^^^^^ Berechnet für einen Kanal ``c`` die folgenden Differenzen: ``[c[2] - c[1], c[3] - c[2], ... , c[n] - c[n-1]]``. .. index:: if_than_else (Formel-Funktion) .. _if_than_else_formula: if_than_else(expr, than_exp, else_exp) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Liefert in Abhänigkeit von ``expr`` entweder ``than_exp`` oder ``else_exp``. Die Parameter können Skalare oder Vektoren sein. Die Vektoren müssen alle gleich lang sein. Beispiel: ``be2 = if_than_else(compare_less(torque, 3), 500, be)`` .. index:: compare_less (Formel-Funktion) compare_less(c1, c2) ^^^^^^^^^^^^^^^^^^^^ ``c1`` kleiner ``c2`` Vergleich. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: compare_lessequal (Formel-Funktion) compare_lessequal(c1, c2) ^^^^^^^^^^^^^^^^^^^^^^^^^ ``c1`` kleiner gleich (c2) Vergleich. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: compare_notequal (Formel-Funktion) compare_notequal(c1, c2) ^^^^^^^^^^^^^^^^^^^^^^^^ ``c1`` nicht gleich ``c2`` Vergleich. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: compare_equal (Formel-Funktion) compare_equal(c1, c2) ^^^^^^^^^^^^^^^^^^^^^ ``c1`` gleich ``c2`` Vergleich. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: compare_greater (Formel-Funktion) compare_greater(c1, c2) ^^^^^^^^^^^^^^^^^^^^^^^ ``c1`` größer ``c2`` Vergleich. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: compare_greaterequal (Formel-Funktion) compare_greaterequal(c1, c2) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``c1`` größer gleich ``c2`` Vergleich. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: and (Formel-Funktion) and(c1, c2) ^^^^^^^^^^^ Logische AND Verknüpfung von ``c1`` und ``c2``. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: or (Formel-Funktion) or(c1, c2) ^^^^^^^^^^ Logische OR Verknüpfung von ``c1`` und ``c2``. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: not (Formel-Funktion) not(c) ^^^^^^ Logisch NOT von ``c``. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. .. index:: between (Formel-Funktion) between(c, lower, upper) ^^^^^^^^^^^^^^^^^^^^^^^^ Kanal ``c`` größer gleich ``lower`` und ``c`` kleiner gleich ``upper`` Vergleich. Wird hauptsächlich in Verbindung mit der :ref:`if_than_else_formula` Funktion verwendet. Liefert 0 und 1. .. index:: PT1 (Formel-Funktion) PT1(rvT, rvY, T_const) ^^^^^^^^^^^^^^^^^^^^^^ PT1 Glied: ``z = (y - max) * (1 - exp("t-1" - t / T)) + "Z-1"``. .. index:: section_points (Formel-Funktion) section_points(time, c, Threshold, min_section_len_time, add_time_before, add_time_after, bEnumSection) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Die Funktion findet die Abschnitte, in denen die Daten (Kanalname c), die größer sind, als der Schwellwert ``Threshold`` und eine Mindestlänge haben, die größer sind, als ``min_section_len_time``. Die Parameter ``add_time_before``, ``add_time_after``, ``bEnumSection`` sind optional. Die Funktion kann mit 4 oder 7 Parameter aufgerufen werden. Falls ``add_time_before`` größer als 0 ist, werden zusätzliche Punkte an den Anfang eines Abschnitts markiert. Eine negative Zeit entspricht einem Verzug. Der Parameter wird in der Einheit des Zeitkanals definiert. Wenn ``add_time_after`` negativ eingegeben wird, entspricht das einer Verkürzung des Abschnitts. Falls ``bEnumSection`` gleich 1 ist, werden die Abschnitte durchnummeriert, wobei der erste Abschnitt den Wert 1 erhält. Default Werte: ``add_time_before = 0``, ``add_time_after = 0``, ``bEnumSection = 0``. Beispiel: ``index = section_points(time, speed, 3000, 10)`` Beispiel für Verwendung des Zeilenfilter-Kanals: ``index = section_points(time, __filter__, 0.5, 6.5)`` Beispiel bei dem 15 Sekunden am Anfang eines Abschnitts zugefügt werden: ``index = section_points(time, speed, 3000, 10, 15, 0, 1)`` Beispiel: Abschnitt soll erst 3.5 Sekunden nach dem Ereignis markiert werden soll. Alle Abschnitte werden mit 1 markiert: ``index = section_points(time, speed, 3000, 10, -3.5, 0, 0)`` Die Funktion erzeugt einen Kanal, der den Wert 1 enthält, wenn die Bedingung erfüllt ist und ansonsten den Wert 0. Falls ``bEnumSection = 1`` ist, werden die Abschnitte durchnummeriert. Um einen 2D-Datensatz zu erzeugen, der nur die Datenpunkte enthält, wo ``index`` den Wert 1 hat, wählen Sie den Datensatz-Typ 2D: x/y/Zyklus-Index aus. Es werden dann alle Datenpunkte geladen, bei denen der Kanal ``index`` den Wert 1 enthält. .. index:: smooth (Formel-Funktion) smooth(c, width) ^^^^^^^^^^^^^^^^ Gleitender Mittelwert. Width ist die halbe Fensterbreite. Die Fensterbreite wird in Anzahl der Datenpunkte angegeben. Verwendet die Funktion :ref:`moving_average`. Beispiel: NOx = smooth(NOx, 50) .. index:: smooth_time (Formel-Funktion) smooth_time(c, TimeChannel, TimeWindow) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Gleitender Mittelwert. TimeWindow ist die halbe Fensterbreite. Mit der Funktion kann die Fenstergröße unabhängig von der Abtastrate festgelegt werden. TimeChannel ist der Name des zugehörigen Zeitkanals. c ist der Name des zu glättenden Kanals. Beispiel: NOx_s = smooth_time(NOx, time, 1.7) Funktion :ref:`moving_average`. .. index:: smooth_median (Formel-Funktion) .. _smooth_median_formula: smooth_median(c, nNeighbor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Gleitender Median. nNeighbor ist die Fensterbreite im Bereich 3 bis 1025. Gerade Zahlen werden auf die nächste ungerade Zahl aufgerundet. Verwendet die Funktion :ref:`moving_median`. Beispiel: ``ATL_speed_s = smooth_median(ATL_speed, 5)`` 5 aufeinander folgende Punkte aufsteigend sortiert und der dritte Wert wird nach ``ATL_speed_s`` geschrieben. Bei einer Fensterbreite von 5 Punkten werden die ersten zwei Punkte und die letzten zwei Punkte unverändert in den Ergebnisvektor geschrieben. Gegeben: ``ATL_speed = [5, 7, 6, 4, 27, 8, 4, 5]`` Ergebnis: ``ATL_speed_s = [5, 7, 6, 7, 6, 8, 4, 5]`` .. index:: bit (Formel-Funktion) bit(c, nBit) ^^^^^^^^^^^^ Liefert das n-te Bit von c. nBit beginnt bei 1. .. index:: derivative (Formel-Funktion) derivative(x, y) ^^^^^^^^^^^^^^^^ Berechnet die Ableitung. .. index:: integral (Formel-Funktion) integral(x, y) ^^^^^^^^^^^^^^ Berechnet den Verlauf des Integrals. Der letzte Wert ist die Fläche unter der Kurve. .. index:: integral_withreset (Formel-Funktion) .. _integral_withreset: integral_withreset(x, y, rsYResetThreshold or idx_vector, bEndValueOnly) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Berechnet den Verlauf des Integrals. Der Integralverlauf beginnt wieder bei 0, wenn der y-Wert die Schwellwertlinie ``rsYRestThreshold`` von unten kommend schneidet. Falls idx_vector ein Vektor mit ganzen Zahlen ist (z. B. 1,1,1,1,2,2,2,3,3,3) wird für jeden konstanten Vektorwert ein Integral gebildet. Für das Beispiel werden dann drei Integrale gebildet, z. B.: 0,12,13,14,0,3,5,0,4,5. .. index:: integral_withreset2 (Formel-Funktion) .. _integral_withreset2: integral_withreset2(x, y, bool_channel_01, bEndValueOnly) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Berechnet den Verlauf des Integrals. Der Integralverlauf beginnt wieder bei 0, wenn der Wert des Kanals ``bool_channel_01`` kleiner als 0.5 ist. Falls ``bEndValueOnly`` auf 1 gesetzt wird, wird Endwert des Integrals im gesamten Verlauf angezeigt. Falls der Wert auf 0 gesetzt wird, wird der Integralverlauf, beginnend mit 0, berechnet. .. index:: integral_withreset_thd (Formel-Function) .. _integral_withreset_thd: integral_withreset_thd(x, y, Threshold) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Berechnet die Integralkurve. Wenn der Wert des Integrals von `Y` über `X` den `Schwellenwert` überschreitet, wird der Integralwert auf 0 zurückgesetzt. .. index:: extract (Formel-Funktion) extract(c, minval, maxval) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Setzt alle Werte des Kanals ``c`` außerhalb des Bereichs ``minval`` bis ``maxval`` auf missing_value. Beispiel, wie das Integral von pChan über der Zeit für einen Zeitabschnitt von 1 bis 2 Sekunden berechnet werden kann: ``int = integral(extract(time, 1, 2), pChan)`` .. index:: exclude (Formel-Funktion) exclude(c, minval, maxval) ^^^^^^^^^^^^^^^^^^^^^^^^^^ Setzt alle Werte des Kanals ``c`` im Bereich ``minval`` bis ``maxval`` auf missing_value. .. index:: findfirst (Formel-Funktion) findfirst(cx, cy, posx) ^^^^^^^^^^^^^^^^^^^^^^^ Sucht in Kanal ``cx`` die Position ``posx`` und liefert einen Vektor mit dem konstanten Wert von Kanal ``cy`` an dieser Stelle. ``cx`` muss monoton aufsteigend sein. .. index:: root_mean_square (Formel-Funktion) root_mean_square(c, n) ^^^^^^^^^^^^^^^^^^^^^^ Berechnet das quadratische Mittel als gleitenden Wert (RMS= root mean square). ``c`` ist der Name eines Kanals und ``n`` ist die Fensterbreite als Anzahl der Datenpunkte. Das Ergebnis wird an die Position i geschrieben. Am Anfang und Ende werden entsprechend weniger Punkte in die Berechnung ein. .. math:: \mathrm{rms}= \sqrt{\frac1n \sum_{i=1}^n{x_i^2}} Der Abschnitt :ref:`funktionen-fur-formeln` beschreibt, wie solche Funktionen definiert werden. .. index:: Missing Values .. index:: MISSING_FLOAT .. index:: MISSING_DOUBLE .. index:: Missing .. _kanale-mit-missing-values: Kanäle mit Missing Values ------------------------- In der folgenden Tabelle hat der Messpunkt 6 des Kanals ``EngSpd`` keinen gültigen Wert. An dieser Stelle steht das Wort ``"Missing"``. .. image:: S:/uniplot-obj/images/missing1.* Da der Kanal ``P=f(EngSpd, SAETrq)`` vom Kanal ``EngSpd`` abhängig ist, enthält auch ``P`` an dieser Stelle den Wert ``"Missing"``. Bei Kanälen, die den Datentyp ``double`` oder ``float`` haben (64bit- bzw. 32bit-Realzahl), werden Werte mit dem Zahlenwert ``1e10`` als ``"Missing"`` aufgefasst. Bei Kanälen mit den Datentypen ``byte`` (8bit-Integer), ``short`` (16bit-Integer), ``long`` (32bit-Integer) gibt es keine festen Missing-Value-Werte. Diese Kanäle können aber ein Attribut ``missing_value`` haben, das den Wert festlegt. Beim Import von Daten werden Betriebspunkte mit Missing-Values ignoriert. .. _definition-von-formeln-in-einer-tabelle: Definition von Formeln in einer Tabelle --------------------------------------- Neue Formeln können in eine Excel-Datei eingegeben werden. Ein Beispiel finden Sie im Verzeichnis :file:`UniPlot\\samples`. Die Datei hat den Namen :file:`formula.xls`. .. image:: S:/uniplot-obj/images/formel-excel-tabelle.* Die Tabelle enthält 8 Spalten. Die Spalten haben die folgende Bedeutung: 1. Spalte - FunctionName: In der ersten Spalte steht der Name der Formel. 2. Spalte - Description: Beschreibung der Formel. 3. Spalte - Unit: Einheit der Formel. Der Formelinterpreter konvertiert die Einheiten nur, falls in Spalte 9 eine 1 steht (SI-Einheiten). Andernfalls wird die Einheit als Einheitentext im Kanal gespeichert. In diesem Fall muss die Formeln einheitenrichtig definiert sein. Es findet keine Konvertierung der Einheiten statt. 4. Spalte - ChannelName: Name des Ausgabekanals der erzeugt werden soll. 5. Spalte - Formula: Die Formel. Beispiel: ``(EngSpd * SAETrq) / 9549.3``. Weitere Informationen über Formeln finden Sie im Kapitel :ref:`definition-von-formeln`. Zu Beachten ist, wenn Zwischenergebnisse genutzt werden sollen, dass die letzte Formel einen Ergebniskanal enthält. Der Ergebnisname ist in Spalte 4 definiert. 6. Spalte - OnlyIf: Name einer Bedingung. 7. Spalte - Numberformat: Formatbescheibung, z. B. ``%g`` oder ``%.4lf``. 8. Spalte - SI-Units: Falls der Wert auf 1 gesetzt wird, werden die Variablen in SI-Einheiten konvertiert, bevor die Formel ausgewertet wird. Das Ergebnis der Formel wird in die angegebene Einheit (Spalte 3) konvertiert. 9. Spalte - Comment: In dieser Spalte kann ein Kommentar eingetragen werden. Bis UniPllot 2013.11 stand der Kommentar in Spalte 8. Die erste Zelle (A1) der Excel-Tabelle muss die Zeichenkette ``"UniPlotFormulaTable"`` oder ``"UniPlotFormelTabelle"`` enthalten. Die zweite Zeile enthält die Spaltennamen. Ausführlich wird im Kapitel :ref:`formelinterpreter-2---erstellung-der-formeltabelle` beschrieben, wie neue Formeln mit der Formeltabelle definiert werden. :sub:`id-202804`