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

Page 1 of 2 12 LastLast
Results 1 to 10 of 20

Thread: WHILE / RETURN mit ablaufender Zeit

  1. #1
    Join Date
    13.01.2009
    Posts
    30
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Unglücklich


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    habe ein kleines Problem. Ich will entweder eine RETURN-
    oder eine WHILE-Schleife nutzen, die 30 Sekunden überprüft wird.

    Mit einer WHILE sieht es bis jetzt wie folgt aus, jedoch funktioniert es nicht!

    Deklarationen:
    Code:
    PROGRAM MAIN
    VAR
        zaehler: TIME;
        var1: UDINT;
        strg: STRING;
    END_VAR
    Die Anweisung is nur ein Bespiel:
    Code:
    var1:=1;
    zaehler:=t#30000ms;
    WHILE zaehler<>t#0ms DO
        Var1 := Var1*2;
        zaehler := zaehler-t#1000ms;
    END_WHILE
    strg:= UDINT_TO_STRING(var1);
    Das Ergebnis bekomme ich nur leider nicht nach erst 30 Sekunden, sondern sofort.
    Code:
    var1 = 16#40000000
    zaehler = T#0ms
    zaehler = T#0ms
    var1 = 16#40000000
    zaehler = T#0ms
    
    strg = '1073741824'           var1 = 16#40000000
    Was mache ich falsch?

    Gruß Mathias
    Reply With Quote Reply With Quote WHILE / RETURN mit ablaufender Zeit  

  2. #2
    Join Date
    06.07.2007
    Posts
    2,839
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Default

    Du benutzt wie du so schön schreibst einen Zähler! Dieser wieder in der While-Schleife incrementiert. Dies geschieht allerdings ohne jegliche Zeitverzögerung, auch wenn der Zähler "Zeitwerte" besitzt.

    Mein Vorschlag wäre es, dass du einen Timer benutzt. Möchtest du Multiplikation nur jede Sekunde durchführen? Dann würde ich den Timer immer für 1 Sek laufen lassen und nach Ablauf die Multiplikation durchführen. Das ganze könntest du dann 30 Mal wiederholen.
    A programmer is just a tool which converts caffeine into code.

  3. #3
    Join Date
    19.11.2006
    Posts
    1,364
    Danke
    6
    Erhielt 255 Danke für 231 Beiträge

    Default

    Quote Originally Posted by hoOLLOow View Post
    Hallo,
    habe ein kleines Problem. Ich will entweder eine RETURN-
    oder eine WHILE-Schleife nutzen, die 30 Sekunden überprüft wird.

    Mit einer WHILE sieht es bis jetzt wie folgt aus, jedoch funktioniert es nicht!

    Deklarationen:
    Code:
    PROGRAM MAIN
    VAR
        zaehler: TIME;
        var1: UDINT;
        strg: STRING;
    END_VAR
    Die Anweisung is nur ein Bespiel:
    Code:
    var1:=1;
    zaehler:=t#30000ms;
    WHILE zaehler<>t#0ms DO
        Var1 := Var1*2;
        zaehler := zaehler-t#1000ms;
    END_WHILE
    strg:= UDINT_TO_STRING(var1);
    Das Ergebnis bekomme ich nur leider nicht nach erst 30 Sekunden, sondern sofort.
    Ist Klar, weil die Eingangsbedingung schon nach dem ersten Zyklus nicht mehr gilt.
    DIe While-Schleife wird solange durchlaufen (in einem Zyklus) bis die Abbruchbedingung verfällt. Vergleichbar mit einer FOR-Schleife.
    While ist hier denkbar ungünstig.

    Probier mal:
    Code:
    VAR
      ton1: TON;
    END_VAR
    
    ton1(IN := NOT ton1.Q , PT :=t#30s);
    IF ton1.Q THEN
        ....  (* Aktion *)
    END_IF
    Diese Aktion wird alle 30 Sekunden ausgeführt.
    edit: hab's nochmal geändert (vereinfacht)
    Last edited by trinitaucher; 03.02.2009 at 13:36.

  4. #4
    Join Date
    06.07.2007
    Posts
    2,839
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Default

    Jetzt ist nur die Frage, ob er seine Aktion dreißig Sekunden lang oder erst nach dreißig Sekunden ausführen will.
    A programmer is just a tool which converts caffeine into code.

  5. #5
    Join Date
    19.11.2006
    Posts
    1,364
    Danke
    6
    Erhielt 255 Danke für 231 Beiträge

    Default

    Für "30 Sekunden lang" fragt man einfach ab:
    Code:
    IF ton1.IN THEN
        (* Aktion *)
    END_IF
    Diese Anweisung wird immer 30 Sekunden lang durchlaufen (endlos)

    Für eine einmalig Ausführung nach 30 Sekunden setzt man:
    Code:
    ton1(IN := NOT ton1.Q AND (*Bedingung*) , PT :=t#30s);
    IF ton1.Q THEN
       (* Aktion *)
       (*Bedingung := FALSE *)
    END_IF
    Last edited by trinitaucher; 03.02.2009 at 14:03.

  6. #6
    Join Date
    13.01.2009
    Posts
    30
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Default

    Quote Originally Posted by Cerberus View Post
    Jetzt ist nur die Frage, ob er seine Aktion dreißig Sekunden lang oder erst nach dreißig Sekunden ausführen will.
    Na jede Sekunde einmal. Nicht erst nach 30 Sekunden.

    Die Sache von Trinitaucher mit dem TON-Timer bin ich am basteln.

    Schreibe dann nochmal wenns klappt.

  7. #7
    Join Date
    13.01.2009
    Posts
    30
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Default

    So siehts es erstmal aus...
    Code:
    PROGRAM MAIN
    VAR
        var1        : UDINT;
        strg        : STRING;
        Zeit        : TON;
    END_VAR
    Code:
    var1:=1;
        Zeit(IN := NOT Zeit.Q , PT :=t#30s);
        IF Zeit.Q THEN
                Var1 := Var1*2;
        END_IF
    strg:= UDINT_TO_STRING(var1);
    So nun fehlt nur noch ein Zähler für die Berechnung der Var1-Berechnung.
    Last edited by hoOLLOow; 03.02.2009 at 14:06.

  8. #8
    Join Date
    19.11.2006
    Posts
    1,364
    Danke
    6
    Erhielt 255 Danke für 231 Beiträge

    Default

    Dein Code wird immer nach 30 Sekunden ausgeführt, wobei var1 in jedem Zyklus =1 ist, außer alle 30 Sekunden. Dann ist var = 2 .

  9. #9
    Join Date
    06.07.2007
    Posts
    2,839
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Default

    Probiers mal damit:
    Code:
    IF zaehler < 30 THEN
     Timer(IN:= TRUE, PT:= t#1s);
     IF Timer.Q THEN
      Timer(IN:= FALSE);
      var1 := var1*2;
      zaehler := zaehler + 1;
     END_IF
    END_IF
    IF zaehler = 30 THEN
     strg := UDINT_TO_STRING(var1);
    END_IF
    A programmer is just a tool which converts caffeine into code.

  10. #10
    Join Date
    13.01.2009
    Posts
    30
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Reden


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das ist immer noch nicht die optimale Lösung.
    Im Endeffekt soll folgendes geschehen:
    (die var1-Berechnung ist ja nur eine Beispiel-Anweisung)
    Die Schleife soll 10min lang alle 10 Sekunden oder jede Sekunde versuchen eine Mail über AMS zu senden (SMTP-Funktionsblock).

    Nur Fragen ich weiß...
    Vielleicht ist jetzt klar was wann wo passieren soll.

    Aber ich baue auch noch weiter.

Similar Threads

  1. TwinCat 3 Break, Exit, Return und Continue
    By Ärmel in forum CODESYS und IEC61131
    Replies: 8
    Last Post: 01.02.2019, 07:38
  2. TwinCat3 - CoE - ADS Return Code Fehler 6
    By Aleks0209 in forum CODESYS und IEC61131
    Replies: 3
    Last Post: 14.02.2018, 14:14
  3. Step 7 Carriage Return CR
    By spirit in forum Simatic
    Replies: 8
    Last Post: 21.10.2014, 14:40
  4. OB32 hoch zählen/return
    By HorstPower in forum Simatic
    Replies: 3
    Last Post: 27.02.2012, 19:40
  5. Funktion ohne Return Value?
    By Sh4gr4th in forum Simatic
    Replies: 9
    Last Post: 13.09.2007, 22:18

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •