Tutorial: Flussprofilgenerierung mit QmixElements - Teil 2

Tutorial: Flussprofilgenerierung mit QmixElements - Teil 2

Veröffentlicht am 20.04.2020 , Schlagwörter: Software, Tutorial

Im zweiten Teil des Tutorials erfahren Sie, wie Sie mit Hilfe von JavaScript Funktionen sinusförmige Flussprofile erzeugen können. Dafür ändern Sie das Script aus dem ersten Teil so ab, dass statt eines Sägezahnprofils ein Sinusprofil erzeugt wird.  Bevor Sie mit diesem zweiten Teil starten, können Sie hier den ersten Teil des Tutorials lesen.

WICHTIG
Für dieses Tutorial benötigen Sie die QmixElements Version v20191121 oder eine neuere Version. Wenn Sie noch eine ältere Version verwenden, aktualisieren Sie bitte auf die aktuellste QmixElements Version.
Aktuelle QmixElements Version

Vorbereitung

Konfigurieren Sie Ihr System, wie im ersten Teil des Tutorials beschrieben und stellen Sie dann die Verbindung zu Ihren Geräten her. Wenn Sie nicht über entsprechende Geräte verfügen, können Sie das Tutorial auch gern mit simulierten Geräten nachvollziehen. Das QmixElements Projekt mit simulierten Geräten und dem im ersten Tutorial erstellten Script können Sie hier herunterladen.

Öffnen Sie nun das Script Tutorial_Sawtooth_Profile.qsc, welches Sie im ersten Teil des Tutorials erstellt haben und speichern Sie dieses dann unter einem neuen Namen ab. Sie sollten dann das folgende Programm in Scripteditor sehen.

Sägezahnscript aus Teil 1

Teil 2 - Script zur Generierung eines Sinusprofils

Ziel dieses Scripts soll es sein, mit einer Pumpe ein Flussprofil in Form eines Sinus von 0 bis zur definierten Zielflussrate zu generieren und mit der zweiten Pumpe den Fluss der ersten Pumpe so zu ergänzen, dass die Summe der beiden Flüsse zu einem konstanten Fluss mit einer definierten Flussrate führt.

Zur Erzeugung des Profils muss die Flussrate der Pumpe schrittweise so verändert werden, dass im zeitlichen Verlauf ein Sinus-Profil entsteht. Die Anzahl der Schritte zur Erzeugung des Sinus-Profils, d.h. die Auflösung, soll auf 100 Schritte für einen Sinus festgelegt werden. In dem bisherigen Sägezahn-Script hatten Sie die Anzahl der Schritte auf 20 festgelegt. Ändern Sie deshalb den Wert der Variable $GradientSteps auf 100.

Auflösung (Schrittanzahl) für ein Sinusprofil anpassen

Löschen Sie nun die beiden Generate Flow Funktionen, wie in der Abbildung unten dargestellt. Markieren Sie dafür beide Funktionen und löschen Sie diese anschließend über das Kontextmenü (rechte Maustaste) oder durch Drücken der Entfernen Taste.

Generate Flow Funktionen löschen

Fügen Sie nun eine neue Variable vor die beiden vorhandenen Variablen in die Zählschleife (Counting Loop) ein. Nennen Sie die Variable $Sinus und wählen Sie im Type Feld JavaScript Expression aus.

Sinus Variable einfügen

Die $Sinus Variable dient dazu, die Berechnung des Sinus-Wertes für die weitere Bearbeitung zu speichern. Für die Berechnung des Sinus Wertes, verwenden Sie die JavaScript Funktion Math.sin() zusammen mit der Konstante Math.PI. In das Eingabefeld für den JavaScript Ausdruck geben Sie Folgendes ein:

Math.sin(2 * Math.PI / ($GradientSteps - 1) * $i)

Der Schleifenzähler $i läuft von 0 bis zur Anzahl der $GradientSteps - 1. Zur Berechnung des aktuellen Sinuswertes wird die Periode 2π durch die Anzahl die Schritte - 1 geteilt und dann mit dem aktuellen Schritt $i multipliziert.

Eingabe der Formel zur Sinus-Berechnung

Um den berechneten Wert der $Sinus Variable zu überprüfen, können Sie deren Wert im grafischen Logger anzeigen lassen. Dafür haben Sie im ersten Teil des Tutorials bereits den virtuellen I/O-Kanal Script Value 1 erstellt und zum grafischen Logger hinzugefügt. Fügen Sie nun die Funktion Write Device Property in das Script ein.  Konfigurieren Sie die Funktion dann so, wie in der Abbildung unten dargestellt.

Wert der $Sinus Variablen in den virtuellen I/O-Kanal schreiben

