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

Ergebnis 1 bis 7 von 7

Thema: While Schleife in ST

  1. #1
    Registriert seit
    10.08.2010
    Ort
    Bi
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    moin zusammen,

    hab da ma ne Frage...
    Villt ne dumme aber ich weiß es nicht besser.
    Programmiere für nen Projekt grad eine Ofensteuerung.
    Hab eine While schleife gebaut wo ich auf eine Temperature abfrage.

    IF isttempA < SolltempA THEN
    SolltempB:=SolltempA - 0.1;
    WHILE isttempA < SolltempB DO (*solange isttemp < solltemp*)
    isttempA:=Umwandlung(isttemp);(Funktion Strom0..20mA->°C*)
    SolltempmA := Solltemp_Strom(SolltempA);
    IF AbtastA <> -1 THEN
    NotSolltemp:=TRUE;
    TIME3:=mult_sec(AbtastA); (*Funktion von ms nach s *)
    z:=abtasten(AbtastA,NotSolltemp);
    END_IF
    END_WHILE
    END_IF

    Kompilieren lässt sich alles wunderbar.
    Wenn ich das Programm starte, schmiert sofort alles ab.

    Ich kenne die While schleife aus C und in C wiederholt die schleife das ganze bis die Bedingung eintritt.

    Ne SPS arbeitet ja über nen Zyklus und ich hab das Gefühl das ich mit der Schleife nen Loop baue.

    Komme irgendwie nicht weiter...

    Danke für eure Hilfe

    Gruß Martin
    Zitieren Zitieren While Schleife in ST  

  2. #2
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.752
    Danke
    323
    Erhielt 1.527 Danke für 1.286 Beiträge

    Standard

    Dein Problem ist definitiv das "WHILE".

    Die SPS ist sowieso eine ständige Endlos-Schleife, also entspräche dein WHILE in dem Fall eindeutig einem zusätzlichen "IF THEN".

    Code:
    IF isttempA < SolltempA THEN
        SolltempB:=SolltempA - 0.1;
        IF isttempA < SolltempB DO (*solange isttemp < solltemp*) THEN
            isttempA:=Umwandlung(isttemp);(Funktion Strom0..20mA->°C*)
            SolltempmA := Solltemp_Strom(SolltempA);
            IF AbtastA <> -1 THEN
                NotSolltemp:=TRUE;
                TIME3:=mult_sec(AbtastA); (*Funktion von ms nach s *)
                z:=abtasten(AbtastA,NotSolltemp);
            END_IF
         END_IF
    END_IF
    Die WHILE Schleife ist bei einer SPS nur in den seltensten Fällen sinnvoll zu gebrauchen.
    Warum hast du jetzt ja kennengelernt ...

    Mfg
    Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  3. Folgender Benutzer sagt Danke zu MSB für den nützlichen Beitrag:

    Snooky (24.11.2010)

  4. #3
    Registriert seit
    09.11.2010
    Ort
    8448x
    Beiträge
    9
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Snooky Beitrag anzeigen
    Ich kenne die While schleife aus C und in C wiederholt die schleife das ganze bis die Bedingung eintritt.
    While wiederholt { ... } solange while( ... ) wahr ist!!!
    Es gibt in C auch noch eine Until und die wiederholt { .. }bis until( ... ) wahr ist!!!

    Ne SPS arbeitet ja über nen Zyklus und ich hab das Gefühl das ich mit der Schleife nen Loop baue.
    Genau das passiert auch. Du musst die bedingung in der While ändern
    Komme irgendwie nicht weiter...
    Du musst die bedingung in der While ändern

  5. #4
    Snooky ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.08.2010
    Ort
    Bi
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo danke für eure Hilfe.
    Es scheint allerdings so als hätte ich nen hänger. Ich komme einfach nicht drauf wie ich das machen soll.

    Das Programm soll so funktionieren das alles abgearbeitet wird und bei einer Negativen Flanke von bool_verweil i um 1 hochgezählt wird.
    Wenn im Feld Ende steht wird das Programm beendet ansonsten die nächste Temperatur angefahren.
    Das Problem ist, wie kann ich erreichen das das Programm nicht beim Start direkt alle Felder abfragt. erst wenn bool_verweil eine negative flanke bringt darf die nächste Temperatur angefahren werden.
    Oder kann ich dies noch anders z.B. ohne eine Schleife programmieren?

    Hier der Code:

    Code:
    IF Programm_start = TRUE THEN                 (*Programm start *)
    verweilStart:=FALSE;
        WHILE  eingabe[i] <> 'Ende' DO                     (* Programm Schleife zur Abfrage der in der Tabelle stehenden Werte*)
    
            IF eingabe[i] ='Temperatur' THEN                 (* Abfrage ob im Feld eingabe von i der String Temperatur steht *)
                SolltempA:=eingabe_wert[i];                     (*Temperaturwert nach Variable SolltempA schreiben ( Sichern ) *)
            END_IF
            IF SolltempA >= -20 AND SolltempA <= 90 THEN     (* Abfrage ob SolltempA > -20°C und < 90°C ist*)
                i:=i+1;                                         (* Die Varible i wird um 1 hochgezählt um ins nächste Feld der Arrays zu springen*)
            END_IF
            IF SolltempA > 90 THEN                         (*Abfrage ob Solltemp A > 90 ist*)
                SolltempA := 90;                                 (*Die Variable SolltempA mit 90 überschreiben*)
                eingabe_wert[i]:=90;                             (* 90 ins Arrayfeld schreiben ( nur zur Anzeige ; keine Funktion) *)
                Fehlermeldung[i]:='Temp > 90°C ; Temp=90°C !';     (* Fehlermeldung ob die Temperatur > 90°C ist*)
                i:=i+1;                                          (* Die Varible i wird um 1 hochgezählt um ins nächste Feld der Arrays zu springen*)
            END_IF
            IF SolltempA < -20 THEN                         (*Abfrage ob Solltemp A < 20 ist*)
                SolltempA:= -20;                                 (*Die Variable SolltempA mit -20 überschreiben*)
                eingabe_wert[i]:= -20;                             (* -20 ins Arrayfeld schreiben ( nur zur Anzeige ; keine Funktion) *)
                Fehlermeldung[i]:='Temp< -20°C ; Temp= -20°C !';     (* Fehlermeldung ob die Temperatur < -20°C ist*)
                i:=i+1;                                          (* Die Varible i wird um 1 hochgezählt um ins nächste Feld der Arrays zu springen*)
            END_IF
            IF eingabe[i]='Abtastrate' THEN                  (* Abfrage ob im Feld eingabe von i der String Abtastrate steht *)
                AbtastA:=eingabe_wert[i];                         (* Wert nach AbtastA schreiben*)
                i:=i+1;                                          (* Die Varible i wird um 1 hochgezählt um ins nächste Feld der Arrays zu springen*)
            END_IF
    
    
    
                IF isttempA <> SolltempA THEN            (*Schleife für Steigung positiv *)
    
                isttempA:=Umwandlung(isttemp);            (*Abfrage auf Isttemperatur des Ofens*)
    
                SolltempmA := Solltemp_Strom(SolltempA);    (*Übergabe der Solltemperatur auf den Eingang der Stromklemme*)
    
                IF AbtastA <> -1 AND NOT bool_verweil THEN                        (*Abfrage ob AbtastA ungleich -1*)
                    NotSolltemp:=TRUE;
                    TIME3:=mult_sec(AbtastA);
                    z:=abtasten(AbtastA,NotSolltemp);        (*Übergabe der Funktion WerteSchreiben den Abtastintervall sowie die positive BOOL*)
                END_IF
                END_IF
                IF eingabe[i]='' THEN                             (* Wenn EingabeFeld leer Ende reinschreiben! Wichtig sollte der Anwender Ende vergessen würde die CPU abstürzen (LOOP) *)
                eingabe[i]:='Ende';
                END_IF
                IF isttempA > SolltempA - 0.1 THEN
                istgroesser:=TRUE;
                ELSE
                istgroesser:=FALSE;
                END_IF
                IF isttempA < SolltempA +0.1 THEN
                istkleiner:=TRUE;
                ELSE
                istkleiner:=FALSE;
                END_IF
    
    (* Isttemp größer Solltemp*)
    
    (*ENDE Veränderung*)
    
    (*START Timer*)
            IF eingabe[i] ='Timer' THEN                      (* Abfrage ob im Feld eingabe von i der String Timer steht *)
            TimerA:=eingabe_wert[i];
            i:=i+1;
            time4:=mult_min(TimerA);                                         (* Die Varible i wird um 1 hochgezählt um ins nächste Feld der Arrays zu springen*)
            END_IF
                FF2(CLK:=istgroesser , Q=>nflanke );
                Timer(IN:=nflanke , PT:=time4 , Q=>bool_verweil );
    
                FF3(CLK:=istkleiner , Q=>nflanke2 );
                Timer(IN:=nflanke2 , PT:=time4 , Q=>bool_verweil );
    
    
                IF bool_verweil = TRUE THEN
                IF eingabe[i]='Abtastrate' THEN                  (* Abfrage ob im Feld eingabe von i der String Abtastrate steht *)
                AbtastA:=eingabe_wert[i];                         (* Wert nach AbtastA schreiben*)                                                (* Die Varible i wird um 1 hochgezählt um ins nächste Feld der Arrays zu springen*)
                END_IF
                SolltempmA := Solltemp_Strom(SolltempA);    (*Übergabe der Solltemperatur auf den Eingang der Stromklemme*)
    
                NotSolltemp:=FALSE;                    (*Umwandlung von TimerA nach minuten*)
    
                (*start_time_verweil:=FALSE;*)
                IF AbtastA <> -1 THEN                        (*Abfrage ob AbtastA ungleich -1*)
                TIME3:=mult_sec(AbtastA);
                z:=abtasten(AbtastA,bool_verweil);        (*Übergabe der Funktion WerteSchreiben den Abtastintervall sowie die positive BOOL*)
                END_IF
                END_IF
    
            END_WHILE
    
    END_IF                                         (*ENDE Programm_start*)

  6. #5
    Registriert seit
    13.09.2010
    Beiträge
    115
    Danke
    0
    Erhielt 18 Danke für 18 Beiträge

    Standard

    Wie oben schon erwähnt, wird jedes Programm in einer SPS zyklisch abgearbeitet.
    Also immer und immer wieder. Dazu gehört eine Zykluszeit und die kann man mit einer Schleife ungewollt überschreiten.

  7. #6
    Snooky ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    10.08.2010
    Ort
    Bi
    Beiträge
    7
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hey,

    ja das habe ich verstanden! Nur wie kann ich erreichen das die große(eingabe[i]<> 'Ende') von mir aus auch ne IF Schleife, immer bei einer negativen Flanke von bool_verweil ausgeführt wird? Das Problem ist ja das der Eingang der IF Abfrage solange TRUE sein muss bis die SPS zeit hatte alle anderen IF Abfragen abzuarbeiten. Ne Flanke reicht da wahrscheinlich nicht aus.

    Gruß Martin

  8. #7
    Registriert seit
    24.10.2010
    Beiträge
    133
    Danke
    2
    Erhielt 23 Danke für 23 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    zuerst mal IF ist keine Schleife, sondern eine Abfrage.

    Setz doch einfach bei der negativen Flanke von bool_verweil ein Bit das die IF-Anweisung aktiviert und nachdem du alle gewünschten Anweisungen abgearbeitet hast nimmst du es wieder weg.

    Gruß

Ähnliche Themen

  1. IF oder FOR Schleife in AWL?
    Von motamas im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 21.07.2010, 14:19
  2. for-Schleife
    Von fai004 im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 26.04.2009, 19:14
  3. FOR Schleife
    Von dietere im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 19.01.2008, 02:36
  4. For Schleife in VB 6
    Von godi im Forum Hochsprachen - OPC
    Antworten: 8
    Letzter Beitrag: 14.06.2007, 10:03
  5. AWL Schleife
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 31.07.2003, 07:05

Lesezeichen

Berechtigungen

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