B&R Programmierung eines Torantriebes

Luzie

Level-1
Beiträge
77
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
da ich im Web nicht das gefunden habe was ich wollte Frage ich doch lieber hier.
Es geht um ein Garagentorantrieb. Diesen würde ich gerne im Strukturierten Programmieren und habe da schon einmal angefangen mit.
Code:
    IF((Tor_1_auf OR Tor_1_Funk_auf) AND NOT m_Tor_1_Bewegung_zu)THEN
        m_Tor_1_Bewegung_auf:=TRUE;
    END_IF;    
    RS_TOR_1_auf(SET :=m_Tor_1_Bewegung_auf, RESET1:= Tor_1_oben OR Tor_1_stop);
    M1_Tor_1_hoch:=RS_TOR_1_auf.Q1;

    IF((Tor_1_zu OR Tor_1_Funk_zu) AND NOT m_Tor_1_Bewegung_auf)THEN
        m_Tor_1_Bewegung_zu:=TRUE;
    END_IF;    
    RS_TOR_1_zu(SET :=m_Tor_1_Bewegung_zu, RESET1:= Tor_1_unten OR Tor_1_stop);
    M1_Tor_1_runter:=RS_TOR_1_zu.Q1;
    
    IF((m_Tor_1_Blockade) AND NOT m_Tor_1_Bewegung_auf)THEN
        M1_Tor_1_runter:=FALSE; 
        M1_Tor_1_hoch:=TRUE;
    END_IF;
    IF(M1_Tor_1_runter OR M1_Tor_1_hoch)THEN
        Tor_1_Ampel_rot:=TRUE;
    ELSE
        Tor_1_Ampel_rot:=FALSE;
    END_IF;
    IF(Tor_1_oben OR Tor_1_unten)THEN
        m_Tor_1_Bewegung_auf:= FALSE;
        m_Tor_1_Bewegung_zu:= FALSE;
        m_Tor_1_Blockade:=FALSE;
    END_IF;

Ich weiss das es auch einfacher geht, aber ich bin halt kein Programmierer und tue mich mit der B&R Programmierung etwas schwer da diese etwas anderst ist in der schreibweise als die die ich kenne.
Soweit so gut, es scheint so auch zu Funktionieren. Aber nun möchte ich noch einen Grünen Leuchtmelder ansteuern der für 10s angeht wenn das Tor die Pos. oben erreicht hat. Ich hatte es mit einem TOF versucht. dies klappte auch, aber wie bekomme ich den Tof dazu das er, wenn, ich in diesen 10s das Tor wieder schliessen möchte ausgeschaltet? die Zeit läuft weiter und der Melder bleibt an. kann mir da vieleicht einer bei helfen? So das wenn das Tor oben ist und der Melder angeht für die 10s, ich aber in dieser Zeit das Tor wieder runterfahre das dieser dann aus geht.

Ok und Danke für euer Verständniss, aber alles was im web zu finden was ist in KOP was mir nicht echt weiterhift.
 
TP ist auch keine Lösung, weil der TP-Impuls immer 10s lang ist, egal ob der Sensor noch betätigt ist...

@Luzie
Vielleicht formulierst Du Deine Wunsch-Aufgabenstellung etwas anders und kommst dann auf die Lösung:
Der Leuchtmelder soll leuchten, wenn die Pos.Oben betätigt ist, aber längstens für 10 Sekunden.

Mein Tipp: TOF auf "Pos.Oben nicht betätigt". Für den Leuchtmelder dann "Pos.Oben" und den TOF verknüpfen.

Harald
 
