Kommunikation per UART: Unterschied zwischen den Versionen

Aus Technische Beeinflussbarkeit der Geschmacksache Kaffee
Zur Navigation springen Zur Suche springen
 
Zeile 3: Zeile 3:


= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =
Der Token vom STM32 zum Maschinensimulator dient zur zyklischen Übertragung des aktuellen Maschinenzustands. Da die Maschinensimulator-MCU zusätzlich als Gateway für die Wartungs-App dient, enthält dieser Token alle Informationen, die für Simulation, Diagnose und Wartung benötigt werden. Der Token wird mit einem Sendetakt von 4 Token pro Sekunde vom STM32 an den Maschinensimulator gesendet.
== Struktur ==
Der Token beginnt mit dem Startzeichen 0x0F. Danach folgt ein fest definierter Nutzdatenbereich mit 69 Byte. Am Ende befinden sich zwei Byte für das CRC16/MODBUS-Prüfverfahren. Damit ist die Gesamtlänge mit insgesamt 72 Byte eindeutig festgelegt.
== Inhalt ==
Der Token beschreibt den aktuellen Zustand der Maschine. Zuerst werden die Spannungsmesswerte (Leitwert, Drücke, Temperaturen) übertragen. Diese liegen als 16 Bit Spannungsmesswerte im Bereich von 0 bis 3,3 V vor und werden im Maschinensimulator über die entsprechenden Kennlinien in physikalische Werte umgerechnet.
Danach folgen die Heizungswerte. Die Boilerheizungen und die Tassenwärmerheizung werden als PWM-Werte im Bereich von 0 bis 100 % als 8 Bit-Wert übertragen. Anschließend werden die Positionen der Schrittmotoren für die Dosierventile von 0 bis 550 mit 16 Bit übergeben. Zusätzlich werden Verstellwerte übertragen. Diese werden als vorzeichenbehaftete 16-Bit-Integerwerte übergeben, damit sowohl positive als auch negative Verstellrichtungen dargestellt werden können.
Die Pumpensollwerte werden als 12-Bit-Wert im Wertebereich 0 bis 4096 in 2 Bytes (16 Bit) übertragen. Dieser Bereich entspricht dem Spannungsbereich von 0 bis 5000 mV beziehungsweise der Drehzahl 0 bis 5000 U/min. Die Durchflussraten werden im Bereich von 0 bis 25 ml/s in 1/10-ml/s-Schritten als 8-Bit-Werte übertragen. Die Durchflusscounts werden als 16-Bit-Werte im Bereich von 0 bis 65535 übertragen, wobei ein Count 1/39,9 ml entspricht.
Nach den Mess- und Stellwerten folgen Füllstands- und Ventilinformationen. Das Füllstandsbyte wird bitweise ausgewertet. Jedes Bit beschreibt einen einzelnen Zustand, also Boilerfüllstand, Tankminimum, Tankmaximum und Abtropfschale.
Auch die Magnetventile werden bitweise übertragen. Es gibt 3 Magnetventil-Bytes. Dabei steht jedes Bit für ein einzelnes Ventil, zum Beispiel Y101, Y102, Y103.
Danach folgt die Bezugszeit und die Bezugsmenge für die beiden Brühgruppen. Die Bezugszeit wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird der Zeitbereich von 0 bis 120 Sekunden mit einer 1/10 Sekunde Auflösung im Wertebereich von 0 bis 1200 dargestellt. Die Bezugsmenge wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird die Bezugsmenge im Bereich von 20 bis 300g mit 1/10 Gramm Auflösung im Wertebereich von 200 bis 3000 dargestellt.
Anschließend folgen die Preinfusionszeiten der ersten und zweiten Brühgruppe. Diese werden jeweils als 16 Bit Integerwert (0 bis 65535) übermittelt.  Dabei wird die Preinfusionszeit im Zeitbereich von 0 bis 120 Sekunden mit einer 1/10 Sekunde Auflösung im Wertebereich von 0 bis 1200 dargestellt.
Danach wird die Abschalttemperatur für die Boilerentschichtung und die Grenztemperatur welche von den Boilern nicht überschritten werden darf als Integerwerte in Grad Celsius kommuniziert.
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.
Am Ende des Nutzdatenbereichs befinden sich die drei Maschinenstatus-Bytes. Die Maschinenstatus-Bytes werden bitweise ausgewertet. Die ersten zwei Maschinenstatus-Bytes enthalten Betriebszustände wie Mischerstatus, Entschichtung und Handhebelmodus. In dem dritten Maschinenstatus-Byte wird unter anderem mitgeteilt, ob sich die Maschine im Wartungsmodus befindet und ob Botschaften zum STM32 erfolgreich übertragen wurden oder ob es zu einem Übertragungsfehler nach dem Überprüfen mit dem CRC-Verfahren gekommen ist.
Der Umgang mit CRC-Fehler ist nicht definiert.
== Erklärung der Tokentabelle ==
Die Tokentabelle beschreibt den Aufbau des Tokens vollständig. Sie legt fest, an welcher Byteposition eine Information steht, wie viele Byte oder Bits verwendet werden, welchen Wertebereich der Wert besitzt und wie er zu interpretieren ist.
Bei 16-Bit-Werten werden zwei aufeinanderfolgende Bytes verwendet. Bei 8-Bit-Werten wird ein einzelnes Byte gelesen. Bei Statusbytes wird nicht das gesamte Byte als Zahlenwert interpretiert, sondern jedes Bit besitzt eine eigene Bedeutung. Der Maschinensimulator zerlegt den Token daher exakt nach dieser Tabelle: zuerst die mehrbyteigen Mess- und Stellwerte, danach die Einzelwerte und zuletzt die bitweisen Zustände.
Der Token wird ausschließlich vom STM32 erzeugt und vom Maschinensimulator gelesen. Änderungen von Sollwerten, Reglerparameter oder Wartungsfunktionen erfolgen nicht über diesen Token, sondern über separate Botschaften zurück an den STM32.


== Haupttoken von STM32 zu Maschinensimulator-MCU ==
== Haupttoken von STM32 zu Maschinensimulator-MCU ==
Zeile 15: Zeile 53:
|-
|-
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar
|-
|5,6
|16
|Brühgruppendruck  1.BG
|0 - 3,3V
|0 - 12 bar
|-
|7,8
|16
|Brühgruppendruck  2.BG
|0  - 3,3V
|0  - 12 bar
|-
|9,10
|16
|Wassereingangstemperatur
| -
|
|-
|11,12
|16
|Boiler-NTC  (1.BG)
|0 - 3,3V
|Kennlinie für 0  … 5V
|-
|13,14
|16
|Boiler-NTC  (2.BG)
|0  - 3,3V
|Kennlinie  für 0 … 5V
|-
|15,16
|16
|Tassenwärmer-NTC
|0  - 3,3V
|Kennlinie  für 0 … 5V
|-
|17,18
|16
|Mischtemperatur-NTC  (1.BG)
|0  - 3,3V
|Kennlinie  für 0 … 5V
|-
|19,20
|16
|Mischtemperatur-NTC  (2.BG)
|0  - 3,3V
|Kennlinie  für 0 … 5V
|-
|21,22
|16
|Brühgruppen-NTC  (1.BG)
|0  - 3,3V
|Kennlinie  für 0 … 5V
|-
|23,24
|16
|Brühgruppen-NTC  (2.BG)
|0  - 3,3V
|Kennlinie  für 0 … 5V
|-
|25
|8
|Boilerheizung  (Soll, 1.BG)
|0–100%  PWM
|
|-
|26
|8
|Boilerheizung  (Soll, 2.BG)
|0–100%  PWM
|
|-
|27
|8
|Tassenwärmerheizung  (Soll)
|0–100%  PWM
|
|-
|28,29
|16
|Position  Schrittmotor Dosierventil (1.BG)
|0–550
|
|-
|30,31
|16
|Position  Schrittmotor Dosierventil (2.BG)
|0–550
|
|-
|32,33
|16
|Verstellwert  Schrittmotor (1.BG)
|signed  int
|
|-
|34,35
|16
|Verstellwert  Schrittmotor (2.BG)
|signed  int
|
|-
|36,37
|16
|Pumpensollwert  (1.BG)
|0–4096
|entspricht  0–5000 mV
|-
|38,39
|16
|Pumpensollwert  (2.BG)
|0–4096
|entspricht  0–5000 mV
|-
|40
|8
|Durchflussrate  (1.BG)
|0–25  ml/s
|1/10  ml/s
|-
|41
|8
|Durchflussrate  (2.BG)
|0–25  ml/s
|1/10  ml/s
|-
|42,43
|16
|Durchflusscounts  (1.BG)
|0–65535
|1  Count ≈ 1/39,9 ml
|-
|44,45
|16
|Durchflusscounts  (2.BG)
|0–65535
|1  Count ≈ 1/39,9 ml
|-
|46
|8
|Füllstandbyte
|
|
|-
|
|0
|Füllstand  Boiler 1. BG
|0/1
|
|-
|
|1
|Füllstand  Boiler 2. BG
|0/1
|
|-
|
|2
|Füllstand  Tank Minimum
|0/1
|
|-
|
|3
|Füllstand  Tank Maximum
|0/1
|
|-
|
|4
|Füllstand  Abtropfschale
|0/1
|
|-
|
|5
|
|
|
|-
|
|6
|
|
|
|-
|
|7
|
|
|
|-
|47
|8
|Magnetventile  Byte 1
| -
| rowspan="6" |Magnetventile Y101 bis Y113 gehören zur 1. BG
Y113 ist der Dampfhahn Y214 bis Y222 gehören zur 2. BG
|-
|
|0
|Y101
|0/1
|-
|
|1
|Y102
|0/1
|-
|
|2
|Y103
|0/1
|-
|
|3
|Y104
|0/1
|-
|
|4
|Y105
|0/1
|-
|
|5
|Y106
|0/1
|
|-
|
|6
|Y107
|0/1
|
|-
|
|7
|Y108
|0/1
|
|-
|48
|8
|Magnetventile  Byte 2
| -
| rowspan="6" |
|-
|
|0
|Y109
|0/1
|-
|
|1
|Y110
|0/1
|-
|
|2
|Y111
|0/1
|-
|
|3
|Y112
|0/1
|-
|
|4
|Y113
|0/1
|-
|
|5
|Y114
|0/1
|
|-
|
|6
|Y115
|0/1
|
|-
|
|7
|Y116
|0/1
|
|-
|49
|8
|Magnetventile  Byte 3
| -
| rowspan="6" |
|-
|
|0
|Y117
|0/1
|-
|
|1
|Y118
|0/1
|-
|
|2
|Y119
|0/1
|-
|
|3
|Y120
|0/1
|-
|
|4
|Y121
|0/1
|-
|
|5
|Y122
|0/1
|
|-
|
|6
|
|
|
|-
|
|7
|
|
|
|-
|50,51
|16
|Bezugszeit  1.BG
|0–120  s
|Integerwert  ×10
|-
|52,53
|16
|Bezugsmenge  1.BG
|20-  300g bzw. ml
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000
|-
|54,55
|16
|Bezugszeit  2.BG
|0–120  s
|Integerwert  ×10
|-
|56,57
|16
|Bezugsmenge  2.BG
|20-  300g bzw. ml
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000
|-
|58,59
|16
|Preinfusionszeit  1.BG
|0–120  s
|Integerwert  ×10
|-
|60,61
|16
|Preinfusionszeit  2.BG
|0–120  s
|Integerwert  ×10
|-
|62
|8
|Abschalttemperatur
|90–98  °C
|Integerwert  in °C
|-
|63
|8
|Grenztemperatur
|135–150  °C
|Integerwert  in °C
|-
|64
|8
|Sollwert  Boilerdruck
|110–150
|×10  mbar
|-
|65
|8
|Stellung  Vertikalhebel 1
|0–180°
|
|-
|66
|8
|Stellung  Vertikalhebel 2
|0–180°
|
|-
|67
|8
|Maschinen-Counter
|0-255
|siehe  Startprozedur Flowchart
|-
|68
|8
|Maschinenstatus  Byte 1
|
|
|-
|
|0
|Mischerstatus  1. BG
|0/1
|True  = Mischtemperatur erreicht
|-
|
|1
|Mischerstatus  2. BG
|0/1
|True  = Mischtemperatur erreicht
|-
|
|2
|Entschichtung
|0/1
|True  = Entschichtung aktiv
|-
|
|3
|Handhebelmodus  1.BG
|0/1
|True  = aktiv
|-
|
|4
|Handhebelmodus  2.BG
|0/1
|True  = aktiv
|-
|
|5
|Spülung 1.BG
|0/1
|True  = aktiv
|-
|
|6
|Spülung 2.BG
|0/1
|True  = aktiv
|-
|
|7
|Rückspülung 1.BG
|0/1
|True  = aktiv
|-
|69
|8
|Maschinenstatus  Byte 2
|
|
|-
|
|0
|Rückspülung 2.BG
|0/1
|True  = aktiv
|-
|
|1
|Schrittmotor  Dosierventil Flag 1. BG
|0/1
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)
|-
|
|2
|Schrittmotor  Dosierventil Flag 2. BG
|0/1
|
|-
|
|3
|Kaffeebezug  1. BG
|0/1
|True  = aktiv
|-
|
|4
|Kaffeebezug  2. BG
|0/1
|True  = aktiv
|-
|
|5
|Teewasserbezug
|0/1
|True  = aktiv
|-
|
|6
|Dampfbezug
|0/1
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck
|-
|
|7
|Boilerbefüllung  (Befüllungsflag)
|0/1
|True  = Boilerbefüllung aktiv
|-
|70
|8
|Maschinenstatus  Byte 3
|
|
|-
|
|0
|Aufheizen
|0/1
|True  = Aufheizphase, False = Betriebsbereit
|-
|
|1
|Systemstart
|0/1
|True  = Systemstart
|-
|
|2
|Sicherheitsfunktion
|0/1
|True  = Sicherheitsfunktion aktiv
|-
|
|3
|Wartungsmodus
|0/1
|True  = aktiv
|-
|
|4
|CRC-Fehler  Maschinensimulator
|0/1
|True  = aktiv
|-
|
|5
|CRC-Fehler  Display
|0/1
|True  = aktiv
|-
|
|6
|Entleerung
|0/1
|
|-
|
|
|
|
|
|-
|
|
|
|
|
|-
|71,72
|16
|CRC16-Bytes
|
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks
|}
|}


= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =
Vom Maschinensimulator zum STM32 werden einzelne Botschaften versendet. Diese werden nur gesendet, wenn eine Änderung oder ein Eingriff erforderlich ist. Die Maschinensimulator-MCU dient dabei als Gateway. Die Wartungs-APP löst über den REPL das Senden der Botschaften aus.
== Struktur ==
Jede Botschaft beginnt mit einem Startzeichen aus dem Bereich 0x20 bis 0x4F. Über dieses Startzeichen erkennt der STM32, welche Botschaft empfangen wurde und wie die Nutzdaten auszuwerten sind.
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:
''Startzeichen'' – Nutzdaten – CRC16
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.
== Inhalt und Aufteilung ==
Die Botschaften sind in der Tabelle thematisch gegliedert und sofern Reglerparameter vorhanden sind, diese immer am Ende eines Themas zu platzieren. Erweiterungen sind allerdings unabhängig der thematischen Zuordnung lediglich durch Anhängen in der Tabelle möglich. Für alles andere wäre der Programmieraufwand zu hoch und zu fehleranfällig.
Die Botschaften sind für 2 Brühgruppen vordefiniert.
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.
Alle Temperaturwerte werden als Integer-Werte in 1/10°C Schritten übermittelt. Dabei wird der Temperaturbereich 30 bis 98 °C mit dem Wertebereich 300 bis 980 und der Temperaturbereich 135 bis 150 °C mit dem Wertebereich 1350 bis 1500 dargestellt.
Am Anfang der Tabelle befinden sich alle Befehle, welche einen Einfluss auf den Boiler haben. Die Boilerheizungen und die Tassenwärmerheizung werden als PWM-Werte im Bereich von 0 bis 100 % übertragen. Der Boilerdruck wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird der Druckbereich 1100 bis 1500 mbar mit einer 1 mbar Auflösung im Wertebereich von 1100 bis 1500 dargestellt.
Danach kommen die Einstellungen für die Mischtemperatur.
Es folgen die Pumpen und Durchfluss bezogenen Größen. Die Pumpensollwerte werden im Wertebereich von 0 bis 4096 übertragen. Dieser Bereich entspricht dem Spannungsbereich von 0 bis 5000 mV beziehungsweise der Drehzahl 0 bis 5000 U/min.
Die Magnetventile werden alle innerhalb derselben Botschaft bitweise übermittelt, so dass alle Zustände der Ventile übergeben werden, auch wenn sie nicht verändert wurden.
Die Bezugszeit und die Preinfusionszeit wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird der Zeitbereich von 0 bis 120 Sekunden mit einer 1/10 Sekunde Auflösung im Wertebereich von 0 bis 1200 dargestellt. Anschließend folgt die Preinfusionszeit der ersten und zweiten Brühgruppe, welche als Integerwerte mit jeweils 16 Bit im Bereich von 0-1200 übergeben werden und 1 1/10 Sekunde entspricht, wodurch sich ein Zeitbereich von 0 bis 120 s ergibt.
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.
Über die Maschinenstatus-Bytes werden die Programme, wie z.B. der Teewasserbezug oder die Boilerbefüllung ausgeführt. Entsprechend werden die Status-Bits in den Maschinenstatus-Bytes gesetzt.
Der STM32 wertet eine Botschaft erst dann aus, wenn die Länge und die CRC16-Prüfung gültig sind. Dadurch wird verhindert, dass fehlerhafte oder unvollständige Botschaften direkt in die Steuerung übernommen werden.


== Botschaften von Wartungs-APP zu STM32 ==
== Botschaften von Wartungs-APP zu STM32 ==
Zeile 25: Zeile 684:
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung
|-
|-
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||  
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||
|-
|-
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||  
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||
|-
|-
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar
|-
|0x23
|32
|Abschalttemperatur  Entschichtung
|90 - 98 °C
|Integerwert in  °C
|-
|0x24
|32
|Grenztemperatur
|135  - 150 °C
|Integerwert  in °C
|-
|0x25
|32
|Boilerdruckregelung  Proportionalregelparameter
|0-255
|
|-
|0x26
|32
|Boilerdruckregelung  Integralregelparameter
|0-255
|
|-
|0x27
|32
|Boilerdruckregelung  Differentialregelparameter
|0-255
|
|-
|0x28
|32
|Boilerfolgeregelung  Proportionalregelparameter
|0-255
| rowspan="2" |
|-
|0x29
|32
|Boilerfolgeregelung  Integralregelparameter
|0-255
|-
|0x2A
|32
|Boilerfolgeregelung  Differentialregelparameter
|0-255
|
|-
|0x2B
|32
|Verstellwert  Schrittmotor Dosierventil 1. BG
|Integer  mit Vorzeichen
|
|-
|0x2C
|32
|Bezugswassertemperatur  1. BG
|30  - 98 °C
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980
|-
|0x2D
|32
|Mischtemperaturregelung  1.BG Proportionalregelparameter
|0-255
|
|-
|0x2E
|32
|Mischtemperaturregelung  1.BG Integralregelparameter
|0-255
|
|-
|0x2F
|32
|Mischtemperaturregelung  1.BG Differentialregelparameter
|0-255
|
|-
|0x30
|32
|Verstellwert  Schrittmotor Dosierventil 2. BG
|Integer  mit Vorzeichen
|
|-
|0x31
|32
|Bezugswassertemperatur  2. BG
|30  - 98 °C
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980
|-
|0x32
|32
|Mischtemperaturregelung  2.BG Proportionalregelparameter
|0-255
|
|-
|0x33
|32
|Mischtemperaturregelung  2.BG Integralregelparameter
|0-255
|
|-
|0x34
|32
|Mischtemperaturregelung  2.BG Differentialregelparameter
|0-255
|
|-
|0x35
|32
|Pumpensollwert  1. BG
|0  -4096
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min
|-
|0x36
|32
|Bezugsmenge  1. BG
|20  - 300 g bzw. ml
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000
|-
|0x37
|32
|Durchflussregelung  1.BG Proportionalregelparameter
|0-255
|
|-
|0x38
|32
|Durchflussregelung  1.BG Integralregelparameter
|0-255
|
|-
|0x39
|32
|Durchflussregelung  1.BG Differentialregelparameter
|0-255
|
|-
|0x3A
|32
|Pumpensollwert  2. BG
|0  -4096
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min
|-
|0x3B
|32
|Bezugsmenge  2. BG
|20  - 300 g bzw. ml
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000
|-
|0x3C
|32
|Durchflussregelung  2.BG Proportionalregelparameter
|0-255
|255  Verstellmöglichketien
|-
|0x3D
|32
|Durchflussregelung  2.BG Integralregelparameter
|0-255
|255  Verstellmöglichketien
|-
|0x3E
|32
|Durchflussregelung  2.BG Differentialregelparameter
|0-255
|255  Verstellmöglichketien
|-
|0x3F
|32
|Magnetventile
|
|
|-
|
|0
|Y101
|
| rowspan="8" |Magnetventile  Y101 bis Y113 1. BG
|-
|
|1
|Y102
|
|-
|
|2
|Y103
|
|-
|
|3
|Y104
|
|-
|
|4
|Y105
|
|-
|
|5
|Y106
|
|-
|
|6
|Y107
|
|-
|
|7
|Y108
|
|-
|
|8
|Y109
|
| rowspan="8" |Magnetventile  Y214 bis Y222 2. BG
|-
|
|9
|Y110
|
|-
|
|10
|Y111
|
|-
|
|11
|Y112
|
|-
|
|12
|Y113
|
|-
|
|13
|Y214
|
|-
|
|14
|Y215
|
|-
|
|15
|Y216
|
|-
|
|16
|Y217
|
| rowspan="8" |
|-
|
|17
|Y218
|
|-
|
|18
|Y219
|
|-
|
|19
|Y220
|
|-
|
|20
|Y221
|
|-
|
|21
|Y222
|
|-
|
|
|
|
|-
|
|
|
|
|-
|0x40
|32
|Bezugszeit  1. BG
|0  - 120 Sekunden
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200
|-
|0x41
|32
|Bezugszeit  2. BG
|0  - 120 Sekunden
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200
|-
|0x42
|32
|Preinfusionszeit  1. BG
|0  - 120 Sekunden
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200
|-
|0x43
|32
|Preinfusionszeit  2. BG
|0  - 120 Sekunden
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200
|-
|0x44
|32
|Stellung  Vertikalhebel 1
|0  -180 Grad
|Integerwert  in Grad
|-
|0x45
|32
|Stellung  Vertikalhebel 2
|0  -180 Grad
|Integerwert  in Grad
|-
|0x46
|32
|Tassenwärmer  Soll
|PWM  0 - 100 %
|
|-
|0x47
|32
|Maschinenstatus  Bytes
|
|
|-
|
|
|Maschinenstatus  Byte 1
|
|
|-
|
|0
|Mischerstatus  1. BG
|0/1
|True  = Mischtemperatur erreicht
|-
|
|1
|Mischerstatus  2. BG
|0/1
|True  = Mischtemperatur erreicht
|-
|
|2
|Entschichtung
|0/1
|True  = Entschichtung aktiv
|-
|
|3
|Handhebelmodus  1.BG
|0/1
|True  = aktiv
|-
|
|4
|Handhebelmodus  2.BG
|0/1
|True  = aktiv
|-
|
|5
|Spülung  1.BG
|0/1
|True  = aktiv
|-
|
|6
|Spülung  2.BG
|0/1
|True  = aktiv
|-
|
|7
|Rückspülung  1.BG
|0/1
|True  = aktiv
|-
|
|
|Maschinenstatus  Byte 2
|
|
|-
|
|8
|Rückspülung  2.BG
|0/1
|True  = aktiv
|-
|
|9
|Schrittmotor  Dosierventil Flag 1. BG
|0/1
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)
|-
|
|10
|Schrittmotor  Dosierventil Flag 2. BG
|0/1
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)
|-
|
|11
|Kaffeebezug  1. BG
|0/1
|True  = aktiv
|-
|
|12
|Kaffeebezug  2. BG
|0/1
|True  = aktiv
|-
|
|13
|Teewasserbezug
|0/1
|True  = aktiv
|-
|
|14
|Dampfbezug
|0/1
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck
|-
|
|15
|Boilerbefüllung  (Befüllungsflag)
|0/1
|True  = Boilerbefüllung aktiv
|-
|
|
|Maschinenstatus  Byte 3
|
|
|-
|
|16
|Aufheizen
|0/1
|True  = Aufheizphase, False = Betriebsbereit
|-
|
|17
|Systemstart
|0/1
|True  = Systemstart
|-
|
|18
|Sicherheitsfunktion
|0/1
|True  = Sicherheitsfunktion aktiv
|-
|
|19
|Wartungsmodus
|0/1
|True  = aktiv
|-
|
|20
|CRC-Fehler  Maschinensimulator
|0/1
|True  = aktiv
|-
|
|21
|CRC-Fehler  Display
|0/1
|True  = aktiv
|-
|
|22
|Entleerung
|0/1
|True = aktiv
|}
|}



