Tutorial Flussprofilgenerierung mit QmixElements

Tutorial Flussprofilgenerierung mit QmixElements

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

Die QmixElements Software verfügt über ein leistungsfähiges Script-System, um Prozesse und Abläufe schnell und einfach zu automatisieren. Sie erhalten im Rahmen dieses Tutorials einen Einblick und viele nützliche Hinweise zu einigen erweiterten Techniken, wie z.B. den Einsatz von Variablen, die Verwendung von JavaScript und die Nutzung von virtuellen Kanälen für die Aufzeichnung von Werten im grafischen Logger.

Im Rahmen des Tutorials erstellen Sie zwei Scripte, in denen auf Basis mathematischer Funktionen Flussgradienten bzw. Flussprofile generiert werden.

Vorbereitung

Bevor Sie mit der Programmierung der Scripte beginnen können, müssen Sie Ihr System konfigurieren. 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 Tutorial erstellten Script können Sie hier herunterladen.

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

Für dieses Tutorial verwenden Sie zwei neMESYS Niederdruck Spritzenpumpen mit 5 ml Glasspritzen . Damit während der Generierung der Flussprofile die Ventile automatisch geschaltet werden, aktivieren Sie die Ventilautomatik für beide Pumpen . Als Einheit für die Flussrate konfigurieren Sie bitte ml/min .

Systemkonfiguration für Tutorial

Um berechnete Werte aus dem Script grafisch visualisieren zu können, erstellen Sie in der Liste der I/O Kanäle einen virtuellen Kanal . Ein virtueller Kanal ist ein I/O Kanal, der für die Eingabe und Ausgabe von Werten verwendet werden kann.

Damit die generierten Flussprofile grafische in Echtzeit aufgezeichnet und visualisiert werden können, verwenden Sie den grafischen Logger und konfigurieren ihn entsprechend der Abbildung unten. Es soll von beiden Pumpen die aktuelle Flussrate und von dem virtuellen Kanal der aktuellen Wert angezeigt werden . Als Log Intervall stellen Sie einen Wert von 0,1 Sekunden ein. Jetzt können Sie mit der Programmierung des ersten Scripts starten.

Loggerkonfiguration

Teil 1 - Script zur Generierung eines Sägezahnprofils

Ziel dieses Scripts soll es sein, mit einer Pumpe ein Flussprofil in Form eines Sägezahns 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.

Sägezahnfunktion

Den Sägezahn generieren Sie, indem Sie die Flussrate schrittweise in einem festen Intervall von 0 bis zur gewünschten Zielflussrate erhöhen. D.h. für das Script lassen sich die folgenden Parameter identifizieren:

  • Anzahl der Schritte für einen einzelnen Sägezahn $GradientSteps)
  • Dauer eines Schrittes in Millisekunden ($StepDuration)
  • Zielflussrate ($TargetFlow)

Für diese Parameter legen Sie in Ihrem Script drei Variablen an. So können Sie die später Parameter schnell und einfach an einer Stelle ändern, ohne ständig durch das komplette Script navigieren zu müssen. Für jede Variable vergeben Sie einen aussagekräftigen und eindeutigen Namen.

Variablen für Script

Für den Gradient verwenden Sie 20 Schritte ($GradientSteps = 20) mit einer Dauer von je 100 Millisekunden ($StepDuration = 100). Diese Werte können Sie später jederzeit ändern. Für die Zielflussrate können Sie einen festen Wert eingeben, oder Sie berechnen die Zielflussrate auf Basis der maximalen Flussrate der ersten Pumpe. Dafür können Sie in das JavaScript Feld die entsprechende Geräteeigenschaft  (Insert device property) der Pumpe einfügen und durch 10 teilen:

$TargetFlow = $neMESYS_Low_Pressure_1.MaxFlow / 10

Um einen einzelnen Sägezahn zu erzeugen, benötigen Sie nun eine Zählschleife (Counting Loop) . Für eine Zählschleife können zwei Parameter konfiguriert werden: die Anzahl der Schleifendurchläufe (Loop Cycles) und der Name der Variable, in die der Zählerwert für den aktuellen Schleifendurchlauf gespeichert wird . Das Eingabfeld für die Loop Cycles ist mit einem orangefarbenen V markiert, d.h. Sie können in diesem Eingabefeld Variablen verwenden. Sie können an dieser Stelle also einfach die vorher definierte Variable $GradientSteps eintragen.

Zählschleife für die Generierung des Sägezahns

Innerhalb der Schleife können Sie nun die Flussrate für die erste Pumpe berechnen und in einer Variablen speichern. Der Schleifenzähler $i nimmt bei den 10 Schleifendurchläufen die Werte 0 – 9 an. Die Flussrate können Sie deshalb mit der folgenden Formel berechnen:

$Flow1 = $TargetFlow / ($GradientSteps - 1) * $i

D.h. die Flussrate ist im ersten Schleifendurchlauf 0 und erreicht im letzten Durchlauf den Wert $TargetFlow. Die Summe der Flussraten beider Pumpen soll den Wert $TargetFlow ergeben. Deshalb können Sie in einer zweiten Variablen die Flussrate der zweiten Pumpe wie folgt berechnen:

$Flow2 = $TargetFlow - $Flow1

Berechnung der Flussraten