Code:
PT(IN:=Tor_1_oben, PT:=T#10s);
Ampel_Grün := PT.Q AND Tor_1_oben;

Die Ampel einfach nochmal mit dem Endschalter ver-unden.
Wird die Endlage verlassen, ist es ja egal, wenn der Impuls noch weiterläuft, so lange das nicht minutenlang ist...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Ampel einfach nochmal mit dem Endschalter ver-unden.
Wird die Endlage verlassen, ist es ja egal, wenn der Impuls noch weiterläuft, so lange das nicht minutenlang ist...
Ich kenne das B&R System jetzt nicht, aber wenn der TP nicht retriggerbar ist hätte Deine Lösung einen kleinen, wenn auch in der Realität eher nicht auftretenden, Schönheitsfehler. Fährt man vom Endschalter wieder runter geht auch bei Deiner Lösung die Lampe aus, würde aber, wenn man dann wieder auf den Endschalter fährt, keine 10s mehr leuchten, das ginge wirklich nur mit einem TOF.
 
Ich kenne das B&R System jetzt nicht, aber wenn der TP nicht retriggerbar ist hätte Deine Lösung einen kleinen, wenn auch in der Realität eher nicht auftretenden, Schönheitsfehler. Fährt man vom Endschalter wieder runter geht auch bei Deiner Lösung die Lampe aus, würde aber, wenn man dann wieder auf den Endschalter fährt, keine 10s mehr leuchten, das ginge wirklich nur mit einem TOF.


Das ist richtig, bedeutet aber auch, daß jemand am Antrieb rumspielt: innerhalb 10s wieder runterfahren und innerhalb der selben 10s wieder hoch.... natürlich kann man solche Spielereien abfangen. Frage ist, ob man das bei einer Ampel muß :rolleyes:
 
Alternativ geht auch ein TON, der ist auf jeden Fall nachtriggerbar.
Code:
TON(IN:=Tor_1_oben, PT:=T#10s);
Ampel_Grün := (NOT TON.Q) AND Tor_1_oben;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist richtig, bedeutet aber auch, daß jemand am Antrieb rumspielt: innerhalb 10s wieder runterfahren und innerhalb der selben 10s wieder hoch.... natürlich kann man solche Spielereien abfangen. Frage ist, ob man das bei einer Ampel muß :rolleyes:
Ja klar, wenn der Programmierer nicht drüber nachdenkt welchen Timer man am besten verwendet, oder wie man überhaupt robust programmiert, dann ist bei "spinnenden"/unsinnigen Anzeigen der Bediener schuld. ;)

Zum Thema: der grüne Leuchtmelder hier ist keine Ampel, und wenn es eine Ampel wäre, dann müßte man erst recht sorgfältig durchdacht programmieren.

Harald
 
Danke für eure Hilfe.
Ich habe es nun einmal mit TP Baustein probiert, es Funktioniert. Das Die Tor Ampel geht an wenn das Tor oben ist und geht nach 10s aus. Auch geht sie aus wenn innerhalb der 10s die pos oben verlassen wird und geht auch wieder an wenn die pos. oben erreicht ist.
Auch funktioniert es nun auch mit Torbeleuchtung die für 5min angeht sobald der Lichtsensor sagt es ist zu dunkel.
Ok es sind Spielerrein aber es macht spaß es selber zu machen als was fertiges zu benutzen.
Nun kann ich das dann auch für die anderen 2 Tore anwenden.

Danke euch
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der TON ist auch nicht gut, weil: wenn bei Tor_1_oben die SPS eingeschaltet wird, dann leuchtet der Leuchtmelder ewig.
Klär mich mal bitte auf warum, ich blick es nicht. Die SPS startet und im TON müsste durch die Initialisierung doch FALSE als vorheriger Zustand stehen. Der Eingang ist TRUE, der TON läuft los und da der Ausgang ja (noch) FALSE ist und der Endschalter betätigt ist leuchtet die Lampe und geht nach 10s aus.
 
Klär mich mal bitte auf warum, ich blick es nicht. Die SPS startet und im TON müsste durch die Initialisierung doch FALSE als vorheriger Zustand stehen.
Wenn beim SPS-Start der IN des TON schon TRUE ist, dann erkennt er keine steigende Flanke und läuft nicht los. Es bleibt Q = FALSE. In den mir bekannten Implementationen braucht der TON eine steigende Flanke am IN. Bei den auf Codesys basierenden Implementationen gibt es sooo viele ungenaue bis irreführende Beschreibungen, wie der TON angeblich funktioniert, daß man das tatsächliche Verhalten am besten selber ausprobiert. Aber egal, ob der TON die steigende Flanke nun erkennt oder nicht - mit TOF ist man auf der sicheren/implementations-unabhängigen Seite.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es nun einmal mit TP Baustein probiert, es Funktioniert. Das Die Tor Ampel geht an wenn das Tor oben ist und geht nach 10s aus. Auch geht sie aus wenn innerhalb der 10s die pos oben verlassen wird und geht auch wieder an wenn die pos. oben erreicht ist.
Vielleicht wiederholst Du mal Deine Tests und schaust ganz GENAU hin, wie Deine Lösung funktioniert, wenn Pos oben nur kurz verlassen wird, ob das so von Dir gewollt ist. Siehe den Hinweis in Beitrag #6

Harald
 
Wenn beim SPS-Start der IN des TON schon TRUE ist, dann erkennt er keine steigende Flanke und läuft nicht los. Es bleibt Q = FALSE. In den mir bekannten Implementationen braucht der TON eine steigende Flanke am IN.
Stimmt, an die Flankenauswertung habe ich nicht gedacht oder genauer, ich habe schon dran gedacht, bin aber davon ausgegangen, dass der vorherige Zu stand FALSE ist beim Start der SPS, aber je nachdem wie die intern realisiert ist kann das natürlich, wenn es anders läuft, in die Hose gehen.
 
Zuletzt bearbeitet:
Hallo Harald
Ja das ist so gewollt das der Melder dann sofort ausgeht wenn die Pos. oben verlassen wird.

ich habe auch noch einmal das ganze etwas umgestellt und hoffe das es so Übersichtlicher ist.
Code:
    //TOR 1    
    RS_TOR_1_auf(SET :=Tor_1_auf OR Tor_1_Funk_auf, RESET1:= Tor_1_oben OR Tor_1_stop);
    M1_Tor_1_hoch:=RS_TOR_1_auf.Q1 AND NOT M1_Tor_1_runter;


    RS_TOR_1_zu(SET :=Tor_1_zu OR Tor_1_Funk_zu, RESET1:= Tor_1_unten OR Tor_1_stop);
    M1_Tor_1_runter:=RS_TOR_1_zu.Q1 AND NOT M1_Tor_1_hoch;
    
    Timer_Tor_1_Sig_gruen(IN:=Tor_1_oben, PT:=t#10s);
    Tor_1_Ampel_gruen:=Timer_Tor_1_Sig_gruen.Q AND Tor_1_oben;


    Timer_Tor_1_LED_Leiste(IN:=Tor_1_oben AND Lichtsensor_Tor_LED, PT:=t#300s);
    Tor_1_LED_1:=Timer_Tor_1_LED_Leiste.Q AND Tor_1_oben;


[COLOR=#ff0000]    IF(Tor_1_blockiert AND NOT M1_Tor_1_hoch AND NOT Tor_1_oben)THEN[/COLOR]
[COLOR=#ff0000]        M1_Tor_1_runter:=FALSE; [/COLOR]
[COLOR=#ff0000]        M1_Tor_1_hoch:=TRUE;[/COLOR]
[COLOR=#ff0000]    END_IF;[/COLOR]


    IF(M1_Tor_1_runter OR M1_Tor_1_hoch)THEN
        Tor_1_Ampel_rot:=TRUE;
    ELSE
        Tor_1_Ampel_rot:=FALSE;
    END_IF;
jetzt habe ich nur noch das Problem wenn ein Hindernis im Torbereich erkannt wird. Das Tor soll ja dann entweder stoppen oder in die obere Pos. Fahren. Ich habe mich entschlossen das es wieder in die obere Pos. Fährt. Aber das macht es so nicht. sobald das Signal vom Blockiert Sensor wieder FALSE wird fährt das Tor wieder sofort runter. (Rot markierter Text) Eine Steigende Flanke bring auch nicht den erwünschten Effekt da das Tor dann nicht abschaltet wenn es Pos. oben erreicht hat.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Luzie,

auf den schnellen Blick mußt Du noch ein Tor_1_stop setzen, um das RS für die Runter-Fahrt zurückzusetzen.

Bzw. würde ich vielleicht in den beiden RS-FlipFlops jeweils den gegenläufigen Fahrbefehl mit reinnehmen. Damit hast Du ein direktes Umschalten, ohne über Stop zu gehen.
Und solch eine wichtige Funktion, wie die Blockier-Auswertung VOR die Befehle setzen, so daß es auch sofort Auswirkung hat und nicht erst im nächsten Zyklus.

Gruß
Jens
 
Hallo alle zusammen,

noch jemand an folgendem Vorschlag Verbesserungsvorschläge (abgesehen von möglichen Verschlankungen, die ich mir auf Grund der Übersichtlichkeit gespart habe)?

Code:
    //Auswertung der Befehle
    RS_TOR_1_auf(SET :=Tor_1_auf OR Tor_1_Funk_auf OR Tor_1_blockiert, RESET1:= Tor_1_oben  OR Tor_1_stop OR Tor_1_zu  OR Tor_1_Funk_zu);
    RS_TOR_1_zu (SET :=Tor_1_zu  OR Tor_1_Funk_zu,                     RESET1:= Tor_1_unten OR Tor_1_stop OR Tor_1_auf OR Tor_1_Funk_auf OR Tor_1_blockiert);
    
    
    //Fahrbefehle setzen
    M1_Tor_1_hoch    :=RS_TOR_1_auf.Q1 AND NOT M1_Tor_1_runter;
    M1_Tor_1_runter    :=RS_TOR_1_zu.Q1  AND NOT M1_Tor_1_hoch;
    
    //Ampel Grün    
    TON_Tor_1_Sig_gruen(IN:=Tor_1_oben AND NOT FirstCycle , PT:=t#10s);
    Tor_1_Ampel_gruen := NOT TON_Tor_1_Sig_gruen.Q AND Tor_1_oben;

    //Ampel Rot
    Tor_1_Ampel_rot := (M1_Tor_1_runter OR M1_Tor_1_hoch);
    
    //Licht
    Timer_Tor_1_LED_Leiste(IN:=Tor_1_oben AND Lichtsensor_Tor_LED, PT:=t#300s);
    Tor_1_LED_1:=Timer_Tor_1_LED_Leiste.Q AND Tor_1_oben;
 
Zurück
Oben