Aktuelle Version vom 12. Juni 2026, 11:23 Uhr

Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken

Zur Initialisierung der UART-Kommunikation sendet die STM32 das Byte 0x0A an die Display-MCU und die Maschinensimulator-MCU. Beide MCUs senden das Byte 0x0B zurück. Darüber wird die Kommunikationsbereitschaft erkannt.

Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator

Der Token vom STM32 zum Maschinensimulator dient zur zyklischen Übertragung des aktuellen Maschinenzustands. Da die Maschinensimulator-MCU zusätzlich als Gateway für die Wartungs-App dient, enthält dieser Token alle Informationen, die für Simulation, Diagnose und Wartung benötigt werden. Der Token wird mit einem Sendetakt von 4 Token pro Sekunde vom STM32 an den Maschinensimulator gesendet.

Struktur

Der Token beginnt mit dem Startzeichen 0x0F. Danach folgt ein fest definierter Nutzdatenbereich mit 69 Byte. Am Ende befinden sich zwei Byte für das CRC16/MODBUS-Prüfverfahren. Damit ist die Gesamtlänge mit insgesamt 72 Byte eindeutig festgelegt.

Inhalt

Der Token beschreibt den aktuellen Zustand der Maschine. Zuerst werden die Spannungsmesswerte (Leitwert, Drücke, Temperaturen) übertragen. Diese liegen als 16 Bit Spannungsmesswerte im Bereich von 0 bis 3,3 V vor und werden im Maschinensimulator über die entsprechenden Kennlinien in physikalische Werte umgerechnet.

Danach folgen die Heizungswerte. Die Boilerheizungen und die Tassenwärmerheizung werden als PWM-Werte im Bereich von 0 bis 100 % als 8 Bit-Wert übertragen. Anschließend werden die Positionen der Schrittmotoren für die Dosierventile von 0 bis 550 mit 16 Bit übergeben. Zusätzlich werden Verstellwerte übertragen. Diese werden als vorzeichenbehaftete 16-Bit-Integerwerte übergeben, damit sowohl positive als auch negative Verstellrichtungen dargestellt werden können.

Die Pumpensollwerte werden als 12-Bit-Wert im Wertebereich 0 bis 4096 in 2 Bytes (16 Bit) übertragen. Dieser Bereich entspricht dem Spannungsbereich von 0 bis 5000 mV beziehungsweise der Drehzahl 0 bis 5000 U/min. Die Durchflussraten werden im Bereich von 0 bis 25 ml/s in 1/10-ml/s-Schritten als 8-Bit-Werte übertragen. Die Durchflusscounts werden als 16-Bit-Werte im Bereich von 0 bis 65535 übertragen, wobei ein Count 1/39,9 ml entspricht.

Nach den Mess- und Stellwerten folgen Füllstands- und Ventilinformationen. Das Füllstandsbyte wird bitweise ausgewertet. Jedes Bit beschreibt einen einzelnen Zustand, also Boilerfüllstand, Tankminimum, Tankmaximum und Abtropfschale.

Auch die Magnetventile werden bitweise übertragen. Es gibt 3 Magnetventil-Bytes. Dabei steht jedes Bit für ein einzelnes Ventil, zum Beispiel Y101, Y102, Y103.

Danach folgt die Bezugszeit und die Bezugsmenge für die beiden Brühgruppen. Die Bezugszeit wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird der Zeitbereich von 0 bis 120 Sekunden mit einer 1/10 Sekunde Auflösung im Wertebereich von 0 bis 1200 dargestellt. Die Bezugsmenge wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird die Bezugsmenge im Bereich von 20 bis 300g mit 1/10 Gramm Auflösung im Wertebereich von 200 bis 3000 dargestellt.

Anschließend folgen die Preinfusionszeiten der ersten und zweiten Brühgruppe. Diese werden jeweils als 16 Bit Integerwert (0 bis 65535) übermittelt.  Dabei wird die Preinfusionszeit im Zeitbereich von 0 bis 120 Sekunden mit einer 1/10 Sekunde Auflösung im Wertebereich von 0 bis 1200 dargestellt.

Danach wird die Abschalttemperatur für die Boilerentschichtung und die Grenztemperatur welche von den Boilern nicht überschritten werden darf als Integerwerte in Grad Celsius kommuniziert.

Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.

Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.

Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.

Am Ende des Nutzdatenbereichs befinden sich die drei Maschinenstatus-Bytes. Die Maschinenstatus-Bytes werden bitweise ausgewertet. Die ersten zwei Maschinenstatus-Bytes enthalten Betriebszustände wie Mischerstatus, Entschichtung und Handhebelmodus. In dem dritten Maschinenstatus-Byte wird unter anderem mitgeteilt, ob sich die Maschine im Wartungsmodus befindet und ob Botschaften zum STM32 erfolgreich übertragen wurden oder ob es zu einem Übertragungsfehler nach dem Überprüfen mit dem CRC-Verfahren gekommen ist.

Der Umgang mit CRC-Fehler ist nicht definiert.

Erklärung der Tokentabelle

Die Tokentabelle beschreibt den Aufbau des Tokens vollständig. Sie legt fest, an welcher Byteposition eine Information steht, wie viele Byte oder Bits verwendet werden, welchen Wertebereich der Wert besitzt und wie er zu interpretieren ist.

Bei 16-Bit-Werten werden zwei aufeinanderfolgende Bytes verwendet. Bei 8-Bit-Werten wird ein einzelnes Byte gelesen. Bei Statusbytes wird nicht das gesamte Byte als Zahlenwert interpretiert, sondern jedes Bit besitzt eine eigene Bedeutung. Der Maschinensimulator zerlegt den Token daher exakt nach dieser Tabelle: zuerst die mehrbyteigen Mess- und Stellwerte, danach die Einzelwerte und zuletzt die bitweisen Zustände.

Der Token wird ausschließlich vom STM32 erzeugt und vom Maschinensimulator gelesen. Änderungen von Sollwerten, Reglerparameter oder Wartungsfunktionen erfolgen nicht über diesen Token, sondern über separate Botschaften zurück an den STM32.

Haupttoken von STM32 zu Maschinensimulator-MCU

Haupttoken von STM32 zu Maschinensimulator-MCU
Byte-Nr Bits Beschreibung Wertebereich Anmerkung
0 8 Startzeichen 0x0F Standardtoken
1,2 16 Leitwert 0 - 3,3 V Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm
3,4 16 Boilerdruck 0 - 3,3 V Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar
5,6 16 Brühgruppendruck 1.BG 0 - 3,3V 0 - 12 bar
7,8 16 Brühgruppendruck 2.BG 0 - 3,3V 0 - 12 bar
9,10 16 Wassereingangstemperatur -
11,12 16 Boiler-NTC (1.BG) 0 - 3,3V Kennlinie für 0 … 5V
13,14 16 Boiler-NTC (2.BG) 0 - 3,3V Kennlinie für 0 … 5V
15,16 16 Tassenwärmer-NTC 0 - 3,3V Kennlinie für 0 … 5V
17,18 16 Mischtemperatur-NTC (1.BG) 0 - 3,3V Kennlinie für 0 … 5V
19,20 16 Mischtemperatur-NTC (2.BG) 0 - 3,3V Kennlinie für 0 … 5V
21,22 16 Brühgruppen-NTC (1.BG) 0 - 3,3V Kennlinie für 0 … 5V
23,24 16 Brühgruppen-NTC (2.BG) 0 - 3,3V Kennlinie für 0 … 5V
25 8 Boilerheizung (Soll, 1.BG) 0–100% PWM
26 8 Boilerheizung (Soll, 2.BG) 0–100% PWM
27 8 Tassenwärmerheizung (Soll) 0–100% PWM
28,29 16 Position Schrittmotor Dosierventil (1.BG) 0–550
30,31 16 Position Schrittmotor Dosierventil (2.BG) 0–550
32,33 16 Verstellwert Schrittmotor (1.BG) signed int
34,35 16 Verstellwert Schrittmotor (2.BG) signed int
36,37 16 Pumpensollwert (1.BG) 0–4096 entspricht 0–5000 mV
38,39 16 Pumpensollwert (2.BG) 0–4096 entspricht 0–5000 mV
40 8 Durchflussrate (1.BG) 0–25 ml/s 1/10 ml/s
41 8 Durchflussrate (2.BG) 0–25 ml/s 1/10 ml/s
42,43 16 Durchflusscounts (1.BG) 0–65535 1 Count ≈ 1/39,9 ml
44,45 16 Durchflusscounts (2.BG) 0–65535 1 Count ≈ 1/39,9 ml
46 8 Füllstandbyte
0 Füllstand Boiler 1. BG 0/1
1 Füllstand Boiler 2. BG 0/1
2 Füllstand Tank Minimum 0/1
3 Füllstand Tank Maximum 0/1
4 Füllstand Abtropfschale 0/1
5
6
7
47 8 Magnetventile Byte 1 - Magnetventile Y101 bis Y113 gehören zur 1. BG

Y113 ist der Dampfhahn Y214 bis Y222 gehören zur 2. BG

0 Y101 0/1
1 Y102 0/1
2 Y103 0/1
3 Y104 0/1
4 Y105 0/1
5 Y106 0/1
6 Y107 0/1
7 Y108 0/1
48 8 Magnetventile Byte 2 -
0 Y109 0/1
1 Y110 0/1
2 Y111 0/1
3 Y112 0/1
4 Y113 0/1
5 Y114 0/1
6 Y115 0/1
7 Y116 0/1
49 8 Magnetventile Byte 3 -
0 Y117 0/1
1 Y118 0/1
2 Y119 0/1
3 Y120 0/1
4 Y121 0/1
5 Y122 0/1
6
7
50,51 16 Bezugszeit 1.BG 0–120 s Integerwert ×10
52,53 16 Bezugsmenge 1.BG 20- 300g bzw. ml Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000
54,55 16 Bezugszeit 2.BG 0–120 s Integerwert ×10
56,57 16 Bezugsmenge 2.BG 20- 300g bzw. ml Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000
58,59 16 Preinfusionszeit 1.BG 0–120 s Integerwert ×10
60,61 16 Preinfusionszeit 2.BG 0–120 s Integerwert ×10
62 8 Abschalttemperatur 90–98 °C Integerwert in °C
63 8 Grenztemperatur 135–150 °C Integerwert in °C
64 8 Sollwert Boilerdruck 110–150 ×10 mbar
65 8 Stellung Vertikalhebel 1 0–180°
66 8 Stellung Vertikalhebel 2 0–180°
67 8 Maschinen-Counter 0-255 siehe Startprozedur Flowchart
68 8 Maschinenstatus Byte 1
0 Mischerstatus 1. BG 0/1 True = Mischtemperatur erreicht
1 Mischerstatus 2. BG 0/1 True = Mischtemperatur erreicht
2 Entschichtung 0/1 True = Entschichtung aktiv
3 Handhebelmodus 1.BG 0/1 True = aktiv
4 Handhebelmodus 2.BG 0/1 True = aktiv
5 Spülung 1.BG 0/1 True = aktiv
6 Spülung 2.BG 0/1 True = aktiv
7 Rückspülung 1.BG 0/1 True = aktiv
69 8 Maschinenstatus Byte 2
0 Rückspülung 2.BG 0/1 True = aktiv
1 Schrittmotor Dosierventil Flag 1. BG 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
2 Schrittmotor Dosierventil Flag 2. BG 0/1
3 Kaffeebezug 1. BG 0/1 True = aktiv
4 Kaffeebezug 2. BG 0/1 True = aktiv
5 Teewasserbezug 0/1 True = aktiv
6 Dampfbezug 0/1 Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck
7 Boilerbefüllung (Befüllungsflag) 0/1 True = Boilerbefüllung aktiv
70 8 Maschinenstatus Byte 3
0 Aufheizen 0/1 True = Aufheizphase, False = Betriebsbereit
1 Systemstart 0/1 True = Systemstart
2 Sicherheitsfunktion 0/1 True = Sicherheitsfunktion aktiv
3 Wartungsmodus 0/1 True = aktiv
4 CRC-Fehler Maschinensimulator 0/1 True = aktiv
5 CRC-Fehler Display 0/1 True = aktiv
6 Entleerung 0/1
71,72 16 CRC16-Bytes Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks

Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32

