piControl ist der zentrale Systemtreiber des Revolution Pi Systems. Der Treiber bildet die technische Grundlage für die Echtzeitkommunikation zwischen dem Linux-Betriebssystem auf dem RevPi Basismodul und den RevPi Erweiterungsmodulen.
Aufgaben von piControl:
-
stellt das zyklisch aktualisierte Prozessabbild bereit
-
liest die Werte der RevPi I/O-Module zyklisch ein
-
überträgt die Werte für die Ausgänge an die RevPi I/O-Module
-
konfiguriert die RevPi I/O-Module entsprechend der PiCtory Konfigurationsdatei
Prozessabbild #
piControl erzeugt ein fortlaufend aktualisiertes Speicherabbild aller I/O-Werte. Dieses Abbild kann von Programmen wie Node-RED oder von Python-Skripten gelesen oder geschrieben werden.
piControl stellt eine Gerätedatei /dev/piControl0 zur Verfügung, über die Anwendungen lesend und schreibend auf das Prozessabbild zugreifen können.
Konfigurationsdatei #
piControl liest die Konfiguration des Revolution Pi Systems aus der Konfigurationsdatei /etc/revpi/config.rsc, die typischerweise mit PiCtory erstellt wird, und richtet die RevPi Geräte entsprechend ein.
Treiber zurücksetzen #
Der Treiber kann über PiCtory zurückgesetzt werden. Dadurch wird die PiCtory Konfigurationsdatei neu eingelesen und alle bisher gesetzten Werte werden auf die Standardwerte zurückgesetzt.
▷ Starte PiCtory.
▷ Wähle .
Alternativ kann der Treiber über das Kommandozeilen-Tool piTest zurückgesetzt werden mit:
piTest -x
Zykluszeit #
Die Zykluszeit legt fest, wie oft alle Werte zwischen dem RevPi Basismodul und den I/O-Modulen ausgetauscht werden. Standardmäßig wird ein Zyklus so schnell wie möglich ausgeführt. Über einen Kernel-Modulparameter kann die Zeit für einen Zyklus angepasst werden.
-
Eine längere Zykluszeit reduziert die CPU-Auslastung.
-
Eine kürzere Zykluszeit erlaubt eine schnellere Reaktion auf Ein- und Ausgangswerte.
Die Metriken zur Zykluszeit können aus Dateien im Verzeichnis /sys/class/piControl/piControl0/ ausgelesen werden.
| Metrik | Bedeutung |
|---|---|
|
Zykluszeit in Mikrosekunden (µs). Der Standardwert |
|
Kürzeste gemessene Zykluszeit seit dem Start von piControl. Kann durch Schreiben einer 0 zurückgesetzt werden. |
|
Längste gemessene Zykluszeit seit dem Start von piControl. Kann durch Schreiben einer 0 zurückgesetzt werden. |
|
Maximal tolerierte Abweichung von der Referenz-Zykluszeit in Mikrosekunden. Die Referenz ist die feste |
|
Anzahl der Zyklen, die länger als die Referenz-Zykluszeit plus |
|
Anzahl der Zyklen, die aufgrund einer zu niedrig eingestellten Zykluszeit und eines zu langen aktuellen Zykluses verpasst wurden. Wird nur gezählt, wenn eine feste |
|
Dauer des letzten Zyklus in Mikrosekunden (µs). |
Zykluszeit auslesen #
▷ Logge dich über ein Terminal am RevPi ein.
▷ Lies die Zykluszeit aus:
cat /sys/class/piControl/piControl0/cycle_duration
❯❯ Der Standardwert 0 führt den Zyklus so schnell wie möglich aus.
Zykluszeit anpassen (dauerhaft) #
▷ Erstelle unter /etc/modprobe.d eine Datei mit der Dateiendung .conf, um einen neuen Kernel-Modulparameter zu definieren.
▷ Definiere darin eine Zykluszeit cycle_duration in Mikrosekunden.
▷ Lade das Kernelmodul neu:
sudo rmmod piControl && sudo modprobe piControl
Das Entfernen und Neuladen des Kernelmoduls ist nur möglich, wenn keine Anwendung auf /dev/piControl0 zugreift, andernfalls schlägt der Vorgang fehl. Starte in diesem Fall den RevPi neu.
Beispiel: Um eine Zykluszeit von 20 Millisekunden einzustellen, erstelle die Datei /etc/modprobe.d/picontrol-cycle-duration.conf mit:
options piControl picontrol_cycle_duration=20000
Der neue Kernel-Modulparameter wird nur beim Laden des Moduls eingelesen und wird daher erst nach dem Neuladen des Moduls bzw. nach einem Neustart des RevPi wirksam. Ein Zurücksetzen des Treibers mit piTest -x liest die Modulparameter nicht neu ein.
Zykluszeit anpassen (kurzzeitig) #
Alternativ kann die Zykluszeit während der Laufzeit des piControl Treibers über die Datei cycle_duration verändert werden.
▷ Setze eine nicht persistente Zykluszeit von z. B. 20 Millisekunden mit:
echo "20000" | sudo tee /sys/class/piControl/piControl0/cycle_duration
Kommunikationsfehler #
Die RevPi I/O-Module tauschen über eine serielle Leitung Daten mit dem RevPi Basismodul aus. Elektrisch werden die Daten nach dem RS485-Standard übertragen. Das Statusbyte RS485ErrorCnt zählt die Kommunikationsfehler über diesen internen RS485-Bus.
Jedes Modul im zyklischen RS485-Austausch führt einen eigenen Fehlerzähler. In jedem Zyklus wird der Zähler gegen zwei Grenzwerte geprüft:
-
Beim Erreichen von RS485ErrorLimit1 wird eine Warnung in
kern.loggeschrieben. -
Beim Erreichen von RS485ErrorLimit2 wird das Modul offline genommen, im Byte RevPiStatus als abwesend markiert und ein Fehler in
kern.loggeschrieben. Sobald das Modul wieder antwortet, wird es automatisch wieder online genommen.
Diese Grenzwerte sind voreingestellt und bieten für die meisten Anwendungsfälle eine ausgewogene Balance zwischen Fehlertoleranz und Systemstabilität:
-
RS485ErrorLimit1: 10
-
RS485ErrorLimit2: 1000
Wenn einer der Grenzwerte auf 0 gesetzt wird, ist die jeweilige Prüfung deaktiviert.
piControl deaktivieren #
In speziellen Anwendungsfällen kann es notwendig sein, piControl zu deaktivieren.
▷ Logge dich über ein Terminal am RevPi ein.
▷ Deaktiviere piControl mit:
sudo rmmod piControl
Falls der Befehl fehlschlägt, weil piControl noch verwendet wird, beende zuerst die Anwendungen, die auf /dev/piControl0 zugreifen. Mit sudo lsof /dev/piControl0 lassen sie sich ermitteln.
▷ Reaktiviere piControl mit:
sudo modprobe piControl
Nach einem Neustart des RevPi wird piControl automatisch wieder gestartet.
Um piControl dauerhaft zu deaktivieren, muss die Konfiguration angepasst werden:
▷ Logge dich über ein Terminal am RevPi ein.
▷ Öffne die Datei /etc/modules-load.d/picontrol.conf in einem Editor.
▷ Kommentiere mit # die Zeile für piControl aus.
▷ Speichere und schließe die Datei.
Weitere Ressourcen #
-
Zugriff auf das Prozessabbild über piTest
-
Zugriff auf das Prozessabbild über Python-Module wie RevPiModIO2