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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Frage bez. FOR-Schleife (Beckhoff CX9000-001)

  1. #1
    Registriert seit
    03.05.2011
    Beiträge
    7
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen!

    Seit gestern sitze ich an einer FOR-Schleife, die einfach nicht funktionieren will. Da ich bei SPS erst seit Kurzem dabei bin, weiss ich nicht mehr Rat.

    Aufgabe: in einer FOR-Schleife soll eine beliebige Anzahl von kurzen Flashes (mit irgendeiner Lampe o.ä.) generiert werden. Ich übergebe der Schleife eine positive ganze Zahl und erwarte, dass die Schleife mir eine entspr. Anzahl von kurzen (1s) Blinks liefert, mit 1s Pause zwischen den Blinks.

    Die Schleife sieht so aus:

    FOR (counter := 1 TO myNumber BY 1) DO
    timer (IN:= TRUE, PT:=T#1s);
    IF (timer.Q = TRUE) THEN
    greenLightControl := TRUE;
    END_IF;

    timer (IN:= TRUE, PT:=T#1s);
    IF (timer.Q = TRUE) THEN
    greenLightControl := FALSE;
    END_IF;
    END_FOR;

    Komischerweise wird bei der Abarbeitung der Schleife der counter sofort auf myNumber gesetzt und die Pausen, die in der Schleife mit dem timer generiert werden sollten, werden ignoriert. Für sich alleine, liefert der timer aber schon eine Pause, die ja auch bei zyklischem Ablauf berücksichtigt werden sollte.

    Habe ich da was falsch verstanden? Alles andere klappt einwandfrei.

    Danke für Eure Hilfe!
    Zitieren Zitieren Frage bez. FOR-Schleife (Beckhoff CX9000-001)  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard

    Hi

    Eine FOR -Schleife bleibt im Zylkus nicht stehen. Das macht Dir WHILE.
    Die FOR-Schleife hat in jedem Zyklus hochgezähtl daher bist Du sofort auf dem Sollwert gelandet.

    Ich würds damit probieren:

    Code:
    IF counter <= mynumber THEN
    timer (IN:= TRUE AND NOT timer2.Q, PT:=T#1s);
    IF (timer.Q = TRUE) THEN
    greenLightControl := TRUE;
    END_IF;
    
    timer2 (IN:= timer.Q, PT:=T#1s);
    IF (timer2.Q = TRUE) THEN
    greenLightControl := FALSE;
    END_IF;
    
    trig(CLK:=timer2.Q );
    
    IF trig.Q THEN
    COUNTER := COUNTER +1;
    END_IF
    
    END_IF
    Timer : TON;
    Timer2 : TOF;
    trig : F_trig;

    Ist nur schnell gebastelt, kannste noch verbessern.
    Sollte aber funktionieren.

    Du hast für Pause und Betrieb beide Mal den gleichen Timer verwendet.


    Gruss Anis
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de

  3. Folgender Benutzer sagt Danke zu Schnick und Schnack für den nützlichen Beitrag:

    apmIng (03.05.2011)

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    ... ich würde nicht innerhalb einer Schleife und auch nicht innerhalb einer Abfrage einen Timer-Aufruf unterbringen.
    Ich kann jetzt nicht für Beckhoff & Co. sprechen aber innerhalb einer S7 würde in SCL dieser Aufruf unter den genannten Bedingungen auch nicht funktionieren.

    Gruß
    Larry

  5. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    apmIng (03.05.2011)

  6. #4
    apmIng ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    03.05.2011
    Beiträge
    7
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Schnick und Schnack Beitrag anzeigen
    Hi
    Eine FOR -Schleife bleibt im Zylkus nicht stehen. Das macht Dir WHILE.
    Die FOR-Schleife hat in jedem Zyklus hochgezähtl daher bist Du sofort auf dem Sollwert gelandet.
    Danke für die Info.

    > Eine FOR -Schleife bleibt im Zylkus nicht stehen.

    Was ich nicht verstehe - die FOR-Schleife läuft doch in jedem SPS-Zyklus komplett durch - bis sie beendet ist und erst dann läuft SPS-Zyklus weiter. Oder irre ich mich? Weil - wie kann eine FOR-Schleife nicht stehen bleiben (in diesem Fall für die o.g. Sekunden) wenn sie doch durch eben den timer dazu gezwungen wird? Zwingt etwa ein SPS-Zyklus die FOR-Schleife dazu, den Anweisungsblock zu ignorieren, wenn dessen Ausführung länger dauert, als ein SPS-Zyklus?

    Bei WHILE/REPEAT-Schleife bekomme ich immer (auch bei billigsten Beispielen) einen SPS-Timeout und muss die CPU resetten, da diese sonst weder im Config, noch im Runmode startet.

    Komme aus der C++/Java - Welt und hatte bisher leider recht wenig mit zyklischer Programmausführung zu tun. Habe hier sechs Bücher über SPS-Programmierung liegen (u.a. von Tiegelkamp, Kaftan, Wellenreuther und Krätzig) - nirgendwo wird es auf das Problem eingegangen - daher vermute ich einen DAU.

  7. #5
    apmIng ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    03.05.2011
    Beiträge
    7
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... ich würde nicht innerhalb einer Schleife und auch nicht innerhalb einer Abfrage einen Timer-Aufruf unterbringen.
    Vielen Dank für die Info.

  8. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... ich würde nicht innerhalb einer Schleife und auch nicht innerhalb einer Abfrage einen Timer-Aufruf unterbringen.
    Ich kann jetzt nicht für Beckhoff & Co. sprechen aber innerhalb einer S7 würde in SCL dieser Aufruf unter den genannten Bedingungen auch nicht funktionieren.

    Gruß
    Larry
    Yep, genau.
    Und selbst wenn du die For-Schleife nutzen willst/sollst, z.Bsp. aus Übungsgründen, dann mußt du das Hochzählen des Counters auch in irgendeiner Form mit dem Timer verknüpfen, denn Counter wird bei jedem Zyklusdurchgang einfach hochgezählt und ist somit ruckzuck durch.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  9. #7
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard

    @ LL

    ich würde nicht innerhalb einer Schleife und auch nicht innerhalb einer Abfrage einen Timer-Aufruf unterbringen
    Stimmt. Geb ich Dir Recht. Funzen tuts, is aber ned unbedingt schön.

    Beispiel:
    Code:
    IF counter <= mynumber THEN
    do_job := TRUE;
    ELSE
    do_job := FALSE;
    END_IF
    @ampIng

    Du hast Deine Frage selber beantwortet. Die FOR-Schleife läuft durch.

    Wie Ralle gesagt hat:
    ....denn Counter wird bei jedem Zyklusdurchgang einfach hochgezählt und ist somit ruckzuck durch.
    Die WHILE-Schleife bleibt solange hängen, bis sie "beendet" ist.
    Da Du innerhalb Deiner WHILE-Schleife zwei Timer aufrufst, mit einer gesamten Wartezeit von 2 Sekunden dauert die WHILE-Schleife auch mindestens 2 Sekunden. Somit bleibt der Zyklus für diese Zeit auch in der Schleife stehen.
    Ergebnis:
    Dein Zyklus dauert mind. 2 Sekunden was eine Zykluszeitüberschreitung zur Folge hat und den WatchDog auslöst.


    Anis
    Geändert von Schnick und Schnack (03.05.2011 um 13:39 Uhr)
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de

  10. #8
    Registriert seit
    15.02.2011
    Ort
    Stromness, Scotland, UK
    Beiträge
    339
    Danke
    25
    Erhielt 34 Danke für 33 Beiträge

    Standard

    Du bist wohl noch nicht ganz in der Echtzeit-Welt angekommen. (In diesem Sinne Willkommen! )

    Wenn du im TwinCAT eine Zykluszeit von 1ms hast, hast du nur wenige us Zeit, um die Berechnungen zu erledigen. Vergiss die WHILE Schleife! Den Timeout Fehler erhälst du, wenn dein Programm nicht innerhalb von den paar us abgearbeitet wird! Für deine Verzögerung von 2 Sekunden musst du eine andere Lösung finden. (Siehe oben)

  11. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    @TE:
    das Stichwort ist hier "zyklische Programm-Bearbeitung" was hier heißt : "es wird immer alles abgearbeitet" und "der Zyklus muß irgendwann beendet sein".

    Die Lösung für dich könnte sein, dass du die Timer direkt zu einem Taktgeber verschaltest und dessen Impulse nach einem Start-Impuls zählst.
    Ist der Zähler = Wunschwert löscht du den Start wieder und damit die Freigabe dafür die Impulse auf einen Ausgang (oder ähnlich) zu geben ...

    Gruß
    Larry

  12. #10
    Registriert seit
    08.08.2007
    Ort
    Süd-Süd-Deutschland (CH)
    Beiträge
    220
    Danke
    29
    Erhielt 27 Danke für 21 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @ LL

    Was ja eigentlich (sofern ich Dich richtig verstehe) etwa dem entspricht,
    was ich bereits als Lösung (Beitrag #2) im Code vorgeschlagen habe.
    Inkl. der Verbesserung nach Deinem berechtigten Einwand (Beitrag #7).

    Oda??

    Gruss
    "Hätte ich das gewusst, hätte ich einen anderen Beruf gelernt." - "Hast Du gelernt diese Scheisse?"
    (Zitat aus Knockin' on Heaven's Door)

    "Kommentare? Wieso? Steht doch alles im Code..!"

    Avatar erstellt auf www.sp-studio.de

Ähnliche Themen

  1. Beckhoff CX9000 Profinet verwenden
    Von s.murauer im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 14.10.2011, 09:30
  2. Biete: Beckhoff CX9000
    Von chrischio im Forum Suche - Biete
    Antworten: 5
    Letzter Beitrag: 09.08.2011, 08:15
  3. Beckhoff CX9000-N000 target
    Von Fallon im Forum CODESYS und IEC61131
    Antworten: 18
    Letzter Beitrag: 28.07.2011, 13:27
  4. Visualisierung für Beckhoff CX9000 gesucht
    Von klaus1 im Forum CODESYS und IEC61131
    Antworten: 29
    Letzter Beitrag: 17.01.2010, 16:07
  5. Beckhoff CX9000-KBus
    Von SPS_Neuling im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 26.12.2007, 12:29

Lesezeichen

Berechtigungen

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