Vom Maschinensimulator zum STM32 werden einzelne Botschaften versendet. Diese werden nur gesendet, wenn eine Änderung oder ein Eingriff erforderlich ist. Die Maschinensimulator-MCU dient dabei als Gateway. Die Wartungs-APP löst über den REPL das Senden der Botschaften aus.

Struktur

Jede Botschaft beginnt mit einem Startzeichen aus dem Bereich 0x20 bis 0x4F. Über dieses Startzeichen erkennt der STM32, welche Botschaft empfangen wurde und wie die Nutzdaten auszuwerten sind.

Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:

Startzeichen – Nutzdaten – CRC16

Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.

Inhalt und Aufteilung

Die Botschaften sind in der Tabelle thematisch gegliedert und sofern Reglerparameter vorhanden sind, diese immer am Ende eines Themas zu platzieren. Erweiterungen sind allerdings unabhängig der thematischen Zuordnung lediglich durch Anhängen in der Tabelle möglich. Für alles andere wäre der Programmieraufwand zu hoch und zu fehleranfällig.

Die Botschaften sind für 2 Brühgruppen vordefiniert.

Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.

Alle Temperaturwerte werden als Integer-Werte in 1/10°C Schritten übermittelt. Dabei wird der Temperaturbereich 30 bis 98 °C mit dem Wertebereich 300 bis 980 und der Temperaturbereich 135 bis 150 °C mit dem Wertebereich 1350 bis 1500 dargestellt.

Am Anfang der Tabelle befinden sich alle Befehle, welche einen Einfluss auf den Boiler haben. Die Boilerheizungen und die Tassenwärmerheizung werden als PWM-Werte im Bereich von 0 bis 100 % übertragen. Der Boilerdruck wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird der Druckbereich 1100 bis 1500 mbar mit einer 1 mbar Auflösung im Wertebereich von 1100 bis 1500 dargestellt.

Danach kommen die Einstellungen für die Mischtemperatur.

Es folgen die Pumpen und Durchfluss bezogenen Größen. Die Pumpensollwerte werden im Wertebereich von 0 bis 4096 übertragen. Dieser Bereich entspricht dem Spannungsbereich von 0 bis 5000 mV beziehungsweise der Drehzahl 0 bis 5000 U/min.

Die Magnetventile werden alle innerhalb derselben Botschaft bitweise übermittelt, so dass alle Zustände der Ventile übergeben werden, auch wenn sie nicht verändert wurden.

Die Bezugszeit und die Preinfusionszeit wird als 16 Bit Integerwert (0 bis 65535) übermittelt. Dabei wird der Zeitbereich von 0 bis 120 Sekunden mit einer 1/10 Sekunde Auflösung im Wertebereich von 0 bis 1200 dargestellt. Anschließend folgt die Preinfusionszeit der ersten und zweiten Brühgruppe, welche als Integerwerte mit jeweils 16 Bit im Bereich von 0-1200 übergeben werden und 1 1/10 Sekunde entspricht, wodurch sich ein Zeitbereich von 0 bis 120 s ergibt.

Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.

Über die Maschinenstatus-Bytes werden die Programme, wie z.B. der Teewasserbezug oder die Boilerbefüllung ausgeführt. Entsprechend werden die Status-Bits in den Maschinenstatus-Bytes gesetzt.

Der STM32 wertet eine Botschaft erst dann aus, wenn die Länge und die CRC16-Prüfung gültig sind. Dadurch wird verhindert, dass fehlerhafte oder unvollständige Botschaften direkt in die Steuerung übernommen werden.

Botschaften von Wartungs-APP zu STM32

Botschaften von Wartungs-APP zum STM32
Startzeichen Bits Beschreibung Wertebereich Anmerkung
0x20 32 Boilerheizung Soll 1. BG PWM 0 - 100 %
0x21 32 Boilerheizung Soll 2. BG PWM 0 - 100 %
0x22 32 Sollwert Boilerdruck 1100 - 1500 mbar Integerwert in mbar
0x23 32 Abschalttemperatur Entschichtung 90 - 98 °C Integerwert in °C
0x24 32 Grenztemperatur 135 - 150 °C Integerwert in °C
0x25 32 Boilerdruckregelung Proportionalregelparameter 0-255
0x26 32 Boilerdruckregelung Integralregelparameter 0-255
0x27 32 Boilerdruckregelung Differentialregelparameter 0-255
0x28 32 Boilerfolgeregelung Proportionalregelparameter 0-255
0x29 32 Boilerfolgeregelung Integralregelparameter 0-255
0x2A 32 Boilerfolgeregelung Differentialregelparameter 0-255
0x2B 32 Verstellwert Schrittmotor Dosierventil 1. BG Integer mit Vorzeichen
0x2C 32 Bezugswassertemperatur 1. BG 30 - 98 °C Integerwert in 1/10 °C, damit Wertebereich 300 bis 980
0x2D 32 Mischtemperaturregelung 1.BG Proportionalregelparameter 0-255
0x2E 32 Mischtemperaturregelung 1.BG Integralregelparameter 0-255
0x2F 32 Mischtemperaturregelung 1.BG Differentialregelparameter 0-255
0x30 32 Verstellwert Schrittmotor Dosierventil 2. BG Integer mit Vorzeichen
0x31 32 Bezugswassertemperatur 2. BG 30 - 98 °C Integerwert in 1/10 °C, damit Wertebereich 300 bis 980
0x32 32 Mischtemperaturregelung 2.BG Proportionalregelparameter 0-255
0x33 32 Mischtemperaturregelung 2.BG Integralregelparameter 0-255
0x34 32 Mischtemperaturregelung 2.BG Differentialregelparameter 0-255
0x35 32 Pumpensollwert 1. BG 0 -4096 entspricht 0 - 5000 mV bzw. 0 - 5000 U/min
0x36 32 Bezugsmenge 1. BG 20 - 300 g bzw. ml Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000
0x37 32 Durchflussregelung 1.BG Proportionalregelparameter 0-255
0x38 32 Durchflussregelung 1.BG Integralregelparameter 0-255
0x39 32 Durchflussregelung 1.BG Differentialregelparameter 0-255
0x3A 32 Pumpensollwert 2. BG 0 -4096 entspricht 0 - 5000 mV bzw. 0 - 5000 U/min
0x3B 32 Bezugsmenge 2. BG 20 - 300 g bzw. ml Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000
0x3C 32 Durchflussregelung 2.BG Proportionalregelparameter 0-255 255 Verstellmöglichketien
0x3D 32 Durchflussregelung 2.BG Integralregelparameter 0-255 255 Verstellmöglichketien
0x3E 32 Durchflussregelung 2.BG Differentialregelparameter 0-255 255 Verstellmöglichketien
0x3F 32 Magnetventile
0 Y101 Magnetventile Y101 bis Y113 1. BG
1 Y102
2 Y103
3 Y104
4 Y105
5 Y106
6 Y107
7 Y108
8 Y109 Magnetventile Y214 bis Y222 2. BG
9 Y110
10 Y111
11 Y112
12 Y113
13 Y214
14 Y215
15 Y216
16 Y217
17 Y218
18 Y219
19 Y220
20 Y221
21 Y222
0x40 32 Bezugszeit 1. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
0x41 32 Bezugszeit 2. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
0x42 32 Preinfusionszeit 1. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
0x43 32 Preinfusionszeit 2. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
0x44 32 Stellung Vertikalhebel 1 0 -180 Grad Integerwert in Grad
0x45 32 Stellung Vertikalhebel 2 0 -180 Grad Integerwert in Grad
0x46 32 Tassenwärmer Soll PWM 0 - 100 %
0x47 32 Maschinenstatus Bytes
Maschinenstatus Byte 1
0 Mischerstatus 1. BG 0/1 True = Mischtemperatur erreicht
1 Mischerstatus 2. BG 0/1 True = Mischtemperatur erreicht
2 Entschichtung 0/1 True = Entschichtung aktiv
3 Handhebelmodus 1.BG 0/1 True = aktiv
4 Handhebelmodus 2.BG 0/1 True = aktiv
5 Spülung 1.BG 0/1 True = aktiv
6 Spülung 2.BG 0/1 True = aktiv
7 Rückspülung 1.BG 0/1 True = aktiv
Maschinenstatus Byte 2
8 Rückspülung 2.BG 0/1 True = aktiv
9 Schrittmotor Dosierventil Flag 1. BG 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
10 Schrittmotor Dosierventil Flag 2. BG 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
11 Kaffeebezug 1. BG 0/1 True = aktiv
12 Kaffeebezug 2. BG 0/1 True = aktiv
13 Teewasserbezug 0/1 True = aktiv
14 Dampfbezug 0/1 Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck
15 Boilerbefüllung (Befüllungsflag) 0/1 True = Boilerbefüllung aktiv
Maschinenstatus Byte 3
16 Aufheizen 0/1 True = Aufheizphase, False = Betriebsbereit
17 Systemstart 0/1 True = Systemstart
18 Sicherheitsfunktion 0/1 True = Sicherheitsfunktion aktiv
19 Wartungsmodus 0/1 True = aktiv
20 CRC-Fehler Maschinensimulator 0/1 True = aktiv
21 CRC-Fehler Display 0/1 True = aktiv
22 Entleerung 0/1 True = aktiv

Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG

Der Token vom STM32 zum Display der 1. BG dient zur zyklischen Übertragung des aktuellen Maschinenzustands an das Display. Er enthält alle Informationen, die das Display regelmäßig zur Anzeige, Bedienfreigabe und Statusauswertung benötigt. Dazu gehören Messwerte der 1. BG, allgemeine Maschinenzustände, Fehlerzustände, Füllstandsinformationen und Freigaben. Der Token wird im regulären Betrieb mit einem Sendetakt von 4 Token pro Sekunde vom STM32 an das Display gesendet.

Struktur

Der Token beginnt mit dem Startzeichen 0x0D. Danach folgt ein fest definierter Nutzdatenbereich mit 20 Byte. Am Ende befinden sich zwei Byte für das CRC16/MODBUS-Prüfverfahren. Damit ist die Gesamtlänge mit insgesamt 23 Byte eindeutig festgelegt.

Inhalt

Der Token beschreibt den aktuellen Zustand der Maschine aus Sicht des Displays der 1. BG. Zuerst werden die Spannungsmesswerte übertragen, die für die Anzeige und für die Freigabe der Bedienfunktionen des Displays benötigt werden. Dazu gehören der Leitwert, der Boilerdruck, der Brühgruppendruck der 1. Brühgruppe, der Boiler-NTC der 1. Brühgruppe, der Tassenwärmer-NTC, die Mischtemperatur der 1. Brühgruppe, der Brühgruppen-NTC der 1. Brühgruppe und die Durchflussrate der 1. Brühgruppe.

