Revolutionsumbau 2.0 freestyle – Frequenzumrichter

Bei der ersten Version unseres Revolutionsumbaus war der Aufbau vom Prüfungsobjekt fest vorgegeben. Positionen von Sensoren und Zylinder, aber auch der Ablauf musste strickt eingehalten werden.

Das ist jetzt VORBEI! Wir können alles anpassen wie es uns gefällt!

Also gibt es einen komplett neuen Schaltschrank, mit viel Platz für Neuerungen! Die Bedienflaschen fallen komplett weg. Start, Stop, Betriebswahl, Notaus usw. werden direkt in die Tür eingebaut. Die Taster für den Handbetrieb entfallen GANZ (seid gespannt, das kommt in einem weiteren Beitrag)!

Die nächste und tollste Neuerung ist ein Frequenzumrichter (FU)! Diesen steuern wir, bis die analogen Module für den Revolution Pi verfügbar sind, digital an. Die alten Schütze fallen komplett weg!

Nun können wir unsere piCtory Konfiguration anpassen. Der FU benötigt in unserem Fall 6 digitale Ausgänge. Diese konfigurieren wir auf unserem „do01“:

fu_rechts / fu_links
fu_schnell / fu_lahm
fu_freigabe

Ein weiterer „fu_reset“ auf dem „do02“.

Außerdem stellen wir für den FU zwei digitale Eingänge auf unserem „di01“ zur Verfügung. Über diese erhalten wir ein 1 Signal, wenn der FU fehlerfrei arbeitet und ein weiteres 1 Signal wenn der Motor läuft.

fu_ok / fu_motoran

Der FU wurde mit Start- Stoppflanken a 500 ms konfiguriert. Der Eingang „fu_motoran“ wird erst auf 0 gesetzt, wenn der FU den Motor „angehalten“ hat, sprich nach der 500 ms Flanke.

In unserem alten Steuerungsprogramm für den Revolutionsumbau, haben wir für die Bandsteuerung eine eigene Klasse geschrieben class Band(Thread):. Diese stellt allen anderen Teilen des Programms Funktionen zur Verfügung um das Band zu starten und stoppen.
Diese Klasse ist nun der einzige Punkt, den wir auf unseren FU anpassen müssen. Die neue Klasse sieht dann so aus:

class Band(Thread):

    """Thread fuer die Steuerung des Bandmotors.

    Ueber die hier zur Verfuegung gestellten Funktionen steuert das Programm
    die Eigenschaften des Bandmotors. Die Funktionen kontrollieren
    selbststaendig ob die gewuenschte Betriebsart erlaubt ist und geben jeweils
    True oder False zurueck. Damit kann in dem aufrufenden Teiles des
    Programms kontrolliert werden, ob die Aktion durchgefuert werden konnte.

    """

    def __init__(self, rpi):
        """Instanziiert den Bandthread."""
        super().__init__()
        self.evt_ende = Event()
        self.daemon = True
        self.rpi = rpi

    def grundstellung(self, wait=False):
        """Setzt die Motorensteuerung in die Grundstellung.
        @return True, wenn erfolgreich durchgefuert"""
        self.rpi.io.fu_rechts.value = False
        self.rpi.io.fu_links.value = False
        self.rpi.io.fu_schnell.value = False
        self.rpi.io.fu_lahm.value = False
        if wait:
            return self.rpi.io.fu_motoran.wait(
                exitevent=self.evt_ende,
                okvalue=False,
                timeout=2000
            ) <= 0
        else:
            return True

    def set_lahm_rechts(self):
        """Band langsam nach rechts laufen lassen.
        @return True, wenn Aktion ausgefuehrt werden konnte"""
        return self.switch("fu_rechts", "fu_lahm")

    def set_lahm_links(self):
        """Band langsam nach links laufen lassen.
        @return True, wenn Aktion ausgefuehrt werden konnte"""
        return self.switch("fu_links", "fu_lahm")

    def set_schnell_rechts(self):
        """Band schnell nach rechts laufen lassen.
        @return True, wenn Aktion ausgefuehrt werden konnte"""
        return self.switch("fu_rechts", "fu_schnell")

    def set_schnell_links(self):
        """Band schnell nach links laufen lassen.
        @return True, wenn Aktion ausgefuehrt werden konnte"""
        return self.switch("fu_links", "fu_schnell")

    def switch(self, richtung, speed):
        if self.rpi.io.notaus_ok.value and self.rpi.io.fu_frei.value:

            # Wenn bereits läuft
            if self.rpi.io[richtung].value and self.rpi.io[speed].value:
                return True

            # Grundstellung einnehmen und bei Erfolg schalten
            if self.grundstellung(self.rpi.io.fu_motoran.value):
                self.rpi.io[richtung].value = True
                self.rpi.io[speed].value = True
                return True

        else:
            self.grundstellung()
        return False

    def run(self):
        """Wird durchgehend ausgefuehrt, wenn Bandthread laeuft.

        In dieser Funktion werden die Lampen gesteuert, die je nach Betriebsart
        dauerhaft leuchten (Automatikbetrieb) oder blinken (Handbetrieb) wenn
        der Motor lauft.

        """
        while not self.evt_ende.is_set():
            # FU-Freigabe auswerten
            self.rpi.io.fu_frei.value = \
                self.rpi.io.notaus_ok.value and \
                self.rpi.io.motorschutz_ok.value

            myflash.wait()

    def stop(self):
        """Beendet den Bandthread."""
        self.evt_ende.set()