In das Feld Value to be written  tragen Sie den Variablennamen $Sinus ein. Im Bereich Device Property wählen Sie im Feld Device den virtuellen Kanal Script Value 1. Im Feld Property wählen Sie die dann die Eigenschaft ActualValue. Die Funktion können Sie dann so lesen:

Schreibe den Wert der Variablen $Sinus in die Eigenschaft ActualValue des virtuellen Kanals Script Value 1

Löschen Sie jetzt alle Daten aus dem grafischen Logger und aktivieren Sie die automatische Skalierung. Starten Sie nun Ihr Script. Wenn Sie alles richtig eingegeben haben, sollten Sie sehen, wie im grafischen Logger die folgende Sinusfunktion generiert wird:

Grafische Darstellung des berechneten Sinuswertes

Der Sinus oszilliert wie erwartet zwischen 1 und -1. Für das sinusförmige Flussprofil welches generiert werden soll, soll die Flussrate zwischen 0 und der Zielflussrate oszillieren. In einem ersten Schritt soll der Sinuswert dafür so angepasst werden, dass er zwischen 0 und 1 oszilliert. Dies können Sie erreichen, indem Sie den Sinus auf der Y-Achse um 1 nach oben verschieben und dann die Amplitude halbieren. Zur Speicherung des neuen Wertes, verwenden wir die bereits vorhandene Variable $Flow1 . Dies kann nun so berechnet werden:

$Flow1 = ($Sinus + 1) / 2

Sinusfunktion um 1 nach oben verschieben und Amplitude halbieren

Ändern Sie nun die Write Device Property Funktion so ab, dass nicht mehr der Wert der Variable $Sinus sondern der Wert der Variable $Flow1 ausgegeben wird. Löschen Sie dann den grafischen Logger und aktivieren Sie wieder die automatische Skalierung. Sie sollten nun folgende Funktion im grafischen Logger sehen - eine Sinusfunktion, die zwischen 0 und 1 oszilliert:

Sinusfunktion, die zwischen 0 und 1 oszilliert

Um den Sinus zwischen 0 und der Zielflussrate oszillieren zu lassen, müssen Sie jetzt lediglich noch mit der Zielflussrate $TargetFlow multiplizieren. Erweitern Sie die Berechnung der Variable $Flow1 um diesen Schritt:

$Flow1 = ($Sinus + 1) / 2 * $TargetFlow

Die Flussrate $Flow1 wird nun sinusförmig zwischen 0 und der Zielflussrate oszillieren. Die Flussrate $Flow2 der zweiten Pumpe soll die erste Flussrate so ergänzen, das ein konstanter Fluss mit gleichbleibender Flussrate $TargetFlow entsteht. Deshalb können Sie in der Variable $Flow2 die Flussrate der zweiten Pumpe wie folgt berechnen

$Flow2 = $TargetFlow - $Flow1

Fügen Sie nun vor die Write Device Property Funktion zwei Generate Flow Funktionen ein und löschen Sie anschließend die Write Device Property Funktion, da diese nicht mehr benötigt wird.

Genrate Flow Funktionen einfügen

Das Script sollte nun wie in der Abbildung unten aussehen . Konfigurieren Sie die beiden Generate Flow Funktionen so, dass die erste Pumpe mit der Flussrate $Flow1 gestartet wird und die zweite Pumpe mit der Flussrate $Flow2 (siehe Abbildung unten). Achten Sie darauf, dass die Option Run to completion deaktiviert ist.

Generate Flow Funktion mit den berechneten sinusförmigen Flussraten

Löschen Sie jetzt erneut alle Daten aus dem grafischen Logger und aktivieren Sie die automatische Skalierung. Überprüfen Sie vor dem Scriptstart, dass die Spritzen der beiden Pumpen aufgezogen sind. Starten Sie dann Ihr Script. Wenn Sie alles richtig eingegeben haben, sollten Sie sehen, wie im grafischen Logger die folgenden Flussprofile generiert werden:

Sinus Flussprofile

Sie haben nun die Grundlagen erlernt, wie Sie in den Scriptfunktionen JavaScript verwenden können - z.B. um mathematische Berechnung durchzuführen. Wenden Sie das Erlernte an, indem Sie z.B. ein Script programmieren, dass zwei sinusförmige Flüsse erzeugt, bei dem der Sinus des zweiten Flusses die doppelte Periodendauer vom Sinus des ersten Flusses hat. Nutzen Sie den grafischen Logger, um die Ergebnisse zu überprüfen.

Im dritten Teil des Tutorials erfahren Sie, wie Sie das Script um eine Initialisierungsroutine erweitern, welche die Spritzen aufzieht und erhalten Tipps, welche Möglichkeiten es gibt, die Lesbarkeit Ihres Scriptes zu verbessern und Ihr Script zu dokumentieren.

Das QmixElements Projekt mit simulierten Geräten und dem im ersten und zweiten Teil des Tutorials erstellten Scripten können Sie hier herunterladen.