Spannungsmesswerte werden als 16-Bit-Werte übertragen und liegen als Spannungsmesswerte im Bereich von 0 bis 3,3 V vor. Anhand der jeweiligen Kennlinien oder Skalierungen in physikalische Werte umgerechnet werden. Der Leitwert entspricht dabei dem Bereich von 0,2 bis 20 S/cm. Der Boilerdruck entspricht dem Bereich von 0 bis 4 bar. Der Brühgruppendruck der 1. Brühgruppe entspricht dem Bereich von 0 bis 12 bar. Die NTC-Werte werden über die hinterlegten Kennlinien ausgewertet. Die Durchflussrate der 1. Brühgruppe wird als 8-Bit-Integerwert übertragen. Die Skalierung erfolgt in 1/10 ml/s, wodurch der übertragbare Wertebereich 0 bis 250 einem physikalischen Bereich von 0 bis 25 ml/s entspricht. Die Werte 251 bis 255 sind nicht als gültige Durchflusswerte zu interpretieren.

Nach den Messwerten folgt das Füllstandsbyte. Das Füllstandsbyte wird bitweise ausgewertet. Jedes Bit beschreibt einen einzelnen Füllstandszustand. Bit 0 beschreibt den Füllstand Boiler 1. BG, Bit 1 den Füllstand Boiler 2. BG, Bit 2 den Füllstand Tank Minimum, Bit 3 den Füllstand Tank Maximum und Bit 4 den Füllstand Abtropfschale. Bit 5 bis Bit 7 sind reserviert und dürfen nicht als gültige Steuerinformation interpretiert werden.

Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.

Am Ende des Nutzdatenbereichs befinden sich die drei Maschinenstatus-Bytes. Die Maschinenstatus-Bytes werden bitweise ausgewertet. Die ersten zwei Maschinenstatus-Bytes enthalten Betriebszustände wie Mischerstatus, Entschichtung und Handhebelmodus. In dem dritten Maschinenstatus-Byte wird unter anderem mitgeteilt, ob sich die Maschine im Wartungsmodus befindet und ob Botschaften zum STM32 erfolgreich übertragen wurden oder ob es zu einem Übertragungsfehler nach dem Überprüfen mit dem CRC-Verfahren gekommen ist.

Der Umgang mit CRC-Fehler ist nicht definiert.

Erklärung der Tokentabelle

Die Tokentabelle beschreibt den Aufbau des Tokens vollständig. Sie legt fest, an welcher Byteposition eine Information steht, wie viele Byte oder Bits verwendet werden, welchen Wertebereich der Wert besitzt und wie er zu interpretieren ist.

Bei 16-Bit-Werten werden zwei aufeinanderfolgende Bytes verwendet. Bei 8-Bit-Werten wird ein einzelnes Byte gelesen. Bei Statusbytes wird nicht das gesamte Byte als Zahlenwert interpretiert, sondern jedes Bit besitzt eine eigene Bedeutung. Das Display MCU zerlegt den Token daher exakt nach dieser Tabelle: zuerst die mehrbyteigen Messwerte, danach die Einzelwerte und zuletzt die bitweisen Zustände.

Der Token wird ausschließlich vom STM32 erzeugt und vom Display gelesen. Änderungen von Sollwerten, Reglerparameter oder Wartungsfunktionen erfolgen nicht über diesen Token, sondern über separate Botschaften zurück an den STM32.

Haupttoken von STM32 zu Display-MCU 1. BG

Haupttoken von STM32 zu Display-MCU 1. BG
Byte-Nr Bits Beschreibung Wertebereich Anmerkung
0 8 Startzeichen 0x0D Standardtoken
1,2 16 Leitwert 0 - 3,3 V Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm
3,4 16 Boilerdruck 0 - 3,3 V Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar
5,6 16 Brühgruppendruck 1.BG 0 - 3,3 V 0 - 12 bar
7,8 16 Boiler-NTC 1. BG 0 - 3,3 V Kennlinie für 0… 5 V
9,10 16 Tassenwärmer-NTC 0 - 3,3 V Kennlinie für 0… 5 V
11,12 16 Mischtemperatur 1. BG 0 - 3,3 V Kennlinie für 0… 5 V
13,14 16 Brühgruppen-NTC 1. BG 0 - 3,3 V Kennlinie für 0… 5 V
15 8 Durchflussrate 1. BG 0–25 ml/s 1/10 ml/s
16 Füllstandbyte
0 Füllstand Boiler 1. BG 0/1
1 Füllstand Boiler 2. BG 0/1
2 Füllstand Tank Minimum 0/1
3 Füllstand Tank Maximum 0/1
4 Füllstand Abtropfschale 0/1
5
6
7
17 8 Counter siehe Startprozedur Flowchart
18 Maschinenstatus Byte 1
0 Mischerstatus 1. BG 0/1 True = Mischtemperatur erreicht
1 Mischerstatus 2. BG 0/1 True = Mischtemperatur erreicht
2 Entschichtung 0/1 True = aktiv
3 Handhebelmodus 1.BG 0/1 True = aktiv
4 Handhebelmodus 2.BG 0/1 True = aktiv
5 Spülung 1.BG 0/1 True = aktiv
6 Spülung 2.BG 0/1 True = aktiv
7 Rückspülung 1.BG 0/1 True = aktiv
19 Maschinenstatus Byte 2
0 Rückspülung 2.BG 0/1 True = aktiv
1 Schrittmotor Dosierventil Flag 1. BG 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
2 Schrittmotor Dosierventil Flag 2. BG 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
3 Kaffeebezug 1. BG 0/1 True = aktiv
4 Kaffeebezug 2. BG 0/1 True = aktiv
5 Teewasserbezug 0/1 True = aktiv
6 Dampfbezug 0/1 Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck
7 Boilerbefüllung (Befüllungsflag) 0/1 True = Boilerbefüllung aktiv
20 Maschinenstatus Byte 3
0 Aufheizen 0/1 True = Aufheizphase, False = Betriebsbereit
1 Systemstart 0/1 True = Systemstart
2 Sicherheitsfunktion 0/1 True = Sicherheitsfunktion aktiv
3 Wartungsmodus 0/1 True = aktiv
4 CRC-Fehler Maschinensimulator 0/1 True = aktiv
5 CRC-Fehler Display 0/1 True = aktiv
6 Entleerung 0/1 True = aktiv
7
21
0 CRC16-Bytes 0/1 Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks
1
2
3
4
5
6
7
22,23 16 CRC16-Bytes 0xAC9A nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks

Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32

Die Kommunikation vom Display der 1. BG zurück zum STM32 erfolgt über einzelne Botschaften. Diese werden nicht zyklisch gesendet, sondern nur bei einer Bedienaktion oder Wertänderung. Dadurch sendet das Display nicht dauerhaft alle Eingabedaten zurück, sondern nur die jeweils relevante Information.

Struktur

Jede Botschaft beginnt mit einem Startzeichen aus dem für das Display reservierten Bereich 0x50 bis 0x6F. Über dieses Startzeichen erkennt der STM32, welche Botschaft empfangen wurde und wie die Nutzdaten auszuwerten sind.

Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau: Startzeichen – Nutzdaten – CRC16

Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.

Der STM32 wertet eine Botschaft erst dann aus, wenn das Startzeichen, die Länge, die CRC16-Prüfung und der Wertebereich gültig sind. Dadurch wird verhindert, dass fehlerhafte oder unvollständige Botschaften direkt in die Steuerung übernommen werden.

Die in der Tabelle angegebenen Startzeichen 0x50 bis 0x58 sind direkte Programmiervorgaben. Sie dürfen nach der Übernahme nicht umsortiert oder anders belegt werden, weil der STM32 die Bedeutung der Nutzdaten ausschließlich über das Startzeichen erkennt.

Inhalt und Aufteilung

Die Botschaften sind in der Tabelle thematisch gegliedert. Erweiterungen sind allerdings unabhängig der thematischen Zuordnung lediglich durch Anhängen in der Tabelle möglich. Für alles andere wäre der Programmieraufwand zu hoch und zu fehleranfällig.

Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe.

Die Bezugswassertemperatur 1. BG wird mit Startzeichen 0x50 übertragen. Sie wird als Integerwert in 1/10 °C übermittelt. Dabei wird der Temperaturbereich von 30 bis 98 °C mit dem Wertebereich 300 bis 980 dargestellt.

Die Bezugsmenge 1. BG wird mit Startzeichen 0x51 übertragen. Sie wird als Integerwert in 1/10 ml beziehungsweise 1/10 g übermittelt. Dabei wird der Bereich von 20 bis 300 g beziehungsweise ml mit dem Wertebereich 200 bis 3000 dargestellt.

Die Bezugszeit 1. BG wird mit Startzeichen 0x52 übertragen. Sie wird als Integerwert in 1/10 Sekunde übermittelt. Dabei wird der Zeitbereich von 0 bis 120 Sekunden mit dem Wertebereich 0 bis 1200 dargestellt.

Die Preinfusionszeit 1. BG wird mit Startzeichen 0x53 übertragen. Sie wird als Integerwert in 1/10 Sekunde übermittelt. Dabei wird der Zeitbereich von 0 bis 120 Sekunden mit dem Wertebereich 0 bis 1200 dargestellt.

Zusätzlich werden allgemeine Sollwerte und Funktionsparameter übertragen. Die Abschalttemperatur der Entschichtung wird mit Startzeichen 0x54 übertragen. Sie wird als Integerwert in °C übermittelt und beschreibt den Bereich 90 bis 98 °C.

Die Grenztemperatur wird mit Startzeichen 0x55 übertragen. Sie wird als Integerwert in °C übermittelt und beschreibt den Bereich 135 bis 150 °C. Der Sollwert Boilerdruck wird mit Startzeichen 0x56 übertragen. Er wird als Integerwert in 10 mbar übermittelt. Dabei wird der Druckbereich von 1100 bis 1500 mbar mit dem Wertebereich 110 bis 150 dargestellt.

Die Stellung Vertikalhebel 1. BG wird mit Startzeichen 0x57 übertragen. Sie wird als Integerwert in Grad übermittelt und beschreibt den Bereich 0 bis 180 Grad.

Die Maschinenstatus-Bytes werden mit Startzeichen 0x58 vom Display der 1. BG übertragen. Zustände und Befehle werden in der Maschinenstatus-Botschaft bitweise interpretiert. Die Maschinenstatus-Botschaft besitzt wie alle Display-Botschaften einen Nutzdatenbereich von 32 Bit. Davon werden 24 Bit als verbindlicher Maschinenstatus verwendet. Diese 24 Bit entsprechen den drei definierten Maschinenstatus-Bytes auf dem STM32. Die verbleibenden 8 Bit sind reserviert und werden aktuell nicht ausgewertet.

Brühgruppenspezifische Befehle müssen eindeutig der betreffenden Brühgruppe zugeordnet werden. Handhebelmodus, Spülung und Rückspülung dürfen deshalb nicht als allgemeiner Maschinenzustand ohne Brühgruppenbezug interpretiert werden.

Die aktuell definierten Display-Botschaften beziehen sich auf das Display der 1. BG. Für ein Display der 2. BG sind weitere Token- und Botschaftsdefinitionen einzuführen.

Der STM32 wertet eine Botschaft erst dann aus, wenn die Länge und die CRC16-Prüfung gültig sind. Dadurch wird verhindert, dass fehlerhafte oder unvollständige Botschaften direkt in die Steuerung übernommen werden.

Botschaften vom Display der 1. BG zum STM32

