Virtuelle Devices statt Programmvariablen

In der ersten Version unseres Revolutionsumbaus haben wir die Magazinfüllstände in unserem Programm als Variablen angelegt. Das hatte natürlich den Nachteil, dass diese Werte beim Programmneustart verloren waren.

Nun wollen wir diese Werte über virtuelle Devices im Prozessabbild speichern!

piCtory Konfiguration

Legen wir uns ein virtuelles Device mit dem Namen „virt01“ in piCtory an:

Die ersten beiden Bytes der Outputs nennen wir „meldung0_7“ und „meldung8_15“ für die spätere bitweise Verwendung von Fehlern oder Warnungen (Als Reserve lassen wir die nächsten zwei Bytes leer).
In den nächsten beiden Bytes mit dem Namen „magazin1“ und „magazin2“ speichern wir die Füllstände ab (Theoretisch bis 255 Stück möglich).

Um dynamisch die maximalen Füllstände zu verändern, nutzen wir zwei Bytes der Inputs des virtuellen Devices. Diese nennen wir „magazin1_max“ und „magazin2_max“. Als Value geben wir in piCtory den Wert 4 an – Für 4 Stück.

Damit können die maximal zulässigen Füllstände über piCtory konfiguriert werden und stehen nicht statisch im Programmcode!
Die Bytes „pbit0_7“ und „pbit8_15“ werden erst in einem späteren Beitrag Beachtung finden 😀

Programmcode

Die Füllstände werden von unserm Thread class Anlage(Thread): verwaltet. Dort brechen wir bei Instanziierung die Bytes „meldung0_7“ und „meldung8_15“ in einzelne Bits für Fehler und Warnungen auf, indem wir eigene Outputs mit neuen Namen registrieren:

# Outputs für Störungen auf virtuellem Device anlegen
self.rpi.io.meldung0_7.replace_io("err_master", "?", bit=0)
self.rpi.io.meldung0_7.replace_io("err_notaus", "?", bit=1)
self.rpi.io.meldung0_7.replace_io("err_druck", "?", bit=2)

# Outputs für Warnungen auf virtuellem Device anlegen
self.rpi.io.meldung8_15.replace_io("warn_mag1full", "?", bit=0)
self.rpi.io.meldung8_15.replace_io("warn_mag2full", "?", bit=1)

In diesen neuen Outputs können wir nun Fehlermeldungen und Warnungen speichern – genau so wir wir alle andren Outputs ansprechen:
self.rpi.io.warn_mag1full.value = True

Da wir für die Werte der Magazinfüllstände nur jeweils ein Byte verwenden und diese von class RevPiIO(RevPiIOBase): abgebildet werden, können wir ohne weitere Konfiguration direkt auf den int() Wert zugreifen.

# Wert Abfragen
>>> self.rpi.io.magazin1.value
0

# Wert Setzen
>>> self.rpi.io.magazin1.value = 2

# Wert um 1 erhöhen
>>> self.rpi.io.magazin1.value += 1

Genau so verhalten sich auch unsere Werte für den maximalen Füllstand. So können wir herausfinden, ob ein Magazin voll ist und diese Information als Warnung speichern:

# Ist Magazin 1 voll?
voll = self.rpi.io.magazin1.value >= \
    self.rpi.io.magazin1_max.value

# Warnung speichern
self.rpi.io.warn_mag1full = voll

Diese Daten werden nun also direkt im Prozessabbild als Werte abgelegt und sind so auch über einen Programmneustart beständig. Zusätzlich können auch andere Systeme, die mit dem Prozessabbild arbeiten, diese Werte lesen und verarbeiten.

Dazu aber in einem anderen Beitrag mehr… 😀