<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Armin+Rohnen</id>
	<title>Technische Beeinflussbarkeit der Geschmacksache Kaffee - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Armin+Rohnen"/>
	<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Spezial:Beitr%C3%A4ge/Armin_Rohnen"/>
	<updated>2026-06-15T10:24:16Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4986</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4986"/>
		<updated>2026-06-13T12:25:59Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Botschaften vom Display der 1. BG zum STM32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
Zur Initialisierung der UART-Kommunikation sendet der 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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
Es folgen die Pumpen und durchflussbezogenen 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1. BG (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1. BG (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4985</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4985"/>
		<updated>2026-06-13T12:24:39Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Haupttoken von STM32 zu Display-MCU 1. BG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
Zur Initialisierung der UART-Kommunikation sendet der 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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
Es folgen die Pumpen und durchflussbezogenen 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1. BG (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1. BG (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4983</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4983"/>
		<updated>2026-06-13T12:22:22Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Botschaften von Wartungs-APP zu STM32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1. BG (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|CRC16-Bytes&lt;br /&gt;
|0/1&lt;br /&gt;
|Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22,23&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4982</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4982"/>
		<updated>2026-06-13T12:21:34Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Botschaften von Wartungs-APP zu STM32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1. BG (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2. BG (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|CRC16-Bytes&lt;br /&gt;
|0/1&lt;br /&gt;
|Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22,23&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4981</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4981"/>
		<updated>2026-06-13T12:19:33Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Haupttoken von STM32 zu Maschinensimulator-MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|9&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|10&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|11&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|12&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|13&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|14&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|15&lt;br /&gt;
|Boilerbefüllung  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|16&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|17&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|18&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|19&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|20&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|21&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|22&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|CRC16-Bytes&lt;br /&gt;
|0/1&lt;br /&gt;
|Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22,23&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4980</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4980"/>
		<updated>2026-06-13T12:18:06Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Haupttoken von STM32 zu Display-MCU 1. BG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|9&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|10&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|11&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|12&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|13&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|14&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|15&lt;br /&gt;
|Boilerbefüllung  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|16&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|17&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|18&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|19&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|20&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|21&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|22&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|CRC16-Bytes&lt;br /&gt;
|0/1&lt;br /&gt;
|Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22,23&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4979</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4979"/>
		<updated>2026-06-13T12:14:02Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Botschaften von Wartungs-APP zu STM32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30 - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|9&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|10&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|11&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|12&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|13&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|14&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|15&lt;br /&gt;
|Boilerbefüllung  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|16&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|17&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|18&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|19&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|20&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|21&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|22&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Counter&lt;br /&gt;
|&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|CRC16-Bytes&lt;br /&gt;
|0/1&lt;br /&gt;
|Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22,23&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4978</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4978"/>
		<updated>2026-06-13T12:03:06Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Haupttoken von STM32 zu Maschinensimulator-MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|71&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|72&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|73,74&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135  - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer  mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer  mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0  -4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20  - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0  -4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20  - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|9&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|10&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|11&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|12&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|13&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|14&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|15&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|16&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|17&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|18&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|19&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|20&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|21&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|9&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|10&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|11&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|12&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|13&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|14&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|15&lt;br /&gt;
|Boilerbefüllung  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|16&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|17&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|18&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|19&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|20&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|21&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|22&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Counter&lt;br /&gt;
|&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|CRC16-Bytes&lt;br /&gt;
|0/1&lt;br /&gt;
|Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22,23&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4977</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4977"/>
		<updated>2026-06-13T12:01:57Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Haupttoken von STM32 zu Maschinensimulator-MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Anschließend wird der Sollwert des Boilerdrucks als Integerwert im Bereich von 110 bis 150 angegeben, welcher 1100 bis 1500 mbar entspricht.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel der ersten und der zweiten Brühgruppe ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck  2.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 1. BG&lt;br /&gt;
| 0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Leitungsdruck 2. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Spannungsteiler von 0,5 bis 4,5 V, 0  - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0  … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15,16&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|17,18&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|19,20&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|21,22&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|23,24&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (1.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|25,26&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC  (2.BG)&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie  für 0 … 5 V&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 1.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|8&lt;br /&gt;
|Boilerheizung  (Soll, 2.BG)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|8&lt;br /&gt;
|Tassenwärmerheizung  (Soll)&lt;br /&gt;
|0 - 100%  PWM&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30,31&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (1.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32,33&lt;br /&gt;
|16&lt;br /&gt;
|Position  Schrittmotor Dosierventil (2.BG)&lt;br /&gt;
|0 - 550&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|34,35&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (1.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|36,37&lt;br /&gt;
|16&lt;br /&gt;
|Verstellwert  Schrittmotor (2.BG)&lt;br /&gt;
|signed  int&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|38,39&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (1.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|40,41&lt;br /&gt;
|16&lt;br /&gt;
|Pumpensollwert  (2.BG)&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht  0 - 5000 mV&lt;br /&gt;
|-&lt;br /&gt;
|42&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (1.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate  (2.BG)&lt;br /&gt;
|0 - 25  ml/s&lt;br /&gt;
|1/10  ml/s&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (1.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|46,47&lt;br /&gt;
|16&lt;br /&gt;
|Durchflusscounts  (2.BG)&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|1  Count ≈ 1/39,9 ml&lt;br /&gt;
|-&lt;br /&gt;
|48&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand  Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand  Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand  Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand  Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand  Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|49&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 1&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | - Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
- Y113 ist der Dampfhahn &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|50&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 2&lt;br /&gt;
| -&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |Y214 bis Y222 gehören zur 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventile  Byte 3&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|52,53&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|54,55&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  1.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|56,57&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|58,59&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge  2.BG&lt;br /&gt;
|20 - 300g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|60,61&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  1.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|62,63&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit  2.BG&lt;br /&gt;
|0 - 120  s&lt;br /&gt;
|Integerwert  ×10&lt;br /&gt;
|-&lt;br /&gt;
|64&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur&lt;br /&gt;
|90 - 98  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|65&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150  °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|66&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert  Boilerdruck&lt;br /&gt;
|110 - 150&lt;br /&gt;
|×10  mbar&lt;br /&gt;
|-&lt;br /&gt;
|67&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|68&lt;br /&gt;
|8&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0 - 180°&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Maschinen-Counter&lt;br /&gt;
|0 - 255&lt;br /&gt;
|siehe  Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 1.BG  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|70&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung 2.BG  (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|71,72&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes &lt;br /&gt;
|&lt;br /&gt;
|Empfehlung  Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC)  Polynomial Selection For Embedded Networks &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nach dem Startzeichen folgt ein Nutzdatenbereich mit 32 Bit, also 4 Byte. Dabei werden die Daten von vorne beginnend definiert. Am Ende stehen zwei Byte mit dem CRC16-Verfahren. Damit besitzen alle Botschaften denselben Grundaufbau:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startzeichen&#039;&#039; – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können.&lt;br /&gt;
&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die Botschaften sind für 2 Brühgruppen vordefiniert.&lt;br /&gt;
&lt;br /&gt;
Generell können ausgehend von den ermittelten Reglerparameter in [114] 255 weitere umliegende Parameterwerte über die Wartungs-App eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Danach kommen die Einstellungen für die Mischtemperatur.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin werden die Stellungen der Vertikalhebel ebenfalls als Integerwert zwischen 0 und 180 angegeben.&lt;br /&gt;
&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|-&lt;br /&gt;
|0x23&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur  Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in  °C&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135  - 150 °C&lt;br /&gt;
|Integerwert  in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x25&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Proportionalregelparameter &lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x27&lt;br /&gt;
|32&lt;br /&gt;
|Boilerdruckregelung  Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|0x29&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|-&lt;br /&gt;
|0x2A&lt;br /&gt;
|32&lt;br /&gt;
|Boilerfolgeregelung  Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2B&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 1. BG&lt;br /&gt;
|Integer  mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  1. BG &lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x2D&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2E&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x2F&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|32&lt;br /&gt;
|Verstellwert  Schrittmotor Dosierventil 2. BG&lt;br /&gt;
|Integer  mit Vorzeichen&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x31&lt;br /&gt;
|32&lt;br /&gt;
|Bezugswassertemperatur  2. BG &lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in  1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
|0x32&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x33&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|32&lt;br /&gt;
|Mischtemperaturregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x35&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  1. BG&lt;br /&gt;
|0  -4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 -  5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x36&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  1. BG&lt;br /&gt;
|20  - 300 g bzw. ml&lt;br /&gt;
|Integerwert in  1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x37&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  1.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x3A&lt;br /&gt;
|32&lt;br /&gt;
|Pumpensollwert  2. BG&lt;br /&gt;
|0  -4096&lt;br /&gt;
|entspricht  0 - 5000 mV bzw. 0 - 5000 U/min &lt;br /&gt;
|-&lt;br /&gt;
|0x3B&lt;br /&gt;
|32&lt;br /&gt;
|Bezugsmenge  2. BG&lt;br /&gt;
|20  - 300 g bzw. ml&lt;br /&gt;
|Integerwert  in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Proportionalregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3D&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Integralregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3E&lt;br /&gt;
|32&lt;br /&gt;
|Durchflussregelung  2.BG Differentialregelparameter&lt;br /&gt;
|0-255&lt;br /&gt;
|255  Verstellmöglichketien&lt;br /&gt;
|-&lt;br /&gt;
|0x3F&lt;br /&gt;
|32&lt;br /&gt;
|Magnetventile&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y101&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y101 bis Y113 1. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y102&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y103&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y105&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y106&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y107&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Y109&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |Magnetventile  Y214 bis Y222 2. BG&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|9&lt;br /&gt;
|Y110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|10&lt;br /&gt;
|Y111&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|11&lt;br /&gt;
|Y112&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|12&lt;br /&gt;
|Y113&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|13&lt;br /&gt;
|Y214&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|14&lt;br /&gt;
|Y215&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|15&lt;br /&gt;
|Y216&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|16&lt;br /&gt;
|Y217&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;8&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|17&lt;br /&gt;
|Y218&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|18&lt;br /&gt;
|Y219&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|19&lt;br /&gt;
|Y220&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|20&lt;br /&gt;
|Y221&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|21&lt;br /&gt;
|Y222&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x41&lt;br /&gt;
|32&lt;br /&gt;
|Bezugszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x42&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  1. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x43&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit  2. BG&lt;br /&gt;
|0  - 120 Sekunden&lt;br /&gt;
|Integerwert  in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x44&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 1&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x45&lt;br /&gt;
|32&lt;br /&gt;
|Stellung  Vertikalhebel 2&lt;br /&gt;
|0  -180 Grad&lt;br /&gt;
|Integerwert  in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x46&lt;br /&gt;
|32&lt;br /&gt;
|Tassenwärmer  Soll&lt;br /&gt;
|PWM  0 - 100 %&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x47&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus  Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus  1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus  2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Entschichtung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung  1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|8&lt;br /&gt;
|Rückspülung  2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|9&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|10&lt;br /&gt;
|Schrittmotor  Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position  erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|11&lt;br /&gt;
|Kaffeebezug  1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|12&lt;br /&gt;
|Kaffeebezug  2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|13&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|14&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt  200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|15&lt;br /&gt;
|Boilerbefüllung  (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus  Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|16&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|17&lt;br /&gt;
|Systemstart &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Systemstart &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|18&lt;br /&gt;
|Sicherheitsfunktion &lt;br /&gt;
|0/1&lt;br /&gt;
|True  = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|19&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|20&lt;br /&gt;
|CRC-Fehler  Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|21&lt;br /&gt;
|CRC-Fehler  Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True  = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|22&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Daraufhin kommt der Maschinen-Counter, der einen präzisen Zustand des Systemstarts und der Funktionsprogramme beschreibt.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Umgang mit CRC-Fehler ist nicht definiert.&lt;br /&gt;
&lt;br /&gt;
== Erklärung der Tokentabelle ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|-&lt;br /&gt;
|5,6&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppendruck 1.BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
|7,8&lt;br /&gt;
|16&lt;br /&gt;
|Boiler-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|9,10&lt;br /&gt;
|16&lt;br /&gt;
|Tassenwärmer-NTC&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|11,12&lt;br /&gt;
|16&lt;br /&gt;
|Mischtemperatur 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|13,14&lt;br /&gt;
|16&lt;br /&gt;
|Brühgruppen-NTC 1. BG&lt;br /&gt;
|0 - 3,3 V&lt;br /&gt;
|Kennlinie für 0… 5 V&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|8&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0–25 ml/s&lt;br /&gt;
|1/10 ml/s&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|&lt;br /&gt;
|Füllstandbyte&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Füllstand Boiler 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Füllstand Boiler 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Füllstand Tank Minimum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Füllstand Tank Maximum&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Füllstand Abtropfschale&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|8&lt;br /&gt;
|Counter&lt;br /&gt;
|&lt;br /&gt;
|siehe Startprozedur Flowchart&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug &lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag) &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv &lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen &lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|CRC16-Bytes&lt;br /&gt;
|0/1&lt;br /&gt;
|Empfehlung Generator Polynom:0xBAAD nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22,23&lt;br /&gt;
|16&lt;br /&gt;
|CRC16-Bytes 0xAC9A&lt;br /&gt;
|&lt;br /&gt;
|nach Tabelle 3 in Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Struktur ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
Startzeichen – Nutzdaten – CRC16&lt;br /&gt;
&lt;br /&gt;
Die Bedeutung der Nutzdaten ergibt sich aus dem Startzeichen. Dadurch bleibt die Grundstruktur gleich, obwohl unterschiedliche Inhalte übertragen werden können. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
== Inhalt und Aufteilung ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Die aktuell übertragenen Botschaften des Displays der 1. BG beziehen sich auf die 1. Brühgruppe. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x53&lt;br /&gt;
|32&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|32&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x55&lt;br /&gt;
|32&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|0x56&lt;br /&gt;
|32&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150 &lt;br /&gt;
|-&lt;br /&gt;
|0x57&lt;br /&gt;
|32&lt;br /&gt;
|Stellung Vertikalhebel 1. BG&lt;br /&gt;
|0 -180 Grad&lt;br /&gt;
|Integerwert in Grad&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|32&lt;br /&gt;
|Maschinenstatus Bytes&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Handhebelmodus 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Spülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Spülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Rückspülung 1.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Rückspülung 2.BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Schrittmotor Dosierventil Flag 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Schrittmotor Dosierventil Flag 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Kaffeebezug 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 3&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|CRC-Fehler Maschinensimulator&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|CRC-Fehler Display&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Entleerung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemelektronik&amp;diff=4972</id>
		<title>Systemelektronik</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemelektronik&amp;diff=4972"/>
		<updated>2026-06-12T06:46:32Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 04.05.2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg07.met.vgwort.de/na/bba645a1dc394f49accdad8cbefaa70f&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.05.2026 =&lt;br /&gt;
Aufgrund der guten Verfügbarkeit des NUCLEO-H753ZI, welches PINgleich und Firmwarecompatible zum NUCLEO-H743ZI2 ist, wurde entschieden, die nächste Prototypenelektronik mit diesem MCU-Board zu erstellen. Dadurch reduziert sich die Anzahl der erforderlichen Platinen auf eine. zusätzlich wird ein Touch-Display mit RP2350 MCU verbaut werden. Die Kommunikation zwischen STM32 und Display erfolgt über UART. Auch dies reduziert den Hardwareaufwand. Als maximale Ausbaustufe wird aktuell die 2-Zylinder-Glasboilermaschine betrachtet. Hierfür wird die PIN-Belegung des STM32 sowie das Softwaregrundkonzept ausgelegt. Realisiert werden auf Basis vorhandener Basis, SSR und Messplatinen zwei Musterplatinen zum Entwickeln und Testen der Betriebssoftware.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ PIN Funktionalität STM32H743 - Zio Connector CN7&lt;br /&gt;
|-&lt;br /&gt;
! Name !! phys. PIN !! ADC !! I/O !! PWM !! DAC !! UART !! Pinbelegung !! Notizen&lt;br /&gt;
|-&lt;br /&gt;
| D16 || 1 || || X|| || || || Dosierventil 1. BG A-||&lt;br /&gt;
|-&lt;br /&gt;
| D15 || 2 || || X || || || || Dosierventil 1. BG A+||&lt;br /&gt;
|-&lt;br /&gt;
| D17 || 3 || || X|| || || || Dosierventil 1. BG B-||&lt;br /&gt;
|-&lt;br /&gt;
| D14 || 4 || || X|| || || || Dosierventil 1. BG B+||&lt;br /&gt;
|-&lt;br /&gt;
| D18 || 5 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| VREFP || 6 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D19 || 7 || || X|| || || || Tank Füllstand min.||&lt;br /&gt;
|-&lt;br /&gt;
| GND || 8 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D20 || 9 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D13 (ADC) || 10 || || || || DAC(2)|| || Pumpe 2. BG (12 Bit)||0 - 4096 / 0 - 5 V / 0 - 5000/min&lt;br /&gt;
|-&lt;br /&gt;
| D21 || 11 || || X|| || || || Tank Füllstand max.||&lt;br /&gt;
|-&lt;br /&gt;
| D12 || 12 || X|| || || || || Brühgruppendruck 2. BG||0,5 - 4,5 V / 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
| D22 || 13 || || X|| || || || Füllstand Abtropfschale||&lt;br /&gt;
|-&lt;br /&gt;
| D11 || 14 || || || X|| || || Heizelement 1. BG||PWM 0 - 100 %&lt;br /&gt;
TIM_E_PWM1&lt;br /&gt;
(TIM3_CH2)&lt;br /&gt;
|-&lt;br /&gt;
| D23 || 15 || || X|| || || || Boilerfüllstand 2. BG||&lt;br /&gt;
|-&lt;br /&gt;
| D10 || 16 || || || X|| || || Heizelement Tassenwärmer||PWM 0 - 100 %&lt;br /&gt;
TIM_B_PWM3&lt;br /&gt;
(TIM4_CH3)&lt;br /&gt;
|-&lt;br /&gt;
| D24 || 17 || || X|| || DAC (1)|| || Pumpe 1. BG (12 Bit)||0 - 4096 / 0 - 5 V / 0 - 5000/min&lt;br /&gt;
|-&lt;br /&gt;
| D9 || 18 || || || X|| || || Heizelement 2. BG||PWM 0 - 100 %&lt;br /&gt;
TIM_B_PWM2&lt;br /&gt;
(TIM4_CH4)&lt;br /&gt;
|-&lt;br /&gt;
| D25 || 19 || || X|| || || || Boilerfüllstand 1. BG||&lt;br /&gt;
|-&lt;br /&gt;
| D8 || 20 || X|| || || || || Boilerdruck||0,5 - 4,5 V / 0 - 4 bar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ PIN Funktionalität STM32H743 - Zio Connector CN8&lt;br /&gt;
|-&lt;br /&gt;
! Name !! phys. PIN !! ADC !! I/O !! PWM !! DAC !! UART !! Pinbelegung !! Notizen&lt;br /&gt;
|-&lt;br /&gt;
| NC || 1 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D43 || 2 || || X || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| IOREF || 3 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D44 || 4 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| NRST || 5 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D45 || 6 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3,3 V || 7 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D46 || 8 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 V || 9 || || || || || || ||Spannungsversorgung&lt;br /&gt;
|-&lt;br /&gt;
| D47 || 10 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GND || 11 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D48 || 12 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GND || 13 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D49 || 14 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| VIN || 15 || || || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D50 || 16 || || X|| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ PIN Funktionalität STM32H743 - Zio Connector CN9&lt;br /&gt;
|-&lt;br /&gt;
! Name !! phys. PIN !! ADC !! I/O !! PWM !! DAC !! UART !! Pinbelegung !! Notizen&lt;br /&gt;
|-&lt;br /&gt;
| A0 || 1 || X|| || || || || Leitwert|| 0 - 5 V / 0,2 - 2 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| D51 || 2 || || X || || || || Y214||&lt;br /&gt;
|-&lt;br /&gt;
| A1 || 3 || X|| || || || || Leitungsdruck 1. BG|| 0,5 - 4,5 V / 0 -16 bar&lt;br /&gt;
|-&lt;br /&gt;
| D52 || 4 || || || || || USART_B_RX|| Display||&lt;br /&gt;
|-&lt;br /&gt;
| A2 || 5 || X|| || || || || Boilertemp. 1. BG|| NTC&lt;br /&gt;
|-&lt;br /&gt;
| D53 || 6 || || || || || USART_B_TX|| Display||&lt;br /&gt;
|-&lt;br /&gt;
| A3 || 7 || X|| || || || || Brügruppentemp. 1. BG||NTC&lt;br /&gt;
|-&lt;br /&gt;
| D54 || 8 || || X|| || || || Y215||&lt;br /&gt;
|-&lt;br /&gt;
| A4 || 9 || X|| || || || || Mischtemp. 1. BG||NTC&lt;br /&gt;
|-&lt;br /&gt;
| D55 || 10 || || X|| || || || Y216||&lt;br /&gt;
|-&lt;br /&gt;
| A5 || 11 || X|| || || || || Tassenwärmer|| NTC&lt;br /&gt;
|-&lt;br /&gt;
| GND || 12 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D72 || 13 || || X|| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D56 || 14 || || X|| || || || Dosierventil 2. BG A+||&lt;br /&gt;
|-&lt;br /&gt;
| D71 || 15 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D57 || 16 || || X|| || || || Dosierventil 2. BG B+||&lt;br /&gt;
|-&lt;br /&gt;
| D70 || 17 || || X|| || || || Y217||&lt;br /&gt;
|-&lt;br /&gt;
| D58 || 18 || || X|| || || || Y218||&lt;br /&gt;
|-&lt;br /&gt;
| D69 || 19 || || X|| || || || Y219||&lt;br /&gt;
|-&lt;br /&gt;
| D59 || 20 || || X|| || || || Y220||&lt;br /&gt;
|-&lt;br /&gt;
| D68 || 21 || || X|| || || || Y221||&lt;br /&gt;
|-&lt;br /&gt;
| D60 || 22 || || X|| || || || Y222||&lt;br /&gt;
|-&lt;br /&gt;
| GND || 23 || || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| D61 || 24 || X|| || || || || Leitungsdruck 2. BG||0,5 - 4,5 V / 0 - 16 bar&lt;br /&gt;
|-&lt;br /&gt;
| D67 || 25 || || || || || CAN_RX|| || &lt;br /&gt;
|-&lt;br /&gt;
| D62 || 26 || X|| || || || || Boilertemp. 2. BG|| NTC&lt;br /&gt;
|-&lt;br /&gt;
| D66 || 27 || || || || || CAN_TX|| || &lt;br /&gt;
|-&lt;br /&gt;
| D63 || 28 || X|| || || || || Brühgruppentemp. 2. BG|| NTC&lt;br /&gt;
|-&lt;br /&gt;
| D65 || 29 || || X|| || || || Dosierventil A-||&lt;br /&gt;
|-&lt;br /&gt;
| D64 || 30 || || X|| || || || Dosierventil A+||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ PIN Funktionalität STM32H743 - Zio Connector CN10&lt;br /&gt;
|-&lt;br /&gt;
! Name !! phys. PIN !! ADC !! I/O !! PWM !! DAC !! UART !! Pinbelegung !! Notizen&lt;br /&gt;
|-&lt;br /&gt;
| AVDD || 1 || || || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D7 || 2 || || X || || || || Y101||&lt;br /&gt;
|-&lt;br /&gt;
| AGND || 3 || || || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D6 || 4 || || X|| || || || Y102||&lt;br /&gt;
|-&lt;br /&gt;
| GND || 5 || || || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D5 || 6 || || X|| || || || Y103||&lt;br /&gt;
|-&lt;br /&gt;
| A6 || 7 || X|| || || || || Brühgruppendruck 2. BG||0,5 - 4,5 V / 0 - 12 bar&lt;br /&gt;
|-&lt;br /&gt;
| D4 || 8 || || X|| || || || Y104||&lt;br /&gt;
|-&lt;br /&gt;
| A7 || 9 || X|| || || || || Mischtemp. 2. BG||NTC&lt;br /&gt;
|-&lt;br /&gt;
| D3 || 10 || || X|| || || || Y105||&lt;br /&gt;
|-&lt;br /&gt;
| A8 || 11 || X|| || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D2 || 12 || || X|| || || || Y106||&lt;br /&gt;
|-&lt;br /&gt;
| D26 || 13 || || X|| || || || Y107||&lt;br /&gt;
|-&lt;br /&gt;
| D1 || 14 || || || || || USART_A_TX|| Maschinensimulator||&lt;br /&gt;
|-&lt;br /&gt;
| D27 || 15 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D0 || 16 || || || || || USART_A_RX|| Maschinensimulator||&lt;br /&gt;
|-&lt;br /&gt;
| GND || 17 || || || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D42 || 18 || || X|| || || || Y108||&lt;br /&gt;
|-&lt;br /&gt;
| D28 || 19 || || X|| || || || Y109||&lt;br /&gt;
|-&lt;br /&gt;
| D41 || 20 || || X|| || || || Y110||&lt;br /&gt;
|-&lt;br /&gt;
| D29 || 21 || || X|| || || || Y111||&lt;br /&gt;
|-&lt;br /&gt;
| GND || 22 || || || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D30 || 23 || || X|| || || || Y112||&lt;br /&gt;
|-&lt;br /&gt;
| D40 || 24 || || X|| || || || Y113||&lt;br /&gt;
|-&lt;br /&gt;
| D31 || 25 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D39 || 26 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| GND || 27 || || || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D38 || 28 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D32 || 29 || X|| || || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D37 || 30 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D33 || 31 || || || || || || || Gekoppelt mit LED 1&lt;br /&gt;
|-&lt;br /&gt;
| D36 || 32 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D34 || 33 || || X|| || || || || &lt;br /&gt;
|-&lt;br /&gt;
| D35 || 34 || || X|| || || || || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 05.10.2023 =&lt;br /&gt;
Auf Basis der bisherigen Erfahrungen und der Anforderung(en) durch mehrgruppige Maschinentypen wie z. B. die 2-Zylinder Glasboilermaschine ist das finale Elektronik-Konzept [[:Datei:20230909 Elektronik-Konzeptbeschreibung.pdf|[104]]] entsanden.&lt;br /&gt;
&lt;br /&gt;
Für die Prototypen nach 10.2023 soll diese Elektronik entwickelt und verbaut werden. Diese Elektronik stellt den final angestrebten modularen Stand dar.&lt;br /&gt;
&lt;br /&gt;
== SSR-Platine - Kennung ssr ==&lt;br /&gt;
Alle Magnetventile werden über die SSR-Platine geschaltet. Diese verfügt über eine Raspberry Pi Pico MCU. 12 SSRs (z. B. VOR1121) für die Schaltung der 11 Magnetventile der Maschinenbasisvariante sowie ein SSR zur Reserve befinden sich auf der Platinenbasis. Jeweils 6 weitere SSRs werden über Aufsteckplatinen für die Erweiterung auf 2 Brühgruppen bzw. 3 Brühgruppen untergebracht.&lt;br /&gt;
&lt;br /&gt;
Diese Platine beinhaltet die 230 V AC und die 24 V DC Verteilung.&lt;br /&gt;
&lt;br /&gt;
Auf dieser MCU werden keine Regelkreise gerechnet.&lt;br /&gt;
&lt;br /&gt;
Die Platinenmaße dürfen 162 x 75 mm nicht überschreiten. Die Positionierung ist in der 1-Zylinder- Glasboilermaschine stehend in Bauraum 1 als letzte Platine vorgesehen.&lt;br /&gt;
&lt;br /&gt;
== Schrittmotorplatine - Kennung sch ==&lt;br /&gt;
Alle Schrittmotoren werden über die Schrittmotorplatine angesteuert. Diese verfügt über eine Raspberry Pi Pico MCU. Die Platine wird für den maximalbedarf an Schrittmotoren ausgelegt jedoch nur soweit wie der Bedarf ist bestückt. Dies ermöglicht im Prototypenbau die Ansteuerung der zusätzlich erforderlichen Schrittmotoren.&lt;br /&gt;
&lt;br /&gt;
Auf dieser MCU werden keine Regelkreise gerechnet. Um mehrere Schrittmotoren gleichzeitig stellen zu können muss die MicroPython-Funktion asyncio verwendet werden. Durch die erforderlichen Pausen während der einzelnen Schrittmotoransteuerungen ergeben sich nutzbare Wartezeiten für die verschachtelte Ausführung.&lt;br /&gt;
&lt;br /&gt;
Die Platinenmaße dürfen 162 x 75 mm nicht überschreiten. Die Positionierung ist in der 1-Zylinder-Glasboilermaschine stehend in Bauraum 1 als vorletzte Platine vorgesehen. Die Bohrungen für die Platinenbefestigung müssen im gleichen Raster wie bei der SSR-Platine gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
== Basisplatine - Kennung bas ==&lt;br /&gt;
Die Basisplatine umfasst die gesamten Funktionssteuerungen, Regelungen und Messdatenerfassung für den Maschinenbetrieb. Um dies leisten zu können wird ein NUCLEO STM32H743ZI2 MCU-Board verwendet. Das Board kann mit MicroPython betrieben werden, verfügt über 140 PINs, 12-Bit-DACs und 16-Bit-ADCs.&lt;br /&gt;
&lt;br /&gt;
Die Basisplatine wird aufgrund des großen Schaltungsaufwandes ein Platinenpaket werden. Eine Mutterplatine, welche die Maße 164 x 98 mm nicht überschreiten darf, wird durch weitere Aufsteckund Ansteck-Platinen zu einem gesamthaften Platinenpaket. Die Maximaldimensionen des Platinenpaketes sind durch die verfügbaren Bauräume limitiert. In der Variante für eine Brühgruppe darf der Bauraum 45 x 164 x 98 mm nicht überschritten werden.&lt;br /&gt;
&lt;br /&gt;
Die Grundvariante der Basisplatine wird für Maschinen mit 1 Brühgruppe ausgelegt. Dies umfasst die digitale Verarbeitung des Flowmeters und der Drehknöpfe, 4 Füllstandsdetektionen, 4 NTCMesswerte und 4 Spannungsmesswerte. Es werden 2 PWM Signale welche wahlweise die 1000 W Heizelemente über 5 A SSRs steuern oder SSRs für höhere Leistungen ansteuern. Die Platine enthält ebenso die Ansteuerung eines Displays mit Touch-Funktion und für die Kommunikation mit den beiden anderen Platinen werden 2 UART-Schnittstellen verwendet.&lt;br /&gt;
&lt;br /&gt;
Um die Störungssicherheit zu erhöhen werden die Display- und Touch-Schnittstellen für die Varianten mit 2 und 3 Brühgruppen in der Grundvariante angelegt jedoch nur bei Bedarf bestückt. Reicht das Platinenmaß 164 x 98 mm nicht aus, muss durch eine Aufsteckplatine die nutzbare Platinenfläche&lt;br /&gt;
erweitert werden.&lt;br /&gt;
&lt;br /&gt;
Die Grundvariante kann um bis zu 2 Ansteck- oder Aufsteck-Platinen für den Erweiterungsbedarf der mehrgruppigen Varianten erweitert werden. Der Erweiterungsumfang ist für die 2. oder die 3. Brühgruppe jeweils identisch und umfasst je eine Platine mit den Schaltungen für&lt;br /&gt;
&lt;br /&gt;
* 1 Flowmeter&lt;br /&gt;
* 1 Füllstand&lt;br /&gt;
* 1 Signalaufbereitung Tasten&lt;br /&gt;
* 3 Signalaufbereitungen für NTC-Messwerte&lt;br /&gt;
* 2 Signalaufbereitungen für Spannungsmesswerte&lt;br /&gt;
* 1 Signalverstärkung für die Pumpensteuerspannung&lt;br /&gt;
* 1 Leistungs SSR 5 A oder höher&lt;br /&gt;
&lt;br /&gt;
Durch die Steckbaren Zusatzplatinen und die Grundauslegung der Basisplatine für die Erfassung der Messdaten im Gesamtumfang kann für Erprobungs- und Forschungszwecke eine eingruppige Maschine mit einer Steuerung für eine mehrgruppige Maschine betrieben werden. Was den Bedarf&lt;br /&gt;
an zusätzlicher Sensorik abdecken dürfte.&lt;br /&gt;
&lt;br /&gt;
Als Alternative für die Leistungs-SSRs (XSSRs) bietet sich u.u. eine eigenständige Leistungsplatine an, welche dann auch den Verteiler des 230 V AC vornimmt. Hierzu ergibt sich allerdings die Fragestellung des in der 1-Zylinder Glasboilermaschine vorhandenen Bauraums.&lt;br /&gt;
&lt;br /&gt;
== Kommunikation der Platinen untereinander ==&lt;br /&gt;
Die Kommunikation geht von der Basisplatine aus. Es werden über UART an die SSR-Platine und Schrittmotorplatine kurze Kommandosequenzen gesendet.&lt;br /&gt;
&lt;br /&gt;
== Bauräume ==&lt;br /&gt;
=== 1-Gruppige Maschinen ===&lt;br /&gt;
* Bauraum 1: 80 x 164 x 77 mm&lt;br /&gt;
* Bauraum 2: 80 x 164 x 98 mm, davon 33 x 164 x 98 mm vom Netzteil belegt.&lt;br /&gt;
&lt;br /&gt;
=== 2-Gruppige Maschinen ===&lt;br /&gt;
Es stehen unter der Abtropfschale drei Bauräume zur Verfügung&lt;br /&gt;
* 2 Bauräume zu je 282 x 180 x 65 mm&lt;br /&gt;
* 1 Bauraum 92 x 78 x 65 mm&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 23.02.2023 - STEP-Dateien der Platinen =&lt;br /&gt;
In den STEP-Dateien der Platinen sind einige Bauelemente, insb. die Federklemmen nicht in der waren Größe abgebildet. In den einzelnen Wiki-Seiten sind die relevanten Datenblätter verlinkt, bzw. hier:&lt;br /&gt;
* [[Datei:Federkraftklemmblock.pdf|PTSA Federkraftklemmblock]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 07.02.2023 =&lt;br /&gt;
Grundlegend kann die Systemelektronik nicht ohne die [[Systemsoftware]] betrachtet werden.&lt;br /&gt;
&lt;br /&gt;
Die aktuell verwendete und leider nur sehr gering dokumentierte Elektronik wird aus mehreren Gründen auf eine Multi-MCU-Elektronik umgestellt. Zum einen bestehen immer wieder Lieferengpässe bei verfügbaren MCU-Evaluationsboards, was dazu geführt hat, dass sich für das am wahrscheinlichsten verfügbare und obendrein auch relativ kostengünstige Raspberry Pi Pico Board endschieden wurde. Dies ist mit und ohne W-Lan verfügbar.&lt;br /&gt;
&lt;br /&gt;
Zum Anderen erfordert ein MCU-Wechsel auch immer eine Anpassung der Systemelektronik, so dass die Überlegung nach der wahrscheinlich verfügbarsten MCU wichtig für die Projektweiterführung ist.&lt;br /&gt;
&lt;br /&gt;
Als weiterer technischer Aspekt für die Entscheidung der überarbeiteten Systemelektronik ist die Entscheidung bezüglich einiger steuerbarer Ventile in den Maschinen. Es werden nun mehrere Schrittmotorsteuerungen benötigt, welche den Ausführungstask auf dem jeweiligen Prozessor(kern) bis zu 1 Sekunde blockieren können. Dies würde die Systemsteuerung nicht unerheblich blockieren.&lt;br /&gt;
&lt;br /&gt;
== Schema der Systemsteuerung ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:20230207 Konzept.png|thumb|750px|gerahmt|zentriert|alternativtext=Abbildung 1) Schema der Multi-MCU-Systemelektronik|Abbildung 1) Schema der Multi-MCU-Systemelektronik]]&lt;br /&gt;
&lt;br /&gt;
Die Multi-MCU-Elektronik (Abbildung 1) besteht im Kern aus drei Systemboards, welche jeweils mit einem Raspberry Pi Pico als MCU bestückt sind. Während der Entwicklungsphase erfolgt für jedes der drei Boards eine eigenständige USB-Verbindung zu einem übergeordneten PC mit einer MATLAB®-GUI. Im Produktivbetrieb soll dies für die Labormaschine lediglich über das Basisboard erfolgen. Eventuell kann im Produktivbetrieb gänzlich auf eine USB-Verbindung verzichtet werden, wenn per W-LAN oder Bluetooth ein Datenaustausch ermöglicht werden kann. Prinzipiell ist ein Datenaustausch im Produktivbetrieb via MQTT darstellbar.&lt;br /&gt;
&lt;br /&gt;
== Unterschied Entwicklungsbetrieb / Produktivbetrieb ==&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
&lt;br /&gt;
# Nutzung von MCUs welche mit MicroPython programmiert werden können.&lt;br /&gt;
# Auf den MCUs werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über die MATLAB® meets MicroPython - Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes ein Produktivbetrieb ohne MATLAB®-Verbindung möglich ist. Die MATLAB®-Verbindung dient dann lediglich für weiterführende Datenerfassung, grafische Darstellungen, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll und Servicefunktionen.&lt;br /&gt;
&lt;br /&gt;
Eine Portierung der Software nach C ist nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
== Basisboard ==&lt;br /&gt;
Die für den Betrieb der Kaffeemaschine wichtigen Steuerungen und Regelungen&lt;br /&gt;
&lt;br /&gt;
* Pumpensteuerung&lt;br /&gt;
* Füllstandsregler&lt;br /&gt;
* Durchflussregler&lt;br /&gt;
* Mischtemperaturregler&lt;br /&gt;
&lt;br /&gt;
und die Funktionssteuerung mit&lt;br /&gt;
&lt;br /&gt;
* Preinfusion&lt;br /&gt;
* Kaffeebezug&lt;br /&gt;
* Wasserbezug&lt;br /&gt;
* Dampfbezug&lt;br /&gt;
* Spülen (Rückspülreinigung)&lt;br /&gt;
* Grundreinigung&lt;br /&gt;
&lt;br /&gt;
werden auf der MCU des Basisboards durchgeführt. Die Verwaltung von Presets kann für wenige Presets auf diesem Board stattfinden, umfangreichere Datensammlungen müssen jedoch auf einem übergeordnetem System stattfinden.&lt;br /&gt;
&lt;br /&gt;
Ziel ist, dass im Produktivbetrieb eine MATLAB®-Verbindung nicht erforderlich ist. Optional soll im Produktivbetrieb über USB eine MATLAB®-GUI angesschlossen werden können.&lt;br /&gt;
&lt;br /&gt;
Über die UART1-Schnittstelle werden die Anweisungen zum Magnetventilschalten, die Initialisierungen von Dampfhahn und Dosierventil sowie die Positionierung von Dampfhahn und Dosierventil übermittelt.&lt;br /&gt;
&lt;br /&gt;
Die UART2-Schnittstelle dient der Kommunikation mit der Messplatine. Die Messplatine sendet in einem definierten Takt kontinuierlich die Messdaten an das Basisboard. Umgekehrt erfolgt lediglich eine Kommunikation bei Änderung der Sollwerteinstellungen für den Boilerdruck und der Solltemperatur am Tassenwärmer.&lt;br /&gt;
&lt;br /&gt;
Das Basisboard verfügt über einen 24 V Spannungsverteiler sowie über den 5 V Spannungsregler und Spannungsverteiler. Es dient zur Ermittlung der Flowrate über das Flowmeter, der Erkennung der Füllstände (Tank min., Tank max. Abwasser max., Boiler max.) und der Bedientastenerkennung inkl. Drehinkrementerkennung. Es werden die selten zu betätigenden Schrittmotoren der Brühgruppendrossel und des Pumpenbypasses angesteuert sowie der Pumpensollwert (0 - 5 V) ausgegeben.&lt;br /&gt;
&lt;br /&gt;
== SSR-Platine ==&lt;br /&gt;
Die SSR-Platine schaltet die Magnetventile mit 24 V DC Magnetspulen, die beiden 230 V AC XSSRs sowie die Schrittmotorsteuerung für das Dosierventil und den Dampfhahn.&lt;br /&gt;
&lt;br /&gt;
Schaltkommandos dazu erfolgen über die UART1-Schnittstelle von der Basisplatine für die Schrittmotoren und die Magnetventile, während für die XSSRs das Steuersignal, üblich PWM, über eine Kabelverbindung von der Messplatine erfolgt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Messplatine ==&lt;br /&gt;
Auf der Messplatine werden an insgesamt 8 Eingängen über einen 16-Bit-ADS1115 ADC mit vorgeschaltetem Multiplexer kontinuierlich Messdaten erfasst. Die Messdaten werden über die UART1-Schnittstelle an das Basisboard zur Weiterverarbeitung übermittelt.&lt;br /&gt;
&lt;br /&gt;
Die Messplatine führt die Regelungen für den Boilerdruck und den Tassenwärmer durch. Die Sollwerte hierzu werden über die UART1-Schnittstelle vom Basisboard übermittelt. Wert 0 bedeutet dabei die Deaktivierung des Reglers. Initial sind die Regler mit Sollwert = 0 deaktiviert. Die Stellwerte der regler sind PWM-Signale, welche an die SSR-Platine per Hardwareleitung übertragen werden, um dort XSSRs zu steuern.&lt;br /&gt;
&lt;br /&gt;
== Bisherige Steuerungselektronik(en) ==&lt;br /&gt;
Eine Dokumentation der bisherigen Varianten der Steuerungselektronik wird im Wiki nicht mehr nagezogen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 15.01.2022 =&lt;br /&gt;
Telefonat mit einem Dienstleister zur Elektronikentwicklung&lt;br /&gt;
&lt;br /&gt;
Manfred Eggersdorf, eggersdorf.com, 033233 40 94 70&lt;br /&gt;
&lt;br /&gt;
Seiner Einschätzung nach wären 3 bis 4 Entwicklungsschleifen erforderlich- Aufgrund der aktuellen Situation in der Bauelementeverfügbarkeit müssen dafür 12 bis 18 Monate Entwicklungszeitraum einkalkuliert werden.&lt;br /&gt;
&lt;br /&gt;
Er schätzt die Entwicklungskosten (ohne Platinen, Bauelemente etc.) auf ca. 40 k€.&lt;br /&gt;
&lt;br /&gt;
Die Kosten kommen aus einem Vergleich mit einem anderen Projekt. Schaltpläne sowie Infos zu bekannten Fehlern, Verbesserungsvorschläge, etc. werden natürlich benötigt.&lt;br /&gt;
&lt;br /&gt;
Vor der nächsten Entwicklungsschleife der Elektronik muss der Funktionsumfang, Sensoreingänge, Ausgänge, etc. fix definiert sein.&lt;br /&gt;
&lt;br /&gt;
Die Elektronik muss eigenständig CE geprüft sein. Die Kosten dazu betragen ca. 5 k€.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 15.01.2022 =&lt;br /&gt;
Einschätzung zur weiteren Elektronikentwicklung von Marius Ghica, der die aktuelle Elektronik entwickelt hat. Es sind noch drei weitere Entwicklungsschleifen erforderlich. Je Entwicklungsschleife würde er ca. 50 Arbeitsstunden benötigen. Ein neu beauftragter Dienstleister sollte für seine erste Entwciklungsschleife mit der doppelten Arbeitszeit zurecht kommen. Daraus leitet sich sich ab:&lt;br /&gt;
&lt;br /&gt;
# Entwicklungsschleife 15 k€&lt;br /&gt;
# Entwicklungsschleife 7,5 k€&lt;br /&gt;
# Entwicklungsschleife 7,5 k€&lt;br /&gt;
# CE 5 k€&lt;br /&gt;
&lt;br /&gt;
ergibt in Summe: 35 k€&lt;br /&gt;
&lt;br /&gt;
Auch Marius Ghica weist darauf hin, dass zur nächsten Entwicklungsschleife die Ein- und Ausgänge zur Elektronik definiert sein müssen und es danach keine Veränderungen in der Spezifikation mehr geben darf.&lt;br /&gt;
&lt;br /&gt;
= ToDo Systemelektronik =&lt;br /&gt;
== Status ==&lt;br /&gt;
&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ToDo-Liste Systemelektronik ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! lfd-Nr. !! Arbeitspaket !! ToDo !! Wer !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Basisboard || [[Multi-MCU-Elektronik:Basisboard|Basisboard]] || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Messplatine || [[Multi-MCU-Elektronik:Messplatine|Messplatine]] || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || SSR-Platine || [[Multi-MCU-Elektronik:SSR-Platine|SSR-Platine]] ||  || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Schrittmotor || [[Schrittmotor-Treiber]] || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
|  || || ========== Finalisierung ========== || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || STM32H753ZI-Platine || [[STM32-Elektronik:STM32Board|Systemsteuerung]] || || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Simulator || [[STM32-Elektronik:Maschinensimulator|Maschinensimulator]] || || 10 ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4966</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4966"/>
		<updated>2026-06-11T13:13:19Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Loic Aboufiras&lt;br /&gt;
Felix Kerner&lt;br /&gt;
| 1 || 70 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || ||  1 || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||19.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||19.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Felix Kerner|| 1 || 30 ||19.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 30 ||03.07.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || || 1 || 30 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || || 1 || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4965</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4965"/>
		<updated>2026-06-11T13:08:09Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Felix Kerner, Loic Aboufiras, 10.06.2026, Initialisierungs- und Antworttoken =&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Haupttoken vom STM32 zum Maschinensimulator =&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Maschinensimulator-MCU ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Maschinensimulator-MCU&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0F Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Felix Kerner, 10.06.2026, Botschaften vom Maschinensimulator zum STM32 =&lt;br /&gt;
&lt;br /&gt;
== Botschaften von Wartungs-APP zu STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften von Wartungs-APP zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 32 || Boilerheizung Soll 1. BG || PWM 0 - 100 % || &lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || 32 || Boilerheizung Soll 2. BG || PWM 0 - 100 % || &lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || 32 || Sollwert Boilerdruck || 1100 - 1500 mbar || Integerwert in mbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Haupttoken vom STM32 zum Display der 1. BG =&lt;br /&gt;
&lt;br /&gt;
== Haupttoken von STM32 zu Display-MCU 1. BG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Haupttoken von STM32 zu Display-MCU 1. BG&lt;br /&gt;
|-&lt;br /&gt;
! Byte-Nr !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || Startzeichen || || 0x0D Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| 1,2 || 16 || Leitwert || 0 - 3,3 V || Spannungsteiler von 0 bis 5 V, 0,2 - 20 mS/cm&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 || Boilerdruck || 0 - 3,3 V || Spannungsteiler von 0,5 bis 4,5 V, 0 bis 4 bar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Loic Aboufiras, 10.06.2026, Botschaften vom Display der 1. BG zum STM32 =&lt;br /&gt;
&lt;br /&gt;
== Botschaften vom Display der 1. BG zum STM32 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Botschaften vom Display der 1. BG zum STM32&lt;br /&gt;
|-&lt;br /&gt;
! Startzeichen !! Bits !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || 32 || Bezugswassertemperatur 1. BG  || 30 - 98 °C || Integerwert in 1/10 °C, damit Wertebereich 300 bis 980 &lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || 32 || Bezugsmenge 1. BG || 20 - 300 g bzw. ml || Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000 &lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || 32 || Bezugszeit 1. BG || 0 - 120 Sekunden || Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4962</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4962"/>
		<updated>2026-06-07T12:14:55Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Kommunikationsaufbau mit der Maschinensimulator-MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505_Rohnen_Startprozedur_1.001.png|thumb|350px|right]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit der Display-MCU ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an die Display-MCU gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display-MCU zu STM32 erfolgt die Initialisierung einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit der Maschinensimulator-MCU ==&lt;br /&gt;
&#039;&#039;&#039;(Änderung: Armin Rohnen, 07.06.2026 - keine Unterscheidung Wartungs-APP Maschinensimulator-APP)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Für den Kommunikationsaufbau mit der Maschinensimulator-MCU wird das Byte &amp;quot;0x0A&amp;quot; über UART an die Maschinensimulator-MCU gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Maschinensimulator-MCU und Wartungs-App der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Maschinensimulator-MCU angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Die Maschinensimulator-MCU dient als Gateway zur Wartungs/Maschinensimulator-APP. Es erfolgt jedoch keine Unterscheidung für die Funktionalitäten als Wartungs oder Maschinensimulator-APP seitens der SMT32-Steuerungs-MCU. Für Kommunikation von Maschinensimulator-MCU zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife und es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
Wird die Wartungs/Maschinensimulator-APP lediglich als Maschinensimulator verwendet, müssen ausgehend von der Maschinensimulator-APP alle Regler-Flags auf 1 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4961</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4961"/>
		<updated>2026-06-07T12:14:27Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Kommunikationsaufbau mit der Maschinensimulator-MCU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505_Rohnen_Startprozedur_1.001.png|thumb|350px|right]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit der Display-MCU ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an die Display-MCU gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display-MCU zu STM32 erfolgt die Initialisierung einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit der Maschinensimulator-MCU ==&lt;br /&gt;
(Änderung: Armin Rohnen, 07.06.2026 - keine Unterscheidung Wartungs-APP Maschinensimulator-APP)&amp;lt;br&amp;gt;&lt;br /&gt;
Für den Kommunikationsaufbau mit der Maschinensimulator-MCU wird das Byte &amp;quot;0x0A&amp;quot; über UART an die Maschinensimulator-MCU gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Maschinensimulator-MCU und Wartungs-App der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Maschinensimulator-MCU angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Die Maschinensimulator-MCU dient als Gateway zur Wartungs/Maschinensimulator-APP. Es erfolgt jedoch keine Unterscheidung für die Funktionalitäten als Wartungs oder Maschinensimulator-APP seitens der SMT32-Steuerungs-MCU. Für Kommunikation von Maschinensimulator-MCU zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife und es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
Wird die Wartungs/Maschinensimulator-APP lediglich als Maschinensimulator verwendet, müssen ausgehend von der Maschinensimulator-APP alle Regler-Flags auf 1 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4960</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4960"/>
		<updated>2026-06-07T12:12:42Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Kommunikationsaufbau mit Maschinensimulator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505_Rohnen_Startprozedur_1.001.png|thumb|350px|right]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit der Display-MCU ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an die Display-MCU gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display-MCU zu STM32 erfolgt die Initialisierung einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit der Maschinensimulator-MCU ==&lt;br /&gt;
Für den Kommunikationsaufbau mit der Maschinensimulator-MCU wird das Byte &amp;quot;0x0A&amp;quot; über UART an die Maschinensimulator-MCU gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Maschinensimulator-MCU und Wartungs-App der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist die Maschinensimulator-MCU angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Die Maschinensimulator-MCU dient als Gateway zur Wartungs/Maschinensimulator-APP. Es erfolgt jedoch keine Unterscheidung für die Funktionalitäten als Wartungs oder Maschinensimulator-APP seitens der SMT32-Steuerungs-MCU. Für Kommunikation von Maschinensimulator-MCU zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife und es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
Wird die Wartungs/Maschinensimulator-APP lediglich als Maschinensimulator verwendet, müssen ausgehend von der Maschinensimulator-APP alle Regler-Flags auf 1 gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4959</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4959"/>
		<updated>2026-06-07T12:04:10Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Kommunikationsaufbau mit Display */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505_Rohnen_Startprozedur_1.001.png|thumb|350px|right]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit der Display-MCU ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an die Display-MCU gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display-MCU zu STM32 erfolgt die Initialisierung einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich zu sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4958</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4958"/>
		<updated>2026-06-07T12:02:05Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505_Rohnen_Startprozedur_1.001.png|thumb|350px|right]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich zu sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4957</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4957"/>
		<updated>2026-06-07T12:00:35Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|mini|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich zu sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4956</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4956"/>
		<updated>2026-06-07T12:00:12Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich zu sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4955</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4955"/>
		<updated>2026-06-07T11:59:24Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich zu sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur_1.001.png&amp;diff=4954</id>
		<title>Datei:20260505 Rohnen Startprozedur 1.001.png</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur_1.001.png&amp;diff=4954"/>
		<updated>2026-06-07T11:57:05Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: Armin Rohnen lud eine neue Version von Datei:20260505 Rohnen Startprozedur 1.001.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Startprozedur Teil 1, (c) Armin Rohnen&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Mikrocontroller_Programmierung_in_MicroPython_SoSe_2026&amp;diff=4953</id>
		<title>Mikrocontroller Programmierung in MicroPython SoSe 2026</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Mikrocontroller_Programmierung_in_MicroPython_SoSe_2026&amp;diff=4953"/>
		<updated>2026-06-06T10:13:44Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Besprechungsprotokolle und weitere Unterlagen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;https://vg07.met.vgwort.de/na/3e58d840a91b42ac97ee493cdd085245&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Mikrocontroller Programmierung in MicroPython Sommersemester 2026 =&lt;br /&gt;
Für die Projekte zur labortechnischen Espressomaschine (und weiteren Derivaten) ist die Mikrokontroller-Programmierung einer Steuerungselektronik erforderlich.&lt;br /&gt;
&lt;br /&gt;
Die Programmierung der Mikrocontroller erfolgt in MicroPython und die übergeordnete Steuerung ist eine MATLAB®-APP mit einem Prozessschaubild. Die Grundfunktionalität dieses Vorgehensweise ist in der Quellenliste unter [40] (MATLAB® meets MicroPython) beschrieben.&lt;br /&gt;
&lt;br /&gt;
Das Projekt wurde bereits durch eine Projektgruppe bearbeitet und hat einen Projektstand, der jedoch noch nicht die gesamte erforderliche Steuerungsfunktionalität umfasst.&lt;br /&gt;
&lt;br /&gt;
Es wird angestrebt eine Steuerung auf Basis eines Nucleo STM32H743ZI2 zu erstellen. Dies würde die aktuell drei Steuerungsplatinen und Mikrocontroller auf einen reduzieren. Kommunikation wäre dann lediglich zum Displaycontroller erforderlich.&lt;br /&gt;
&lt;br /&gt;
= Aufgabenanalyse =&lt;br /&gt;
==UART-Kommunikation==&lt;br /&gt;
Es soll eine Stern-Topologie implementiert werden, welche die UART-Kommunikation&lt;br /&gt;
zu einem separaten Display-Controller, dem Maschinensimulator und der Wartungs-&lt;br /&gt;
App herstellt. Dabei sind Sende- und Empfangs-Token für das Display, die Wartungs-App und den Maschinensimulator einzuführen. Es gilt dabei, den Umfang und Takt der&lt;br /&gt;
neuen Token festzulegen.&lt;br /&gt;
&lt;br /&gt;
==Mehrkernnutzung und/oder Multitasking==&lt;br /&gt;
&lt;br /&gt;
Es gibt bestimmte Vorgänge, welche regelmäßig zur Unterbrechung des Pro-&lt;br /&gt;
grammablaufs führen. Es gilt, diese Vorgänge zu identifizieren und umzuleiten,&lt;br /&gt;
damit diese den Programmablauf nicht mehr unterbrechen. Die Möglichkeit&lt;br /&gt;
der Mehrkernnutzung fällt dabei aus, da der STM32H753ZI nur über einen&lt;br /&gt;
M7-Kern verfügt. Dank der Hardware-Unterstützung DMA sowie der Nutzung&lt;br /&gt;
der uasyncio-Library besteht die Möglichkeit, die Vorgänge umzuleiten. Somit&lt;br /&gt;
können die Unterbrechungen des Programmablaufs reduziert werden.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator ==&lt;br /&gt;
Die Hauptaufgabe des Maschinensimulators ist die Nachbildung aller Sensordaten der Kaffeemaschine. Dies ermöglicht die Programmentwicklung der Steuerungselektronik ohne die reale Hardware. Die für die Simulation benötigte Hardware ist bereits rudimentär vorhanden, muss aber für einen zuverlässigen und störungsfreien Betrieb optimiert werden. Zudem muss für die Umsetzung der Durchflusssimulation noch eine entsprechende Hardware-Modellierung erfolgen. Softwareseitig ist der Python-Code für die Datengenerierung größtenteils fertiggestellt [http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator &amp;lt;nowiki&amp;gt;[ToDo Maschinensimulator - Funktionsnutzung]&amp;lt;/nowiki&amp;gt;]. Es fehlen aktuell noch die Flowmetersimulation sowie die Aufheizsimulation, welche für die Validierung der Druck- und Temperaturregelung benötigt wird. Die vom Maschinensimulator gelieferten Temperatur- und Druckwerte müssen validiert werden. Dabei soll ein bereits bekannter Messfehler bei den Temperaturwerten durch die Anpassung der Einstellwerte behoben werden. Für den Programmablauf des Simulators wird eine MATLAB®-App entwickelt, die parallel zum Ablauf des STM32 arbeitet. Für die UART-Kommunikation in der Sterntopologie zwischen dem Maschinensimulator und dem STM32 müssen zudem spezifische Sende- und Empfangs- Token implementiert sowie deren Taktung und Datenumfang definiert werden. Zusätzlich wird ein Gateway als Kommunikationsschnittstelle zwischen dem Maschinensimulator und der Wartungs-App implementiert. Des Weiteren muss während der Ausarbeitung des Maschinensimulators eine Projektfortschrittsdokumentation erfolgen. Die Ausarbeitung erfolgt in einem ein- bis zweiwöchigen Turnus.&lt;br /&gt;
&lt;br /&gt;
== Füllstandsregler ==&lt;br /&gt;
Die Füllstandsregelung erkennt den Füllstand über eine Kurzschlussdetektion. Liegt kein &lt;br /&gt;
Kurzschluss vor, wird dies als zu niedriger Füllstand interpretiert und der Boilerdruckregler &lt;br /&gt;
zur Vermeidung von Trockenheizen gesperrt. Beim Erreichen des Sollfüllstands erfolgt eine &lt;br /&gt;
gezielte Überfüllung bei reduzierter Pumpenspannung, um ein periodisches Ein- und &lt;br /&gt;
Ausschalten der Regelung zu vermeiden. Da die in der MATLAB®-GUI realisierte Boiler Füllstandsregelung aus [114] bereits in einem ersten Stand in MicroPython übertragen &lt;br /&gt;
wurde, liegt der Fokus hier auf der Validierung am Maschinensimulator sowie der &lt;br /&gt;
Abstimmung mit den Schnittstellenpartnern.&lt;br /&gt;
&lt;br /&gt;
== Boilerdruckregelung ==&lt;br /&gt;
Ziel ist es, die bisher in der MATLAB®-GUI realisierte Boilerdruckregelung aus [114], die auf &lt;br /&gt;
einem PD-Regler basiert, vollständig zu übertragen, sodass die Regelung unabhängig von der &lt;br /&gt;
externen PC-Umgebung arbeitet.&lt;br /&gt;
&lt;br /&gt;
== Mischtemperaturregler ==&lt;br /&gt;
Der Mischtemperaturregler nach [114] dient zur Regelung der Kaffee- und &lt;br /&gt;
Teewassertemperatur und wird als PID-Regler für das Mischventil umgesetzt. Die Stellgröße &lt;br /&gt;
ist dabei die Verstellung des Mischventils. Der Temperatursollwert wird aus dem jeweils &lt;br /&gt;
aktiven Rezept vorgegeben. Da die Regelung vom aktuellen Durchfluss abhängt, wird eine &lt;br /&gt;
Kaskadenstruktur verwendet. In dieser Struktur arbeitet der Durchflussregler als innerer, &lt;br /&gt;
schneller Regelkreis, während der Mischtemperaturregler den äußeren Regelkreis bildet und &lt;br /&gt;
die Ergebnisse des inneren Kreises berücksichtigt. Daraus ergibt sich ein besonderes &lt;br /&gt;
Augenmerk auf das Testen des Zusammenspiels der beiden Regler anhand des &lt;br /&gt;
Maschinensimulators, um das Ziel – die Implementierung dieser Kaskadenregelung auf dem &lt;br /&gt;
STM32 – zu erreichen.&lt;br /&gt;
&lt;br /&gt;
== Durchflussregler ==&lt;br /&gt;
Ein Durchflussregler, der in MATLAB® gemäß [114] vorliegt, wird als PID-Regler in &lt;br /&gt;
MicroPython umgesetzt. Durch die Anpassung der Pumpendrehzahl über einen &lt;br /&gt;
Spannungssollwert von 0–5 V kann ein konstanter oder ein profildefinierter Volumenstrom &lt;br /&gt;
entsprechend der Sollwertvorgabe realisiert werden. Als innerer Regelkreis liefert er &lt;br /&gt;
kontinuierlich Durchflusswerte an den Mischtemperaturregler. Daraus ergibt sich der Fokus &lt;br /&gt;
auf der Implementierung und dem Test des Reglers sowie auf der Validierung seines &lt;br /&gt;
Zusammenspiels mit dem übergeordneten Mischtemperaturregler im Maschinensimulator, &lt;br /&gt;
um die Integration auf dem STM32 sicherzustellen.&lt;br /&gt;
&lt;br /&gt;
== Startprozedur ==&lt;br /&gt;
Das Ziel ist es, eine Startprozedur zu definieren. Beim Einschalten der Stromversorgung starten die Prozessoren der Maschine. Ohne eine festgelegte Ablauflogik würden die einzelnen Systemteile jedoch unkoordiniert anlaufen. Daraus ergibt sich der technische Bedarf, eine eindeutige Reihenfolge für den Start festzulegen und die zugehörigen Ausgaben auf dem Display so zu definieren, dass der Startprozess nachvollziehbar verfolgt werden kann.&lt;br /&gt;
&lt;br /&gt;
Dafür müssen zunächst die relevanten Inhalte der Startprozedur identifiziert werden. Außerdem sind die beteiligten Schnittstellen zu erkennen und die Reihenfolge der einzelnen Startschritte so festzulegen, dass ein geordneter und technisch sinnvoller Maschinenstart möglich ist.&lt;br /&gt;
&lt;br /&gt;
== Display ==&lt;br /&gt;
Ziel ist eine kompakte und benutzerfreundliche Displaylösung, die sich nahtlos in das Gesamtsystem integriert. Das Display mit Touchfunktion dient als Schnittstelle zur Interaktion zwischen Bediener und Maschine. Messwerte müssen strukturiert darzustellen sowie die Auswahl von Funktionen wie Kaffeerezepten, Teewasser- oder Dampfbezug zu ermöglichen. Zusätzlich übernimmt das Display die Visualisierung der Startprozedur, relevanter Betriebszustände und der Sicherheitsfunktionen.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die benötigten Funktionalitäten analysiert und definiert, darunter Messwertanzeige, Benutzerführung und Sicherheitsmeldungen. Parallel dazu werden drei unterschiedliche Displaytypen (rundes Display, LCD2 und 1,69Display) auf ihre Eignung hin untersucht, um anschließend die, am besten passende, Variante auszuwählen. Die MCU der Displayplatine erhält die benötigten Informationen über die UART-Kommunikation aus dem System und muss in die bestehende Gesamtarchitektur integriert werden. Der Vertikalhebel dient zur Vorgabe von Sollwerten, während die beiden Anschlagtaster die Funktionen Kaffeebezug und Flush beziehungsweise Reinigung auslösen. Diese Bedienelemente sind mit der Displayplatine zu verbinden, damit das Display die zugehörigen Informationen und Zustände für den Benutzer darstellen kann.&lt;br /&gt;
&lt;br /&gt;
== STM32 ==&lt;br /&gt;
Als Haupt-MCU soll ein STM32H753ZI-Controller verwendet werden. Es soll sichergestellt &lt;br /&gt;
werden, dass die vorinstallierten Steckerleisten CN7 bis CN10 ausreichend Pins für &lt;br /&gt;
Definition der benötigten UART-, ADC-, DAC- und GPIO-Pins aufweisen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Boilerdruck-, die Wassertemperatur-, die Durchfluss- und die Füllstandsregelung des &lt;br /&gt;
Boilers müssen implementiert werden. Es soll ebenfalls eine UART-Kommunikation für ein &lt;br /&gt;
Touch-Display, einen Maschinensimulator sowie eine Möglichkeit zum Anschließen einer &lt;br /&gt;
Wartungs-App programmiert werden. Um einen geordneten Ablauf der einzelnen &lt;br /&gt;
Komponenten bei Inbetriebnahme der Maschine zu gewährleisten, soll eine Startprozedur &lt;br /&gt;
programmiert werden&lt;br /&gt;
&lt;br /&gt;
== Wartungs - APP ==&lt;br /&gt;
Es müssen der Inhalt des Wartungs-Token definiert werden, ein GUI-Layout erstellt werden, ein Kommunikationsaufbau mit dem Maschinensimulator hergestellt werden, die Darstellung der Messwerte, eine manuelle Startprozedur, das Schalten von Magnetventilen, die Einstellung von Sollwertvorgaben (Boilerdruck, Bezugswassertemperatur, Durchfluss) und manuellen Stellwerten für das PWM-Heizelement, die Pumpenansteuerung und die Stellung des Dosierventils sowie die Messwertspeicherung und das Logging programmiert werden. Die App ist bis zu einem funktionsfähigen Prototypen erforderlich.&lt;br /&gt;
&lt;br /&gt;
= Leistungsvereinbarung =&lt;br /&gt;
&lt;br /&gt;
== Startprozedur ==&lt;br /&gt;
Es wird eine definierte und nachvollziehbare Startprozedur für die Maschine erarbeitet. Das Ergebnis umfasst eine festgelegte Reihenfolge der Startschritte, die Berücksichtigung der relevanten Schnittstellen sowie ein Konzept für die Ausgaben auf dem Display, damit der Startprozess strukturiert abläuft und für den Benutzer verfolgbar ist.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator ==&lt;br /&gt;
Das Ziel dieser Arbeit ist die Entwicklung eines voll funktionsfähigen Maschinensimulators, der das Testen der auf den STM32 zu verlagernden Regelkreisen ermöglicht. Hierfür werden physikalische Größen wie Temperatur und Druck simuliert und über die Digital- Potentiometer MCP4151 als elektrische Signale an die Steuerungselektronik ausgegeben. Der Maschinensimulator wird in einer MATLAB®-App implementiert, sodass der Maschinensimulators parallel zu einer weiteern MCU an einem PC betrieben werden kann. Die App soll sowohl den Betrieb des Simulators als solches als auch die Nutzung als Wartungs-App ermöglichen.&lt;br /&gt;
&lt;br /&gt;
== Wartungs - APP ==&lt;br /&gt;
Die aktuelle MATLAB®-GUI soll in eine komfortable Bedienoberfläche für Wartungs- und Einstellarbeiten überführt werden. Bei aktivierter Wartungs-App sollen sämtliche Tastenfunktionen und die Vertikalhebelfunktion nutzbar sein und zudem alle Aktoren (Magnetventile, Pumpenleistung und Schrittmotorverstellungen) über diese App angesteuert werden können. Des Weiteren soll die bisherige Visualisierung der Messwerte und Schaltzustände erhalten bleiben. Dies allerdings mit einer geringeren Aktualisierungsrate, da vier Aktualisierungen pro Sekunde als ausreichend angesehen werden.&lt;br /&gt;
&lt;br /&gt;
==UART-Kommunikation==&lt;br /&gt;
Um die spezifischen Daten von dem STM32H7 auf das Display zu übertragen, sowie &lt;br /&gt;
Steuerbefehle des Displays für den STM32H7, wird ein neue UART-Schnittstelle mit Display-Token eingeführt. Ebenfalls wird eine UART-Kommunikation mit entsprechendem Token für &lt;br /&gt;
Maschinensimulator und der Wartungs-App implementiert. Dabei soll ein Gateway den &lt;br /&gt;
Zugriff für die Wartungs-App integriert werden.&lt;br /&gt;
&lt;br /&gt;
==Multitasking==&lt;br /&gt;
Die direkte Hardware-Unterstützung über DMA gestaltet sich schwierig in MicroPython, da &lt;br /&gt;
sie von MicroPython automatisch verwendet wird (bspw. bei Buffern) und nur über &lt;br /&gt;
Registeraccess direkt ausgeführt werden kann. Daher wird die Nutzung der uasyncio-Library&lt;br /&gt;
bevorzugt, welche die Vorgänge, die den Programmablauf verzögern, umleitet. Dadurch soll &lt;br /&gt;
das Programm reibungsfreier ablaufen.&lt;br /&gt;
&lt;br /&gt;
==STM32H7==&lt;br /&gt;
Die bestehenden Regelkreise, Füllstandsregelung (Boiler und Tanks), Boilerdruckregelung, &lt;br /&gt;
Mischtemperaturregelung und Durchflussregelung werden von den drei Microcontroller auf &lt;br /&gt;
den STM32H7 verlagert. Ebenfalls erfolgt die Migration der Messwerterfassung aller &lt;br /&gt;
verbauten Sensoren auf die neue STM32H7-Plattform.&amp;lt;br&amp;gt;&lt;br /&gt;
Zusätzlich wird eine UART-Kommunikation implementiert, die die Anbindung des Displays, &lt;br /&gt;
eines Maschinensimulators sowie für den Zugriff durch eine externe Wartungs-App über &lt;br /&gt;
einem Gateway ermöglicht.&amp;lt;br&amp;gt;&lt;br /&gt;
Um einen geordneten Ablauf der einzelnen Komponenten bei Inbetriebnahme der Maschine &lt;br /&gt;
zu gewährleisten, wird eine Startprozedur programmiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Hardware-Umsetzung wird von LfbA Armin Rohnen übernommen.&lt;br /&gt;
&lt;br /&gt;
== Display ==&lt;br /&gt;
Es wird eine geeignete Displaylösung ausgewählt und in das Gesamtsystem integriert. Das Ergebnis umfasst die Darstellung relevanter Messwerte, Betriebszustände, Sicherheitsmeldungen und der Startprozedur sowie die Einbindung der Bedienfunktionen über Touch, Vertikalhebel und Anschlagtaster.&lt;br /&gt;
&lt;br /&gt;
== Vertikalhebel ==&lt;br /&gt;
Der Vertikalhebel wird als Bedienelement technisch und funktional in das System integriert. Das Ergebnis umfasst die Erfassung und Verarbeitung der Hebelstellung als Sollwertvorgabe für den Durchflussregler, die Einbindung der Anschlagtaster als zusätzliche Bedienfunktionen sowie die Anzeige der relevanten Informationen auf dem Display.&lt;br /&gt;
&lt;br /&gt;
== Verlagerung der Regler Syntax ==&lt;br /&gt;
Ziel dieser Arbeit ist die vollständige Übertragung der in MATLAB® implementierten Regelalgorithmen aus [114] in MicroPython sowie deren Vorbereitung für die Implementierung auf einer STM32‑MCU. Die Umsetzung erfolgt entlang der bestehenden Reglerstruktur: Füllstandsregler, Boilerdruckregelung, Mischtemperaturregler und Durchflussregler.&lt;br /&gt;
&lt;br /&gt;
= Besprechungsprotokolle und weitere Unterlagen =&lt;br /&gt;
* [[:Datei:20260214 Abschlusspraesentation.pdf|Übergabepräsentation Vorgänger]]&lt;br /&gt;
* [[:Datei:20260326 Projektstart.pdf|Aktueller Projektstand]]&lt;br /&gt;
* [[Projektstart 26.03.2026]]&lt;br /&gt;
* [[Projektrücksprache 02.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 09.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 17.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 24.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 08.05.2026]]&lt;br /&gt;
* [[Projektrücksprache 22.05.2026]]&lt;br /&gt;
* [[Projektrücksprache 12.06.2026]]&lt;br /&gt;
* [[Projektrücksprache 03.07.2026]]&lt;br /&gt;
* [[Projektrücksprache 17.07.2026]]&lt;br /&gt;
* [[Abschlusspräsentation 31.07.2026]]&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4951</id>
		<title>Kommunikation per UART</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Kommunikation_per_UART&amp;diff=4951"/>
		<updated>2026-05-31T13:28:21Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 31.05.2026, UART-Tester =&lt;br /&gt;
Für die erforderlichen Tests der UART-Kommunikation wurden aus zwei Platinen der früheren Multi-MCU-Steuerung UART-Tester hergestellt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;0x0A&amp;quot;. Wenn dieses von der zu testenden MCU mit dem Zeichen &amp;quot;0x0B&amp;quot; beantwortet wird erfolgt der weiteer individuelle testablauf auf dem Tester.&lt;br /&gt;
&lt;br /&gt;
== Display-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; hergestellt werden zunächst die in der Datei &amp;quot;startprozedur.csv&amp;quot; abgelegten Textzeilen übermittelt. Zwischen jeder Zeile Text wird 1 Sekunde Pause eingeelgt.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator-MCU UART-Tester ==&lt;br /&gt;
Ist die UART-Verbindung durch Rücksendung des Bytes &amp;quot;0x0B&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 18.12.2025&amp;lt;br&amp;gt; Setter und Getter für Bits und Bytes =&lt;br /&gt;
Beim Arbeiten mit binären Daten ist der Einsatz von Setter- und Getter-Funktionen sinnvoll, da &lt;br /&gt;
sie den Code übersichtlicher machen und Fehler durch direkte Bit- oder Bytemanipulation &lt;br /&gt;
vermeiden. Ein Setter verändert einen Wert in einem Bytearray, während ein Getter einen &lt;br /&gt;
bestehenden Wert ausliest. Der Setter wird bei Bits in Form von zwei Funktionen beschrieben, &lt;br /&gt;
einmal das Setzen eines Bits auf 1 und das Löschen eines Bits. Letzteres meint das Setzen eines &lt;br /&gt;
Bits auf 0. &lt;br /&gt;
=== set_bit ===&lt;br /&gt;
Zum Setzen einzelner Bits (siehe linke Grafik in der Abbildung 4) wird zunächst aus dem Bitindex &lt;br /&gt;
eine Bitmaske erzeugt, indem der Wert 1 entsprechend nach links verschoben wird (1 &amp;lt;&amp;lt; &lt;br /&gt;
bit_index). Durch eine OR-Verknüpfung des Bytes mit dieser Maske wird das betreffende Bit &lt;br /&gt;
zuverlässig auf den Wert 1 gesetzt.&lt;br /&gt;
=== clear_bit ===&lt;br /&gt;
Zum Löschen eines Bits (siehe zweite Grafik von links in der Abbildung 4) wird dieselbe Maske &lt;br /&gt;
invertiert und das Byte anschließend mit einer AND-Verknüpfung verarbeitet. Dadurch wird das &lt;br /&gt;
Zielbit sicher auf den Wert 0 gesetzt. Beide Operationen verändern ausschließlich das &lt;br /&gt;
gewünschte Bit, alle anderen Bits im Byte bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
=== get_bit ===&lt;br /&gt;
Das Auslesen eines Bits (siehe mittlere Grafik in der Abbildung 4) erfolgt, indem das &lt;br /&gt;
entsprechende Byte um den Bitindex nach rechts verschoben und anschließend mit 1 maskiert &lt;br /&gt;
wird. Auf diese Weise wird das Zielbit isoliert und als Wert 0 oder 1 zurückgegeben. &lt;br /&gt;
Für die Verarbeitung ganzer Messwerte, die aus ein oder zwei Bytes bestehen, werden ebenfalls &lt;br /&gt;
Setter und Getter verwendet.&lt;br /&gt;
&lt;br /&gt;
=== sync_bit ===&lt;br /&gt;
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.&lt;br /&gt;
Auf diese Weise wird sichergestellt, dass der im Token gespeicherte Zustand jederzeit dem realen Messwert entspricht, ohne unnötige Schreibzugriffe durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== set_bytes ===&lt;br /&gt;
Beim Schreiben von Bytes in den Token (siehe vierte Grafik von links in der Abbildung 4) wird der Integerwert &lt;br /&gt;
im Big-Endian-Format in zwei Bytes umgewandelt und an der vorgesehenen Position im &lt;br /&gt;
Bytearray gespeichert.&lt;br /&gt;
&lt;br /&gt;
Big-Endian-Format bedeutet, dass bei mehrbyteigen Werten das höherwertige Byte (MSB) zuerst &lt;br /&gt;
gespeichert oder übertragen wird, gefolgt vom niederwertigen Byte (LSB). Im Gegensatz dazu &lt;br /&gt;
gibt es noch das Format Little-Endian. Hierbei ist die Reihenfolge genau umgekehrt, das &lt;br /&gt;
niederwertiges Byte wird zuerst übertragen. Entscheidend ist, dass Sender und Empfänger &lt;br /&gt;
dieselbe Endianess verwenden, sonst entstehen falsche Werte.&lt;br /&gt;
&lt;br /&gt;
=== get_bytes ===&lt;br /&gt;
Das Auslesen von Bytes (siehe rechte Grafik in der Abbildung 4) erfolgt durch Entnehmen von &lt;br /&gt;
einem (oder zwei Bytes) und deren Rückwandlung in einen Integer. Da beide Funktionen &lt;br /&gt;
dasselbe Format Big-Endian verwenden, wird der Messwert exakt so zurückgegeben, wie er &lt;br /&gt;
zuvor gespeichert wurde.&lt;br /&gt;
&lt;br /&gt;
=== get_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
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, &#039;big&#039;) keinen zusätzlichen Parameter signed hat. Dies gilt auch für den folgenden Getter.&lt;br /&gt;
&lt;br /&gt;
===set_signed_bytes ===&lt;br /&gt;
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.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die genannten fünf Funktionen werden in die Datei utils.py geschrieben. Diese Datei wird auf jeder Platine hinterlegt. &amp;lt;br /&amp;gt; &lt;br /&gt;
Beispielaufruf: utils.set_bytes(token, ort, wert)&lt;br /&gt;
&lt;br /&gt;
[[Datei:Setter Getter.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger|Abbildung 4: Funktionsablauf Setter und Getter Teil 1, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260213 Flussdiagramm Setter Getter 2.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger|Abbildung 5: Funktionsablauf Setter und Getter Teil 2, (c) Peter Vogginger]]&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 13.12.2025&amp;lt;br&amp;gt;Espressomaschinen-Kommunikations-Ring Timing =&lt;br /&gt;
[[Datei:20251213 EKR-Timing.png|thumb|1000px|gerahmt|zentriert|alternativtext=EKR Timing Diagramm, (c) Armin Rohnen|EKR Timing Diagramm, (c) Armin Rohnen]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Kommunikationsring ist mit der Abfolge - Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine -&amp;gt; (Maschinensimulator) -&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Da eine Summenrechenzeit von 5,8 ms sehr knapp ist, ist zu prüfen, ob der Betrieb in maximaler ADC-Abtastrat emöglich ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 30.11.2025&amp;lt;br&amp;gt; Kommunikationsstart und kontinuierliches Sendendes Token im ADC Takt der Messwertplatine =&lt;br /&gt;
Ü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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Es wird der Initialtoken mit 75-Bytes angelegt und in Byte[0] wird &amp;quot;0x0A&amp;quot; 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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&amp;lt;br&amp;gt;&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 28.11.2025 - Grundkonzept des Programmcodes für die UART-Kommunikation =&lt;br /&gt;
Auf den jeweiligen Platinen werden durch die Bestromung die MCUs gestartet und es werden nacheinander die Dateien &amp;quot;boot.py&amp;quot; und &amp;quot;main.py&amp;quot; abgearbeitet. In &amp;quot;boot.py&amp;quot; befindet sich weiter kein Progammcode, dort werden höchstens Systemeinstellungen vorgenommen. In &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Initialisierung MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen|Abb. 1) Konzept zur Initialisierung der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf UART IRQ.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen|Abb. 2) Programmablauf UART ISR, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
Die Abarbeitung des UART IRQ erfolgt auf allen Platinen gleich. Der UART.IRQ_RXIDLE ruft als ISR &amp;quot;_uart_rx_handler&amp;quot; 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 &amp;quot;on_receive&amp;quot; zur weiteren Überprüfung des Tokens aufgerufen.&amp;lt;br&amp;gt;&lt;br /&gt;
In &amp;quot;on_receive&amp;quot; wird geprüft ob es sich um den (richtigen) Token handelt und dieser Fehlerfrei übertragen wurde. Danach wird ein &amp;quot;local_receive&amp;quot; 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.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Auslagerung der eigentlichen Verarbeitung des Tokens auf einen lokalen Programmcode entlastet den IRQ, so dass dieser sehr schnell wieder aufgerufen werden kann.&lt;br /&gt;
&lt;br /&gt;
Im &amp;quot;local_receive&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20251128 Programmablauf ADC IRQ MWP.png|thumb|1000px|gerahmt|zentriert|alternativtext=Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen|Abb. 3) Programmablauf der ADC ISR auf der Messwertplatine, (c) Armin Rohnen]]&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;main.py&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
= Peter Vogginger, 10.11.2025 - Aufgabenanalyse =&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hardware-Aufbau ==&lt;br /&gt;
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 -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Display-Platine -&amp;gt; Messwertplatine durchgeführt. Damit ergibt sich ein geschlossener Ring. Optional kann nach der Displayplatine noch der Maschinensimulator eingeschleift werden.&lt;br /&gt;
&lt;br /&gt;
== Messwerte ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token ==&lt;br /&gt;
=== Anzahl ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Struktur ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Prüfsumme ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Standardtoken ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Paniktoken ===&lt;br /&gt;
Es ist erkennbar über das Startzeichen am Anfang. Dies ist die Realisierung eines Not-Halts. Es sollen alle Prozesse augenblicklich gestoppt werden.&lt;br /&gt;
=== Fehlererkennung === &lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Token Definition ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabelle 1: Tokeninhalt&lt;br /&gt;
|-&lt;br /&gt;
! Platine !! Byte-Nr !! Bits / Bit-Nr. !! Beschreibung !! Wertebereich !! Anmerkung&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Startzeichen&lt;br /&gt;
|&lt;br /&gt;
|0x0A - Standardtoken&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;15&amp;quot; | Messplatine || 1,2 || 16 Bit || Leitwert || 0,2 - 20 S/cm || rowspan=&amp;quot;15&amp;quot; | 16 Bit im Token&lt;br /&gt;
dort wo diese Messwerte verarbeitet werden, werden sie mittels Kennlinie umgerechnet.&lt;br /&gt;
&lt;br /&gt;
Die csv-Datei der Kennlinie befindet sich auf der jeweiligen Platine.&lt;br /&gt;
&lt;br /&gt;
Der Tassenwärmer existiert nur 1x je Machine&lt;br /&gt;
|-&lt;br /&gt;
| 3,4 || 16 Bit || Boilerdruck || 0,5 - 4,5 V / 0 - 4 bar &lt;br /&gt;
|-&lt;br /&gt;
| 5,6 || 16 Bit || Brühgruppendruck (1. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 7,8 || 16 Bit || Brühgruppendruck (2. BG) || 0,5 - 4,5 / 0 - 12 bar &lt;br /&gt;
|-&lt;br /&gt;
| 9,10 || 16 Bit || Wassereingangstemperatur&lt;br /&gt;
(ersatzweise Leitungsdruck)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 11,12 || 16 Bit || Boiler-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 13,14 || 16 Bit || Boiler-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 15,16 || 16 Bit || Tassenwärmer-NTC || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 17,18 || 16 Bit || Mischtemperatur-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 19,20 || 16 Bit || Mischtemperatur-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 21,22 || 16 Bit || Brühgruppen-NTC (1. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 23,24 || 16 Bit || Brühgruppen-NTC (2. BG) || Kennlinie &lt;br /&gt;
|-&lt;br /&gt;
| 25,26 || 16 Bit || Boilerheizung (Soll, 1. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 27,28 || 16 Bit || Boilerheizung (Soll, 2. BG) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| 29,20 || 16 Bit || Tassenwärmerheizung (Soll) || 8 Hz PWM 0 - 100 % &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | SSR-Platine || 31,32 || 16 Bit || Position Schrittmotor Dosierventil 1. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| 33,34 || 16 Bit || Position Schrittmotor Dosierventil 2. BG || 0 - 550 ||&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;17&amp;quot; | Basisplatine || 35,36 || 16 Bit || Verstellwert Schrittmotor Dosierventil 1. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
| 37,38 || 16 Bit || Verstellwert Schrittmotor Dosierventil 2. BG || Integer mit Vorzeichen ||&lt;br /&gt;
|-&lt;br /&gt;
|39,40&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 1. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|41,42&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Pumpensollwert 2. BG&lt;br /&gt;
|0 - 4096&lt;br /&gt;
|entspricht 0 - 5000 mV bzw. 0 - 5000 U/min&lt;br /&gt;
|-&lt;br /&gt;
|43&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 1. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|44,45&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 1. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
|46&lt;br /&gt;
|8 Bit&lt;br /&gt;
|Durchflussrate 2. BG&lt;br /&gt;
|0 - 25 ml/s&lt;br /&gt;
|Integerwert in 1/10 ml/s, damit Wertebereich 0 - 250&lt;br /&gt;
|-&lt;br /&gt;
|47,48&lt;br /&gt;
|16 Bit&lt;br /&gt;
|Durchflusscounts 2. BG&lt;br /&gt;
|0 - 65535&lt;br /&gt;
|je Count 1/39,9 ml, Überlauf muss unterbunden werden&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |49&lt;br /&gt;
|&lt;br /&gt;
|Füllstandsbyte&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |Füllstände werden von den Füllstandsreglern auf der Basisplatine verarbeitet&lt;br /&gt;
Füllstand Abtropfschale True verhindert Pumpenansteuerung&lt;br /&gt;
Füllstand Boiler False verhindert Pumpenansteuerung&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Füllstand Boiler 1. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 1 || Füllstand Boiler 2. BG || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 2 || Füllstand Tank Minimum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 3 || Füllstand Tank Maximum || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 4 || Füllstand Abtropfschale || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 5 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 6 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| 7 || || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || rowspan=&amp;quot;9&amp;quot; | 50 || || Magnetventile Byte 1 || || rowspan=&amp;quot;9&amp;quot; | Magnetventile Y101 bis Y113 gehören zur 1. BG&lt;br /&gt;
Y113 ist der Dampfhahn&lt;br /&gt;
Y214 bis Y222 gehören zur 2. BG &lt;br /&gt;
|-&lt;br /&gt;
| || 0 || Y101 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 1 || Y102 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 2 || Y103 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 3 || Y104 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 4 || Y105 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 5 || Y106 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
| || 6 || Y107 || 0/1 &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y108&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |51&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 2&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y109&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y110&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y111&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y112&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y113&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y214&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Y215&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Y216&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |52&lt;br /&gt;
|&lt;br /&gt;
|Magnetventil Byte 3&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Y217&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Y218&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Y219&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Y220&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Y221&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Y222&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|-&lt;br /&gt;
|Displayplatine&lt;br /&gt;
|53,54&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 1. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|55,56&lt;br /&gt;
|16&lt;br /&gt;
|Bezugswassertemperatur 2. BG&lt;br /&gt;
|30  - 98 °C&lt;br /&gt;
|Integerwert in 1/10 °C, damit Wertebereich 300 bis 980&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|57,58&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 1. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|59,60&lt;br /&gt;
|16&lt;br /&gt;
|Bezugsmenge 2. BG&lt;br /&gt;
|20 - 300 g bzw. ml&lt;br /&gt;
|Integerwert in 1/10 ml, damit Wertebereich 200 bis 3000&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|61,62&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|63,64&lt;br /&gt;
|16&lt;br /&gt;
|Bezugszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|65,66&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 1. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|67,68&lt;br /&gt;
|16&lt;br /&gt;
|Preinfusionszeit 2. BG&lt;br /&gt;
|0 - 120 Sekunden&lt;br /&gt;
|Integerwert in 1/10 Sekunde, damit Wertebereich 0 bis 1200&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|69&lt;br /&gt;
|8&lt;br /&gt;
|Abschalttemperatur Entschichtung&lt;br /&gt;
|90 - 98 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|70&lt;br /&gt;
|8&lt;br /&gt;
|Grenztemperatur&lt;br /&gt;
|135 - 150 °C&lt;br /&gt;
|Integerwert in °C&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|71&lt;br /&gt;
|8&lt;br /&gt;
|Sollwert Boilerdruck&lt;br /&gt;
|1100 - 1500 mbar&lt;br /&gt;
|Integerwert in 10 mbar, damit Wertebereich 110 bis 150&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|72&lt;br /&gt;
|8&lt;br /&gt;
|Stellung Vertikalhebel&lt;br /&gt;
|0 - 180 Grad&lt;br /&gt;
|Integerwert&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |73&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 1&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Mischerstatus 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Mischerstatus 2. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Mischtemperatur erreicht&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Entschichtung&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Entschichtung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Handhebelmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Rezepteingabe&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Wartungsmodus&lt;br /&gt;
|0/1&lt;br /&gt;
|True = aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Schrittmotor Dosierventil Flag&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Schrittmotor für Dosierventil Kaltwasser hat ursprüngliche Position erreicht (Teil der Initialisierung)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| rowspan=&amp;quot;9&amp;quot; |74&lt;br /&gt;
|&lt;br /&gt;
|Maschinenstatus Byte 2&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|Kaffeebezug 1. BG&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|2&lt;br /&gt;
|Teewasserbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|3&lt;br /&gt;
|Dampfbezug&lt;br /&gt;
|0/1&lt;br /&gt;
|Bewirkt 200 mbar Reduzierung Sollwert Boilerdruck&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|4&lt;br /&gt;
|Boilerbefüllung (Befüllungsflag)&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Boilerbefüllung aktiv&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|5&lt;br /&gt;
|Aufheizen&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Aufheizphase, False = Betriebsbereit&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|6&lt;br /&gt;
|Systemstart&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Systemstart&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|7&lt;br /&gt;
|Sicherheitsfunktion&lt;br /&gt;
|0/1&lt;br /&gt;
|True = Sicherheitsfunktion aktiv&lt;br /&gt;
|}&lt;br /&gt;
= Peter Vogginger,19.10.2025 - NUCLEO_H743ZI2 =&lt;br /&gt;
Kommunikation als Token-Ring oder in Stern-Topologie &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Der Wechsel hin zu einem größeren Board, dem NUCLEO-H743ZI2 MCU-Board mit einer STM32H7 MCU. Der Wechsel würde Vorteile bieten:  &lt;br /&gt;
* weniger Elektronik in der Peripherie &lt;br /&gt;
* ADCs ausreichend am Board &lt;br /&gt;
* DACs ausreichend am Board &lt;br /&gt;
* 8 serielle Schnittstellen &lt;br /&gt;
* viel mehr nutzbare PINs &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Allerdings bietet diese Umstellung nicht nur Vorteile.  &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Aufgrund der aktuellen Situation wird bis auf Weiteres die Verwendung von Raspberry Pi Pico verfolgt.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 16.10.2025 =&lt;br /&gt;
Im Zuge der Analyse für die zweite Auflage von MATLAB® meets MicroPython ist das Thema der UART-Kommunikation tiefer betrachtet worden. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
[[Datei:20250322 Konzept.png|thumb|900px|gerahmt|zentriert|alternativtext=Armin Rohnen, Kommunikationskonzept mit Token|Armin Rohnen, Kommunikationskonzept mit Token]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4950</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4950"/>
		<updated>2026-05-27T13:12:49Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||29.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Felix Kerner|| 1 || 30 ||05.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 30 ||29.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || || 1 || 30 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || || 1 || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4948</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4948"/>
		<updated>2026-05-22T18:32:05Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 70 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Felix Kerner|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || || 1 || 30 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || || 1 || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4947</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4947"/>
		<updated>2026-05-22T18:31:32Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 70 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Felix Kerner|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || Tillmann Haas|| 1 || 30 ||08.05.2026&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || Tillmann Haas|| 1 || 30 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4946</id>
		<title>Visualisierung und Interaktion über die MATLAB®-GUI</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4946"/>
		<updated>2026-05-22T18:29:49Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 20.05.2026 - Programmgerüst der MATLAB® Maschinensimulator / Wartungs - APP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 20.05.2026 - Programmgerüst der MATLAB® Maschinensimulator / Wartungs - APP =&lt;br /&gt;
Aufgrund der nichtlinearität der digitalen Potis und der Auswirkung der Schaltungstoleranzen auf den Platinen sind Kennlinien für die Übersetzung von phys. Wert der eingestellt werden soll zu Digitalwert für die Einstellung des jeweiligen Potis erforderlich. Die Ermittlung dieser Kennlinien erfordert den gelichzeitigen Betrieb von mindestens zwei MCUs an einem PC. Das ist mit Thonny nicht darstellbar. Da sich die gleiche Situation für die spätere Nutzung des Maschinensimulators ebenso ergeben wird und eine einfache Bedienung ermöglicht werden soll, ist die Entscheidung getroffen worden, dass der Maschinensimulator integraler Bestandteil der Wartungs-App wird.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Kennlinienermittlung lag noch kein Progarmmgerüst der Wartungs-App vor. Um jedoch nicht in weiteren Zeitverzug zu geraten, wurde im Zuge der Kennlinienermittlung für den Maschinensimulator das Programmgerüst für die Wartungs-App erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260520 Maschinensimulator.png|thumb|1000px|gerahmt|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
Um mit die Wartungs-App betreiben zu können und um mit dem Maschinensimulator arbeiten zu können, muss die MCU des Maschinensimulators via USB angeschlossen sein. Über den Button erfolgt der Verbindungsaufbau mit der Maschinensimulator MCU. Dieser Verbindungsaufbau ist bislang lediglich für das Betriebssystem UNIX /macOS realisiert. Für andere Betriebssysteme muss dies noch erfolgen. In der Initialisierung der Maschinensimulator MCU erfolgt auch nur jener Teil, welcher für die Bestimmung der Digitalwert-Kennlinien erforderlich ist. Insbesondere erfolgt noch nicht die UART-initialisierung und ebenso keine Weiterleitung der Token.&lt;br /&gt;
&lt;br /&gt;
Wenn der Maschinensimulator verbunden ist, wird der Verbindungsaufbau zu einer Messplatine freigegeben und es ist möglich eine MCU-Verbindung mit einer Messplatine aus der Multi-MCU-Baureihe aufzubauen. Ist die Verbindung aufgebaut kann über den Button &amp;quot;Messwerte erfassen&amp;quot; Messwertdatensätze für die jeweils 8 Messkanäle erfasst und verarbeitet werden. Um diese Art der Messwerterfassung durchführen zu können ist auf der MCU der Messplatine das Python-Programm mwp_chanMesswerte.py erforderlich, was sich in der ZIP-Datei 20260516_Simulator_Wartungs_APP.zip auf der Wiki-Seite des [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcodes] befindet. Bei jedem erfassten Messdatensatz wird aus den ermittelten Spannungswerten über die logische phys. Umrechnung oder über die erforderliche Kennlinie aus dem Spannungswert auf den phys. Wert umgerechnet. Die Werte werden in der Messwerttabelle (rechte Tabelle) als Spannungswert in [mV] und im jeweiligen phys. Messwert ausgegeben. In der linken Tabelle kann der jeweilige Simulationswert eingegeben werden. Entweder als Digitalwert oder als phys. Wert. Im falle der phys. Werteeingabe wird über die ermittelte Kennlinie auf den erforderlichen Digitalwert umgerechnet und dieser wird dann auf dem Maschinensimulator eingestellt. Da die Digitalpotentiometer lediglich über eine 8-Bit-Auflösung verfügen, ist diese Einstellung recht grob und der gemessene Wert weicht vom gewünschten Einstellwert oft ab.&lt;br /&gt;
&lt;br /&gt;
Die Kennlinienermittlung läuft automatisiert ab und dauert ca. 15 Min. Damit diese nicht versehentlich ausgelöst wird, ist sie über einen Switch zusätzlich verriegelt.&lt;br /&gt;
&lt;br /&gt;
Für den Kommunikation mit dem Maschinensimulator und der Messwertplatine ist ein jeweils 4zeiliges Statusfeld angelegt. Hier werden die zugehörigen Statusmeldungen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Programmstuktur ==&lt;br /&gt;
=== function startupFcn(app) ===&lt;br /&gt;
Wird zum Start der App durchgeführt. Hier werden alle Voreinstellungen durchgeführt, es werden die erforderlichen Kennlinien eingelesen und es wird der &amp;quot;Trace&amp;quot; vorbereitet.&lt;br /&gt;
&lt;br /&gt;
Es wird das Betriebssystem des ausführenden Host ermittelt. Allerdings erfolgt lediglich für &amp;quot;UNIX/macOS&amp;quot; eine Abarbeitung. Damit ist diese App für die Nutzung auf anderen betriebssystemen als &amp;quot;UNIX/macOS&amp;quot; noch anzupassen.&lt;br /&gt;
&lt;br /&gt;
=== function SimulatorVerbindenButtonPushed(app, event) ===&lt;br /&gt;
Der Button Simulator Verbinden führt die Funktion SimulatorVerbindenButtonPushed aus. Es wird über den ersten freien USB-Port versucht die Verbindung zum Maschinensimulator aufzubauen. Dieser Teil des Programmcodes ist individuell für &amp;quot;UNIX/macOS&amp;quot; programmiert und muss für andere Betriebssysteme noch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Zur Abarbeitung der ersten Daten vom Maschinensimulator wird die Funktion init_sim als ISR konfiguriert.&lt;br /&gt;
&lt;br /&gt;
===  function init_sim(app, ~, ~) ===&lt;br /&gt;
Zur Indentifikation des Maschinensimulators wurde auf dieser MCU die Funktion ident aufgerufen. Diese gibt die Platinenkennung zurück und es kann entschieden werden ob der Port gewechselt werden muss oder tatsächlich der Maschinensimulator angeschlossen ist. Ist der Maschinensimulator angeschlossen, erfolgt die tatsächliche Initialisierung des Maschinensimulators in der Funktion sim_initialisieren.&lt;br /&gt;
&lt;br /&gt;
=== function sim_initialisieren(app, ~, ~) ===&lt;br /&gt;
Für die Initialisierung des Maschinensimulators werden alle Digitalpotis auf Digitalwert 250 gestellt und alle Kurzschlüsse (Füllstandssimulationen) geöffnet.&lt;br /&gt;
&lt;br /&gt;
Für das weitere Interrupthandling der eingehenden Daten wird das ISR auf die Funktion sim_datenverarbeitung umgestellt.&lt;br /&gt;
&lt;br /&gt;
Als letzte Aktion in der Initialisierung wird auf der Maschinensimulator-MCU &amp;quot;import machine&amp;quot; durchegführt. Dies muss die letzte Aktion bleiben, da über die nachfolgende ISR Abarbeitung durch das Echo des Aufrufs die Betriebsbereitschaft erkannt wird. Weitere Initialisierungsschritte müssen vor diesem Aufruf eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function sim_datenverarbeitung(app, ~, ~) ===&lt;br /&gt;
Die Funktion sim_datenverarbeitung übernimmt die eigentliche Abarbeitung der von der Maxchinensimulator gesendeten Daten.&lt;br /&gt;
&lt;br /&gt;
Stand 20.05.2026 wird lediglich das Logging durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Die weitere Funktionalität muss noch hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function KalibrierungVerbindenButtonPushed(app, event) ===&lt;br /&gt;
Der Button Espressomaschine/Messplatine (Kalibrierung) Verbinden führt die Funktion KalibrierungVerbindenButtonPushed aus. Es wird über den ersten freien USB-Port versucht die Verbindung zr Messwertplatine aufzubauen. Dieser Teil des Programmcodes ist individuell für &amp;quot;UNIX/macOS&amp;quot; programmiert und muss für andere Betriebssysteme noch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Zur Abarbeitung der ersten Daten von der Messwertplatine wird die Funktion init_kal als ISR konfiguriert.&lt;br /&gt;
&lt;br /&gt;
=== function init_kal(app, ~, ~) ===&lt;br /&gt;
Zur Indentifikation der Messwertplatine wurde auf dieser MCU die Funktion ident aufgerufen. Diese gibt die Platinenkennung zurück und es kann entschieden werden ob der Port gewechselt werden muss oder tatsächlich eine Messwertplatine angeschlossen ist. Ist eine Messwertplatine angeschlossen, erfolgt die tatsächliche Initialisierung der Messwertplatine in der Funktion kal_initialisieren.&lt;br /&gt;
&lt;br /&gt;
=== function kal_initialisieren(app, ~, ~) ===&lt;br /&gt;
Für die Initialisierung der Messwertplatine wird die Anweisung &amp;quot;writeline(app.MCU_KAL, &#039;from mwp_chanMesswerte import mwp_chanMesswerte&#039;);&amp;quot; durchgeführt. Dazu muss isch auf der Messwertplatine die Datei mwp_chanMesswerte.py befinden. &lt;br /&gt;
&lt;br /&gt;
Für das weitere Interrupthandling der eingehenden Daten wird das ISR auf die Funktion kal_datenverarbeitung umgestellt.&lt;br /&gt;
&lt;br /&gt;
Als letzte Aktion in der Initialisierung wird auf der Messwertplatinen-MCU &amp;quot;import machine&amp;quot; durchegführt. Dies muss die letzte Aktion bleiben, da über die nachfolgende ISR Abarbeitung durch das Echo des Aufrufs die Betriebsbereitschaft erkannt wird. Weitere Initialisierungsschritte müssen vor diesem Aufruf eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function MesswerteErfassenButtonPushed(app, event) ===&lt;br /&gt;
Der Button Messwerte Erfassen löst die Funktion MesswerteErfassenButtonPushed aus. Darin wird die Anweisung &amp;quot;writeline(app.MCU_KAL, &#039;mwp_chanMesswerte(0)&#039;);&amp;quot; ausgeführt, was die Messung von Messwert Kanal(0) auf der Messwertplatine auslöst. Ist die Messung abgeschlossen wird der Messwert an die APP zurück gesendet und über den ISR wird die Funktion kal_datenverarbeitung ausgeführt.&lt;br /&gt;
&lt;br /&gt;
=== function kal_datenverarbeitung(app, ~, ~) ===&lt;br /&gt;
Die Funktion kal_datenverarbeitung übernimmt die Datenverarbeitung der von der Messwertplatine kommenden Daten. Ist dies ein Messwert der zu keiner Kalibrierung gehört wird der Messwert logisch und ohysikalisch verarbeitet und im entsprechenden Datenfeld ausgegeben. Es wird danach die Messung des nächsten Messwertkanals angestoßen.&lt;br /&gt;
&lt;br /&gt;
Gehört der Messwert zu einer Kalibrierdurchführung, wird dieser in die zugehörige Stelle der Kalibriermatrix eingefügt und es wird die nächst folgende Kalibrierstufe ausgeführt. Zum Abschluss der Kalibrierung wird die Kalibriermatrix abgespeichert.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
In der Übergangsphase soll der Betriebsstart der Espressomaaschine von der MATLAB®-GUI ausgelöst werden. &lt;br /&gt;
&lt;br /&gt;
Die aktuelle MATLAB®-GUI soll in eine komfortable Bedienoberfläche für Wartungs- und Einstellarbeiten überführt werden. Alle Tastenfunktionalitäten und die Vertikalhebelfunktionalität sollen über die Oberfläche durchgeführt werden können.Wie bisher soll jeder Aktor (Magnetventile, Pumpenleistung und Schrittmotorverstellungen) über die GUI ausgelöst werden können. Ebenso soll die bisherige Visualisierung der Messwerte und Schaltzustände erhalten bleiben. Dies allerdings mit einer geringeren Aktualisierungsrate. Vier Aktualisierungen je Sekunde werden als ausreichend angesehen.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4944</id>
		<title>Visualisierung und Interaktion über die MATLAB®-GUI</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4944"/>
		<updated>2026-05-20T18:00:47Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 20.05.2026 - Programmgerüst der MATLAB® Maschinensimulator / Wartungs - APP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 20.05.2026 - Programmgerüst der MATLAB® Maschinensimulator / Wartungs - APP =&lt;br /&gt;
Aufgrund der nichtlinearität der digitalen Potis und der Auswirkung der Schaltungstoleranzen auf den Platinen sind Kennlinien für die Übersetzung von phys. Wert der eingestellt werden soll zu Digitalwert für die Einstellung des jeweiligen Potis erforderlich. Die Ermittlung dieser Kennlinien erfordert den gelichzeitigen Betrieb von mindestens zwei MCUs an einem PC. Das ist mit Thonny nicht darstellbar. Da sich die gleiche Situation für die spätere Nutzung des Maschinensimulators ebenso ergeben wird und eine einfache Bedienung ermöglicht werden soll, ist die Entscheidung getroffen worden, dass der Maschinensimulator integraler Bestandteil der Wartungs-App wird.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Kennlinienermittlung lag noch kein Progarmmgerüst der Wartungs-App vor. Um jedoch nicht in weiteren Zeitverzug zu geraten, wurde im Zuge der Kennlinienermittlung für den Maschinensimulator das Programmgerüst für die Wartungs-App erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260520 Maschinensimulator.png|thumb|1000px|gerahmt|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
Um mit die Wartungs-App betreiben zu können und um mit dem Maschinensimulator arbeiten zu können, muss die MCU des Maschinensimulators via USB angeschlossen sein. Über den Button erfolgt der Verbindungsaufbau mit der Maschinensimulator MCU. Dieser Verbindungsaufbau ist bislang lediglich für das Betriebssystem UNIX /macOS realisiert. Für andere Betriebssysteme muss dies noch erfolgen. In der Initialisierung der Maschinensimulator MCU erfolgt auch nur jener Teil, welcher für die Bestimmung der Digitalwert-Kennlinien erforderlich ist. Insbesondere erfolgt noch nicht die UART-initialisierung und ebenso keine Weiterleitung der Token.&lt;br /&gt;
&lt;br /&gt;
Wenn der Maschinensimulator verbunden ist, wird der Verbindungsaufbau zu einer Messplatine freigegeben und es ist möglich eine MCU-Verbindung mit einer Messplatine aus der Multi-MCU-Baureihe aufzubauen. Ist die Verbindung aufgebaut kann über den Button &amp;quot;Messwerte erfassen&amp;quot; Messwertdatensätze für die jeweils 8 Messkanäle erfasst und verarbeitet werden. Um diese Art der Messwerterfassung durchführen zu können ist auf der MCU der Messplatine das Python-Programm mwp_chanMesswerte.py erforderlich, was sich in der ZIP-Datei 20260516_Simulator_Wartungs_APP.zip auf der Wiki-Seite des [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcodes] befindet. Bei jedem erfassten Messdatensatz wird aus den ermittelten Spannungswerten über die logische phys. Umrechnung oder über die erforderliche Kennlinie aus dem Spannungswert auf den phys. Wert umgerechnet. Die Werte werden in der Messwerttabelle (rechte Tabelle) als Spannungswert in [mV] und im jeweiligen phys. Messwert ausgegeben. In der linken Tabelle kann der jeweilige Simulationswert eingegeben werden. Entweder als Digitalwert oder als phys. Wert. Im falle der phys. Werteeingabe wird über die ermittelte Kennlinie auf den erforderlichen Digitalwert umgerechnet und dieser wird dann auf dem Maschinensimulator eingestellt. Da die Digitalpotentiometer lediglich über eine 8-Bit-Auflösung verfügen, ist diese Einstellung recht grob und der gemessene Wert weicht vom gewünschten Einstellwert oft ab.&lt;br /&gt;
&lt;br /&gt;
Die Kennlinienermittlung läuft automatisiert ab und dauert ca. 15 Min. Damit diese nicht versehentlich ausgelöst wird, ist sie über einen Switch zusätzlich verriegelt.&lt;br /&gt;
&lt;br /&gt;
Für den Kommunikation mit dem Maschinensimulator und der Messwertplatine ist ein jeweils 4zeiliges Statusfeld angelegt. Hier werden die zugehörigen Statusmeldungen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Programmstuktur ==&lt;br /&gt;
=== function startupFcn(app) ===&lt;br /&gt;
Wird zum Start der App durchgeführt. Hier werden alle Voreinstellungen durchgeführt, es werden die erforderlichen Kennlinien eingelesen und es wird der &amp;quot;Trace&amp;quot; vorbereitet.&lt;br /&gt;
&lt;br /&gt;
Es wird das Betriebssystem des ausführenden Host ermittelt. Allerdings erfolgt lediglich für &amp;quot;UNIX/macOS&amp;quot; eine Abarbeitung. Damit ist diese App für die Nutzung auf anderen betriebssystemen als &amp;quot;UNIX/macOS&amp;quot; noch anzupassen.&lt;br /&gt;
&lt;br /&gt;
=== function SimulatorVerbindenButtonPushed(app, event) ===&lt;br /&gt;
Der Button Simulator Verbinden führt die Funktion SimulatorVerbindenButtonPushed aus. Es wird über den ersten freien USB-Port versucht die Verbindung zum Maschinensimulator aufzubauen. Dieser Teil des Programmcodes ist individuell für &amp;quot;UNIX/macOS&amp;quot; programmiert und muss für andere Betriebssysteme noch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Zur Abarbeitung der ersten Daten vom Maschinensimulator wird die Funktion init_sim als ISR konfiguriert.&lt;br /&gt;
&lt;br /&gt;
===  function init_sim(app, ~, ~) ===&lt;br /&gt;
Zur Indentifikation des Maschinensimulators wurde auf dieser MCU die Funktion ident aufgerufen. Diese gibt die Platinenkennung zurück und es kann entschieden werden ob der Port gewechselt werden muss oder tatsächlich der Maschinensimulator angeschlossen ist. Ist der Maschinensimulator angeschlossen, erfolgt die tatsächliche Initialisierung des Maschinensimulators in der Funktion sim_initialisieren.&lt;br /&gt;
&lt;br /&gt;
=== function sim_initialisieren(app, ~, ~) ===&lt;br /&gt;
Für die Initialisierung des Maschinensimulators werden alle Digitalpotis auf Digitalwert 250 gestellt und alle Kurzschlüsse (Füllstandssimulationen) geöffnet.&lt;br /&gt;
&lt;br /&gt;
Für das weitere Interrupthandling der eingehenden Daten wird das ISR auf die Funktion sim_datenverarbeitung umgestellt.&lt;br /&gt;
&lt;br /&gt;
Als letzte Aktion in der Initialisierung wird auf der Maschinensimulator-MCU &amp;quot;import machine&amp;quot; durchegführt. Dies muss die letzte Aktion bleiben, da über die nachfolgende ISR Abarbeitung durch das Echo des Aufrufs die Betriebsbereitschaft erkannt wird. Weitere Initialisierungsschritte müssen vor diesem Aufruf eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function sim_datenverarbeitung(app, ~, ~) ===&lt;br /&gt;
Die Funktion sim_datenverarbeitung übernimmt die eigentliche Abarbeitung der von der Maxchinensimulator gesendeten Daten.&lt;br /&gt;
&lt;br /&gt;
Stand 20.05.2026 wird lediglich das Logging durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Die weitere Funktionalität muss noch hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function KalibrierungVerbindenButtonPushed(app, event) ===&lt;br /&gt;
Der Button Espressomaschine/Messplatine (Kalibrierung) Verbinden führt die Funktion KalibrierungVerbindenButtonPushed aus. Es wird über den ersten freien USB-Port versucht die Verbindung zr Messwertplatine aufzubauen. Dieser Teil des Programmcodes ist individuell für &amp;quot;UNIX/macOS&amp;quot; programmiert und muss für andere Betriebssysteme noch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Zur Abarbeitung der ersten Daten von der Messwertplatine wird die Funktion init_kal als ISR konfiguriert.&lt;br /&gt;
&lt;br /&gt;
=== function init_kal(app, ~, ~) ===&lt;br /&gt;
Zur Indentifikation der Messwertplatine wurde auf dieser MCU die Funktion ident aufgerufen. Diese gibt die Platinenkennung zurück und es kann entschieden werden ob der Port gewechselt werden muss oder tatsächlich eine Messwertplatine angeschlossen ist. Ist eine Messwertplatine angeschlossen, erfolgt die tatsächliche Initialisierung der Messwertplatine in der Funktion kal_initialisieren.&lt;br /&gt;
&lt;br /&gt;
=== function kal_initialisieren(app, ~, ~) ===&lt;br /&gt;
Für die Initialisierung der Messwertplatine wird die Anweisung &amp;quot;writeline(app.MCU_KAL, &#039;from mwp_chanMesswerte import mwp_chanMesswerte&#039;);&amp;quot; durchgeführt. Dazu muss isch auf der Messwertplatine die Datei mwp_chanMesswerte.py befinden. &lt;br /&gt;
&lt;br /&gt;
Für das weitere Interrupthandling der eingehenden Daten wird das ISR auf die Funktion kal_datenverarbeitung umgestellt.&lt;br /&gt;
&lt;br /&gt;
Als letzte Aktion in der Initialisierung wird auf der Messwertplatinen-MCU &amp;quot;import machine&amp;quot; durchegführt. Dies muss die letzte Aktion bleiben, da über die nachfolgende ISR Abarbeitung durch das Echo des Aufrufs die Betriebsbereitschaft erkannt wird. Weitere Initialisierungsschritte müssen vor diesem Aufruf eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function MesswerteErfassenButtonPushed(app, event) ==&lt;br /&gt;
Der Button Messwerte Erfassen löst die Funktion MesswerteErfassenButtonPushed aus. Darin wird die Anweisung &amp;quot;writeline(app.MCU_KAL, &#039;mwp_chanMesswerte(0)&#039;);&amp;quot; ausgeführt, was die Messung von Messwert Kanal(0) auf der Messwertplatine auslöst. Ist die Messung abgeschlossen wird der Messwert an die APP zurück gesendet und über den ISR wird die Funktion kal_datenverarbeitung ausgeführt.&lt;br /&gt;
&lt;br /&gt;
=== function kal_datenverarbeitung(app, ~, ~) ===&lt;br /&gt;
Die Funktion kal_datenverarbeitung übernimmt die Datenverarbeitung der von der Messwertplatine kommenden Daten. Ist dies ein Messwert der zu keiner Kalibrierung gehört wird der Messwert logisch und ohysikalisch verarbeitet und im entsprechenden Datenfeld ausgegeben. Es wird danach die Messung des nächsten Messwertkanals angestoßen.&lt;br /&gt;
&lt;br /&gt;
Gehört der Messwert zu einer Kalibrierdurchführung, wird dieser in die zugehörige Stelle der Kalibriermatrix eingefügt und es wird die nächst folgende Kalibrierstufe ausgeführt. Zum Abschluss der Kalibrierung wird die Kalibriermatrix abgespeichert.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
In der Übergangsphase soll der Betriebsstart der Espressomaaschine von der MATLAB®-GUI ausgelöst werden. &lt;br /&gt;
&lt;br /&gt;
Die aktuelle MATLAB®-GUI soll in eine komfortable Bedienoberfläche für Wartungs- und Einstellarbeiten überführt werden. Alle Tastenfunktionalitäten und die Vertikalhebelfunktionalität sollen über die Oberfläche durchgeführt werden können.Wie bisher soll jeder Aktor (Magnetventile, Pumpenleistung und Schrittmotorverstellungen) über die GUI ausgelöst werden können. Ebenso soll die bisherige Visualisierung der Messwerte und Schaltzustände erhalten bleiben. Dies allerdings mit einer geringeren Aktualisierungsrate. Vier Aktualisierungen je Sekunde werden als ausreichend angesehen.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4943</id>
		<title>Visualisierung und Interaktion über die MATLAB®-GUI</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4943"/>
		<updated>2026-05-20T17:40:17Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 20.05.2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 20.05.2026 - Programmgerüst der MATLAB® Maschinensimulator / Wartungs - APP =&lt;br /&gt;
Aufgrund der nichtlinearität der digitalen Potis und der Auswirkung der Schaltungstoleranzen auf den Platinen sind Kennlinien für die Übersetzung von phys. Wert der eingestellt werden soll zu Digitalwert für die Einstellung des jeweiligen Potis erforderlich. Die Ermittlung dieser Kennlinien erfordert den gelichzeitigen Betrieb von mindestens zwei MCUs an einem PC. Das ist mit Thonny nicht darstellbar. Da sich die gleiche Situation für die spätere Nutzung des Maschinensimulators ebenso ergeben wird und eine einfache Bedienung ermöglicht werden soll, ist die Entscheidung getroffen worden, dass der Maschinensimulator integraler Bestandteil der Wartungs-App wird.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Kennlinienermittlung lag noch kein Progarmmgerüst der Wartungs-App vor. Um jedoch nicht in weiteren Zeitverzug zu geraten, wurde im Zuge der Kennlinienermittlung für den Maschinensimulator das Programmgerüst für die Wartungs-App erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260520 Maschinensimulator.png|thumb|1000px|gerahmt|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
Um mit die Wartungs-App betreiben zu können und um mit dem Maschinensimulator arbeiten zu können, muss die MCU des Maschinensimulators via USB angeschlossen sein. Über den Button erfolgt der Verbindungsaufbau mit der Maschinensimulator MCU. Dieser Verbindungsaufbau ist bislang lediglich für das Betriebssystem UNIX /macOS realisiert. Für andere Betriebssysteme muss dies noch erfolgen. In der Initialisierung der Maschinensimulator MCU erfolgt auch nur jener Teil, welcher für die Bestimmung der Digitalwert-Kennlinien erforderlich ist. Insbesondere erfolgt noch nicht die UART-initialisierung und ebenso keine Weiterleitung der Token.&lt;br /&gt;
&lt;br /&gt;
Wenn der Maschinensimulator verbunden ist, wird der Verbindungsaufbau zu einer Messplatine freigegeben und es ist möglich eine MCU-Verbindung mit einer Messplatine aus der Multi-MCU-Baureihe aufzubauen. Ist die Verbindung aufgebaut kann über den Button &amp;quot;Messwerte erfassen&amp;quot; Messwertdatensätze für die jeweils 8 Messkanäle erfasst und verarbeitet werden. Um diese Art der Messwerterfassung durchführen zu können ist auf der MCU der Messplatine das Python-Programm mwp_chanMesswerte.py erforderlich, was sich in der ZIP-Datei 20260516_Simulator_Wartungs_APP.zip auf der Wiki-Seite des [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcodes] befindet. Bei jedem erfassten Messdatensatz wird aus den ermittelten Spannungswerten über die logische phys. Umrechnung oder über die erforderliche Kennlinie aus dem Spannungswert auf den phys. Wert umgerechnet. Die Werte werden in der Messwerttabelle (rechte Tabelle) als Spannungswert in [mV] und im jeweiligen phys. Messwert ausgegeben. In der linken Tabelle kann der jeweilige Simulationswert eingegeben werden. Entweder als Digitalwert oder als phys. Wert. Im falle der phys. Werteeingabe wird über die ermittelte Kennlinie auf den erforderlichen Digitalwert umgerechnet und dieser wird dann auf dem Maschinensimulator eingestellt. Da die Digitalpotentiometer lediglich über eine 8-Bit-Auflösung verfügen, ist diese Einstellung recht grob und der gemessene Wert weicht vom gewünschten Einstellwert oft ab.&lt;br /&gt;
&lt;br /&gt;
Die Kennlinienermittlung läuft automatisiert ab und dauert ca. 15 Min. Damit diese nicht versehentlich ausgelöst wird, ist sie über einen Switch zusätzlich verriegelt.&lt;br /&gt;
&lt;br /&gt;
Für den Kommunikation mit dem Maschinensimulator und der Messwertplatine ist ein jeweils 4zeiliges Statusfeld angelegt. Hier werden die zugehörigen Statusmeldungen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Programmstuktur ==&lt;br /&gt;
=== function startupFcn(app) ===&lt;br /&gt;
Wird zum Start der App durchgeführt. Hier werden alle Voreinstellungen durchgeführt, es werden die erforderlichen Kennlinien eingelesen und es wird der &amp;quot;Trace&amp;quot; vorbereitet.&lt;br /&gt;
&lt;br /&gt;
Es wird das Betriebssystem des ausführenden Host ermittelt. Allerdings erfolgt lediglich für &amp;quot;UNIX/macOS&amp;quot; eine Abarbeitung. Damit ist diese App für die Nutzung auf anderen betriebssystemen als &amp;quot;UNIX/macOS&amp;quot; noch anzupassen.&lt;br /&gt;
&lt;br /&gt;
=== function SimulatorVerbindenButtonPushed(app, event) ===&lt;br /&gt;
Der Button Simulator Verbinden führt die Funktion SimulatorVerbindenButtonPushed aus. Es wird über den ersten freien USB-Port versucht die Verbindung zum Maschinensimulator aufzubauen. Dieser Teil des Programmcodes ist individuell für &amp;quot;UNIX/macOS&amp;quot; programmiert und muss für andere Betriebssysteme noch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Zur Abarbeitung der ersten Daten vom Maschinensimulator wird die Funktion init_sim als ISR konfiguriert.&lt;br /&gt;
&lt;br /&gt;
===  function init_sim(app, ~, ~) ===&lt;br /&gt;
Zur Indentifikation des Maschinensimulators wurde auf dieser MCU die Funktion ident aufgerufen. Diese gibt die Platinenkennung zurück und es kann entschieden werden ob der Port gewechselt werden muss oder tatsächlich der Maschinensimulator angeschlossen ist. Ist der Maschinensimulator angeschlossen, erfolgt die tatsächliche Initialisierung des Maschinensimulators in der Funktion sim_initialisieren.&lt;br /&gt;
&lt;br /&gt;
=== function sim_initialisieren(app, ~, ~) ===&lt;br /&gt;
Für die Initialisierung des Maschinensimulators werden alle Digitalpotis auf Digitalwert 250 gestellt und alle Kurzschlüsse (Füllstandssimulationen) geöffnet.&lt;br /&gt;
&lt;br /&gt;
Für das weitere Interrupthandling der eingehenden Daten wird das ISR auf die Funktion sim_datenverarbeitung umgestellt.&lt;br /&gt;
&lt;br /&gt;
Als letzte Aktion in der Initialisierung wird auf der Maschinensimulator-MCU &amp;quot;import machine&amp;quot; durchegführt. Dies muss die letzte Aktion bleiben, da über die nachfolgende ISR Abarbeitung durch das Echo des Aufrufs die Betriebsbereitschaft erkannt wird. Weitere Initialisierungsschritte müssen vor diesem Aufruf eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function sim_datenverarbeitung(app, ~, ~) ===&lt;br /&gt;
Die Funktion sim_datenverarbeitung übernimmt die eigentliche Abarbeitung der von der Maxchinensimulator gesendeten Daten.&lt;br /&gt;
&lt;br /&gt;
Stand 20.05.2026 wird lediglich das Logging durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Die weitere Funktionalität muss noch hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
In der Übergangsphase soll der Betriebsstart der Espressomaaschine von der MATLAB®-GUI ausgelöst werden. &lt;br /&gt;
&lt;br /&gt;
Die aktuelle MATLAB®-GUI soll in eine komfortable Bedienoberfläche für Wartungs- und Einstellarbeiten überführt werden. Alle Tastenfunktionalitäten und die Vertikalhebelfunktionalität sollen über die Oberfläche durchgeführt werden können.Wie bisher soll jeder Aktor (Magnetventile, Pumpenleistung und Schrittmotorverstellungen) über die GUI ausgelöst werden können. Ebenso soll die bisherige Visualisierung der Messwerte und Schaltzustände erhalten bleiben. Dies allerdings mit einer geringeren Aktualisierungsrate. Vier Aktualisierungen je Sekunde werden als ausreichend angesehen.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4942</id>
		<title>Visualisierung und Interaktion über die MATLAB®-GUI</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Visualisierung_und_Interaktion_%C3%BCber_die_MATLAB%C2%AE-GUI&amp;diff=4942"/>
		<updated>2026-05-20T17:08:21Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 20.05.2026 =&lt;br /&gt;
Aufgrund der nichtlinearität der digitalen Potis und der Auswirkung der Schaltungstoleranzen auf den Platinen sind Kennlinien für die Übersetzung von phys. Wert der eingestellt werden soll zu Digitalwert für die Einstellung des jeweiligen Potis erforderlich. Die Ermittlung dieser Kennlinien erfordert den gelichzeitigen Betrieb von mindestens zwei MCUs an einem PC. Das ist mit Thonny nicht darstellbar. Da sich die gleiche Situation für die spätere Nutzung des Maschinensimulators ebenso ergeben wird und eine einfache Bedienung ermöglicht werden soll, ist die Entscheidung getroffen worden, dass der Maschinensimulator integraler Bestandteil der Wartungs-App wird.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Kennlinienermittlung lag noch kein Progarmmgerüst der Wartungs-App vor. Um jedoch nicht in weiteren Zeitverzug zu geraten, wurde im Zuge der Kennlinienermittlung für den Maschinensimulator das Programmgerüst für die Wartungs-App erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260520 Maschinensimulator.png|thumb|1000px|gerahmt|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
Um mit die Wartungs-App betreiben zu können und um mit dem Maschinensimulator arbeiten zu können, muss die MCU des Maschinensimulators via USB angeschlossen sein. Über den Button erfolgt der Verbindungsaufbau mit der Maschinensimulator MCU. Dieser Verbindungsaufbau ist bislang lediglich für das Betriebssystem UNIX /macOS realisiert. Für andere Betriebssysteme muss dies noch erfolgen. In der Initialisierung der Maschinensimulator MCU erfolgt auch nur jener Teil, welcher für die Bestimmung der Digitalwert-Kennlinien erforderlich ist. Insbesondere erfolgt noch nicht die UART-initialisierung und ebenso keine Weiterleitung der Token.&lt;br /&gt;
&lt;br /&gt;
Wenn der Maschinensimulator verbunden ist, wird der Verbindungsaufbau zu einer Messplatine freigegeben und es ist möglich eine MCU-Verbindung mit einer Messplatine aus der Multi-MCU-Baureihe aufzubauen. Ist die Verbindung aufgebaut kann über den Button &amp;quot;Messwerte erfassen&amp;quot; Messwertdatensätze für die jeweils 8 Messkanäle erfasst und verarbeitet werden. Um diese Art der Messwerterfassung durchführen zu können ist auf der MCU der Messplatine das Python-Programm mwp_chanMesswerte.py erforderlich, was sich in der ZIP-Datei 20260516_Simulator_Wartungs_APP.zip auf der Wiki-Seite des [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcodes] befindet. Bei jedem erfassten Messdatensatz wird aus den ermittelten Spannungswerten über die logische phys. Umrechnung oder über die erforderliche Kennlinie aus dem Spannungswert auf den phys. Wert umgerechnet. Die Werte werden in der Messwerttabelle (rechte Tabelle) als Spannungswert in [mV] und im jeweiligen phys. Messwert ausgegeben. In der linken Tabelle kann der jeweilige Simulationswert eingegeben werden. Entweder als Digitalwert oder als phys. Wert. Im falle der phys. Werteeingabe wird über die ermittelte Kennlinie auf den erforderlichen Digitalwert umgerechnet und dieser wird dann auf dem Maschinensimulator eingestellt. Da die Digitalpotentiometer lediglich über eine 8-Bit-Auflösung verfügen, ist diese Einstellung recht grob und der gemessene Wert weicht vom gewünschten Einstellwert oft ab.&lt;br /&gt;
&lt;br /&gt;
Die Kennlinienermittlung läuft automatisiert ab und dauert ca. 15 Min. Damit diese nicht versehentlich ausgelöst wird, ist sie über einen Switch zusätzlich verriegelt.&lt;br /&gt;
&lt;br /&gt;
Für den Kommunikation mit dem Maschinensimulator und der Messwertplatine ist ein jeweils 4zeiliges Statusfeld angelegt. Hier werden die zugehörigen Statusmeldungen angezeigt.&lt;br /&gt;
&lt;br /&gt;
== Programmstuktur ==&lt;br /&gt;
=== function startupFcn(app) ===&lt;br /&gt;
Wird zum Start der App durchgeführt. Hier werden alle Voreinstellungen durchgeführt, es werden die erforderlichen Kennlinien eingelesen und es wird der &amp;quot;Trace&amp;quot; vorbereitet.&lt;br /&gt;
&lt;br /&gt;
Es wird das Betriebssystem des ausführenden Host ermittelt. Allerdings erfolgt lediglich für &amp;quot;UNIX/macOS&amp;quot; eine Abarbeitung. Damit ist diese App für die Nutzung auf anderen betriebssystemen als &amp;quot;UNIX/macOS&amp;quot; noch anzupassen.&lt;br /&gt;
&lt;br /&gt;
=== function SimulatorVerbindenButtonPushed(app, event) ===&lt;br /&gt;
Der Button Simulator Verbinden führt die Funktion SimulatorVerbindenButtonPushed aus. Es wird über den ersten freien USB-Port versucht die Verbindung zum Maschinensimulator aufzubauen. Dieser Teil des Programmcodes ist individuell für &amp;quot;UNIX/macOS&amp;quot; programmiert und muss für andere Betriebssysteme noch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Zur Abarbeitung der ersten Daten vom Maschinensimulator wird die Funktion init_sim als ISR konfiguriert.&lt;br /&gt;
&lt;br /&gt;
===  function init_sim(app, ~, ~) ===&lt;br /&gt;
Zur Indentifikation des Maschinensimulators wurde auf dieser MCU die Funktion ident aufgerufen. Diese gibt die Platinenkennung zurück und es kann entschieden werden ob der Port gewechselt werden muss oder tatsächlich der Maschinensimulator angeschlossen ist. Ist der Maschinensimulator angeschlossen, erfolgt die tatsächliche Initialisierung des Maschinensimulators in der Funktion sim_initialisieren.&lt;br /&gt;
&lt;br /&gt;
=== function sim_initialisieren(app, ~, ~) ===&lt;br /&gt;
Für die Initialisierung des Maschinensimulators werden alle Digitalpotis auf Digitalwert 250 gestellt und alle Kurzschlüsse (Füllstandssimulationen) geöffnet.&lt;br /&gt;
&lt;br /&gt;
Für das weitere Interrupthandling der eingehenden Daten wird das ISR auf die Funktion sim_datenverarbeitung umgestellt.&lt;br /&gt;
&lt;br /&gt;
Als letzte Aktion in der Initialisierung wird auf der Maschinensimulator-MCU &amp;quot;import machine&amp;quot; durchegführt. Dies muss die letzte Aktion bleiben, da über die nachfolgende ISR Abarbeitung durch das Echo des Aufrufs die Betriebsbereitschaft erkannt wird. Weitere Initialisierungsschritte müssen vor diesem Aufruf eingefügt werden.&lt;br /&gt;
&lt;br /&gt;
=== function sim_datenverarbeitung(app, ~, ~) ===&lt;br /&gt;
Die Funktion sim_datenverarbeitung übernimmt die eigentliche Abarbeitung der von der Maxchinensimulator gesendeten Daten.&lt;br /&gt;
&lt;br /&gt;
Stand 20.05.2026 wird lediglich das Logging durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Die weitere Funktionalität muss noch hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 11.04.2024 =&lt;br /&gt;
In der Übergangsphase soll der Betriebsstart der Espressomaaschine von der MATLAB®-GUI ausgelöst werden. &lt;br /&gt;
&lt;br /&gt;
Die aktuelle MATLAB®-GUI soll in eine komfortable Bedienoberfläche für Wartungs- und Einstellarbeiten überführt werden. Alle Tastenfunktionalitäten und die Vertikalhebelfunktionalität sollen über die Oberfläche durchgeführt werden können.Wie bisher soll jeder Aktor (Magnetventile, Pumpenleistung und Schrittmotorverstellungen) über die GUI ausgelöst werden können. Ebenso soll die bisherige Visualisierung der Messwerte und Schaltzustände erhalten bleiben. Dies allerdings mit einer geringeren Aktualisierungsrate. Vier Aktualisierungen je Sekunde werden als ausreichend angesehen.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4941</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4941"/>
		<updated>2026-05-20T16:51:32Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 70 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 30 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Felix Kerner|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || Tillmann Haas|| 1 || 30 ||08.05.2026&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || Tillmann Haas|| 1 || 30 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || Tillmann Haas|| 1 || 10 ||10.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || Tillmann Haas|| 1 || 10 ||08.07.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4940</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4940"/>
		<updated>2026-05-20T16:50:58Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 70 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 30 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Felix Kerner|| 1 || 30 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 10 ||22.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || Tillmann Haas|| 1 || 30 ||08.05.2026&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || Tillmann Haas|| 1 || 30 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || Tillmann Haas|| 1 || 10 ||10.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || Tillmann Haas|| 1 || 10 ||08.07.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator&amp;diff=4939</id>
		<title>Maschinensimulator</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator&amp;diff=4939"/>
		<updated>2026-05-20T16:50:02Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 20.05.2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 20.05.2026 =&lt;br /&gt;
Aufgrund der nichtlinearität der digitalen Potis und der Auswirkung der Schaltungstoleranzen auf den Platinen sind Kennlinien für die Übersetzung von phys. Wert der eingestellt werden soll zu Digitalwert für die Einstellung des jeweiligen Potis erforderlich. Die Ermittlung dieser Kennlinien erfordert den gelichzeitigen Betrieb von mindestens zwei MCUs an einem PC. Das ist mit Thonny nicht darstellbar. Da sich die gleiche Situation für die spätere Nutzung des Maschinensimulators ebenso ergeben wird und eine einfache Bedienung ermöglicht werden soll, ist die Entscheidung getroffen worden, dass der Maschinensimulator integraler Bestandteil der Wartungs-App wird.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Kennlinienermittlung lag noch kein Progarmmgerüst der Wartungs-App vor. Um jedoch nicht in weiteren Zeitverzug zu geraten, wurde im Zuge der Kennlinienermittlung für den Maschinensimulator das Programmgerüst für die Wartungs-App erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260520 Maschinensimulator.png|thumb|1000px|gerahmt|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
Um mit die Wartungs-App betreiben zu können und um mit dem Maschinensimulator arbeiten zu können, muss die MCU des Maschinensimulators via USB angeschlossen sein. Über den Button erfolgt der Verbindungsaufbau mit der Maschinensimulator MCU. Dieser Verbindungsaufbau ist bislang lediglich für das Betriebssystem UNIX /macOS realisiert. Für andere Betriebssysteme muss dies noch erfolgen. In der Initialisierung der Maschinensimulator MCU erfolgt auch nur jener Teil, welcher für die Bestimmung der Digitalwert-Kennlinien erforderlich ist. Insbesondere erfolgt noch nicht die UART-initialisierung und ebenso keine Weiterleitung der Token.&lt;br /&gt;
&lt;br /&gt;
Wenn der Maschinensimulator verbunden ist, wird der Verbindungsaufbau zu einer Messplatine freigegeben und es ist möglich eine MCU-Verbindung mit einer Messplatine aus der Multi-MCU-Baureihe aufzubauen. Ist die Verbindung aufgebaut kann über den Button &amp;quot;Messwerte erfassen&amp;quot; Messwertdatensätze für die jeweils 8 Messkanäle erfasst und verarbeitet werden. Um diese Art der Messwerterfassung durchführen zu können ist auf der MCU der Messplatine das Python-Programm mwp_chanMesswerte.py erforderlich, was sich in der ZIP-Datei 20260516_Simulator_Wartungs_APP.zip auf der Wiki-Seite des [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcodes] befindet. Bei jedem erfassten Messdatensatz wird aus den ermittelten Spannungswerten über die logische phys. Umrechnung oder über die erforderliche Kennlinie aus dem Spannungswert auf den phys. Wert umgerechnet. Die Werte werden in der Messwerttabelle (rechte Tabelle) als Spannungswert in [mV] und im jeweiligen phys. Messwert ausgegeben. In der linken Tabelle kann der jeweilige Simulationswert eingegeben werden. Entweder als Digitalwert oder als phys. Wert. Im falle der phys. Werteeingabe wird über die ermittelte Kennlinie auf den erforderlichen Digitalwert umgerechnet und dieser wird dann auf dem Maschinensimulator eingestellt. Da die Digitalpotentiometer lediglich über eine 8-Bit-Auflösung verfügen, ist diese Einstellung recht grob und der gemessene Wert weicht vom gewünschten Einstellwert oft ab.&lt;br /&gt;
&lt;br /&gt;
Die Kennlinienermittlung läuft automatisiert ab und dauert ca. 15 Min. Damit diese nicht versehentlich ausgelöst wird, ist sie über einen Switch zusätzlich verriegelt.&lt;br /&gt;
&lt;br /&gt;
Für den Kommunikation mit dem Maschinensimulator und der Messwertplatine ist ein jeweils 4zeiliges Statusfeld angelegt. Hier werden die zugehörigen Statusmeldungen angezeigt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 02.02.2026 - Simulation von Temperatur- und Druckwerten =&lt;br /&gt;
== Einleitung und Zielsetzung==&lt;br /&gt;
Ziel ist die Simulation physikalischer Größen (Temperatur, Druck) gegenüber einer zu testenden Steuerungselektronik. Die physikalischen Sollwerte werden dabei in elektrische Signale umgewandelt, die von der Hardware (Digital-Potentiometer MCP4151) ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Problemstellung und Lösungsansatz==&lt;br /&gt;
Die eingesetzten Digital-Potentiometer (MCP4151) zeigen in der realen Beschaltung ein nicht-lineares Übertragungsverhalten Zudem variieren die Kennlinien der in der Kaffeemaschine verbauten Sensoren je nach Einsatzort (unterschiedliche Druckbereiche, verschiedene NTC-Beta-Werte). Des Weiteren besteht bei der Spannungssimulation (Kanäle 4–7) die Gefahr von Kurzschlüssen in den Randbereichen der Potentiometerstellung.&lt;br /&gt;
&lt;br /&gt;
Um eine präzise Simulation physikalischer Werte zu ermöglichen, wurde ein Software-Modell implementiert, das folgende Komponenten umfasst:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfigurierbare physikalische Modellierung:&#039;&#039;&#039; Abstraktion verschiedener Sensortypen durch hinterlegte Kennlinien-Profile (z. B. 4 bar vs. 16 bar Sensoren).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linearisierung:&#039;&#039;&#039; Kompensation der Hardware-Nichtlinearität des Potentiometers durch empirisch ermittelte Stützstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sicherheitslogik:&#039;&#039;&#039; Automatische Begrenzung der elektrischen Ausgabewerte zum Schutz der Hardware vor Kurzschlüssen.&lt;br /&gt;
&lt;br /&gt;
==Implementierungsdetails ==&lt;br /&gt;
&lt;br /&gt;
===Simulation der Temperatursensoren (NTC)===&lt;br /&gt;
Die Simulation von NTC-Sensoren erfolgt auf den Kanälen 0 bis 3. Um unterschiedliche Sensortypen an verschiedenen Kanälen simulieren zu können, wurde eine dynamische Zuordnung implementiert. Die Umrechnung der Temperatur T (in °C) in den Widerstand R erfolgt mittels der vereinfachten Steinhart-Hart-Gleichung (Beta-Parameter-Gleichung):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R(T) = R_0 \cdot e^{B \cdot (\frac{1}{T} - \frac{1}{T_0})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktuell implementierte Sensortypen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Standard-NTC (Typ 1):&#039;&#039;&#039; 𝑅&amp;lt;sub&amp;gt;25&amp;lt;/sub&amp;gt; = 10𝑘Ω ,𝐵 = 3977K&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tabellen-basierter NTC (Typ 2):&#039;&#039;&#039; Für Sensoren, deren Kennlinie nur tabellarisch vorlag, wurde ein optimierter Beta-Wert von B = 3964K errechnet. Dieser Wert erlaubt die Nutzung der Exponentialgleichung anstelle eines Lookup-Tables.&lt;br /&gt;
&lt;br /&gt;
Der berechnete Widerstandswert wird anschließend durch die Interpolationsfunktion in den korrekten Digitalwert für den MCP4151 übersetzt.&lt;br /&gt;
&lt;br /&gt;
===Linearisierung durch Interpolation===&lt;br /&gt;
Da keine geschlossene mathematische Funktion für das Verhalten der beschalteten Potentiometer vorliegt, wird eine Look-Up Table (LUT) mit linearer Interpolation verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus prüft, zwischen welchen zwei Stützstellen (P1 , P2 ) der angeforderte physikalische Wert (P&amp;lt;sub&amp;gt;target&amp;lt;/sub&amp;gt;) liegt und berechnet den zugehörigen digitalen Steuerwert (D&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D_{out} = D_1 + \frac{P_{target} - P_1}{P_2 - P_1} \cdot (D_2 - D_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Logik ist in der internen Funktion _interpolate() implementiert.&lt;br /&gt;
&lt;br /&gt;
Die Stützstellen basieren auf Messreihen des realen Aufbaus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Widerstandssimulation (NTC):&#039;&#039;&#039; 6 Stützstellen im Bereich 96 Ω bis 9180 Ω&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spannungssimulation:&#039;&#039;&#039; 5 Stützstellen im Bereich 144 mV bis 4060 mV&lt;br /&gt;
&lt;br /&gt;
===Simulation analoger Spannungssensoren ===&lt;br /&gt;
Für Drucksensoren (Kanäle 4–7) wird der MCP4151 als Spannungsteiler betrieben.&lt;br /&gt;
&lt;br /&gt;
Die Umrechnung von Druck p (bar) in Spannung U (Volt) berücksichtigt den sensorspezifischen Maximaldruck p&amp;lt;sub&amp;gt;𝑚𝑎𝑥&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{target} = U_{offset} + \frac{p}{p_{max}} \cdot (U_{max} - U_{min})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der digitale Stellwert darf den Bereich [50, 250] nicht verlassen, um Kurzschlüsse gegen 5V oder GND zu vermeiden. Dies wird durch die Kalibrierungstabelle TABLE_VOLT sichergestellt, die nur Werte in diesem sicheren Fenster definiert. Anforderungen außerhalb dieses Bereichs werden durch die Interpolationslogik automatisch auf die definierten Grenzwerte (ca. 0,14 V bis 4,06 V) begrenzt.&lt;br /&gt;
&lt;br /&gt;
===Robustheit (Defensive Programmierung)===&lt;br /&gt;
Zur Vermeidung von Laufzeitfehlern auf dem Mikrocontroller wird der finale Ausgabewert vor der Übergabe an das SPI-Interface auf den gültigen Byte-Wertebereich begrenzt:&lt;br /&gt;
&lt;br /&gt;
value = max(0, min(255, int(value)))&lt;br /&gt;
&lt;br /&gt;
Dies verhindert, dass Berechnungsfehler oder Überläufe einen Programmabsturz verursachen könnten.&lt;br /&gt;
&lt;br /&gt;
==Funktionsnutzung==&lt;br /&gt;
Über die folgenden Funktionen sollen Druck und Temperatur simuliert werden:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;set_temperature(ch, temp_celsius)&#039;&#039;&#039;&lt;br /&gt;
**Beschreibung: Simuliert einen NTC-Sensor am angegebenen Kanal. Die Funktion ermittelt anhand der Konfiguration (SENSOR_ASSIGNMENT), welcher Sensortyp (B-Wert, Nennwiderstand) für diesen Kanal verwendet werden soll.&lt;br /&gt;
**Parameter: ch (Kanal 0-3), temp_celsius (Zieltemperatur in Celsius).&lt;br /&gt;
**Rückgabe: Berechneter Widerstand in Ohm (für Debugging).&lt;br /&gt;
*&#039;&#039;&#039;set_pressure(ch, pressure_bar)&#039;&#039;&#039; &lt;br /&gt;
**Beschreibung: Simuliert einen Drucksensor. Die Funktion lädt die Kennlinie (z. B. 4 bar oder 16 bar Max-Druck) für den gewählten Kanal, berechnet die analoge Zielspannung und setzt das Potentiometer entsprechend. Beinhaltet automatische Begrenzung auf den sicheren Hardwarebereich.&lt;br /&gt;
**Parameter: ch (Kanal 4-7), pressure_bar (Zieldruck in bar).&lt;br /&gt;
**Rückgabe: Berechnete Zielspannung in Volt (für Debugging).&lt;br /&gt;
*&#039;&#039;&#039;set_poti(ch, value)&#039;&#039;&#039;&lt;br /&gt;
**Beschreibung: Low-Level Zugriff zum direkten Setzen des Digitalwertes (0- 255). Umgeht die physikalischen Modelle. Sollte nur für Debugging-Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==Weiteres Vorgehen==&lt;br /&gt;
Als nächsten Schritt müssen die simulierten Temperatur- und Druckwerte validiert werden und bei Bedarf die Berechnung weiter verfeinert werden. Zusätzlich muss überprüft werden, ob die Widerstände zum Schalten der Füllstände ausreichen.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 29.10.2025 - Funktionstest MCP4151 (digitaler Widerstand)=&lt;br /&gt;
Über den Programmcode&lt;br /&gt;
&lt;br /&gt;
    def set_poti(ch, value): &amp;lt;br&amp;gt;&lt;br /&gt;
        if not 0 &amp;lt;= ch &amp;lt; len(cs):&amp;lt;br&amp;gt;&lt;br /&gt;
            raise ValueError(&#039;Ungültiger Kanal (0–7)&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
        if not 0 &amp;lt;= value &amp;lt;= 255:&amp;lt;br&amp;gt;&lt;br /&gt;
            raise ValueError(&#039;Wert muss zwischen 0 und 255 liegen&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
        cs[ch].value(0)&amp;lt;br&amp;gt;&lt;br /&gt;
        spi.write(bytearray([CMD_WRITE &amp;lt;&amp;lt; 4, value]))&amp;lt;br&amp;gt;&lt;br /&gt;
        cs[ch].value(1)&amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
    spi = SPI(0, baudrate=400000, sck=Pin(2), mosi=Pin(3), miso=Pin(4))&amp;lt;br&amp;gt;&lt;br /&gt;
    cs = [Pin(pin, Pin.OUT, value=1) for pin in (5, 6, 7, 8, 9, 10, 11, 12)]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
werden die Widerstandswerte für die einzelnen simulierten Sensoren eingestellt. Konkret führt die Anweisung&lt;br /&gt;
&lt;br /&gt;
    set_poti(ch, value)&lt;br /&gt;
&lt;br /&gt;
zur Verstellung des Widerstandswertes im MCP4151. Darin ist ch die Kanalnummer (0 bis 7) und value der Digitalwet ( 0 bis 255).&lt;br /&gt;
&lt;br /&gt;
Für die Kanäle 0 bis 3 wird über den Widerstandswert jeweils ein NTC simuliert. Die Abhängigkeit ist jedoch nicht linear.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Wertetabelle für den simulierten NTC-Widerstand&lt;br /&gt;
|-&lt;br /&gt;
!Digitalwert!!Widerstand in Ohm&lt;br /&gt;
|-&lt;br /&gt;
|0||96&lt;br /&gt;
|-&lt;br /&gt;
|50||1550&lt;br /&gt;
|-&lt;br /&gt;
|100||3740&lt;br /&gt;
|-&lt;br /&gt;
|150||5490&lt;br /&gt;
|-&lt;br /&gt;
|200||7240&lt;br /&gt;
|-&lt;br /&gt;
|255||9180&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Zusammenhang zwischen Digitalwert und simulierte Temperatur muss noch ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Für die Kanäle 4 bis 7 wird der MCP4151 als Spannungsteiler mit einer Speisespannung von 5 V eingesetzt. Dies simuliert einen analogen Sensorwert in einem Spannungsbereich von 0 bis 5 V. Allerdings darf der Spannungsendwert 5 V nicht angesteuert werden, dies würde u. U. zu einem Kurzschluss führen. Der Nutzbare digitale Wertebereich liegt hier zwischen 50 und 250. Damit bleibt auf jeder Seite des Spannungsteilers immer ein Restwiderstand, welcher den Stromfluss hinreichend begrenzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Aufgrund des nichtlinearen Widerstandsverlaufs ergibt sich ein ebenso nichtlinearer Spannungsverlauf.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Wertetabelle für den simulierten Sensorwert (Spannung)&lt;br /&gt;
|-&lt;br /&gt;
!Digitalwert!!Spannung in mV&lt;br /&gt;
|-&lt;br /&gt;
|50||4060&lt;br /&gt;
|-&lt;br /&gt;
|100||3740&lt;br /&gt;
|-&lt;br /&gt;
|150||2102&lt;br /&gt;
|-&lt;br /&gt;
|200||1122&lt;br /&gt;
|-&lt;br /&gt;
|255||144&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Zusammenhang zwischen Digitalwert und dem zu simulierenden Sensorwert muss noch ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 29.10.2025 - Schaltungsaufbau=&lt;br /&gt;
Der Schaltplan für den Maschinensimulator ist soweit erstellt. Inhaltlich fehlt die Transistorfolgeschaltung für die Simulation des Flowmetersignals.&amp;lt;br&amp;gt;&lt;br /&gt;
Aktuell wird die Funktionalität des MCP4151-103E/P getestet. Dabei stellt sich heraus, dass sich der Widerstandswert nicht linear zum Einstellwert verhällt. Im Weiteren wurde festgestellt, dass auf dem Breadboard das erforderliche Durchschleifen der SPI-Schnittstelle nicht funktioniert. Damit ist bereits für die schnelle Übergangslösung eine gelötete Platine erforderlich.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 19.10.2025 - Konzept des Maschinensimulators=&lt;br /&gt;
Für die Steuerungselektronik besteht die Siebträger Espressomaschine aus Messwerten. Dies sind in der aktuellen Form&lt;br /&gt;
*4 NTC Temperatursensoren mit 10 kOhm&lt;br /&gt;
*2 Druckmesswerte im Spannungsbereich 0,5 bis 4,5 V&lt;br /&gt;
*Leitwert und Temperatur des zufließenden Wassers im Spannungsbereich 0 bis 5 V&lt;br /&gt;
*Flowmeter mit 39,9 Impulsen je ccm&lt;br /&gt;
*4 Füllstandssensoren über Kurzschlussdetektion&lt;br /&gt;
&lt;br /&gt;
Angedacht ist eine Hardware herzustellen, welche diese Messwerte simuliert.&lt;br /&gt;
&lt;br /&gt;
Bei dem Bauelement MCP4151-103E/P handelt es sich um ein digitales 10 kOhm Potentiometer welches als Spannungsteiler eingesetzt werden kann und über SPI programmiert wird. Dieses Bauelement soll dazu dienen den Wiederstandswert der NTCs zu simmulieren und als Spannungsteiler die Druckmesswerte, Leitwert und Wassereingangstemperatur zu generieren.&lt;br /&gt;
&lt;br /&gt;
Der Kurzschluss für die Füllstandssensoren soll über das Bauelement DG 411 DJZ und das Flowmeter über eine Transistorschaltung erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Als Steuerung ist eine Raspberry Pi Pico MCU vorgesenen die u.U. mit einer übergeordneten MATLAB-GUI bedient werden kann. Für die Widerstandsabhängigen Sensorsimulationen wird eine SPI-Schnittstelle und insgesamt 8 PINs für CS benötigt. Die Kurzschlusserzeugung der Füllstandssensoren erfordert 4 PINs digital I/O und das Flowmetersignal einen PIN mit PWM-Signal.&lt;br /&gt;
&lt;br /&gt;
Es ist zu überlegen, ob der Simulator mit in den Kommunikations-Ring des Systems eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
Der Maschinensimulator wird zunächst auf einem Breadboard realisiert um nach erfolgreichem Test die Schaltung in ein Platinenlayout zu überführen.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator&amp;diff=4938</id>
		<title>Maschinensimulator</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator&amp;diff=4938"/>
		<updated>2026-05-20T16:40:27Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 20.05.2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 20.05.2026 =&lt;br /&gt;
Aufgrund der nichtlinearität der digitalen Potis und der Auswirkung der Schaltungstoleranzen auf den Platinen sind Kennlinien für die Übersetzung von phys. Wert der eingestellt werden soll zu Digitalwert für die Einstellung des jeweiligen Potis erforderlich. Die Ermittlung dieser Kennlinien erfordert den gelichzeitigen Betrieb von mindestens zwei MCUs an einem PC. Das ist mit Thonny nicht darstellbar. Da sich die gleiche Situation für die spätere Nutzung des Maschinensimulators ebenso ergeben wird und eine einfache Bedienung ermöglicht werden soll, ist die Entscheidung getroffen worden, dass der Maschinensimulator integraler Bestandteil der Wartungs-App wird.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Kennlinienermittlung lag noch kein Progarmmgerüst der Wartungs-App vor. Um jedoch nicht in weiteren Zeitverzug zu geraten, wurde im Zuge der Kennlinienermittlung für den Maschinensimulator das Programmgerüst für die Wartungs-App erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260520 Maschinensimulator.png|thumb|1000px|gerahmt|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
Um mit die Wartungs-App betreiben zu können und um mit dem Maschinensimulator arbeiten zu können, muss die MCU des Maschinensimulators via USB angeschlossen sein. Über den Button erfolgt der Verbindungsaufbau mit der Maschinensimulator MCU. Dieser Verbindungsaufbau ist bislang lediglich für das Betriebssystem UNIX /macOS realisiert. Für andere Betriebssysteme muss dies noch erfolgen. In der Initialisierung der Maschinensimulator MCU erfolgt auch nur jener Teil, welcher für die Bestimmung der Digitalwert-Kennlinien erforderlich ist. Insbesondere erfolgt noch nicht die UART-initialisierung und ebenso keine Weiterleitung der Token.&lt;br /&gt;
&lt;br /&gt;
Wenn der Maschinensimulator verbunden ist, wird der Verbindungsaufbau zu einer Messplatine freigegeben und es ist möglich eine MCU-Verbindung mit einer Messplatine aus der Multi-MCU-Baureihe aufzubauen. Ist die Verbindung aufgebaut kann über den Button &amp;quot;Messwerte erfassen&amp;quot; Messwertdatensätze für die jeweils 8 Messkanäle erfasst und verarbeitet werden. Um diese Art der Messwerterfassung durchführen zu können ist auf der MCU der Messplatine das Python-Programm mwp_chanMesswerte.py erforderlich, was sich in der ZIP-Datei 20260516_Simulator_Wartungs_APP.zip auf der Wiki-Seite des [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcodes] befindet. Bei jedem erfassten Messdatensatz wird aus den ermittelten Spannungswerten über die logische phys. Umrechnung oder über die erforderliche Kennlinie aus dem Spannungswert auf den phys. Wert umgerechnet. Die Werte werden in der Messwerttabelle (rechte Tabelle) als Spannungswert in [mV] und im jeweiligen phys. Messwert ausgegeben. In der linken Tabelle kann der jeweilige Simulationswert eingegeben werden. Entweder als Digitalwert oder als phys. Wert. Im falle der phys. Werteeingabe wird über die ermittelte Kennlinie auf den erforderlichen Digitalwert umgerechnet und dieser wird dann auf dem Maschinensimulator eingestellt. Da die Digitalpotentiometer lediglich über eine 8-Bit-Auflösung verfügen, ist diese Einstellung recht grob und der gemessene Wert weicht vom gewünschten Einstellwert oft ab.&lt;br /&gt;
&lt;br /&gt;
Die Kennlinienermittlung läuft automatisiert ab und dauert ca. 15 Min. Damit diese nicht versehentlich ausgelöst wird, ist sie über einen Switch zusätzlich verriegelt.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 02.02.2026 - Simulation von Temperatur- und Druckwerten =&lt;br /&gt;
== Einleitung und Zielsetzung==&lt;br /&gt;
Ziel ist die Simulation physikalischer Größen (Temperatur, Druck) gegenüber einer zu testenden Steuerungselektronik. Die physikalischen Sollwerte werden dabei in elektrische Signale umgewandelt, die von der Hardware (Digital-Potentiometer MCP4151) ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Problemstellung und Lösungsansatz==&lt;br /&gt;
Die eingesetzten Digital-Potentiometer (MCP4151) zeigen in der realen Beschaltung ein nicht-lineares Übertragungsverhalten Zudem variieren die Kennlinien der in der Kaffeemaschine verbauten Sensoren je nach Einsatzort (unterschiedliche Druckbereiche, verschiedene NTC-Beta-Werte). Des Weiteren besteht bei der Spannungssimulation (Kanäle 4–7) die Gefahr von Kurzschlüssen in den Randbereichen der Potentiometerstellung.&lt;br /&gt;
&lt;br /&gt;
Um eine präzise Simulation physikalischer Werte zu ermöglichen, wurde ein Software-Modell implementiert, das folgende Komponenten umfasst:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfigurierbare physikalische Modellierung:&#039;&#039;&#039; Abstraktion verschiedener Sensortypen durch hinterlegte Kennlinien-Profile (z. B. 4 bar vs. 16 bar Sensoren).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linearisierung:&#039;&#039;&#039; Kompensation der Hardware-Nichtlinearität des Potentiometers durch empirisch ermittelte Stützstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sicherheitslogik:&#039;&#039;&#039; Automatische Begrenzung der elektrischen Ausgabewerte zum Schutz der Hardware vor Kurzschlüssen.&lt;br /&gt;
&lt;br /&gt;
==Implementierungsdetails ==&lt;br /&gt;
&lt;br /&gt;
===Simulation der Temperatursensoren (NTC)===&lt;br /&gt;
Die Simulation von NTC-Sensoren erfolgt auf den Kanälen 0 bis 3. Um unterschiedliche Sensortypen an verschiedenen Kanälen simulieren zu können, wurde eine dynamische Zuordnung implementiert. Die Umrechnung der Temperatur T (in °C) in den Widerstand R erfolgt mittels der vereinfachten Steinhart-Hart-Gleichung (Beta-Parameter-Gleichung):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R(T) = R_0 \cdot e^{B \cdot (\frac{1}{T} - \frac{1}{T_0})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktuell implementierte Sensortypen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Standard-NTC (Typ 1):&#039;&#039;&#039; 𝑅&amp;lt;sub&amp;gt;25&amp;lt;/sub&amp;gt; = 10𝑘Ω ,𝐵 = 3977K&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tabellen-basierter NTC (Typ 2):&#039;&#039;&#039; Für Sensoren, deren Kennlinie nur tabellarisch vorlag, wurde ein optimierter Beta-Wert von B = 3964K errechnet. Dieser Wert erlaubt die Nutzung der Exponentialgleichung anstelle eines Lookup-Tables.&lt;br /&gt;
&lt;br /&gt;
Der berechnete Widerstandswert wird anschließend durch die Interpolationsfunktion in den korrekten Digitalwert für den MCP4151 übersetzt.&lt;br /&gt;
&lt;br /&gt;
===Linearisierung durch Interpolation===&lt;br /&gt;
Da keine geschlossene mathematische Funktion für das Verhalten der beschalteten Potentiometer vorliegt, wird eine Look-Up Table (LUT) mit linearer Interpolation verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus prüft, zwischen welchen zwei Stützstellen (P1 , P2 ) der angeforderte physikalische Wert (P&amp;lt;sub&amp;gt;target&amp;lt;/sub&amp;gt;) liegt und berechnet den zugehörigen digitalen Steuerwert (D&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D_{out} = D_1 + \frac{P_{target} - P_1}{P_2 - P_1} \cdot (D_2 - D_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Logik ist in der internen Funktion _interpolate() implementiert.&lt;br /&gt;
&lt;br /&gt;
Die Stützstellen basieren auf Messreihen des realen Aufbaus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Widerstandssimulation (NTC):&#039;&#039;&#039; 6 Stützstellen im Bereich 96 Ω bis 9180 Ω&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spannungssimulation:&#039;&#039;&#039; 5 Stützstellen im Bereich 144 mV bis 4060 mV&lt;br /&gt;
&lt;br /&gt;
===Simulation analoger Spannungssensoren ===&lt;br /&gt;
Für Drucksensoren (Kanäle 4–7) wird der MCP4151 als Spannungsteiler betrieben.&lt;br /&gt;
&lt;br /&gt;
Die Umrechnung von Druck p (bar) in Spannung U (Volt) berücksichtigt den sensorspezifischen Maximaldruck p&amp;lt;sub&amp;gt;𝑚𝑎𝑥&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{target} = U_{offset} + \frac{p}{p_{max}} \cdot (U_{max} - U_{min})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der digitale Stellwert darf den Bereich [50, 250] nicht verlassen, um Kurzschlüsse gegen 5V oder GND zu vermeiden. Dies wird durch die Kalibrierungstabelle TABLE_VOLT sichergestellt, die nur Werte in diesem sicheren Fenster definiert. Anforderungen außerhalb dieses Bereichs werden durch die Interpolationslogik automatisch auf die definierten Grenzwerte (ca. 0,14 V bis 4,06 V) begrenzt.&lt;br /&gt;
&lt;br /&gt;
===Robustheit (Defensive Programmierung)===&lt;br /&gt;
Zur Vermeidung von Laufzeitfehlern auf dem Mikrocontroller wird der finale Ausgabewert vor der Übergabe an das SPI-Interface auf den gültigen Byte-Wertebereich begrenzt:&lt;br /&gt;
&lt;br /&gt;
value = max(0, min(255, int(value)))&lt;br /&gt;
&lt;br /&gt;
Dies verhindert, dass Berechnungsfehler oder Überläufe einen Programmabsturz verursachen könnten.&lt;br /&gt;
&lt;br /&gt;
==Funktionsnutzung==&lt;br /&gt;
Über die folgenden Funktionen sollen Druck und Temperatur simuliert werden:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;set_temperature(ch, temp_celsius)&#039;&#039;&#039;&lt;br /&gt;
**Beschreibung: Simuliert einen NTC-Sensor am angegebenen Kanal. Die Funktion ermittelt anhand der Konfiguration (SENSOR_ASSIGNMENT), welcher Sensortyp (B-Wert, Nennwiderstand) für diesen Kanal verwendet werden soll.&lt;br /&gt;
**Parameter: ch (Kanal 0-3), temp_celsius (Zieltemperatur in Celsius).&lt;br /&gt;
**Rückgabe: Berechneter Widerstand in Ohm (für Debugging).&lt;br /&gt;
*&#039;&#039;&#039;set_pressure(ch, pressure_bar)&#039;&#039;&#039; &lt;br /&gt;
**Beschreibung: Simuliert einen Drucksensor. Die Funktion lädt die Kennlinie (z. B. 4 bar oder 16 bar Max-Druck) für den gewählten Kanal, berechnet die analoge Zielspannung und setzt das Potentiometer entsprechend. Beinhaltet automatische Begrenzung auf den sicheren Hardwarebereich.&lt;br /&gt;
**Parameter: ch (Kanal 4-7), pressure_bar (Zieldruck in bar).&lt;br /&gt;
**Rückgabe: Berechnete Zielspannung in Volt (für Debugging).&lt;br /&gt;
*&#039;&#039;&#039;set_poti(ch, value)&#039;&#039;&#039;&lt;br /&gt;
**Beschreibung: Low-Level Zugriff zum direkten Setzen des Digitalwertes (0- 255). Umgeht die physikalischen Modelle. Sollte nur für Debugging-Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==Weiteres Vorgehen==&lt;br /&gt;
Als nächsten Schritt müssen die simulierten Temperatur- und Druckwerte validiert werden und bei Bedarf die Berechnung weiter verfeinert werden. Zusätzlich muss überprüft werden, ob die Widerstände zum Schalten der Füllstände ausreichen.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 29.10.2025 - Funktionstest MCP4151 (digitaler Widerstand)=&lt;br /&gt;
Über den Programmcode&lt;br /&gt;
&lt;br /&gt;
    def set_poti(ch, value): &amp;lt;br&amp;gt;&lt;br /&gt;
        if not 0 &amp;lt;= ch &amp;lt; len(cs):&amp;lt;br&amp;gt;&lt;br /&gt;
            raise ValueError(&#039;Ungültiger Kanal (0–7)&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
        if not 0 &amp;lt;= value &amp;lt;= 255:&amp;lt;br&amp;gt;&lt;br /&gt;
            raise ValueError(&#039;Wert muss zwischen 0 und 255 liegen&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
        cs[ch].value(0)&amp;lt;br&amp;gt;&lt;br /&gt;
        spi.write(bytearray([CMD_WRITE &amp;lt;&amp;lt; 4, value]))&amp;lt;br&amp;gt;&lt;br /&gt;
        cs[ch].value(1)&amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
    spi = SPI(0, baudrate=400000, sck=Pin(2), mosi=Pin(3), miso=Pin(4))&amp;lt;br&amp;gt;&lt;br /&gt;
    cs = [Pin(pin, Pin.OUT, value=1) for pin in (5, 6, 7, 8, 9, 10, 11, 12)]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
werden die Widerstandswerte für die einzelnen simulierten Sensoren eingestellt. Konkret führt die Anweisung&lt;br /&gt;
&lt;br /&gt;
    set_poti(ch, value)&lt;br /&gt;
&lt;br /&gt;
zur Verstellung des Widerstandswertes im MCP4151. Darin ist ch die Kanalnummer (0 bis 7) und value der Digitalwet ( 0 bis 255).&lt;br /&gt;
&lt;br /&gt;
Für die Kanäle 0 bis 3 wird über den Widerstandswert jeweils ein NTC simuliert. Die Abhängigkeit ist jedoch nicht linear.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Wertetabelle für den simulierten NTC-Widerstand&lt;br /&gt;
|-&lt;br /&gt;
!Digitalwert!!Widerstand in Ohm&lt;br /&gt;
|-&lt;br /&gt;
|0||96&lt;br /&gt;
|-&lt;br /&gt;
|50||1550&lt;br /&gt;
|-&lt;br /&gt;
|100||3740&lt;br /&gt;
|-&lt;br /&gt;
|150||5490&lt;br /&gt;
|-&lt;br /&gt;
|200||7240&lt;br /&gt;
|-&lt;br /&gt;
|255||9180&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Zusammenhang zwischen Digitalwert und simulierte Temperatur muss noch ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Für die Kanäle 4 bis 7 wird der MCP4151 als Spannungsteiler mit einer Speisespannung von 5 V eingesetzt. Dies simuliert einen analogen Sensorwert in einem Spannungsbereich von 0 bis 5 V. Allerdings darf der Spannungsendwert 5 V nicht angesteuert werden, dies würde u. U. zu einem Kurzschluss führen. Der Nutzbare digitale Wertebereich liegt hier zwischen 50 und 250. Damit bleibt auf jeder Seite des Spannungsteilers immer ein Restwiderstand, welcher den Stromfluss hinreichend begrenzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Aufgrund des nichtlinearen Widerstandsverlaufs ergibt sich ein ebenso nichtlinearer Spannungsverlauf.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Wertetabelle für den simulierten Sensorwert (Spannung)&lt;br /&gt;
|-&lt;br /&gt;
!Digitalwert!!Spannung in mV&lt;br /&gt;
|-&lt;br /&gt;
|50||4060&lt;br /&gt;
|-&lt;br /&gt;
|100||3740&lt;br /&gt;
|-&lt;br /&gt;
|150||2102&lt;br /&gt;
|-&lt;br /&gt;
|200||1122&lt;br /&gt;
|-&lt;br /&gt;
|255||144&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Zusammenhang zwischen Digitalwert und dem zu simulierenden Sensorwert muss noch ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 29.10.2025 - Schaltungsaufbau=&lt;br /&gt;
Der Schaltplan für den Maschinensimulator ist soweit erstellt. Inhaltlich fehlt die Transistorfolgeschaltung für die Simulation des Flowmetersignals.&amp;lt;br&amp;gt;&lt;br /&gt;
Aktuell wird die Funktionalität des MCP4151-103E/P getestet. Dabei stellt sich heraus, dass sich der Widerstandswert nicht linear zum Einstellwert verhällt. Im Weiteren wurde festgestellt, dass auf dem Breadboard das erforderliche Durchschleifen der SPI-Schnittstelle nicht funktioniert. Damit ist bereits für die schnelle Übergangslösung eine gelötete Platine erforderlich.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 19.10.2025 - Konzept des Maschinensimulators=&lt;br /&gt;
Für die Steuerungselektronik besteht die Siebträger Espressomaschine aus Messwerten. Dies sind in der aktuellen Form&lt;br /&gt;
*4 NTC Temperatursensoren mit 10 kOhm&lt;br /&gt;
*2 Druckmesswerte im Spannungsbereich 0,5 bis 4,5 V&lt;br /&gt;
*Leitwert und Temperatur des zufließenden Wassers im Spannungsbereich 0 bis 5 V&lt;br /&gt;
*Flowmeter mit 39,9 Impulsen je ccm&lt;br /&gt;
*4 Füllstandssensoren über Kurzschlussdetektion&lt;br /&gt;
&lt;br /&gt;
Angedacht ist eine Hardware herzustellen, welche diese Messwerte simuliert.&lt;br /&gt;
&lt;br /&gt;
Bei dem Bauelement MCP4151-103E/P handelt es sich um ein digitales 10 kOhm Potentiometer welches als Spannungsteiler eingesetzt werden kann und über SPI programmiert wird. Dieses Bauelement soll dazu dienen den Wiederstandswert der NTCs zu simmulieren und als Spannungsteiler die Druckmesswerte, Leitwert und Wassereingangstemperatur zu generieren.&lt;br /&gt;
&lt;br /&gt;
Der Kurzschluss für die Füllstandssensoren soll über das Bauelement DG 411 DJZ und das Flowmeter über eine Transistorschaltung erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Als Steuerung ist eine Raspberry Pi Pico MCU vorgesenen die u.U. mit einer übergeordneten MATLAB-GUI bedient werden kann. Für die Widerstandsabhängigen Sensorsimulationen wird eine SPI-Schnittstelle und insgesamt 8 PINs für CS benötigt. Die Kurzschlusserzeugung der Füllstandssensoren erfordert 4 PINs digital I/O und das Flowmetersignal einen PIN mit PWM-Signal.&lt;br /&gt;
&lt;br /&gt;
Es ist zu überlegen, ob der Simulator mit in den Kommunikations-Ring des Systems eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
Der Maschinensimulator wird zunächst auf einem Breadboard realisiert um nach erfolgreichem Test die Schaltung in ein Platinenlayout zu überführen.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator&amp;diff=4937</id>
		<title>Maschinensimulator</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator&amp;diff=4937"/>
		<updated>2026-05-20T16:16:19Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 20.05.2026 =&lt;br /&gt;
Aufgrund der nichtlinearität der digitalen Potis und der Auswirkung der Schaltungstoleranzen auf den Platinen sind Kennlinien für die Übersetzung von phys. Wert der eingestellt werden soll zu Digitalwert für die Einstellung des jeweiligen Potis erforderlich. Die Ermittlung dieser Kennlinien erfordert den gelichzeitigen Betrieb von mindestens zwei MCUs an einem PC. Das ist mit Thonny nicht darstellbar. Da sich die gleiche Situation für die spätere Nutzung des Maschinensimulators ebenso ergeben wird und eine einfache Bedienung ermöglicht werden soll, ist die Entscheidung getroffen worden, dass der Maschinensimulator integraler Bestandteil der Wartungs-App wird.&lt;br /&gt;
&lt;br /&gt;
Zum Zeitpunkt der Kennlinienermittlung lag noch kein Progarmmgerüst der Wartungs-App vor. Um jedoch nicht in weiteren Zeitverzug zu geraten, wurde im Zuge der Kennlinienermittlung für den Maschinensimulator das Programmgerüst für die Wartungs-App erstellt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260520 Maschinensimulator.png|thumb|1000px|gerahmt|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 02.02.2026 - Simulation von Temperatur- und Druckwerten =&lt;br /&gt;
== Einleitung und Zielsetzung==&lt;br /&gt;
Ziel ist die Simulation physikalischer Größen (Temperatur, Druck) gegenüber einer zu testenden Steuerungselektronik. Die physikalischen Sollwerte werden dabei in elektrische Signale umgewandelt, die von der Hardware (Digital-Potentiometer MCP4151) ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Problemstellung und Lösungsansatz==&lt;br /&gt;
Die eingesetzten Digital-Potentiometer (MCP4151) zeigen in der realen Beschaltung ein nicht-lineares Übertragungsverhalten Zudem variieren die Kennlinien der in der Kaffeemaschine verbauten Sensoren je nach Einsatzort (unterschiedliche Druckbereiche, verschiedene NTC-Beta-Werte). Des Weiteren besteht bei der Spannungssimulation (Kanäle 4–7) die Gefahr von Kurzschlüssen in den Randbereichen der Potentiometerstellung.&lt;br /&gt;
&lt;br /&gt;
Um eine präzise Simulation physikalischer Werte zu ermöglichen, wurde ein Software-Modell implementiert, das folgende Komponenten umfasst:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konfigurierbare physikalische Modellierung:&#039;&#039;&#039; Abstraktion verschiedener Sensortypen durch hinterlegte Kennlinien-Profile (z. B. 4 bar vs. 16 bar Sensoren).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Linearisierung:&#039;&#039;&#039; Kompensation der Hardware-Nichtlinearität des Potentiometers durch empirisch ermittelte Stützstellen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sicherheitslogik:&#039;&#039;&#039; Automatische Begrenzung der elektrischen Ausgabewerte zum Schutz der Hardware vor Kurzschlüssen.&lt;br /&gt;
&lt;br /&gt;
==Implementierungsdetails ==&lt;br /&gt;
&lt;br /&gt;
===Simulation der Temperatursensoren (NTC)===&lt;br /&gt;
Die Simulation von NTC-Sensoren erfolgt auf den Kanälen 0 bis 3. Um unterschiedliche Sensortypen an verschiedenen Kanälen simulieren zu können, wurde eine dynamische Zuordnung implementiert. Die Umrechnung der Temperatur T (in °C) in den Widerstand R erfolgt mittels der vereinfachten Steinhart-Hart-Gleichung (Beta-Parameter-Gleichung):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R(T) = R_0 \cdot e^{B \cdot (\frac{1}{T} - \frac{1}{T_0})}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aktuell implementierte Sensortypen:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Standard-NTC (Typ 1):&#039;&#039;&#039; 𝑅&amp;lt;sub&amp;gt;25&amp;lt;/sub&amp;gt; = 10𝑘Ω ,𝐵 = 3977K&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tabellen-basierter NTC (Typ 2):&#039;&#039;&#039; Für Sensoren, deren Kennlinie nur tabellarisch vorlag, wurde ein optimierter Beta-Wert von B = 3964K errechnet. Dieser Wert erlaubt die Nutzung der Exponentialgleichung anstelle eines Lookup-Tables.&lt;br /&gt;
&lt;br /&gt;
Der berechnete Widerstandswert wird anschließend durch die Interpolationsfunktion in den korrekten Digitalwert für den MCP4151 übersetzt.&lt;br /&gt;
&lt;br /&gt;
===Linearisierung durch Interpolation===&lt;br /&gt;
Da keine geschlossene mathematische Funktion für das Verhalten der beschalteten Potentiometer vorliegt, wird eine Look-Up Table (LUT) mit linearer Interpolation verwendet.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus prüft, zwischen welchen zwei Stützstellen (P1 , P2 ) der angeforderte physikalische Wert (P&amp;lt;sub&amp;gt;target&amp;lt;/sub&amp;gt;) liegt und berechnet den zugehörigen digitalen Steuerwert (D&amp;lt;sub&amp;gt;out&amp;lt;/sub&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;D_{out} = D_1 + \frac{P_{target} - P_1}{P_2 - P_1} \cdot (D_2 - D_1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Logik ist in der internen Funktion _interpolate() implementiert.&lt;br /&gt;
&lt;br /&gt;
Die Stützstellen basieren auf Messreihen des realen Aufbaus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Widerstandssimulation (NTC):&#039;&#039;&#039; 6 Stützstellen im Bereich 96 Ω bis 9180 Ω&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spannungssimulation:&#039;&#039;&#039; 5 Stützstellen im Bereich 144 mV bis 4060 mV&lt;br /&gt;
&lt;br /&gt;
===Simulation analoger Spannungssensoren ===&lt;br /&gt;
Für Drucksensoren (Kanäle 4–7) wird der MCP4151 als Spannungsteiler betrieben.&lt;br /&gt;
&lt;br /&gt;
Die Umrechnung von Druck p (bar) in Spannung U (Volt) berücksichtigt den sensorspezifischen Maximaldruck p&amp;lt;sub&amp;gt;𝑚𝑎𝑥&amp;lt;/sub&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;U_{target} = U_{offset} + \frac{p}{p_{max}} \cdot (U_{max} - U_{min})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der digitale Stellwert darf den Bereich [50, 250] nicht verlassen, um Kurzschlüsse gegen 5V oder GND zu vermeiden. Dies wird durch die Kalibrierungstabelle TABLE_VOLT sichergestellt, die nur Werte in diesem sicheren Fenster definiert. Anforderungen außerhalb dieses Bereichs werden durch die Interpolationslogik automatisch auf die definierten Grenzwerte (ca. 0,14 V bis 4,06 V) begrenzt.&lt;br /&gt;
&lt;br /&gt;
===Robustheit (Defensive Programmierung)===&lt;br /&gt;
Zur Vermeidung von Laufzeitfehlern auf dem Mikrocontroller wird der finale Ausgabewert vor der Übergabe an das SPI-Interface auf den gültigen Byte-Wertebereich begrenzt:&lt;br /&gt;
&lt;br /&gt;
value = max(0, min(255, int(value)))&lt;br /&gt;
&lt;br /&gt;
Dies verhindert, dass Berechnungsfehler oder Überläufe einen Programmabsturz verursachen könnten.&lt;br /&gt;
&lt;br /&gt;
==Funktionsnutzung==&lt;br /&gt;
Über die folgenden Funktionen sollen Druck und Temperatur simuliert werden:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;set_temperature(ch, temp_celsius)&#039;&#039;&#039;&lt;br /&gt;
**Beschreibung: Simuliert einen NTC-Sensor am angegebenen Kanal. Die Funktion ermittelt anhand der Konfiguration (SENSOR_ASSIGNMENT), welcher Sensortyp (B-Wert, Nennwiderstand) für diesen Kanal verwendet werden soll.&lt;br /&gt;
**Parameter: ch (Kanal 0-3), temp_celsius (Zieltemperatur in Celsius).&lt;br /&gt;
**Rückgabe: Berechneter Widerstand in Ohm (für Debugging).&lt;br /&gt;
*&#039;&#039;&#039;set_pressure(ch, pressure_bar)&#039;&#039;&#039; &lt;br /&gt;
**Beschreibung: Simuliert einen Drucksensor. Die Funktion lädt die Kennlinie (z. B. 4 bar oder 16 bar Max-Druck) für den gewählten Kanal, berechnet die analoge Zielspannung und setzt das Potentiometer entsprechend. Beinhaltet automatische Begrenzung auf den sicheren Hardwarebereich.&lt;br /&gt;
**Parameter: ch (Kanal 4-7), pressure_bar (Zieldruck in bar).&lt;br /&gt;
**Rückgabe: Berechnete Zielspannung in Volt (für Debugging).&lt;br /&gt;
*&#039;&#039;&#039;set_poti(ch, value)&#039;&#039;&#039;&lt;br /&gt;
**Beschreibung: Low-Level Zugriff zum direkten Setzen des Digitalwertes (0- 255). Umgeht die physikalischen Modelle. Sollte nur für Debugging-Zwecke genutzt werden.&lt;br /&gt;
&lt;br /&gt;
==Weiteres Vorgehen==&lt;br /&gt;
Als nächsten Schritt müssen die simulierten Temperatur- und Druckwerte validiert werden und bei Bedarf die Berechnung weiter verfeinert werden. Zusätzlich muss überprüft werden, ob die Widerstände zum Schalten der Füllstände ausreichen.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 29.10.2025 - Funktionstest MCP4151 (digitaler Widerstand)=&lt;br /&gt;
Über den Programmcode&lt;br /&gt;
&lt;br /&gt;
    def set_poti(ch, value): &amp;lt;br&amp;gt;&lt;br /&gt;
        if not 0 &amp;lt;= ch &amp;lt; len(cs):&amp;lt;br&amp;gt;&lt;br /&gt;
            raise ValueError(&#039;Ungültiger Kanal (0–7)&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
        if not 0 &amp;lt;= value &amp;lt;= 255:&amp;lt;br&amp;gt;&lt;br /&gt;
            raise ValueError(&#039;Wert muss zwischen 0 und 255 liegen&#039;)&amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
        cs[ch].value(0)&amp;lt;br&amp;gt;&lt;br /&gt;
        spi.write(bytearray([CMD_WRITE &amp;lt;&amp;lt; 4, value]))&amp;lt;br&amp;gt;&lt;br /&gt;
        cs[ch].value(1)&amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;br&amp;gt;&lt;br /&gt;
    spi = SPI(0, baudrate=400000, sck=Pin(2), mosi=Pin(3), miso=Pin(4))&amp;lt;br&amp;gt;&lt;br /&gt;
    cs = [Pin(pin, Pin.OUT, value=1) for pin in (5, 6, 7, 8, 9, 10, 11, 12)]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
werden die Widerstandswerte für die einzelnen simulierten Sensoren eingestellt. Konkret führt die Anweisung&lt;br /&gt;
&lt;br /&gt;
    set_poti(ch, value)&lt;br /&gt;
&lt;br /&gt;
zur Verstellung des Widerstandswertes im MCP4151. Darin ist ch die Kanalnummer (0 bis 7) und value der Digitalwet ( 0 bis 255).&lt;br /&gt;
&lt;br /&gt;
Für die Kanäle 0 bis 3 wird über den Widerstandswert jeweils ein NTC simuliert. Die Abhängigkeit ist jedoch nicht linear.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Wertetabelle für den simulierten NTC-Widerstand&lt;br /&gt;
|-&lt;br /&gt;
!Digitalwert!!Widerstand in Ohm&lt;br /&gt;
|-&lt;br /&gt;
|0||96&lt;br /&gt;
|-&lt;br /&gt;
|50||1550&lt;br /&gt;
|-&lt;br /&gt;
|100||3740&lt;br /&gt;
|-&lt;br /&gt;
|150||5490&lt;br /&gt;
|-&lt;br /&gt;
|200||7240&lt;br /&gt;
|-&lt;br /&gt;
|255||9180&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Zusammenhang zwischen Digitalwert und simulierte Temperatur muss noch ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
Für die Kanäle 4 bis 7 wird der MCP4151 als Spannungsteiler mit einer Speisespannung von 5 V eingesetzt. Dies simuliert einen analogen Sensorwert in einem Spannungsbereich von 0 bis 5 V. Allerdings darf der Spannungsendwert 5 V nicht angesteuert werden, dies würde u. U. zu einem Kurzschluss führen. Der Nutzbare digitale Wertebereich liegt hier zwischen 50 und 250. Damit bleibt auf jeder Seite des Spannungsteilers immer ein Restwiderstand, welcher den Stromfluss hinreichend begrenzt.&amp;lt;br&amp;gt;&lt;br /&gt;
Aufgrund des nichtlinearen Widerstandsverlaufs ergibt sich ein ebenso nichtlinearer Spannungsverlauf.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Wertetabelle für den simulierten Sensorwert (Spannung)&lt;br /&gt;
|-&lt;br /&gt;
!Digitalwert!!Spannung in mV&lt;br /&gt;
|-&lt;br /&gt;
|50||4060&lt;br /&gt;
|-&lt;br /&gt;
|100||3740&lt;br /&gt;
|-&lt;br /&gt;
|150||2102&lt;br /&gt;
|-&lt;br /&gt;
|200||1122&lt;br /&gt;
|-&lt;br /&gt;
|255||144&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Der Zusammenhang zwischen Digitalwert und dem zu simulierenden Sensorwert muss noch ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 29.10.2025 - Schaltungsaufbau=&lt;br /&gt;
Der Schaltplan für den Maschinensimulator ist soweit erstellt. Inhaltlich fehlt die Transistorfolgeschaltung für die Simulation des Flowmetersignals.&amp;lt;br&amp;gt;&lt;br /&gt;
Aktuell wird die Funktionalität des MCP4151-103E/P getestet. Dabei stellt sich heraus, dass sich der Widerstandswert nicht linear zum Einstellwert verhällt. Im Weiteren wurde festgestellt, dass auf dem Breadboard das erforderliche Durchschleifen der SPI-Schnittstelle nicht funktioniert. Damit ist bereits für die schnelle Übergangslösung eine gelötete Platine erforderlich.&lt;br /&gt;
&lt;br /&gt;
=Armin Rohnen, 19.10.2025 - Konzept des Maschinensimulators=&lt;br /&gt;
Für die Steuerungselektronik besteht die Siebträger Espressomaschine aus Messwerten. Dies sind in der aktuellen Form&lt;br /&gt;
*4 NTC Temperatursensoren mit 10 kOhm&lt;br /&gt;
*2 Druckmesswerte im Spannungsbereich 0,5 bis 4,5 V&lt;br /&gt;
*Leitwert und Temperatur des zufließenden Wassers im Spannungsbereich 0 bis 5 V&lt;br /&gt;
*Flowmeter mit 39,9 Impulsen je ccm&lt;br /&gt;
*4 Füllstandssensoren über Kurzschlussdetektion&lt;br /&gt;
&lt;br /&gt;
Angedacht ist eine Hardware herzustellen, welche diese Messwerte simuliert.&lt;br /&gt;
&lt;br /&gt;
Bei dem Bauelement MCP4151-103E/P handelt es sich um ein digitales 10 kOhm Potentiometer welches als Spannungsteiler eingesetzt werden kann und über SPI programmiert wird. Dieses Bauelement soll dazu dienen den Wiederstandswert der NTCs zu simmulieren und als Spannungsteiler die Druckmesswerte, Leitwert und Wassereingangstemperatur zu generieren.&lt;br /&gt;
&lt;br /&gt;
Der Kurzschluss für die Füllstandssensoren soll über das Bauelement DG 411 DJZ und das Flowmeter über eine Transistorschaltung erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Als Steuerung ist eine Raspberry Pi Pico MCU vorgesenen die u.U. mit einer übergeordneten MATLAB-GUI bedient werden kann. Für die Widerstandsabhängigen Sensorsimulationen wird eine SPI-Schnittstelle und insgesamt 8 PINs für CS benötigt. Die Kurzschlusserzeugung der Füllstandssensoren erfordert 4 PINs digital I/O und das Flowmetersignal einen PIN mit PWM-Signal.&lt;br /&gt;
&lt;br /&gt;
Es ist zu überlegen, ob der Simulator mit in den Kommunikations-Ring des Systems eingebunden wird.&lt;br /&gt;
&lt;br /&gt;
Der Maschinensimulator wird zunächst auf einem Breadboard realisiert um nach erfolgreichem Test die Schaltung in ein Platinenlayout zu überführen.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260520_Maschinensimulator.png&amp;diff=4936</id>
		<title>Datei:20260520 Maschinensimulator.png</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260520_Maschinensimulator.png&amp;diff=4936"/>
		<updated>2026-05-20T16:15:23Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Maschinensimulator APP&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4931</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4931"/>
		<updated>2026-05-08T10:49:57Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Initialisierung der Maschinensteuerung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 angelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich zu sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Mikrocontroller_Programmierung_in_MicroPython_SoSe_2026&amp;diff=4930</id>
		<title>Mikrocontroller Programmierung in MicroPython SoSe 2026</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Mikrocontroller_Programmierung_in_MicroPython_SoSe_2026&amp;diff=4930"/>
		<updated>2026-05-08T10:00:41Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Besprechungsprotokolle und weitere Unterlagen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;https://vg07.met.vgwort.de/na/3e58d840a91b42ac97ee493cdd085245&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Mikrocontroller Programmierung in MicroPython Sommersemester 2026 =&lt;br /&gt;
Für die Projekte zur labortechnischen Espressomaschine (und weiteren Derivaten) ist die Mikrokontroller-Programmierung einer Steuerungselektronik erforderlich.&lt;br /&gt;
&lt;br /&gt;
Die Programmierung der Mikrocontroller erfolgt in MicroPython und die übergeordnete Steuerung ist eine MATLAB®-APP mit einem Prozessschaubild. Die Grundfunktionalität dieses Vorgehensweise ist in der Quellenliste unter [40] (MATLAB® meets MicroPython) beschrieben.&lt;br /&gt;
&lt;br /&gt;
Das Projekt wurde bereits durch eine Projektgruppe bearbeitet und hat einen Projektstand, der jedoch noch nicht die gesamte erforderliche Steuerungsfunktionalität umfasst.&lt;br /&gt;
&lt;br /&gt;
Es wird angestrebt eine Steuerung auf Basis eines Nucleo STM32H743ZI2 zu erstellen. Dies würde die aktuell drei Steuerungsplatinen und Mikrocontroller auf einen reduzieren. Kommunikation wäre dann lediglich zum Displaycontroller erforderlich.&lt;br /&gt;
&lt;br /&gt;
= Aufgabenanalyse =&lt;br /&gt;
==UART-Kommunikation==&lt;br /&gt;
Es soll eine Stern-Topologie implementiert werden, welche die UART-Kommunikation&lt;br /&gt;
zu einem separaten Display-Controller, dem Maschinensimulator und der Wartungs-&lt;br /&gt;
App herstellt. Dabei sind Sende- und Empfangs-Token für das Display, die Wartungs-App und den Maschinensimulator einzuführen. Es gilt dabei, den Umfang und Takt der&lt;br /&gt;
neuen Token festzulegen.&lt;br /&gt;
&lt;br /&gt;
==Mehrkernnutzung und/oder Multitasking==&lt;br /&gt;
&lt;br /&gt;
Es gibt bestimmte Vorgänge, welche regelmäßig zur Unterbrechung des Pro-&lt;br /&gt;
grammablaufs führen. Es gilt, diese Vorgänge zu identifizieren und umzuleiten,&lt;br /&gt;
damit diese den Programmablauf nicht mehr unterbrechen. Die Möglichkeit&lt;br /&gt;
der Mehrkernnutzung fällt dabei aus, da der STM32H753ZI nur über einen&lt;br /&gt;
M7-Kern verfügt. Dank der Hardware-Unterstützung DMA sowie der Nutzung&lt;br /&gt;
der uasyncio-Library besteht die Möglichkeit, die Vorgänge umzuleiten. Somit&lt;br /&gt;
können die Unterbrechungen des Programmablaufs reduziert werden.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator ==&lt;br /&gt;
Die Hauptaufgabe des Maschinensimulators ist die Nachbildung aller Sensordaten der Kaffeemaschine. Dies ermöglicht die Programmentwicklung der Steuerungselektronik ohne die reale Hardware. Die für die Simulation benötigte Hardware ist bereits rudimentär vorhanden, muss aber für einen zuverlässigen und störungsfreien Betrieb optimiert werden. Zudem muss für die Umsetzung der Durchflusssimulation noch eine entsprechende Hardware-Modellierung erfolgen. Softwareseitig ist der Python-Code für die Datengenerierung größtenteils fertiggestellt [http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Maschinensimulator &amp;lt;nowiki&amp;gt;[ToDo Maschinensimulator - Funktionsnutzung]&amp;lt;/nowiki&amp;gt;]. Es fehlen aktuell noch die Flowmetersimulation sowie die Aufheizsimulation, welche für die Validierung der Druck- und Temperaturregelung benötigt wird. Die vom Maschinensimulator gelieferten Temperatur- und Druckwerte müssen validiert werden. Dabei soll ein bereits bekannter Messfehler bei den Temperaturwerten durch die Anpassung der Einstellwerte behoben werden. Für den Programmablauf des Simulators wird eine MATLAB®-App entwickelt, die parallel zum Ablauf des STM32 arbeitet. Für die UART-Kommunikation in der Sterntopologie zwischen dem Maschinensimulator und dem STM32 müssen zudem spezifische Sende- und Empfangs- Token implementiert sowie deren Taktung und Datenumfang definiert werden. Zusätzlich wird ein Gateway als Kommunikationsschnittstelle zwischen dem Maschinensimulator und der Wartungs-App implementiert. Des Weiteren muss während der Ausarbeitung des Maschinensimulators eine Projektfortschrittsdokumentation erfolgen. Die Ausarbeitung erfolgt in einem ein- bis zweiwöchigen Turnus.&lt;br /&gt;
&lt;br /&gt;
== Füllstandsregler ==&lt;br /&gt;
Die Füllstandsregelung erkennt den Füllstand über eine Kurzschlussdetektion. Liegt kein &lt;br /&gt;
Kurzschluss vor, wird dies als zu niedriger Füllstand interpretiert und der Boilerdruckregler &lt;br /&gt;
zur Vermeidung von Trockenheizen gesperrt. Beim Erreichen des Sollfüllstands erfolgt eine &lt;br /&gt;
gezielte Überfüllung bei reduzierter Pumpenspannung, um ein periodisches Ein- und &lt;br /&gt;
Ausschalten der Regelung zu vermeiden. Da die in der MATLAB®-GUI realisierte Boiler Füllstandsregelung aus [114] bereits in einem ersten Stand in MicroPython übertragen &lt;br /&gt;
wurde, liegt der Fokus hier auf der Validierung am Maschinensimulator sowie der &lt;br /&gt;
Abstimmung mit den Schnittstellenpartnern.&lt;br /&gt;
&lt;br /&gt;
== Boilerdruckregelung ==&lt;br /&gt;
Ziel ist es, die bisher in der MATLAB®-GUI realisierte Boilerdruckregelung aus [114], die auf &lt;br /&gt;
einem PD-Regler basiert, vollständig zu übertragen, sodass die Regelung unabhängig von der &lt;br /&gt;
externen PC-Umgebung arbeitet.&lt;br /&gt;
&lt;br /&gt;
== Mischtemperaturregler ==&lt;br /&gt;
Der Mischtemperaturregler nach [114] dient zur Regelung der Kaffee- und &lt;br /&gt;
Teewassertemperatur und wird als PID-Regler für das Mischventil umgesetzt. Die Stellgröße &lt;br /&gt;
ist dabei die Verstellung des Mischventils. Der Temperatursollwert wird aus dem jeweils &lt;br /&gt;
aktiven Rezept vorgegeben. Da die Regelung vom aktuellen Durchfluss abhängt, wird eine &lt;br /&gt;
Kaskadenstruktur verwendet. In dieser Struktur arbeitet der Durchflussregler als innerer, &lt;br /&gt;
schneller Regelkreis, während der Mischtemperaturregler den äußeren Regelkreis bildet und &lt;br /&gt;
die Ergebnisse des inneren Kreises berücksichtigt. Daraus ergibt sich ein besonderes &lt;br /&gt;
Augenmerk auf das Testen des Zusammenspiels der beiden Regler anhand des &lt;br /&gt;
Maschinensimulators, um das Ziel – die Implementierung dieser Kaskadenregelung auf dem &lt;br /&gt;
STM32 – zu erreichen.&lt;br /&gt;
&lt;br /&gt;
== Durchflussregler ==&lt;br /&gt;
Ein Durchflussregler, der in MATLAB® gemäß [114] vorliegt, wird als PID-Regler in &lt;br /&gt;
MicroPython umgesetzt. Durch die Anpassung der Pumpendrehzahl über einen &lt;br /&gt;
Spannungssollwert von 0–5 V kann ein konstanter oder ein profildefinierter Volumenstrom &lt;br /&gt;
entsprechend der Sollwertvorgabe realisiert werden. Als innerer Regelkreis liefert er &lt;br /&gt;
kontinuierlich Durchflusswerte an den Mischtemperaturregler. Daraus ergibt sich der Fokus &lt;br /&gt;
auf der Implementierung und dem Test des Reglers sowie auf der Validierung seines &lt;br /&gt;
Zusammenspiels mit dem übergeordneten Mischtemperaturregler im Maschinensimulator, &lt;br /&gt;
um die Integration auf dem STM32 sicherzustellen.&lt;br /&gt;
&lt;br /&gt;
== Startprozedur ==&lt;br /&gt;
Das Ziel ist es, eine Startprozedur zu definieren. Beim Einschalten der Stromversorgung starten die Prozessoren der Maschine. Ohne eine festgelegte Ablauflogik würden die einzelnen Systemteile jedoch unkoordiniert anlaufen. Daraus ergibt sich der technische Bedarf, eine eindeutige Reihenfolge für den Start festzulegen und die zugehörigen Ausgaben auf dem Display so zu definieren, dass der Startprozess nachvollziehbar verfolgt werden kann.&lt;br /&gt;
&lt;br /&gt;
Dafür müssen zunächst die relevanten Inhalte der Startprozedur identifiziert werden. Außerdem sind die beteiligten Schnittstellen zu erkennen und die Reihenfolge der einzelnen Startschritte so festzulegen, dass ein geordneter und technisch sinnvoller Maschinenstart möglich ist.&lt;br /&gt;
&lt;br /&gt;
== Display ==&lt;br /&gt;
Ziel ist eine kompakte und benutzerfreundliche Displaylösung, die sich nahtlos in das Gesamtsystem integriert. Das Display mit Touchfunktion dient als Schnittstelle zur Interaktion zwischen Bediener und Maschine. Messwerte müssen strukturiert darzustellen sowie die Auswahl von Funktionen wie Kaffeerezepten, Teewasser- oder Dampfbezug zu ermöglichen. Zusätzlich übernimmt das Display die Visualisierung der Startprozedur, relevanter Betriebszustände und der Sicherheitsfunktionen.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die benötigten Funktionalitäten analysiert und definiert, darunter Messwertanzeige, Benutzerführung und Sicherheitsmeldungen. Parallel dazu werden drei unterschiedliche Displaytypen (rundes Display, LCD2 und 1,69Display) auf ihre Eignung hin untersucht, um anschließend die, am besten passende, Variante auszuwählen. Die MCU der Displayplatine erhält die benötigten Informationen über die UART-Kommunikation aus dem System und muss in die bestehende Gesamtarchitektur integriert werden. Der Vertikalhebel dient zur Vorgabe von Sollwerten, während die beiden Anschlagtaster die Funktionen Kaffeebezug und Flush beziehungsweise Reinigung auslösen. Diese Bedienelemente sind mit der Displayplatine zu verbinden, damit das Display die zugehörigen Informationen und Zustände für den Benutzer darstellen kann.&lt;br /&gt;
&lt;br /&gt;
== STM32 ==&lt;br /&gt;
Als Haupt-MCU soll ein STM32H753ZI-Controller verwendet werden. Es soll sichergestellt &lt;br /&gt;
werden, dass die vorinstallierten Steckerleisten CN7 bis CN10 ausreichend Pins für &lt;br /&gt;
Definition der benötigten UART-, ADC-, DAC- und GPIO-Pins aufweisen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Boilerdruck-, die Wassertemperatur-, die Durchfluss- und die Füllstandsregelung des &lt;br /&gt;
Boilers müssen implementiert werden. Es soll ebenfalls eine UART-Kommunikation für ein &lt;br /&gt;
Touch-Display, einen Maschinensimulator sowie eine Möglichkeit zum Anschließen einer &lt;br /&gt;
Wartungs-App programmiert werden. Um einen geordneten Ablauf der einzelnen &lt;br /&gt;
Komponenten bei Inbetriebnahme der Maschine zu gewährleisten, soll eine Startprozedur &lt;br /&gt;
programmiert werden&lt;br /&gt;
&lt;br /&gt;
== Wartungs - APP ==&lt;br /&gt;
Es müssen der Inhalt des Wartungs-Token definiert werden, ein GUI-Layout erstellt werden, ein Kommunikationsaufbau mit dem Maschinensimulator hergestellt werden, die Darstellung der Messwerte, eine manuelle Startprozedur, das Schalten von Magnetventilen, die Einstellung von Sollwertvorgaben (Boilerdruck, Bezugswassertemperatur, Durchfluss) und manuellen Stellwerten für das PWM-Heizelement, die Pumpenansteuerung und die Stellung des Dosierventils sowie die Messwertspeicherung und das Logging programmiert werden. Die App ist bis zu einem funktionsfähigen Prototypen erforderlich.&lt;br /&gt;
&lt;br /&gt;
= Leistungsvereinbarung =&lt;br /&gt;
&lt;br /&gt;
== Startprozedur ==&lt;br /&gt;
Es wird eine definierte und nachvollziehbare Startprozedur für die Maschine erarbeitet. Das Ergebnis umfasst eine festgelegte Reihenfolge der Startschritte, die Berücksichtigung der relevanten Schnittstellen sowie ein Konzept für die Ausgaben auf dem Display, damit der Startprozess strukturiert abläuft und für den Benutzer verfolgbar ist.&lt;br /&gt;
&lt;br /&gt;
== Maschinensimulator ==&lt;br /&gt;
Das Ziel dieser Arbeit ist die Entwicklung eines voll funktionsfähigen Maschinensimulators, der das Testen der auf den STM32 zu verlagernden Regelkreisen ermöglicht. Hierfür werden physikalische Größen wie Temperatur und Druck simuliert und über die Digital- Potentiometer MCP4151 als elektrische Signale an die Steuerungselektronik ausgegeben. Der Maschinensimulator wird in einer MATLAB®-App implementiert, sodass der Maschinensimulators parallel zu einer weiteern MCU an einem PC betrieben werden kann. Die App soll sowohl den Betrieb des Simulators als solches als auch die Nutzung als Wartungs-App ermöglichen.&lt;br /&gt;
&lt;br /&gt;
== Wartungs - APP ==&lt;br /&gt;
Die aktuelle MATLAB®-GUI soll in eine komfortable Bedienoberfläche für Wartungs- und Einstellarbeiten überführt werden. Bei aktivierter Wartungs-App sollen sämtliche Tastenfunktionen und die Vertikalhebelfunktion nutzbar sein und zudem alle Aktoren (Magnetventile, Pumpenleistung und Schrittmotorverstellungen) über diese App angesteuert werden können. Des Weiteren soll die bisherige Visualisierung der Messwerte und Schaltzustände erhalten bleiben. Dies allerdings mit einer geringeren Aktualisierungsrate, da vier Aktualisierungen pro Sekunde als ausreichend angesehen werden.&lt;br /&gt;
&lt;br /&gt;
==UART-Kommunikation==&lt;br /&gt;
Um die spezifischen Daten von dem STM32H7 auf das Display zu übertragen, sowie &lt;br /&gt;
Steuerbefehle des Displays für den STM32H7, wird ein neue UART-Schnittstelle mit Display-Token eingeführt. Ebenfalls wird eine UART-Kommunikation mit entsprechendem Token für &lt;br /&gt;
Maschinensimulator und der Wartungs-App implementiert. Dabei soll ein Gateway den &lt;br /&gt;
Zugriff für die Wartungs-App integriert werden.&lt;br /&gt;
&lt;br /&gt;
==Multitasking==&lt;br /&gt;
Die direkte Hardware-Unterstützung über DMA gestaltet sich schwierig in MicroPython, da &lt;br /&gt;
sie von MicroPython automatisch verwendet wird (bspw. bei Buffern) und nur über &lt;br /&gt;
Registeraccess direkt ausgeführt werden kann. Daher wird die Nutzung der uasyncio-Library&lt;br /&gt;
bevorzugt, welche die Vorgänge, die den Programmablauf verzögern, umleitet. Dadurch soll &lt;br /&gt;
das Programm reibungsfreier ablaufen.&lt;br /&gt;
&lt;br /&gt;
==STM32H7==&lt;br /&gt;
Die bestehenden Regelkreise, Füllstandsregelung (Boiler und Tanks), Boilerdruckregelung, &lt;br /&gt;
Mischtemperaturregelung und Durchflussregelung werden von den drei Microcontroller auf &lt;br /&gt;
den STM32H7 verlagert. Ebenfalls erfolgt die Migration der Messwerterfassung aller &lt;br /&gt;
verbauten Sensoren auf die neue STM32H7-Plattform.&amp;lt;br&amp;gt;&lt;br /&gt;
Zusätzlich wird eine UART-Kommunikation implementiert, die die Anbindung des Displays, &lt;br /&gt;
eines Maschinensimulators sowie für den Zugriff durch eine externe Wartungs-App über &lt;br /&gt;
einem Gateway ermöglicht.&amp;lt;br&amp;gt;&lt;br /&gt;
Um einen geordneten Ablauf der einzelnen Komponenten bei Inbetriebnahme der Maschine &lt;br /&gt;
zu gewährleisten, wird eine Startprozedur programmiert.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Hardware-Umsetzung wird von LfbA Armin Rohnen übernommen.&lt;br /&gt;
&lt;br /&gt;
== Display ==&lt;br /&gt;
Es wird eine geeignete Displaylösung ausgewählt und in das Gesamtsystem integriert. Das Ergebnis umfasst die Darstellung relevanter Messwerte, Betriebszustände, Sicherheitsmeldungen und der Startprozedur sowie die Einbindung der Bedienfunktionen über Touch, Vertikalhebel und Anschlagtaster.&lt;br /&gt;
&lt;br /&gt;
== Vertikalhebel ==&lt;br /&gt;
Der Vertikalhebel wird als Bedienelement technisch und funktional in das System integriert. Das Ergebnis umfasst die Erfassung und Verarbeitung der Hebelstellung als Sollwertvorgabe für den Durchflussregler, die Einbindung der Anschlagtaster als zusätzliche Bedienfunktionen sowie die Anzeige der relevanten Informationen auf dem Display.&lt;br /&gt;
&lt;br /&gt;
== Verlagerung der Regler Syntax ==&lt;br /&gt;
Ziel dieser Arbeit ist die vollständige Übertragung der in MATLAB® implementierten Regelalgorithmen aus [114] in MicroPython sowie deren Vorbereitung für die Implementierung auf einer STM32‑MCU. Die Umsetzung erfolgt entlang der bestehenden Reglerstruktur: Füllstandsregler, Boilerdruckregelung, Mischtemperaturregler und Durchflussregler.&lt;br /&gt;
&lt;br /&gt;
= Besprechungsprotokolle und weitere Unterlagen =&lt;br /&gt;
* [[:Datei:20260214 Abschlusspraesentation.pdf|Übergabepräsentation Vorgänger]]&lt;br /&gt;
* [[:Datei:20260326 Projektstart.pdf|Aktueller Projektstand]]&lt;br /&gt;
* [[Projektstart 26.03.2026]]&lt;br /&gt;
* [[Projektrücksprache 02.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 09.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 17.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 24.04.2026]]&lt;br /&gt;
* [[Projektrücksprache 08.05.2026]]&lt;br /&gt;
* [[Projektrücksprache 22.05.2026]]&lt;br /&gt;
* [[Projektrücksprache 05.06.2026]]&lt;br /&gt;
* [[Projektrücksprache 19.06.2026]]&lt;br /&gt;
* [[Projektrücksprache 03.07.2026]]&lt;br /&gt;
* [[Projektrücksprache 17.07.2026]]&lt;br /&gt;
* [[Abschlusspräsentation 31.07.2026]]&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4928</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4928"/>
		<updated>2026-05-07T12:36:14Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 70 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 30 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Francis Booth|| 1 || 30 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 10 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || Tillmann Haas|| 1 || 30 ||08.05.2026&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || Tillmann Haas|| 1 || 30 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || Tillmann Haas|| 1 || 10 ||10.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || Tillmann Haas|| 1 || 10 ||08.07.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4927</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4927"/>
		<updated>2026-05-07T12:35:01Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || || 1 || 70 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 70 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Francis Booth|| 1 || 70 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 10 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || Tillmann Haas|| 1 || 30 ||08.05.2026&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || Tillmann Haas|| 1 || 30 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || Tillmann Haas|| 1 || 10 ||10.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || Tillmann Haas|| 1 || 10 ||08.07.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur2.001.png&amp;diff=4926</id>
		<title>Datei:20260505 Rohnen Startprozedur2.001.png</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur2.001.png&amp;diff=4926"/>
		<updated>2026-05-07T12:34:13Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: Armin Rohnen lud eine neue Version von Datei:20260505 Rohnen Startprozedur2.001.png hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Startprozedur Teil 2, (c) Armin Rohnen&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4925</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4925"/>
		<updated>2026-05-07T12:31:10Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 - Startprozedur mit STM32 - Steuerung =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 anelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich z sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
Die Reglerschleife startet mit der Messwerterfassung aller analogen Sensoren und der Zustandsabfrage der Füllstands-PINs. Die Messwerterfassung der Flowmeter erfolgt über eigene ISR-Funktionen. Für alle Messwerte (auch die Flowmeter) wird ein aus mindestens 25 Momentanmesswerte bestehender gleitender Effektivwert mit exponentieller Gewichtung gebildet. Bei erstmaliger Messwerterfassung wird der Maschinen_Counter auf 2 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Tankfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 2, erfolgt der Programmdurchlauf des Tankfüllstandsreglers. Der Maschinen_Counter wird auf 3 gesetzt, wenn der Tankfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerfüllstandsregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 3, es ist also der Tank bereits auf maximum aufgefüllt, erfolgt der Programmdurchlauf des Boilerfüllstandsreglers. Der Maschinen_Counter wird auf 4 gesetzt, wenn der Boilerfüllstand erstmalig sein Maximum erreicht hat.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Boilerdruckregler auf 1 gesetzt und der Maschinen_Counter hat mindestens den Wert 4, es ist demnach der Boiler hinreichend gefüllt, erfolgt der Programmdurchlauf des Boilerdruckreglers. Handelt es sich um einen Systemstart aus Umgebungstemperatur, erfolgt der Aufheizvorgang mit den zugehörigen Maßnahmen zur thermischen Entschichtung. Der Boilerdruckregler wird zusätzlich verriegelt, wenn der Boilerfüllstand nicht als Maximum erkannt wird. Der Mschinen_Counter wird auf 5 gesetzt, wenn erstmals der eingestellte Boilersolldruck erreicht wird. Die Maschine wechselt dann von der Startprozedur in den regulären Betrieb.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Zwischenstände der Startprozedur werden kontinuierlich über UART an das Display kommuniziert und dort als Logging angezeigt. Erreicht die Maschine den regulären Betrieb, wechselt am Display die Darstellungsform und es wird das Bedienungsmenü mit den Systemanzeigen sichtbar.&lt;br /&gt;
&lt;br /&gt;
Befindet sich die Maschine im regulären Betrieb (Maschinen_Counter = 5) und es wird über das Display ein Bezug (Kaffee oder Teewasser) aktiviert, erfolgt der Programmdurchlauf des Mischtemperaturreglers. Dies beinhaltet die Schaltung der erforderlichen Magentventile und die Herstellung eines Wasserdurchflusses. Solange die Mischtemperatur nicht erreicht ist, wird das Bezugswasser in die Abtropfschale abgeleitet. Wenn die Mischtemperatur erreicht ist, wird der Maschinen_Counter auf 6 gesetzt.&lt;br /&gt;
&lt;br /&gt;
Ist das Flag für den Bezug auf 1 gesetzt und ist die Mischtemperatur erreicht (Maschinen_Counter = 6) wird er Programmablauf für den Durchflussregler durchlaufen. Darin enthalten sind die erforderlichen Ventilschaltungen für den Kaffeebezug bzw. Teewasserbezug. Im Fall des Kaffeebezugs wird nach einer definierten Totzeit der Istwert für den Mischtemperaturregler auf den Temperatursensor in der Brühgruppe umgeschaltet. Wird der Bezug durch Nutzeraktion oder durch erreichen der Bezugsmenge beendet, wird der Maschinen_Counter = 5 gesetzt. Dies deaktiviert die beiden, für den Wasserbezug erforderlichen Regelkreise. Es werden alle geschalteten Magnetventile zurück, die Pumpensteuerung auf 0 V und der Istwert für den Mischtemperaturregler wieder auf den Mischwassertemperatursensor gesetzt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4924</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4924"/>
		<updated>2026-05-07T11:31:35Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Zu dieser Initialisierung gehört auch die Initialisierung der Schrittmotoren der Dosierventile. Diese Initialisierung wird mehrere Sekunden in Anspruch nehmen. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 anelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich z sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
Es erfolgt entsprechendes Logging am Display.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. Solange der Maschinen_Counter kleiner 5 ist, befindet sich die Maschine in der Startprozedur. Während der Startprozedur werden die, für den Maschinenbetrieb erforderlichen Komponenten in den Betriebszustand überführt. Die Reglerschleife wird mit einem Takt von ca. 100 Hz entweder als Timer-Funktion oder mittels anderweitiger Programmierung.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4923</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4923"/>
		<updated>2026-05-07T11:21:53Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 anelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich z sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur2.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Reglerschleife ==&lt;br /&gt;
Die Reglerschleife ist sowohl Bestandteil der Startprozedur als auch Bestandteil des normalen Maschinenbetriebs. &lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur2.001.png&amp;diff=4922</id>
		<title>Datei:20260505 Rohnen Startprozedur2.001.png</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur2.001.png&amp;diff=4922"/>
		<updated>2026-05-07T11:20:08Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Startprozedur Teil 2, (c) Armin Rohnen&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4921</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4921"/>
		<updated>2026-05-07T11:17:53Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 07.05.2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
== Initialisierung der Maschinensteuerung ==&lt;br /&gt;
Die Maschinensteuerung (STM32 MCU) und das Display starten durch Einschalten der Maschine (Power On). Aufgrund des erforderlichen Einschwingens der einzelnen Steuerungskomponenten erfolgt zunächst eine zeitlich begrenzte Wartezeit von mehreren Sekunden. Die Maschinensteuerung muss dabei länger warten als die Display-MCU. Es muss sichergestellt sein, dass zur Initialisierung der Maschinensteuerung alle MCUs in der Peripherie bereits gestartet und initialisiert sind. Für den Maschinensimulator und die Wartungs-APP bedeutet dies, dass die zugehörigen MATLAB®-Apps bereits aktiv sind.&lt;br /&gt;
&lt;br /&gt;
Danach erfolgt die Initialisierung der verwendeten PINs und der Messwerterfassung sowie die Aktivierung der Interrupt-Service-Routinen (ISRs) für die Durchflussmessung(en) über die FLowmeter. Es wird ein Counter (Maschinen_Counter) angelegt, der während der Startprozedur und später während des Maschinenbetriebs die jeweils aktuelle Situation des Maschinenzustands beschreibt. Damit ist die Initialisierung der Maschinensteuerung abgeschlossen, der Maschinen_Counter wird mit 0 anelegt. Es folgt der Kommunikationsaufbau mit der Peripherie.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Display ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Display wird das Byte &amp;quot;0x0A&amp;quot; über UART an das Display gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Display-Ausgabe der Maschinenstart weiter durchgeführt. Ohne die angeschlossene Wartungs-App ist dann aber keine Maschinennutzung möglich.&lt;br /&gt;
&lt;br /&gt;
Ist das Display kommunikationsbereit, wird für den kontinuierlich zu sendenden Display-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Display zu STM32 erfolgt die Initialisierung  einer ISR auf die entsprechende UART RX-Leitung. Der Maschinen_Counter wird auf 1 erhöht.&lt;br /&gt;
&lt;br /&gt;
== Kommunikationsaufbau mit Maschinensimulator ==&lt;br /&gt;
Für den Kommunikationsaufbau mit dem Maschinensimulator wird das Byte &amp;quot;0x0A&amp;quot; über UART an dan Maschinensimulator gesendet. Es wird im Programmablauf sofort eine UART-Leseanweisung durchgeführt, für den Fall keiner oder zu sehr verzögerter Antwort wird über eine Timer-Funktion abgebrochen. Im Fall TimeOut wird ohne Wartungs-App / Mschinensimulator der Maschinenstart weiter durchgeführt. &lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator angeschlossen, wird für den kontinuierlich zu sendenden Simulator-Token ein Timer mit Timer-Funktion angelegt. Zur Sicherheit wird für die Kommunikation von Maschinensimulator zu STM32 eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Es erfolgt normal keine Kommunikation von Maschinensimulator zu STM32. Hierüber wäre eine Umschaltung von Maschinensimulator auf Wartungs-App möglich.&lt;br /&gt;
&lt;br /&gt;
Alle für die Reglersteuerung erforderlichen Flags werden 1 gesetzt und es erfolgt der weitere Ablauf des Maschinenstarts.&lt;br /&gt;
&lt;br /&gt;
Ist der Maschinensimulator als Gateway zur Wartungs-APP angeschlossen, wird für den kontinuierlich z sendenden Wartungs-Token ein Timer mit Timer-Funktion angelegt. Für die Kommunikation von Wartungs-App über Maschinensimulator an STM32 wird eine ISR auf der entsprechenden UART RX-Leitung initialisiert. Alle für die Reglersteuerung erforderlichen Flags werden in diesem Fall 0 gesetzt und es erfolgt der Übergang in die Reglerschleife.&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4920</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4920"/>
		<updated>2026-05-07T10:37:15Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* Armin Rohnen, 07.05.2026 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|350|right|]]&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4919</id>
		<title>Startprozedur</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Startprozedur&amp;diff=4919"/>
		<updated>2026-05-07T10:36:34Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Armin Rohnen, 07.05.2026 =&lt;br /&gt;
Durch die Entscheidung anstelle mehrerer Platinen mit einzelnen MCUs zu verwenden eine zentrale Maschinensteuerungs-Platine mit einer STM32H753 MCU verändert sich der Ablauf des Maschinenstarts. Hinzu kommt, dass ein Touch-Display mit integrierter MCU-Platine für die Visualisierung und Interaktion mit dem Anwender eingesetzt wird. Das Display verarbeitet auch die User-Interaktion über den Vertikalhebel und den zwei Drucktasten. Im weiteren gibt es für Wartungs- und Simulationszwecke einen Maschinensimulator.&lt;br /&gt;
&lt;br /&gt;
Die Kommunikation zwischen STM32-Maschinensteuerung, dem Display und ggf. dem Maschinensimulator erfolgt über getrennte UART-Schnittstellen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:20260505 Rohnen Startprozedur 1.001.png|thumb|1000px|zentriert|]]&lt;br /&gt;
&lt;br /&gt;
= Philipp Schiebel, 13.11.2025 - Aufgabenanalyse =&lt;br /&gt;
==Initialisierung der Systeme==&lt;br /&gt;
Nach dem Einschalten der Stromversorgung werden alle vier Mircocontroller (MCU) automatisch aktiviert und führen ihren Code in main.py aus. Darin wird die Kommunikation initialisiert.&lt;br /&gt;
&lt;br /&gt;
==Aufbau der Kommunikationsstruktur==&lt;br /&gt;
Nach einer definierten Startwertzeit stellt die Messwertplatine den Anfangstoken bereit. Aufgrund des Verbundes der Platinen (Messwertplatine -&amp;gt; Basisplatine -&amp;gt; SSR-Platine -&amp;gt; Displayplatine) kann die Displayplatine bei Erhalt des Anfangstokens auf eine korrekte Initialisierung aller Platinen schließen.&lt;br /&gt;
Jede Platine überprüft zusätzlich den Kommunikations-TimeOut und geht bei ausbleibendem Token in einen Sicherheitszustand über.&lt;br /&gt;
&lt;br /&gt;
==Start der Messwerterfassung==&lt;br /&gt;
Nach erfolgreichem Wiedererhalt des Initialisierungstokens startet die die Messplatine die Messwerterfassung, erstellt den ersten Messwertdatensatz und sendet anschließend kontinuierlich Messwert-Token. Die Basisplatine ergänzt die empfangenen Messwerttoken um eigene Messdaten. Dadurch wird ein kontinuierlicher Kommunikations- und Datenaustausch zwischen allen MCUs ermöglicht, bei dem die Messplatine den Takt vorgibt.&lt;br /&gt;
&lt;br /&gt;
==Reglerstart==&lt;br /&gt;
Mit Beginn der Messwerterfassung wird auch der Boilerfüllstand überprüft. Bei der Glasboilermaschine werden zusätzlich die Füllstände der beiden Tanks überprüft. Darauf reagiert die Füllstandsregelung. Solange der Sollwert noch nicht erreicht ist, bleibt der Boilerdruckregler deaktiviert. Erst wenn der Füllstand erreicht ist, wird dieser aktiviert. Dabei wird zusätzlich die Boilertemperatur überwacht, um die Entschichtungsfunktion zu steuern. Wird eine einstellbare Abschalttemperatur überschritten, wird die Entschichtung deaktiviert.&lt;br /&gt;
Die Startprozedur gilt als erfolgreich abgeschlossen, sobald der Sollwert des Boilerdrucks erstmals überschritten wird. In diesem Moment erkennt der Boilerdruckregler die Betriebsbereitschaft und sendet diese. Die Displayplatine reagiert darauf, indem sie die Betriebsbereitschaft zum Kaffeebezug signalisiert.&lt;br /&gt;
&lt;br /&gt;
==Anzeige und Fehlerausgabe==&lt;br /&gt;
Während des gesamten Ablaufs zeigt die Displayplatine den aktuellen Status der Startprozedur an. Dazu gehören Informationen über den Boilerfüllstand, den Boilerdruck und die Boilertemperatur. Bei Timeout oder Fehlern während des Startvorgangs erfolgt eine sichtbare Ausgabe am Display.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 18.10.2025 - Vorschlag zur Startprozedur =&lt;br /&gt;
Wenn die aktuelle manuelle Startprozedur der labortechnischen Espressomaschine als Grundlage für die zukünftige Startprozedur dient, dann ergäbe sich für den Ablauf:&lt;br /&gt;
# alle MCUs starten, wenn die Stromversorgung eingeschaltet wird. Dadurch wird der Programmcode in main.py ausgeführt. In main.py wird als erstes die UART-Kommunikation initialisiert, wie es in der 2. Auflage von [40] beschrieben ist. Dabei wird uart.irq_rx mit einem uart_rx.handler verwendet sowie für ausreichend definierten Schreib- und Lesespeicher gesorgt.&lt;br /&gt;
# Alle MCUs warten auf die Initialisierung der Kommunikation&lt;br /&gt;
# Nach einer definierten Startwartezeit sendet die MCU der Messwertplatine einen Token zur Initialisierung der Kommunikation.&lt;br /&gt;
# Jede andere MCU arbeitet die Initialisierung ab und sendet den Token weiter.&lt;br /&gt;
# Der Token muss wieder bei der Messwertplatine ankommen. Erfolgt dies nicht innerhalb einer definierten Zeit (Timeout) dann erfolgt der Abbruch der Startprozedur mit einer entsprechenden Ausgabe am Display. Kommt der Token InTime bei der Messwertplatine wieder an, dann sendet die Messwertplatine einen Token zum Start der Messwerterfassung.&lt;br /&gt;
# Der Token wird von der Messplatine erstellt. Dort wird die Messwerterfassung gestartet und wenn der erste Messwertdatensatz zusammengestellt ist, der erste Token gesendet. Ab diesem Zeitpunkt wird immer dann, wenn ein Messwertdatensatz der Messplatine zusammengestellt ist, ein Token gesendet. Dadurch gibt die Messwertplatine den Kommunikationstakt vor.&lt;br /&gt;
# Die Basisplatine fügt dem Token die Messwerte der Basisplatine bei.&lt;br /&gt;
# Wenn die Displayplatine erstmalig alle Messwerte erhalten hat, sendet diese einen Token zum Start der Systemüberprüfung.&lt;br /&gt;
# Auf den Token der Systemüberprüfung reagiert als erstes die Basisplatine. Dort wird der Boilerfüllstand geprüft und so lange ein Boilerfüllstands-Flag 0 gesetzt, solange der Füllstand nicht erreicht ist. Das Boilerfüllstands-Flag muss Bestandteil des kontinuierlich umlaufenden Tokens sein. Solange der Füllstand nicht erreicht ist, darf der Boilerdruckregler nicht starten bzw. muss die Heizleistung = 0 sein.&lt;br /&gt;
# Wenn der Boilerfüllstand erreicht ist, wird auf der Messplatine der Boilerdruckregler aktiv. Durch Abgleich mit der Boilertemperatur (kleiner 95 ° C) wird entschieden ob die Entschichtungsfunktion aktiviert wird. Wird die Boilertemperatur von 95 °C überschritten wird die Entschichtung deaktiviert. Wird erstmalig der Sollwert des Boilerdrucks überschritten ist die Maschine betriebsbereit.&lt;br /&gt;
# Auf dem Display wird der jeweilige Stand der Startprozedur angezeigt. Während der Startprozedur ist, zumindest aktuell, ein sichtbares Logging sinnvoll.&lt;br /&gt;
# Der Zustand des Boilerfüllstandsreglers, des Druckreglers, die Boilertemperatur und der Boilerdruck werden kontinuierlich am Display visualisiert, ebenso wird bei Kaffeebezug die Durchflussrate und der Brühgruppendruck angezeigt. Die Displayplatine dient der Übertragung von Systemlogging und Messwerten zur MATLAB® Wartungs-App.&lt;br /&gt;
&lt;br /&gt;
= Armin Rohnen, 04.10.2025 =&lt;br /&gt;
Für den Systemstart der Espressomaschine muss der Funktionsablauf definiert werden. So ist z. B. zunächst die MCU-Kommunikation zu starten, die Messwerterfassung zu starten, es ist zu prüfen ob das Wartungstool angeschlossen ist, es sind die Füllstände zu kontrollieren usw.&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur_1.001.png&amp;diff=4918</id>
		<title>Datei:20260505 Rohnen Startprozedur 1.001.png</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Datei:20260505_Rohnen_Startprozedur_1.001.png&amp;diff=4918"/>
		<updated>2026-05-07T10:35:20Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Startprozedur Teil 1, (c) Armin Rohnen&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
	<entry>
		<id>http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4916</id>
		<title>Systemsoftware</title>
		<link rel="alternate" type="text/html" href="http://www.institut-fuer-kaffeetechnologie.de/Wiki/index.php?title=Systemsoftware&amp;diff=4916"/>
		<updated>2026-05-06T13:52:21Z</updated>

		<summary type="html">&lt;p&gt;Armin Rohnen: /* ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;htmltag tagname=&amp;quot;img&amp;quot; src=&amp;quot;http://vg04.met.vgwort.de/na/4531f1734b324b72b2d7e566cdf639f0&amp;quot;  width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/htmltag&amp;gt;&lt;br /&gt;
[[Datei:Breites Logoband.png|mini|zentriert|hochkant=2.5]]&amp;lt;br&amp;gt;&lt;br /&gt;
Die Systemsoftware lässt sich nicht ohne die Beachtung der Systemelektronik erstellen.&lt;br /&gt;
&lt;br /&gt;
Für die Systemsoftware wurde ein mehrstufiger Entwicklungsprozess definiert:&lt;br /&gt;
# Nutzung einer MCU auf der MicroPython verwendet werden kann. Dies ist durch das STM32F411 nucleo Board der Basiselektronik bzw. durch den Raspberry Pi Pico der Multi-MCU-Elektronik gegeben.&lt;br /&gt;
# Auf der MCU werden lediglich die elementaren Grundfunktionen (GPIO schalten und erfassen, Messwert erfassen, PWM Ausgeben, Sollwert ausgeben, etc.) realisiert und über eine MicroPython zu MATLAB® Schnittstelle [41] wird die Funktionalität in einer MATLAB® GUI hergestellt.&lt;br /&gt;
# Die Softwareentwicklung startet mit der labortechnischen Espressomaschine und wird auf die weiteren Projekte schrittweise transportiert. Dazu ist die Maschinenelektronik gleich zu halten und es sind die gleichen Anschluss-Pins zu verwenden.&lt;br /&gt;
# Nach Abschluss der Testphase der MATLAB® Bedienung wird schrittweise die Betriebssoftware in MicroPython auf der MCU implementiert, so dass am Ende dieses Prozessschrittes die MATLAB®-Verbindung lediglich für weiterführende Datenerfassung und grafische Darstellungen verwendet wird, welche nicht mit dem Display der Maschine möglich ist oder dort nicht dargestellt werden soll.&lt;br /&gt;
# Ob eine Portierung des MicroPython-Codes nach Microcontroller C durchgeführt wird, ist derzeit nicht entschieden.&lt;br /&gt;
&lt;br /&gt;
Es wurden mehrere, die Softwareentwicklung vorbereitende FMEAs durchgeführt.  Die hierdurch entstandenen Dokumentation befinden sich in der Dokumentationsauflistung. Im weiteren wurde eine Projektarbeit zur Konzeptfindung für die Badienung durchgeführt. Auch die hierdurch entstandenen, teilweise auf die FMEA aufbauenden Dokumente befinden sich in der Dokumentationsliste.&lt;br /&gt;
&lt;br /&gt;
= Projektdokumentationen und Beschreibungen =&lt;br /&gt;
* [[:Datei:20210228 Konzept Systemelektronik.pdf|Konzeptbeschreibung Systemelektronik]]&lt;br /&gt;
* [[:Datei:20210605 Workflow Embedded Systems.pdf|Workflow Embedded Systems]]&lt;br /&gt;
* [[:Datei:20200521 Bericht1 NerminArbi.pdf|Funktionsanalyse Boilerbefüllung, Tassenwärmung, Milchschäumen]]&lt;br /&gt;
* [[:Datei:20200518 Bericht halbauto Entkalkung Egger Alexander.pdf|Funktionsanalyse zur halbautomatischen Entkalkung]]&lt;br /&gt;
* [[:Datei:20200518 V0 4 Bericht Funktionsanalyse Rückspulung-Spulung Sladoje.pdf|Funktionsanalyse Rückspülung und Spülung]]&lt;br /&gt;
* [[:Datei:20200521 Bericht Espresso-Teewasserbezug Urbin.pdf|Funktionsanalyse Espresso und Teewasserbezug]]&lt;br /&gt;
* [[:Datei:20200522 Bericht Funktionsanalyse Energieeffizienz Egger Alexander.pdf|Funktionsanalyse Energieeffizienz]]&lt;br /&gt;
* [[:Datei:20200521 V2 Bericht Funktionsanalyse Bedienung Sladoje.pdf|Funktionsanalyse Bedienung]]&lt;br /&gt;
* [[:Datei:20200525 Bericht Abbildung aller Maschinen Urbin V2.pdf|Funktionsanalyse Abbildung aller Maschinen]]&lt;br /&gt;
* [[:Datei:20200609 Bericht Fehleranalyse Entschichtung.pdf|Fehleranalyse Entschichtung]]&lt;br /&gt;
* [[:Datei:20200610 Fehleranalyse Dampf Brühgruppe Sladoje.pdf|Fehleranalyse Brühgruppe und Dampfbezug]]&lt;br /&gt;
* [[:Datei:20200613 Bericht Fehleranalyse Mischer;Magnetventile V2.pdf|Fehleranalyse Mischer und Magnetventile]]&lt;br /&gt;
* [[:Datei:20200611 Bericht3 NerminArbi.pdf|Fehleranalyse Boiler]]&lt;br /&gt;
* [[:Datei:20200705 Dichtheitsprüfung.pdf|Dichtheitsprüfung]]&lt;br /&gt;
* [[:Datei:20200704 Massnahmen Urbin.pdf|Prüfkonzepte Magnetventile und Mischer]]&lt;br /&gt;
* [[:Datei:20200701 Maßnahmenanalyse NerminArbi.pdf|Maßnahmen Boiler]]&lt;br /&gt;
* [[:Datei:20200628 Maßnahmen Entschichtung zweiter Stand.pdf|Maßnahmen Entschichtung]]&lt;br /&gt;
* [[:Datei:20200627 Maßnahmenkonzept Brühguppe Dampf Sladoje.pdf|Maßnahmen Brühgruppe und Dampf]]&lt;br /&gt;
* [[:Datei:20200707_FMEA.xlsx|FMEA Tabelle]]&lt;br /&gt;
* [[:Datei:20201207_Bedienkonzept.pptx|PPT Simulation des Bedienkonzeptes]]&lt;br /&gt;
* [[:Datei:20210207_Bedienkonzept_Funktionsliste.xlsx|Bedienkonzept Funktionsliste]]&lt;br /&gt;
* [[:Datei:20210219_Bedienkonzept_Projektdokumentation.pdf|Bedienkonzept Projektdokumentation]]&lt;br /&gt;
* [[:Datei:HMProjektBedienoberflaecheEspresso.zip|MATLAB® GUI]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2022]]&lt;br /&gt;
* [[Entwicklung Systemsoftware SoSe2023]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython WiSe 2025/26]]&lt;br /&gt;
* [[Mikrocontroller Programmierung in MicroPython SoSe 2026]]&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Programmcode Programmcode] =&lt;br /&gt;
Aktueller Programmcode und Änderungsdokumentation ab Jan 2023&lt;br /&gt;
&lt;br /&gt;
= [http://www.institut-fuer-kaffeetechnologie.de/Intern/index.php?title=Software-Bugs Software-Bugs] =&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste(n) Systemsoftware =&lt;br /&gt;
&lt;br /&gt;
== Prioritätsangabe ==&lt;br /&gt;
Prio 1 - Abarbeitung zeitnah erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 2 - Abarbeitung erforderlich&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 3 - Abarbeitung kann warten&amp;lt;br&amp;gt;&lt;br /&gt;
Prio 99 - Abarbeitung erfordert Vorarbeiten&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
10 - Erfasst&amp;lt;br&amp;gt;&lt;br /&gt;
30 - in Bearbeitung&amp;lt;br&amp;gt;&lt;br /&gt;
50 - Lösung definiert&amp;lt;br&amp;gt;&lt;br /&gt;
70 - in Umsetzung&amp;lt;br&amp;gt;&lt;br /&gt;
90 - Umsetzung abgeschlossen&amp;lt;br&amp;gt;&lt;br /&gt;
99 - Abbruch per Beschluss (Dokumentation dazu erforderlich)&amp;lt;br&amp;gt;&lt;br /&gt;
100 - Maßnahme bestätigt&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Verlagerung der Regelkreise aus der MATLAB®-GUI auf die Mikrocontroller der Steuerungselektronik =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedur]] || Rohnen|| 1 || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kommunikation per UART|UART Kommunikation zwischen den einzelnen MCUs]] || Konstantin Rupprecht|| 1 || 70 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Evaluation STM32H7 |Umstellung auf STM32H7]] || Konstantin Rupprecht|| 1 || 10 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Mehrkernnutzung und/oder Multitasking]] || Konstantin Rupprecht||  1 || 100 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Displays mit Touchfunktion]] || Loic Aboufiras|| 1 || 30 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Integration eines Vertikalhebels]] || Loic Aboufiras|| 1 || 30 ||12.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Maschinensimulator]] || Francis Booth|| 1 || 70 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über die MATLAB®-GUI|Wartungs-App]] || Felix Kerner|| 1 || 10 ||08.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Füllstandsreglers auf das Basisboard|Verlagerung des Füllstandsreglers]] || Tillmann Haas|| 1 || 30 ||08.05.2026&lt;br /&gt;
|- &lt;br /&gt;
| [[Verlagerung der Boilerdruckregelung auf die Messplatine|Verlagerung der Boilerdruckregelung]] || Tillmann Haas|| 1 || 30 ||15.05.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Mischtemperaturreglers auf das Basisboard|Verlagerung des Mischtemperaturreglers]] || Tillmann Haas|| 1 || 10 ||10.06.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Verlagerung des Durchflussreglers auf das Basisboard|Verlagerung des Durchflussreglers]] || Tillmann Haas|| 1 || 10 ||08.07.2026&lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Preinfusion auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Kaffeebezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Wasserbezug auf dem Basisboard]] || || 2 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Dampfbezug auf dem Basisboard]] || || 2 || 10 || 	 &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Spülen auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Erstellung der Funktionssteuerung - Grundreinigung auf dem Basisboard]] || || 2 || 10 ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Visualisierung und Interaktion über eine WEB-Anwendung]] || || 1 || 10 ||  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Allgemeines =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Sicherheitsfunktionen]] || || 99 || 50 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[ Übersicht über verbaute Aktorik und Sensorik in Tabellenform]] || || 2 || 90 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Stromsparmodus]] || || 99 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: Mechatronische Inbetriebnahme Glasboilermaschine =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Fehlerbehebungen]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Startprozedure]] || ||  1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tankfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Boilerfüllstandsregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Boilerdruckregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischwassertemperaturregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregelung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug]] || || 2 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Teebezug]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Temperatureinstellung über Vertikalhebel]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Simulation Handhebelmaschine]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Flush/Rückspülreinigung]] || || 1 || 10 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: MCUs - Hardwarenahe Software =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundfunktionen der MCU und mehrere MCUs]] || || || 100 ||&lt;br /&gt;
|-	&lt;br /&gt;
| Basisboard: [[Schalten Magnetventile (Labor) STM32-Basisboard]] MATLAB®GUI || || || 100&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Pumpenansteuerung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Schrittmotorsteuerungen Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Basisboard: [[Tastenerkennung Basisboard Multi-MCU]] || || 1 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Füllstandserkennung Basisboard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| Basisboard: [[Durchflussmessung Basisnoard Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	  	 	  	 &lt;br /&gt;
| SSR-Platine: [[Schalten Magnetventile SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|- 	 &lt;br /&gt;
| SSR-Platine: [[Schrittmotorsteuerungen SSR-Platine Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| Messplatine: [[Messdatenerfassung Multi-MCU]] || || || 100 ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste der Grundlagenprogrammierung - MATLAB®-Funktionen und GUI =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Start der App]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Initialisierung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Schalten Magnetventile]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[MATLAB®-GUI Datensicherung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Pumpenansteuerung Multi-MCU]] || || || ||&lt;br /&gt;
|- &lt;br /&gt;
| [[Füllstandsregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Misch-Durchfluss Kaskadenregelung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Preinfusion Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Grundreinigung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Display Multi-MCU]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Glasboiler Abtropfwanne]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Bypass]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Mischer]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Schrittmotorensteuerung Brühgruppendrossel]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Adaption an Multi-MCU - Neuprogrammierung MATLAB® GUI]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Dokumentation der Software mit STM32-Elektronik. &amp;lt;br&amp;gt;Ein Betrieb dieser wird nicht mehr weiter verfolgt. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Messwerte erfassen (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Pumpenansteuerung (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Füllstandsregler (Labor)]] || ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| [[Regler Boilerdruck (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Mischregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Durchflussregler (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[einfacher Kaffeebezug (Labor)]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Kaffeebezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Wasserbezug (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Dampfbezug]] || ||  || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Spülvorgänge (Labor)]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Tastenbedienung (Labor)]] || || || ||  &lt;br /&gt;
|-&lt;br /&gt;
| [[Anpassungen für Schrittmotorensteuerung]] || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= ToDo-Liste: APP =&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Arbeitspaket !! Wer !! Prio !! Status !! WV&lt;br /&gt;
|-&lt;br /&gt;
| [[APP - Konzept]] || || 2 || 10 || &lt;br /&gt;
|- 	 &lt;br /&gt;
| [[Messwerte erfassen APP]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| [[Preset / Profilverwaltung]] || || 99 || 10 || &lt;br /&gt;
|-&lt;br /&gt;
| || || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Armin Rohnen</name></author>
	</entry>
</feed>