Botschaften vom Display der 1. BG zum STM32
Startzeichen Bits Beschreibung Wertebereich Anmerkung
0x50 32 Bezugswassertemperatur 1. BG 30 - 98 °C Integerwert in 1/10 °C, damit Wertebereich 300 bis 980
0x51 32 Bezugsmenge 1. BG 20 - 300 g bzw. ml Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000
0x52 32 Bezugszeit 1. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
0x53 32 Preinfusionszeit 1. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
0x54 32 Abschalttemperatur Entschichtung 90 - 98 °C Integerwert in °C
0x55 32 Grenztemperatur 135 - 150 °C Integerwert in °C
0x56 32 Sollwert Boilerdruck 1100 - 1500 mbar Integerwert in 10 mbar, damit Wertebereich 110 bis 150
0x57 32 Stellung Vertikalhebel 1. BG 0 -180 Grad Integerwert in Grad
0x58 32 Maschinenstatus Bytes
Maschinenstatus Byte 1
0 Mischerstatus 1. BG 0/1 True = Mischtemperatur erreicht
1 Mischerstatus 2. BG 0/1 True = Mischtemperatur erreicht
2 Entschichtung 0/1 True = aktiv
3 Handhebelmodus 1.BG 0/1 True = aktiv
4 Handhebelmodus 2.BG 0/1 True = aktiv
5 Spülung 1.BG 0/1 True = aktiv
6 Spülung 2.BG 0/1 True = aktiv
7 Rückspülung 1.BG 0/1 True = aktiv
Maschinenstatus Byte 2
0 Rückspülung 2.BG 0/1 True = aktiv
1 Schrittmotor Dosierventil Flag 1. BG 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
2 Schrittmotor Dosierventil Flag 2. BG 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
3 Kaffeebezug 1. BG 0/1 True = aktiv
4 Kaffeebezug 2. BG 0/1 True = aktiv
5 Teewasserbezug 0/1 True = aktiv
6 Dampfbezug 0/1 Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck
7 Boilerbefüllung (Befüllungsflag) 0/1 True = Boilerbefüllung aktiv
Maschinenstatus Byte 3
0 Aufheizen 0/1 True = Aufheizphase, False = Betriebsbereit
1 Systemstart 0/1 True = Systemstart
2 Sicherheitsfunktion 0/1 True = Sicherheitsfunktion aktiv
3 Wartungsmodus 0/1 True = aktiv
4 CRC-Fehler Maschinensimulator 0/1 True = aktiv
5 CRC-Fehler Display 0/1 True = aktiv
6 Entleerung 0/1 True = aktiv
7

Armin Rohnen, 31.05.2026, UART-Tester

Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.

Von dem jeweiligen Tester wird die UART (TxD ist darauf gekennzeichnet) mit der zu UART der testenden MCU verbunden. Dabei wird TxD des Testers an RxD der zu testenden MCU und RxD des Testers mit TxD überkreuz verbunden. Zusätzlich ist von der zu testenden MCU die 5 V Versorgung des Testers herzustellen.

Wenn alle verbindungen gesteckt sind, wird die zu testende MCU per USB an einen PC verbunden. Die MCU auf dem Tester starten dann sofort, wartet 10 Sekunden und sendet dann als erstes das Steuerzeichen "0x0A". Wenn dieses von der zu testenden MCU mit dem Zeichen "0x0B" beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.

Display-MCU UART-Tester

Ist die UART-Verbindung durch Rücksendung des Bytes "0x0B" hergestellt werden zunächst die in der Datei "startprozedur.csv" abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.

Danach werden je Sekunde 4 Stück 19 Byte lange Token gesendet. Entsprechend Tokendefinition vom 27.05.2026 vorliegenden Definition ist dieser Token in 2 Byte (16 Bit) und 1 Byte (8 Bit) Segmente unterteilt. Die Werte der einzelnen Byte werden über einen Zufallsgenerator erzeugt und entsprechen nicht den zu erwartenden Wertebereichen.

Maschinensimulator-MCU UART-Tester

Ist die UART-Verbindung durch Rücksendung des Bytes "0x0B" hergestellt werden je Sekunde 4 Stück 77 Byte lange Token gesendet. Entsprechend Tokendefinition vom 27.05.2026 vorliegenden Definition ist dieser Token in 2 Byte (16 Bit) und 1 Byte (8 Bit) Segmente unterteilt. Die Werte der einzelnen Byte werden über einen Zufallsgenerator erzeugt und entsprechen nicht den zu erwartenden Wertebereichen.

Peter Vogginger, 18.12.2025
Setter und Getter für Bits und Bytes

Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines Bits auf 0.

set_bit

Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 << bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit zuverlässig auf den Wert 1 gesetzt.

clear_bit

Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.

get_bit

Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls Setter und Getter verwendet.

sync_bit

Das Synchronisieren eines Bits (siehe linke Grafik in Abbildung 5) erfolgt, indem zunächst das entsprechende Bit aus dem Token ausgelesen und mit dem gemessenen Zustand verglichen wird. Stimmen beide Werte nicht überein, wird das Bit im Token entsprechend dem gemessenen Zustand gesetzt oder gelöscht. Ist der Wert bereits identisch, erfolgt keine Änderung. Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.

set_bytes

Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im Bytearray gespeichert.

Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger dieselbe Endianess verwenden, sonst entstehen falsche Werte.

get_bytes

Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er zuvor gespeichert wurde.

get_signed_bytes

Das Auslesen eines vorzeichenbehafteten 16-Bit-Wertes (siehe mittlere Grafik in der Abbildung 5) erfolgt, indem zunächst zwei aufeinanderfolgende Bytes aus dem Token entnommen und zu einem 16-Bit-Ganzzahlwert zusammengesetzt werden. Hierzu wird das höherwertige Byte um acht Bit nach links verschoben und anschließend mit dem niederwertigen Byte logisch verknüpft.

Anschließend wird geprüft, ob das höchstwertige Bit (Bit 15) gesetzt ist. Dieses Bit stellt im Zweierkomplement das Vorzeichenbit dar. Ist es gesetzt, wird vom berechneten Wert 2^16 (0x10000) subtrahiert, um die korrekte negative Ganzzahl zu erhalten. Auf diese Weise wird ein im Token gespeicherter 16-Bit-Wert unabhängig von seiner internen Byte-Darstellung korrekt als signed Integer interpretiert. Dieser aufwendige Code ist nötig, da in MicroPython die Anweisung int.from_bytes(two_bytes, 'big') keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.

set_signed_bytes

Das Speichern eines vorzeichenbehafteten 16-Bit-Wertes (siehe rechte Grafik in der Abbildung 5) erfolgt durch Zerlegung des Integerwertes in zwei einzelne Bytes. Hierzu wird zunächst das höherwertige Byte ermittelt, indem der Wert um acht Bit nach rechts verschoben wird. Durch anschließendes Maskieren mit 0xFF werden ausschließlich die unteren acht Bit übernommen. Dieses Byte wird an der angegebenen Startposition im Token gespeichert. Anschließend wird das niederwertige Byte bestimmt, indem der Wert direkt mit 0xFF maskiert wird. Auch hier werden nur die unteren acht Bit berücksichtigt. Dieses Byte wird an der darauffolgenden Position im Token abgelegt.


Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt.
Beispielaufruf: utils.set_bytes(token, ort, wert)

Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger
Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger
Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger
Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger

Armin Rohnen, 13.12.2025
Espressomaschinen-Kommunikations-Ring Timing

EKR Timing Diagramm, (c) Armin Rohnen
EKR Timing Diagramm, (c) Armin Rohnen

Das Timing des Espressomaschinen-Kommunikations-Rings erfolgt durch die Taktung des ADCs der Messwertplatine. Dieser kann mit einer maximalen Abtastrate von 860 SPS (Samples per Second) betrieben werden. Da jeder 1. Messwert verworfen werden muss und insgesamt 8 Messkanäle berücksichtigt werden müssen, beträgt die effektive Abtastrate 53,75 Hz bzw. alle 18,6 ms steht damit ein neuer Messwertdatensatz zur Verfügung und es wird der Token an die Basisplatine (bas) gesendet. Nach aktuellem Stand (12. Dezember 2025) besteht der Token aus 74 Bytes, was 740 Transferbits ergibt und mit der definierten Transferrate von 230.400 Baud eine Übertragungszeit von 3,2 ms erfordert.

Der Kommunikationsring ist mit der Abfolge - Messwertplatine -> Basisplatine -> SSR-Platine -> Displayplatine -> (Maschinensimulator) -> Messwertplatine definiert. Außer auf der Messwertplatine wird jeweils der Token empfangen, danach die erforderlichen Programmcodes ausgeführt und Änderungen am Token vorgenommen um ihn abschließend an die nächste Platine weiter zu senden. Bei Einstellvorgängen des Dosierventils auf der SSR-Platine wird dies so nicht funktionieren, da die Verstellung des Schrittmotors zu lange dauern wird.

Wird die Kommunikation so wie beschrieben separat betrachtet, dann summiert sich die Transferzeit auf 12,8 ms (bzw. 16 ms mit eingebundenen Maschinensimulator) bis dass der dann mit Änderungen versehene Token wieder an der Messwertplatine angekommen ist. Alle 18,6 ms sendet bei höchster Abtastrate die Messwertplatine den Token erneut. Damit keine Informationen verloren gehen, bleiben insgesamt 5,8 ms Rechenzeit für alle im Ring befindlichen Platinen übrig. Die Messwertplatine fügt aus diesem Grund die Messwerte erst direkt vor dem Senden des Tokens darin ein.

Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.

Eine Reduzierung auf die Abtastrate 475 SPS würde den Token-Aktualisierungstakt auf 33,7 ms (29,7 Hz) erhöhen. Da die kummulierte Übertragungszeit mit 12,8 ms gleich bleibt, ergäbe sich dann eine Restrechenzeit von 20,9 ms. Da der aktualisierte Token, in dem die Messwertplatine wieder Änderungen einfügen darf, dann erst nach dem 3. Messwert eintrifft, ist weiterhin eine Zwischenspeicherung der erfassten Messdaten erforderlich.

Armin Rohnen, 30.11.2025
Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine

Über die Messwertplatine wird der Kommunikationsstart realisiert. Damit dies nicht direkt beim Einschalten erfolgt ist der zugehörige Code in der Datei main_mwp.py abgelegt. Wird diese Datei ausgeführt, dann startet die Kommunikation zwischen den Platinen und im Weiteren erfolgt der Maschinenstart.

Aktuell müssen die Variablen UART_TimeOut, token und uart global definiert werden. Werden diese zu einem späteren Zeitpunkt in main.py initialisiert, dann sind diese automatisch global.

Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird "0x0A" eingetragen. Sollte es sich ergeben, dass die Tokendefinition noch zu weiteren Bytes führt, dann ist dies an den entsprechenden Stellen der main.py auf den Platinen einzutragen.

Im weiteren Ablauf wird die uart-Schnittstelle initialisiert. In der Datei uart_lib.py ist die Klassendefinition des UARTHandler hinterlegt. Diese konfiguriert die uart-Schnittstelle. Im Konstruktor der Klasse ist hinterlegt, dass per UART.IRQ_RXIDLE auf eingehende Daten an der uart-Schnittstelle ragiert wird. Es wird als erstes die Methode _uart_rx_handler aufgerufen, welche sich innerhalb der Klasse befindet. Darin werden lediglich die Daten eingelsen und auf die Methode on_receive weiterverwiesen. Die Methode on_receive ist in allen Realisierungen gleich und prüft auf empfangene Datenlänge und auf das gültige Startzeichen. Danach wird auf die Methode local_receive weitergeleitet.

Die Methode uart.local_receive aus der Klassendefinition wird durch uart.local_receive = mwp_receive_handler mit der in main_mwp.py befindlichen Funktion ersetzt. Da der zu erwartende Token eingegangen ist, wird als erstes die UART-TimeOut-Funktion deaktiviert. Es wird geprüft, ob die Sicherheitsfunktion aufgerufen werden muss oder ob der Token abgearbeitet werden kann. Handelt es sich bei dem empfangenen Token um den ersten Token, werden aktuell das Default-Kaffeerezept und die Betriebsparameter in den Token eingetragen. Es wid eine Byte-Positionsliste erstellt, an die die Messwerte im Token eingetragen werden sollen und es wird der ADS1115 gestartet, welcher danach das Senden des Token takten wird.

