Zyklisch mit wenig Python

Dieses Beispiel führt euch in die zyklische Programmierung mit RevPiModIO und dem cycleloop(...) ein! Das Programm verwendet auch die Funktion handlesignalend(...) um das „Programmende“ Signal zu verarbeiten und sich sauber zu beenden.

Quelltext für RevPiModIO Version 2
# -*- coding: utf-8 -*-
import revpimodio2

def zyklusprogramm(zyklustools):
    """Diese Funktion wird bei jedem IO Zyklus automatisch ausgefuehrt."""

    # Wert des ersten Inputs auf ersten Output schreiben
    rpi.io.O_1.value = rpi.io.I_1.value

    # Wenn zweiter Input True ist, immer Ausschaltverzögerungstimer starten
    if rpi.io.I_2.value:
        # Ausschaltverzögerung für 20 Zyklen einrichten
        zyklustools.set_tofc("t_20", 20)

    # Wert des Ausschaltverzögerungstimers in zweiten Ausgang schreiben
    rpi.io.O_2.value = zyklustools.get_tofc("t_20")

    # A2 im 10 fachen Zyklustakt blinken lassen
    if zyklustools.flag10c:
        rpi.core.A2 = revpimodio2.GREEN
    else:
        rpi.core.A2 = revpimodio2.OFF

def endeprogramm():
    """Diese Funktion erledigt Aufraumarbeiten vor Programmende."""

    # LED A1 am Core Abschalten
    rpi.core.A1 = revpimodio2.OFF

# RevPiModIO mit automatischer Prozessabbildsynchonisierung instanziieren,
# dabei wird die Konfiguration automatisch aus piCtory gelesen.
rpi = revpimodio2.RevPiModIO(autorefresh=True)

# Signale für das Programmende von RevPiModIO verwalten lassen. Aufräumfunktion
# übergeben, welche bei Programmende (Strg+C / SIGTERM) ausgeführt wird.
rpi.handlesignalend(endeprogramm)

# LED A1 am Core grün leuchten lassen
rpi.core.A1 = revpimodio2.GREEN

# Zyklische Verarbeitung der Funktion "zyklusprogramm" starten.
print("Gehe jetzt in Cycleloop")
rpi.cycleloop(zyklusprogramm)

print("Habe Cycleloop verlassen")

Die Standardzykluszeit beträgt 50 Millisekunden. Sie kann über rpi.cycletime = milliseconds angepasst werden. Sollten die Aktualisierung der IOs inkl. Ausführung der Zyklusfunktion diese Zeit überschreiten, werden Warnungen ausgegeben.

Quelltext für RevPiModIO Version 1
# -*- coding: utf-8 -*-
import revpimodio

def zyklusprogramm(zyklustools):
    """Diese Funktion wird bei jedem IO Zyklus automatisch ausgefuehrt."""

    # Wert des ersten Inputs auf ersten Output schreiben
    rpi.devices[32]["O_1"].value = rpi.devices[32]["I_1"].value

    # Wenn zweiter Input True ist, immer Ausschaltverzögerungstimer starten
    if rpi.devices[32]["I_2"]:
        # Ausschaltverzögerung für 20 Zyklen einrichten
        zyklustools.set_tofc("t_20", 20)

    # Wert des Ausschaltverzögerungstimers in zweiten Ausgang schreiben
    rpi.devices[32]["O_2"].value = zyklustools.get_tofc("t_20")

    # A2 im 10 fachen Zyklustakt blinken lassen
    if zyklustools.flag10c:
        rpi.devices.core.A2 = revpimodio.GREEN
    else:
        rpi.devices.core.A2 = revpimodio.OFF

def endeprogramm():
    """Diese Funktion erledigt Aufraumarbeiten vor Programmende."""

    # LED A1 am Core Abschalten
    rpi.devices.core.A1 = revpimodio.OFF

# RevPiModIO mit automatischer Prozessabbildsynchonisierung instanziieren,
# dabei wird die Konfiguration automatisch aus piCtory gelesen.
rpi = revpimodio.RevPiModIO(auto_refresh=True)

# Signale für das Programmende von RevPiModIO verwalten lassen. Aufräumfunktion
# übergeben, welche bei Programmende (Strg+C / SIGTERM) ausgeführt wird.
rpi.handlesignalend(endeprogramm)

# LED A1 am Core grün leuchten lassen
rpi.devices.core.A1 = revpimodio.GREEN

# Zyklische Verarbeitung der Funktion "zyklusprogramm" starten.
print("Gehe jetzt in Cycleloop")
rpi.devices.cycleloop(zyklusprogramm)

print("Habe Cycleloop verlassen")

Die Standardzykluszeit beträgt 50 Millisekunden. Sie kann über rpi.devices.set_refreshtime(milliseconds) angepasst werden. Sollten die Aktualisierung der IOs inkl. Ausführung der Zyklusfunktion diese Zeit überschreiten, werden Warnungen ausgegeben.

 

Unsere piCtory Konfiguration für dieses Beispiel beinhaltet einen RevolutionPi Core und auf der rechten Seite ein DIO Modul, welches mit Inputs: 34 / Outputs: 32 eingestellt ist. Die Namen „I_1“, „I_2“, „O_1“, „O_2“ müssen im „Value Editor“ angegeben werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.