MATLAB®-GUI Initialisierung Multi-MCU: Unterschied zwischen den Versionen

Aus Technische Beeinflussbarkeit der Geschmacksache Kaffee
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „= 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 Funkti…“)
 
Zeile 15: Zeile 15:


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.
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. Erst die Antwort der MCU mit "endDosier" löst Initialisierungsschritt 7, das Rückwärtsdrehen und auf eine definierte Position fahren des Dosierventils aus. 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.
In Initialisierungsschritt 10 wird das Ende der Initialisierung überprüft und es erfolgt in Schritt 11 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 in Initialisierungsschritt 1 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 und mechanisch initialisiert.
Danach wird das Ende der Platinen-Initialisierung überprüft und wie in SSR-Platine weiter verfahren.

Version vom 30. Juli 2023, 16:40 Uhr

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.

Globale Initialiiserung

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. Erst die Antwort der MCU mit "endDosier" löst Initialisierungsschritt 7, das Rückwärtsdrehen und auf eine definierte Position fahren des Dosierventils aus. 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.

In Initialisierungsschritt 10 wird das Ende der Initialisierung überprüft und es erfolgt in Schritt 11 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 in Initialisierungsschritt 1 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 und mechanisch initialisiert.

Danach wird das Ende der Platinen-Initialisierung überprüft und wie in SSR-Platine weiter verfahren.