Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: Endlagenüberwachung Zylinder

  1. #11
    Registriert seit
    15.04.2008
    Ort
    Dippoldiswalde (Sachsen)
    Beiträge
    18
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi Benedikt, um mal deine Frage zu beantworten.
    Also:

    U(
    U A 0.0 // wenn der Ausgang für die Zylinderbewegung eingeschaltet wird
    L S5T#1S // dann startet eine Einschaltverzögerung (z.B. T1)
    SE T 1
    UN A 0.0 // der Timer wird zurück gesetzt, wenn die Zylinderbewegung wieder ausgeschaltet wird
    R T 1
    NOP 0
    NOP 0
    U T 1 // ist die Zeit abgelaufen
    )
    UN E 0.0 // und die zugehörige Endlage wurde nicht erreicht
    = M 0.0 // wird ein Fehler ausgelöst

    Der Nachteil dieser Methode, du brauchst jede Menge Timer und du musst die Zeiten den Laufzeiten der Zylinder anpassen.

    Grüße aus Sachsen
    Geändert von redfoxdipps (08.02.2012 um 11:04 Uhr)
    Programmierung bedeutet, mechanische Fehler zu kompensieren ...

  2. #12
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

  3. #13
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Benedikt,

    in CoDeSys nutze ich ausschließllich die Systemfunktion "TIME()" um Zeitstempel zu erzeugen. Diese Zeit läuft nach dem Einschalten der Steuerung automatisch los und bietet tolle Möglichkeiten im Vergleich zu Timern wie TON, TOF, etc.
    Bei der S7 geht das auch in SCL. Da habe ich die auch schon verwendet.

    Ärgerlich an den TON,.. Bausteinen finde ich, dass das diese per Eingang gestartet werden müssen vor einer erneuten Nutzung muss erst eine neue Flanke erzeugt werden. Das macht die Programmierung fehleranfällig. Mit "TIME()" hast du hier keine Probleme.

    Eine Laufzeitüberwachung könntest du elegant in einer Schrittkette umsetzten im ST:

    CASE nState OF
    0: IF FahreInGS THEN
    VentilGS := TRUE;
    TimeStamp := TIME();
    nState := 10;
    END_IF;

    10: IF EnschalterGS THEN (* alles paletti Endschalter ist gekommen *)
    ;(* weitere Aktion einfügen... *)

    ELSIF TIME() > TimeStamp + t#1s THEN (* Timeout/Laufzeitüberwachung hat angeschlagen *)
    nState := 1000 + nState; (* Sprung zur Fehlerbehandlung usw. *)
    END_IF;

    1000..1999:
    wErrorID := nState - 1000; (* die Fehlerid ist also immer der Schritt in dem der Fehler auftrat. Falls in einem Schritt mehrere Fehler auftreten kannst du auch nState := 1000 + nState + 1 usw. einfügen. Wichtig ist, dass du immer in 10er Schritten alles aufbaust damit der Bezug später bei der Fehlerbehandlung klar ist. *)
    ; (* Implementiere Fehlerhandling *)
    END_CASE;

    So setzte ich immer meine Schrittketten um. Falls du viele Laufzeitüberwachungen, also quasi fast jeden Schritt mit einem Timeout überwachen willst würde ich folgendes Konstrukt vorschlagen:
    VAR
    tTimeOut : TIME;
    END_VAR

    VAR CONSTANT
    tDefaultTimeout : TIME := t#5s;
    tDisarmTimeout: TIME := t#0s;
    END_VAR


    IF nState < 1000 AND tTimeout <> tDisarmTimeout AND TIME() > tTimeout THEN
    nState := 1000 + nState + 1; (* 10er Schritt + 1 ist dann immer automatisch ein Timeout *)
    END_IF;

    CASE nState OF
    0: tTimeout := tDisarmTimeout; (* Wenn du auf ein Startsignal wartest muss natürlich die Überwachung deaktiviert werden!*)
    IF FahreInGS THEN
    VentilGS := TRUE;
    tTimeout := TIME() + tDefaultTimeout; (* Überwachung "aufziehen" *)
    nState := 10;
    END_IF;

    10: IF EnschalterGS THEN (* alles paletti Endschalter ist gekommen *)
    ;(* weitere Aktion einfügen... *)

    END_IF;
    (* ELSIF Zweig entfällt da nun automatisch außerhalb der Schrittkette ein Schritt überwacht wird und ensprechend in den Bereich > 1000 gesprungen wird *)

    1000..1999:
    wErrorID := nState - 1000; (* die Fehlerid ist also immer der Schritt in dem der Fehler auftrat. Falls in einem Schritt mehrere Fehler auftreten kannst du auch nState := 1000 + nState + 1 usw. einfügen. Wichtig ist, dass du immer in 10er Schritten alles aufbaust damit der Bezug später bei der Fehlerbehandlung klar ist. *)
    ; (* Implementiere Fehlerhandling *)
    END_CASE;


    Gibts hier auch eine "CODE" Funktion? Sieht so ja scheusslich aus!
    Geändert von excelite (01.03.2012 um 23:29 Uhr)

Ähnliche Themen

  1. Antworten: 21
    Letzter Beitrag: 11.11.2009, 15:51
  2. Zylinder verfahren lassen
    Von Vauxhall1983 im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 02.09.2009, 15:44
  3. Ansteuerung Zylinder parallel ausfahren
    Von Keeper im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 15.03.2007, 11:01
  4. Suche elektrische Zylinder 20cm Hub
    Von maxi im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 08.06.2006, 21:38
  5. Frage über Zylinder
    Von waldy im Forum Stammtisch
    Antworten: 12
    Letzter Beitrag: 27.01.2006, 11:34

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •