MATLAB®-GUI Initialisierung Multi-MCU

Aus Technische Beeinflussbarkeit der Geschmacksache Kaffee
Zur Navigation springen Zur Suche springen

Armin Rohnen, 30.07.2023

Diese Beschreibung ist gültig für die MATLAB®-GUI ab der Version "EspressoGUI_20230801_AR"

Problemstellung

Die Multi-MCU-Elektronik besteht aus drei Platinen mit jeweils einer eigenen Rasperry Pi Pico MCU. Je nach verwendeten PC, Produktionscharge der Picos, Einschaltfolge der MCU und weiteren noch nicht bekannten Einflüssen verbindet sich die einzelne MCU nicht immer mit dem gleichen COM-Port am PC. Für die Funktionalität der Software ist jedoch Eindeutigkeit erforderlich.

Für die Verbindung MicroPython der MCU mit der MATLAB®-GUI wird die in [40, Abschn. 4.1] beschriebene Kommunikation verwendet. Im Wesentlichen ist dies gekennzeichnet durch eine Verarbeitungsfunktion, welche nach jedem Zeilenendezeichen des zugehörigen COM-Ports ausgelöst wird.

Jede von MATLAB® an die MCU gesendete Anweisung wird durch ">>> <MATLAB-ANWEISUNG>" von der MCU postwendent wieder an MATLAB® beantwortet. Dies ist nicht die Reaktion der durchzuführenden Anweisung, sondern eine Antwort der MicoPython-Laufzeitumgebung. Das Zeilenende des Anweisungs-Echos löst in MATLAB® wiederum die Verarbeitungsfunktion aus. Um nicht mehrfach gleiche Anweisungen von MATLAB® an die MCU zu senden, muss hier für Eindeutigkeit gesorgt werden. U. a. ist dafür sorge zu tragen, dass nach jeder an die MCU gesendeten Anweisung, das Verarbeitungsprogramm beendet wird und erst beim nächsten Aufruf, im Zweifelsfall durch den Eingang von ">>> <MATLAB-ANWEISUNG>", erst die nächste Anweisungszeile an die MCU gesendet wird.

Die mechanische Initialisierung der Schrittmotoren benötigt etwas Zeit, da jeder durchgeführte 1/2-Schritt 2000 us Pausenzeit erfordert. Die Initialisierung muss hier die erforderliche Zeitspanne warten, bis sie weitere Initialisierungsschritte ausführt.

Kontrollfunktion

Über "prorokollFlag = 1" in den Properties kann die Protokollierung der MCU-Antworten eingeschaltet werden. Abgespeichert werden in der Datei "last_log.txt" die Antworten der MCUs auf die eingehenden Anweisungen. Darin enthalten sind auch die Echos der Anweisungen. Alle Antworten beginnend mit ">>>" werden nach dem Logging entfernt.

Beispiel

...05-Aug-2023 12:22:32...
05-Aug-2023 12:22:32 init_mcus:import ident
05-Aug-2023 12:22:32 init_mcus:>>> ident.ident()
05-Aug-2023 12:22:32 init_mcus:ssr
05-Aug-2023 12:22:32init_ ssr:>>> import Schrittmotor
05-Aug-2023 12:22:32init_ ssr:>>> seq = Schrittmotor.sequenz()
05-Aug-2023 12:22:32init_ ssr:>>> pins = Schrittmotor.Dosierventil_Pins()
05-Aug-2023 12:22:32init_ ssr:>>> dosierventil = Schrittmotor.setup(pins)
05-Aug-2023 12:22:32init_ ssr:>>> dosierventil_pos = -1
05-Aug-2023 12:22:32init_ ssr:>>> dosierventil_pos = Schrittmotor.backwardStep(800, dosierventil_pos, seq, dosierventil, "endDosier")
05-Aug-2023 12:22:34init_ ssr:endDosier

"MesswertProtokollFlag = 1" schaltet zusätzlich die Protokollierung der eingehenden Messwerte ein. Die Umsachltung erfolgt über einen Schalter auf der GUI.

Globale Initialisierung

Nach dem Start der App wird durch drücken des Buttons "Verbinden" das Verbinden und die Initialisierung der MCUs ausgelöst. In der Callback-Funktion "Verbinden_ButtonPushed" wird in Abhängigkeit mit dem Verbindungsstatus der Verbindungsaufbau gestartet. Dazu erfolgen einige Statusausgaben, es wird die Liste der freien Ports ermittelt und je nach Bedarf die Protokollierung der eingehenden MCU-Antworten gestartet. Für die einwandfreie Funktionalität dieses Prozesses besteht die Forderung, dass alle am PC angeschlossenen USB-Geräte entweder über die MATLAB®-GUI verbunden werden müssen, oder bereits anderweitig verbunden sind. Jede freie USB-Verbindung wird versucht zu verbinden. Dabei wird davon ausgegangen, dass dies die drei MCUs aus der Multi-MCU-Elektronik sind.

Es wird der erste verfügbare ungenutze COM-Port verbunden. Dieser Verbindung wird die Verarbeitungsfunktion "init_mcus" zugewiesen, es wird die Identifikationsfunktion der MCU geladen und es wird die Identifikation aufgerufen.

Danach wird diese Funktion beendet und weiter in der Ausführung der App nicht mehr benötigt. Um ein versehentliches weiteres Auslösen der globalen Initialisierung zu unterbinden, wird der Verbindungsstatus entsprechend geändert.

Funktion init_mcus

Diese Funktion wird mehrfach als Verarbeitungsfunktion für MCU-Antworten konfiguriert.

Aufgrund der Anweisung "ident.ident()" auf der gerade in Initialisierung befindlichen MCU erfolgt als Antwort die Übermittlung der MCU-Kennung. Das ist eine drei Zeichen lange MCU-Individuelle Kennung. Auf Basis der MCU-Kennung wird die weitere Initialisierung der betroffenen MCU durchgeführt. Es wird ein entsprechender Statustext ausgegeben, der COM-Port wird der richtigen Variablen zugeordnet und es wird für die Phase der Initialisierung eine andere Verarbeitungsfunktion definiert. Der Initialisierungszähler wird auf 1 gesetzt und abschließend wird einmalig die zugehörige Verarbeitungsfunktion ausgeführt.

SSR-Platine Initialisieren

Die Initialisierung der SSR-Platine erfolgt über die Funktion "ssr_initialisieren". Diese Funktion verarbeitet während des Initialisierungsprozesses die am COM-Port eingehenden Antworten der SSR-Platine.

Je nach Bedarf werden die eingehenden MCU-Antworten protokolliert. Antworten beginnend mit ">>>" werden nach der Protokllierung gelöscht, da diese Anweisungs-Echos sind. Das eingehende Anweisungs-Echo bedeutet jedoch, dass die nächste Anweisung an die MCU gesendet werden kann, es sei denn die vorherige Anweisung beinhaltet die Ausgabe eines Schlüsselwortes auf das mit dem Senden weiterer Anweisungen gewartet werden muss.

Realisiert wird der Initialisierungsprozess mit einem "switch-case" im Programmcode der Funktion. Ausgewertet wird der Initialisierungszähler "ssr_init". Dieser wird Initialisierungsschritt für Initialisierungsschritt um 1 erhöht. Es erfolgt als erstes die Initialisierung des Dosierventiles. Dies ist eine Sschrittmotorinitialisierung und bedarf 5 Initialisierungsschritte für den zugehörigen Schrittmotortreiber. In Initialisierungsschritt 6 wird das Dosierventil mechansich Initialisiert, dazu wird es eine bestimmte Anzahl an 1/2-Schritten vorwärts verstellt und damit komplett geschlossen. Erst die Antwort der MCU mit "endDosier" löst Initialisierungsschritt 7 aus. Hier wird das Ventil auf die Position der letzten Nutzung gefahren. Initialisierungsschritt 8 und 9, die Initialisierung der Magnetventil-Schalter erfolgt erst nach der Positionierung des Dosierventils.

Die Initialisierung des optionalen Dampfhahns muss ab dem Initialisierungsschritt 8 erfolgen. Alle anderen Initialisierungsschritte rücken dann weiter nach hinten.

Sollte die Initialisierung der SSR-Platine erweitert werden ist zu beachten, dass die aktuellen Initialisierungsschritte 10 bis 14 immer das Ende der Initialisierung darstellen müssen. In Schritt 11 und 12 wird die LED der MCU eingeschaltet. DIes soll Betriebsbereitschaft signalisieren.

In Initialisierungsschritt 13 wird das Ende der Initialisierung überprüft und es erfolgt in Schritt 14 die Umstellung des Callback des COM-Ports auf die Funktion "ssr_verarbeitung". Es wird, soweit verfügbar, der nächste freie COM-Port verbunden und die Initialisierung gestartet. Sind bereits alle verfügbaren COM-Ports verbunden wird die Funktion "PostStart" aufgerufen.

Messwert-Platine Initialisieren

Die Initialisierung der Messwert-Platine ist Funktional identisch zu der SSR-Platine. Da durch Aufruf der Mess-Funktion sofort Messdaten an die MATLAB®-GUI gesendet werden, wird dies erst zu einem späteren Zeitpunkt ausgelöst. Es wird direkt die LED der MCU eingeschaltet und in Initialisierungsschritt 4 das Ende der Initialisierung überprüft und wie in SSR-Platine weiter verfahren.

Basisplatine Initialisieren

Die Initialisierung der Basisplatine ist Funktional identisch zu der SSR-Platine. Da durch Aufruf der Mess-Funktion sofort Messdaten an die MATLAB®-GUI gesendet werden, wird dies erst zu einem späteren Zeitpunkt ausgelöst.

In den Initialisierungsschritten 1 bis 12 werden die Schrittmotoren für die Brühgruppendrossel und der Bypass konfiguriert, mechanisch initialisiert und auf den Stellwert der letzten Nutzung eingestellt.

Danach wird die Bereitschafts-LED eingeschaltet und das Ende der Platinen-Initialisierung überprüft. Anschließendewird wie in der SSR-Platine weiter verfahren.