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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: WHILE / RETURN mit ablaufender Zeit

  1. #1
    Registriert seit
    13.01.2009
    Beiträge
    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
    Zitieren Zitieren WHILE / RETURN mit ablaufender Zeit  

  2. #2
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    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
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    Zitat Zitat von hoOLLOow Beitrag anzeigen
    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)
    Geändert von trinitaucher (03.02.2009 um 13:36 Uhr)

  4. #4
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    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
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    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
    Geändert von trinitaucher (03.02.2009 um 14:03 Uhr)

  6. #6
    Registriert seit
    13.01.2009
    Beiträge
    30
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Cerberus Beitrag anzeigen
    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
    Registriert seit
    13.01.2009
    Beiträge
    30
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.
    Geändert von hoOLLOow (03.02.2009 um 14:06 Uhr)

  8. #8
    Registriert seit
    19.11.2006
    Beiträge
    1.346
    Danke
    6
    Erhielt 254 Danke für 231 Beiträge

    Standard

    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
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    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
    Registriert seit
    13.01.2009
    Beiträge
    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.

Ähnliche Themen

  1. UTC-Zeit in GMT+1
    Von binford im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.09.2010, 11:26
  2. UTC zeit
    Von M4RKU5 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 14.03.2008, 13:11
  3. Funktion ohne Return Value?
    Von Sh4gr4th im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 13.09.2007, 22:18
  4. CPU Zeit
    Von Pinguino im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.04.2007, 09:46
  5. S7 - Zeit?
    Von Orion im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 13.11.2003, 08:42

Lesezeichen

Berechtigungen

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