Diese beiden Werte können Sie nun verwenden, um mit der Funktion Generate Flow die Dosierung der beiden Pumpen zu starten. Zur Konfiguration der Generate Flow Funktion wählen Sie einfach die entsprechende Pumpe aus und tragen im Feld Flow den berechneten Wert $Flow1 oder $Flow2 ein. Wichtig ist, dass hier die Einheit für die Flussrate auf den gleichen Wert eingestellt wird, wie er für die Pumpe konfiguriert wurde – in diesem Fall ml/min . Die Checkbox Run to completition müssen Sie deaktivieren. Ist dieses Feld aktiv, dann wird die nächste Funktion erst gestartet, wenn die Pumpe die Dosierung beendet hat. Im Fall der Generate Flow Funktion wäre das dann, wenn die Pumpe vollständig aufgezogen oder vollständig entleert ist. Da dies hier nicht erwünscht ist, sondern das Script sofort fortgesetzt werden soll, deaktivieren Sie das Feld.

Generate Flow Funktion

Um die gewünschte Schrittdauer für jeden Schleifendurchlauf zu erreichen, fügen Sie nun noch eine Delay Funktion als letzte Funktion in die Schleife ein. Im Konfigurationsbereich der Funktion im Eingabefeld Milliseconds können Sie direkt die Variable $StepDuration eintragen. Die Delay Funktion verzögert die weitere Scriptausführung für die konfigurierte Zeitdauer.

Delay Funktion

Am Ende Ihres kurzen Scripts fügen Sie jetzt die Funktion Stop All Pumps ein, um alle Pumpen zu stoppen. Um die Aufzeichnung der Flussraten im grafischen Logger mit dem Scriptablauf zu synchronisieren, fügen Sie anschließend noch die Funktion zum Start des Loggers (Start Plot Logger) vor der Zählschleife ein und die Funktion zum Stoppen der Aufzeichnung (Stop Plot Logger) am Ende des Scripts.

Script zur Erzeugung eines einzelnen Sägezahnprofils

Wenn Sie Ihre Spritzen komplett gefüllt haben, können Sie jetzt den ersten Testlauf starten. Wenn das Script fehlerfrei durchgelaufen ist, sollten Sie im grafischen Logger das folgende Bild sehen.

Grafische Aufzeichnung des ersten Testlaufs

Im nächsten Schritt erweitern Sie das Script so, dass die Erzeugung des Sägezahns zyklisch wiederholt wird, bis der Anwender die Taste Request Script Stop drückt. Fügen Sie dafür eine anfangsgeprüfte Schleife (Conditional Loop) vor die Sägezahnschleife ein. Wechseln Sie im Konfigurationsbereich der Funktion in den JavaScript Bereich und geben Sie dort folgende Bedingung ein:

$StopRequested == false

Das bedeutet, diese Schleife wird ständig wiederholt, so lange die Bedingung erfüllt ist, d.h. so lange die globale Variable $StopRequested den Wert false hat. Die Variable $StopRequested ist eine globale Scriptvariable die immer vorhanden ist. Nach dem Start des Scripts hat diese Variable stets den Wert false. Erst wenn der Anwender die Schaltfläche Request Script Stop drückt, wird der Wert der Variable auf true gesetzt.

Anfangsgeprüfte Schleife (Conditional Loop)

Jetzt können Sie die Sägezahnschleife in den Conditional Loop einfügen. Klicken Sie dafür die Zählschleife (Counting Loop) an und ziehen Sie diese auf den Conditional Loop . Die Zählschleife wird damit in den Conditional Loop eingefügt. Starten Sie das Script nun erneut. Die Erzeugung des Sägezahns wird jetzt so lange wiederholt, bis Sie die Schaltfläche Request Script Stop drücken.

Drücken Sie nach einigen Zyklen die  Request Script Stop Schaltfläche um das Script zu beenden. Wenn das Script fehlerfrei durchgelaufen ist, sollten Sie im grafischen Logger das folgende Bild sehen.

Grafische Aufzeichnung

Damit ist Ihr Flussprofil Script fast fertig. Um die Übersichtlichkeit noch ein wenig zu verbessern, können Sie die Variablen, die Sie am Anfang des Scriptes deklariert haben, in einer Variablengruppe (Variable Declarations) zusammenfassen. Fügen Sie dafür eine Variable Declarations Funktion als erste Funktion in das Script ein. Markieren Sie anschließend alle Variablen. Klicken Sie dafür die erste Create Variable Funktion an und klicken Sie dann mit gedrückter Umschalttaste auf die letzte Create Variable Funktion - so wie Sie auch mehrere Dateien im Dateiexplorer markieren würden.

Anschließend können Sie alle markierten Variablen mit der Maus in die Variablengruppe verschieben. Damit haben Sie die Variablen gruppiert und die Übersichtlichkeit und Lesbarkeit des Scripts verbessert. Außerdem ist es nun leichter, diese Gruppe von Variablen an eine andere Position zu verschieben. Ihr Script sollte nun so aussehen:

Script zur Generierung eines Sägezahn Flussprofils

Im zweiten Teil des Tutorials erfahren Sie, wie Sie das Script so ändern, dass mit Hilfe von JavaScript Funktionen sinusförmige Flussprofile erzeugt werden können. Zusätzlich erweitern Sie das Script um eine Initialisierungsroutine, welche die Spritzen aufzieht und lernen, wie Sie berechnete Werte mit Hilfe von virtuellen I/O Kanälen im grafischen Logger aufzeichnen können. Abschließend erhalten Sie dann noch 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 Tutorial erstellten Script können Sie hier herunterladen.