In der Datei mwp_messwerte.py ist die Klassendefinition des ADS1115MuxSampler angelegt. Das ist die Umsetzung als Klassendefinition der bisherigen Messdatenerfassung. Der Konstruktor benötigt den Token, eine Positionslsite für die Byte-Nr. der Messwerte im Token (token_pos_list), das UART-Schnittstellenobjekt, die PIN-Nr über den der ADC-IRQ (irq_pin_nr) eingeht und die Kennziffer für die Abtastrate (smple_rate) des ADCs.
Wenn der ADC gestartet ist, wird nach jedem erfolgten Sampling der Messwert durch die Methode _sample abgeholt. Es wird lediglich jeder zweite Messwert verwendet, da sich in der Wandlung des ersten Messwerts die Umstellung des Multiplexers befindet und der Messwert damit nicht korrekt sein kann. Gültige Messwerte werden als 2 Bytes im Token an der zugehörigen Position abgelegt und danach wird der nächste Messkanal am Multiplexer eingestellt. Ist der achte Messwert erfasst, wird der Token gesendet und die Abarbeitung startet wieder neu.

Damit der Token über die im Verbund befindlichen Platinen durchgereicht wird existiert ein allgemeingültiges main.py und eine allgemeingültige uart_lib.py. In main.py muss die jeweils gültige Länge des Tokens inkl. aller Sonderbyts wie Startzeichen und Checksumme hinterlegt sein, sonst erfolgt keine Weiterleitung des Token. In der uart_lib.py wird aktuell der Token um 0,1 Sekunde verzägert weiter gesendet. Das ist zum Testen über den ADC-TAkt zu löschen.

Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation

Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien "boot.py" und "main.py" abgearbeitet. In "boot.py" befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In "main.py" befindet sich die Initialisierung der jeweiligen Platine. Dieses Prgramm muss beendet werden und darf keine Endlosschleife enthalten. Die Steuerung des Ablaufes erfolgt über Interrupt-Service-Routinen (ISR) welche auf definierte Interrupts reagieren und jeweils den zugehörigen Programmcode ausführen.

Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen
Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen

Zur weiteren Funktionalität auf der Messwertplatine gehört mindestens die Erstellung des (Grund)Tokens und das erste Senden des Tokens. Wird ein Token empfangen bzw. werden Daten an der UART-Schnittstelle erkannt, erfolgt die Abarbeitung gemäß Abb. 2.

Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen
Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen

Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR "_uart_rx_handler" auf. Darin wird lediglich geprüft ob wirklich Daten am UART-RX eingegangen sind. Wenn ja, dann werden die Daten aus dem UART-Eingangspuffer ausgelesen und es wird "on_receive" zur weiteren Überprüfung des Tokens aufgerufen.
In "on_receive" wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein "local_receive" aufgerufen. Diese Methode der Klasse wird jeweils lokal mit der individuellen Token-Abarbeitung überschrieben. In der Token-Abarbeitung befindet sich üblich die Anweisung zum Senden des Tokens. Lediglich auf der Messwertplatine erfolgt das Senden des Tokens durch eine weitere ISR.
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.

Im "local_receive" der Messwertplatine ist die Überprüfung des ersten gesendeten Tokens enthalten. Ist dieser wieder auf der Messwertplatine eingetroffen, dann wird die Messwerterfassung gestartet und es wird mit der eingestellten Abtastrate des ADC die Alert IRS (Abb. 3) abgearbeitet, welche u.a. zu jedem vollen Messwertesatz einen neuen Token versendet.

Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen
Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen

Jeder eingehende Token am UART-RX der jeweiligen Platine lösst die Abarbeitung über die ISR aus. Solange Token im Umflauf sind, solange werden auf den einzelnen Platinen Funktionsabarbeitungen erfolgen. Getriggert wird das System durch die Abtastrate des ADCs auf der Messwertplatine. Endlosschleifen in "main.py" und/oder den ISR stören diesen Ablauf und dürfen daher nicht verwendet werden. Allerdings sind Endlosschleifen icht erforderlich, da dies über den im Umlauf befindlichen Token erfolgt.

Peter Vogginger, 10.11.2025 - Aufgabenanalyse

Aktuell werden die Messwerte von jeder Platine eigenständig an die MATLAB®-GUI versendet. Diese visualisiert und verarbeitet die Messwerte. Die erforderlichen Stellgrößen werden wiederum auf den Platinen in Abhängigkeit der MATLAB®-GUI eingestellt.

In Zukunft soll die Kommunikation unter den MCUs erfolgen. Die Steuerung soll über die Maschinensteuerung erfolgen. Es wird weiterhin eine MATLAB®-GUI (im folgenden MATLAB®-Wartungsapp genannt) geben, diese dient jedoch lediglich für Wartungs- und Versuchszwecke. Die Aufgabe besteht darin, eine robuste und schnelle Kommunikation aufzubauen und diese anschließend auf allen MCUs zu implementieren.

In die Auflistung der miteinander kommunizierenden Steuergeräte ist ein Touch-Display und optional ein Maschinensimulator mit aufzunehmen. Dadurch ergeben sich fünf Platinen, die im ständigen Austausch miteinander stehen: Messwertplatine, SSR-Platine, Basisplatine, Display-Platine und Maschinensimulator.

Zur Fehleranalyse und Erprobung sollen weiterhin alle Messwerte in der Kommunikation enthalten sein, um die MATLAB®-Wartungsapp an die Display-Platine anschließen zu können und mittels Logging alle Daten darauf zu visualisieren. Angelehnt an das 1984 von IBM eingeführte Token Ring Network soll eine „im Kreis laufende“ Kommunikation aufgebaut werden.

Hardware-Aufbau

Die Verbindungen werden hardwareseitig durch den UART der MCUs hergestellt. Die UART Sendeleitung Tx einer MCU wird mit der Empfangsleitung Rx der nächsten MCU verbunden. Dies wird von Platine zu Platine in der Reihenfolge: Messwertplatine -> Basisplatine -> SSR-Platine -> Display-Platine -> Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.

Messwerte

Es gibt einen definierten Token. Jede Platine erneuert ihren Anteil des Tokens und entnimmt dem Token die benötigten Informationen (Messwerte). Was zuvor die MATLAB®-GUI durchgeführt hat, übernehmen nun die einzelnen Platinen. Dadurch ergibt sich unter den Platinen eine Aufgabenverteilung. Tabelle 1 zeigt eine Auflistung der Daten, die in den Datensatz des Tokens aufgenommen werden sollen. Jede nummerierte Position erhält einen Platz, je nach Bedarf an Größe. Der Token wird als Bytearray ausgeführt.

Token

Anzahl

Die Anzahl der im Kreis laufenden Tokens soll sich auf einen beschränken. Dieser wird erstmalig von der Messwertplatine erzeugt und anschließend „im Kreis“ gesendet, wobei jede MCU nur den für sie relevanten Teil liest bzw. auch umschreibt. Die Abtastrate des ADC (analog digital converter) gibt die Taktrate des Tokens vor. Durch die Wahl der ADC-Abtastrate wird daher die Kommunikationsgeschwindigkeit (Token/s) beeinflusst. Dieser ist der Flaschenhals und es ist eine langsame Steigerung der Taktrate vorzusehen, um mögliche Auswirkungen und Probleme in der Übertragung festzustellen.

Struktur

Am Anfang befindet sich ein Startzeichen, um die Art des Tokens (Standard-, Start- oder Paniktoken; siehe unten), festzulegen. Anschließend folgt ein Datensatz und danach eine Prüfsumme. Der Datensatz ist so auszuführen, dass dieser einfach erweitert werden kann, um Erweiterungen zu ermöglichen (z.B. 2. Brühgruppeneinheit). Im Weiteren ist der Token möglichst kurz auszuführen. Der Token soll über eine einheitliche Länge verfügen. Der Token wird als bytearray angelegt und auch so empfangen. (dateneingang = bytearray(readIn(UART))) Datensatz: Jedem Messwert wird ein Bereich von 2 Byte als fester Platz im Token zugewiesen.

Prüfsumme

Um die fehlerfreie Übertragung eines Tokens zu bestätigen, wird aus dem Datenblock des Tokens eine Prüfsumme gebildet und diese ans Ende des Tokens angehängt. Das verwendete Verfahren ist CRC-32.

Standardtoken

Es ist erkennbar über das Startzeichen am Anfang und wird genutzt für den regelmäßigen Datenaustausch zwischen den MCUs. Starttoken: Es ist erkennbar über das Startzeichen am Anfang. Hierbei wird beim Einschalten der Espressomaschine die Betriebsbereitschaft der gesamten Kommunikation geprüft. Sowohl ob die Hardwareverbindung intakt ist als auch ob alle MCUs empfangen und senden können. Es gilt zu klären, welche MCU dies aussendet.

Paniktoken

Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.

Fehlererkennung

Wird das Token nicht innerhalb einer definierten Zeitspanne wieder am Empfang einer MCU erkannt, festgelegt über einen timer-Funktion, soll am Display eine Fehlermeldung ausgegeben werden. Erkennt eine Platine einen Fehler (aufgrund Timeout), werden Magnetventile geschlossen (stromlos geschaltet), die Heizungen und die Pumpen werden abgeschaltet, der Wert des Dosierventils Kaltwasser wird gespeichert. Es ist ein Fehlerspeicher im Grundkonzept vorgesehen.

Token Definition

Tabelle 1: Tokeninhalt
Platine Byte-Nr Bits / Bit-Nr. Beschreibung Wertebereich Anmerkung
0 8 Bit Startzeichen 0x0A - Standardtoken
Messplatine 1,2 16 Bit Leitwert 0,2 - 20 S/cm 16 Bit im Token

dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.

Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.

Der Tassenwärmer existiert nur 1x je Machine

3,4 16 Bit Boilerdruck 0,5 - 4,5 V / 0 - 4 bar
5,6 16 Bit Brühgruppendruck (1. BG) 0,5 - 4,5 / 0 - 12 bar
7,8 16 Bit Brühgruppendruck (2. BG) 0,5 - 4,5 / 0 - 12 bar
9,10 16 Bit Wassereingangstemperatur

(ersatzweise Leitungsdruck)

11,12 16 Bit Boiler-NTC (1. BG) Kennlinie
13,14 16 Bit Boiler-NTC (2. BG) Kennlinie
15,16 16 Bit Tassenwärmer-NTC Kennlinie
17,18 16 Bit Mischtemperatur-NTC (1. BG) Kennlinie
19,20 16 Bit Mischtemperatur-NTC (2. BG) Kennlinie
21,22 16 Bit Brühgruppen-NTC (1. BG) Kennlinie
23,24 16 Bit Brühgruppen-NTC (2. BG) Kennlinie
25,26 16 Bit Boilerheizung (Soll, 1. BG) 8 Hz PWM 0 - 100 %
27,28 16 Bit Boilerheizung (Soll, 2. BG) 8 Hz PWM 0 - 100 %
29,20 16 Bit Tassenwärmerheizung (Soll) 8 Hz PWM 0 - 100 %
SSR-Platine 31,32 16 Bit Position Schrittmotor Dosierventil 1. BG 0 - 550
33,34 16 Bit Position Schrittmotor Dosierventil 2. BG 0 - 550
Basisplatine 35,36 16 Bit Verstellwert Schrittmotor Dosierventil 1. BG Integer mit Vorzeichen
37,38 16 Bit Verstellwert Schrittmotor Dosierventil 2. BG Integer mit Vorzeichen
39,40 16 Bit Pumpensollwert 1. BG 0 - 4096 entspricht 0 - 5000 mV bzw. 0 - 5000 U/min
41,42 16 Bit Pumpensollwert 2. BG 0 - 4096 entspricht 0 - 5000 mV bzw. 0 - 5000 U/min
43 8 Bit Durchflussrate 1. BG 0 - 25 ml/s Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250
44,45 16 Bit Durchflusscounts 1. BG 0 - 65535 je Count 1/39,9 ml, Überlauf muss unterbunden werden
46 8 Bit Durchflussrate 2. BG 0 - 25 ml/s Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250
47,48 16 Bit Durchflusscounts 2. BG 0 - 65535 je Count 1/39,9 ml, Überlauf muss unterbunden werden
49 Füllstandsbyte Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet

Füllstand Abtropfschale True verhindert Pumpenansteuerung Füllstand Boiler False verhindert Pumpenansteuerung

0 Füllstand Boiler 1. BG 0/1
1 Füllstand Boiler 2. BG 0/1
2 Füllstand Tank Minimum 0/1
3 Füllstand Tank Maximum 0/1
4 Füllstand Abtropfschale 0/1
5 0/1
6 0/1
7 0/1
50 Magnetventile Byte 1 Magnetventile Y101 bis Y113 gehören zur 1. BG

Y113 ist der Dampfhahn Y214 bis Y222 gehören zur 2. BG

0 Y101 0/1
1 Y102 0/1
2 Y103 0/1
3 Y104 0/1
4 Y105 0/1
5 Y106 0/1
6 Y107 0/1
7 Y108 0/1
51 Magnetventil Byte 2
0 Y109 0/1
1 Y110 0/1
2 Y111 0/1
3 Y112 0/1
4 Y113 0/1
5 Y214 0/1
6 Y215 0/1
7 Y216 0/1
52 Magnetventil Byte 3
0 Y217 0/1
1 Y218 0/1
2 Y219 0/1
3 Y220 0/1
4 Y221 0/1
5 Y222 0/1
6 0/1
7 0/1
Displayplatine 53,54 16 Bezugswassertemperatur 1. BG 30 - 98 °C Integerwert in 1/10 °C, damit Wertebereich 300 bis 980
55,56 16 Bezugswassertemperatur 2. BG 30 - 98 °C Integerwert in 1/10 °C, damit Wertebereich 300 bis 980
57,58 16 Bezugsmenge 1. BG 20 - 300 g bzw. ml Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000
59,60 16 Bezugsmenge 2. BG 20 - 300 g bzw. ml Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000
61,62 16 Bezugszeit 1. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
63,64 16 Bezugszeit 2. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
65,66 16 Preinfusionszeit 1. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
67,68 16 Preinfusionszeit 2. BG 0 - 120 Sekunden Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200
69 8 Abschalttemperatur Entschichtung 90 - 98 °C Integerwert in °C
70 8 Grenztemperatur 135 - 150 °C Integerwert in °C
71 8 Sollwert Boilerdruck 1100 - 1500 mbar Integerwert in 10 mbar, damit Wertebereich 110 bis 150
72 8 Stellung Vertikalhebel 0 - 180 Grad Integerwert
73 Maschinenstatus Byte 1
0 Mischerstatus 1. BG 0/1 True = Mischtemperatur erreicht
1 Mischerstatus 2. BG 0/1 True = Mischtemperatur erreicht
2 Entschichtung 0/1 True = Entschichtung aktiv
3 Handhebelmodus 0/1 True = aktiv
4 Rezepteingabe 0/1 True = aktiv
5 Wartungsmodus 0/1 True = aktiv
6 Schrittmotor Dosierventil Flag 0/1 True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)
7 0/1
74 Maschinenstatus Byte 2
0 Kaffeebezug 1. BG 0/1
1 Kaffeebezug 1. BG 0/1
2 Teewasserbezug 0/1
3 Dampfbezug 0/1 Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck
4 Boilerbefüllung (Befüllungsflag) 0/1 True = Boilerbefüllung aktiv
5 Aufheizen 0/1 True = Aufheizphase, False = Betriebsbereit
6 Systemstart 0/1 True = Systemstart
7 Sicherheitsfunktion 0/1 True = Sicherheitsfunktion aktiv

Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2

Kommunikation als Token-Ring oder in Stern-Topologie


Der Wechsel der Kommunikation von dem geplanten Token-Ring-Verfahren, hin zur Stern-Topologie erfordert 3 serielle Schnittstellen. Dies ist mit der aktuellen Konstellation, 4 MCUs (Basisplatine, SSR-Platine, Messplatine und Displayplatine) mit jeweils einem Raspberry Pi Pico RP2040, nicht möglich. An einem RP2040 stehen 2 serielle Schnittstellen zur Verfügung.

Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  

  • weniger Elektronik in der Peripherie
  • ADCs ausreichend am Board
  • DACs ausreichend am Board
  • 8 serielle Schnittstellen
  • viel mehr nutzbare PINs

Die Vielzahl an Anschlüssen bietet die Möglichkeit, von aktuell 3 Platinen (und 3 MCUs) auf 1 Platine mit einem MCU-Board zu reduzieren.

Allerdings bietet diese Umstellung nicht nur Vorteile.

Nachteilig wäre, dass bei jedem MicroPython Update ein eigenes Derivat erstellt werden müsste, da default die ADC auf 12-Bit Auflösung in MicroPython definiert sind. Aktuell existiert ein Derivat mit 16-Bit ADC Konfiguration (NUCLEO_H743ZI2_v1-27-0_ADC_16BIT.hex), dies basiert auf der MicroPython Version v1-27-0.

Allerdings ist die Verfügbarkeit von NUCLEO-Boards immer zeitweise nicht gegeben. Diesbezüglich wäre ein Platinenlayout inkl. den Bauelementen für MCU und der direkten Peripherie erforderlich. Was aber erst nach der Inbetriebnahme der beiden Prototypen-Maschinen sinnvoll erscheint. Die Kosten dieser externen Entwicklung werden auf 50 t€ bis 100 t€ geschätzt.

Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.

Armin Rohnen, 16.10.2025

Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden.

Die Kommunikation ist mit Sorgfalt zu programmieren. Durch Lesen und Schreiben auf die UART-Schnittstelle kann die MCU blockiert und dauerhaft an der Ausführung anderer Programmteile gehindert werden. Die Problematik ist in Abschnitt 3.13 der 2. Auflage MATLAB® meets MicroPython beschrieben.


Armin Rohnen, 11.04.2024

Armin Rohnen, Kommunikationskonzept mit Token
Armin Rohnen, Kommunikationskonzept mit Token

Seitens des Platinenlayouts für die Steuerungselektronik wurden die jeweiligen PINs der ersten UARTSchnittstelle für die spätere Inter-Kommunikation der Steuerung herausgelegt. Die Raspberry Pi Pico MCU verfügt über einen jeweils 32 Byte großen Eingangs- bzw. Ausgangspuffer für die UART-Schnittstelle. Dieser soll genutzt werden um die Kommunikation zu ermöglichen. Die jeweilige Kommunikation selbst wird dadurch auf diese 32 Byte begrenzt. Hardwareseitig ist es Denkbar, dass je MCU zwei weitere PINs für die Kommunikation verwendet werden. Lediglich auf der SSR-Platine ist dazu ein Eingriff ins Platinenlayout erforderlich. Dieser kann bei einem Prototypen handwerklich durchgeführt werden. Die zwei zusätzlichen PINs für die Kommunikation (GP04, GP05 auf der Basisplatine, GP03, GP04 auf der SSR-Platine, GP06, GP07 auf der Messplatine) fungieren als eingehender und ausgehender Interrupt, so dass die Kommunikation als ISR programmiert werden kann.

Angelehnt an das 1984 von IBM eingeführte Token Ring Network soll eine „im Kreis laufende“ Kommunikation aufgebaut werden. Ausgehend von der Messplatine wird ein Token über die einzelnen Platinen durchgereicht (Abbildung). Unter Berücksichtigung der Kommunikationsregeln können so eine beliebige Anzahl an Steuerungsplatinen in den Kommunikationsring eingebunden werden. Allerdings sollte dabei die Reihenfolge beachtet werden.

Die Messplatine sendet über UART am Ende jedes gültigen Messwertsatzes einen oder mehrere Token an die Basisplatine. In den Token befinden sich die aktuellen Messwerte und alle anderen „im Kreis laufende“ Daten. Beim ersten Senden werden hier u.u. 0-Werte verwendet, bis dass der erste Token wieder bei der Messplatine angekommen ist. Ggf. unterbricht die Messplatine auch das Senden des Token bzw. der ersten Token-Serie, bis zum ersten Eintreffen eines Tokens. Die Messplatine ist damit der Taktgeber der Kommunikation. Konkret erfolgt dies in Abhängigkeit der Abtastrate des AD-Wandlers.Wenn ein Token versendet ist, wechselt die Messplatine den Logikzustand des ausgehenden Interrupt-PINs. Bevor der nächste Token versendet wird, wird wieder der Ausgangslogikzustand des Interrupt-PINs hergestellt. Sobald die Messplatine auch einen Token empfangen hat wird auch der PWM-Stellwert für das Boilerheizelement (aus Regler Boilerdruck) und für den Tassenwärmer im Token übermittelt.

Von der Messplatine erhält die Basisplatine den Token. Die UART-Schnittstelle wird ausgelesen, wenn am eingehenden Interrupt-PIN der Logikzustand wechselt. Die Basisplatine tauscht im Token die Daten für die eigenen Messwerte, die Schaltzustände der Tasten, die Schaltzustände der Magnetventile usw. aus und sendet den Token an die SSR-Platine weiter. Ist der Token versendet, wechselt die Basisplatine den Logikzustand des ausgehenden Interrupt-PINs und arbeitet in gleicher Logik weiter wie die Messplatine.

Die SSR-Platine bekommt von der Basisplatine den Token durchgereicht. Die SSR-Platine wertet den Token lediglich aus, nimmt keine Veränderungen darin vor und reicht diesen dann weiter. Nach der SSR-Platine kann eine Display-Platine nachgeschaltet werden. Diese wertet die Informationen im Token aus und visualisiert diese bzw. stellt die Informationen über WLAN zur Verfügung. Im Falle eines Touch-Displays werden die Bytes für die Schaltzustände der Tasten ausgetauscht. Abschließend erhält die Messplatine wieder den Token und übernimmt die relevanten Informationen daraus in den neu zu sendenden Token.

Anstelle des eingehenden und ausgehenden Interrupt-PINs kann u.u. auch die MicroPython-Funktionalität uart.irq verwendet werden. Diese ruft eine ISR auf, sobald Daten im EIngangspuffer der UART-Schnittstelle eingegangen sind.

Das Konzept ist auszugestalten und der bzw. die Token sind exakt zu definieren. Dabei ist auch zu definieren (und zu erproben) wie die dann übergeordnete MATLAB®-GUI die Daten für die Visualisierung erhält. Der einzelne Token darf aufgrund der Limitierung durch den UART-Puffer des Raspberry Pi Picos 32 Byte nicht überschreiten. Als maximale Datenrate sind 115200 Baud möglich, was unter Berücksichtigung von START / STOP-Bits und Paritätsbit eine maximale Kommunikationsrate von 11520 Byte je Sekunde ergibt. Damit wären 360 jeweils 32 Byte lange Token in der Kommunikation möglich. Nach aktuellem Stand der Recherchen überschreitet die Datenmenge für die Kommunikation die 32 Byte Grenze, so dass mit mehreren Token gearbeitet werden muss. Jeder Token weist im ersten Byte eine Token-Nr auf, so dass der Token zweifelsfrei identifiziert werden kann. Alle Token müssen die gleiche Länge in Bytes aufweisen. Für zukünftige Erweiterungen sind Leer-Bytes in den Token vorhanden. Jeder der 4 Token muss die gleiche Länge in Bytes aufweisen.

Getaktet wird die Kommunikation durch die Datenerfassung der Messplatine. Aufgrund der jeweils ungültigen ersten Wandlung eines Messkanals ist eine maximale Abtastrate von 430 Messwerten je Sekunde aufgeteilt auf acht Messkanäle, was ca. 53 Datensätze je Sekunde ergibt. Bei einer Abtastrate von 475 SPS ergeben sich 30 gültige Messdatensätze je Sekunde.Wird nach jedem zweiten gültigen Messkanal ein 27 Byte langer Token von der Messplatine gesendet, dann ergibt dies eine Inter-Kommunikation zwischen den MCUs von 120 Token bzw. 3240 Byte je Sekunde, was unter der als Maximum angesehenen Datenrate liegt. Selbst bei einer Verlängerung der Token auf 32 Byte würde lediglich 1/3 des theoretisch möglichen Datentransfers durchgeführt.