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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 26

Thema: kann ich dass so machen?

  1. #11
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    757
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hier ein möglicher Ansatz, ohne die weitere Umgebung zu berücksichtigen:
    Code:
    VAR
       InitTime:TON;
       InitDone:BOOL;
    END_VAR
    
    IF (* Alles aus *)
    THEN
       Betriebsart:=Aus;
       InitDone:=FALSE;
    ELSIF  (iTankLevel_T1<iTankLevel_Start) (* AND weitere Bedingungen für den Start von Init *)
    THEN
       Betriebsart:=Init;
    ELSIF (iTankLevel_T1>=iTankLevel_Start) AND InitDone (* AND weitere Bedingungen für den Start von Auto *)
    THEN
       Betriebsart:=Auto;
    END_IF;
    
    InitTime(In:=Betriebsart=Init,
                 Pt:=t#60min);
    IF InitTime.Q
    THEN
       InitDone:=TRUE;
    END_IF;
    Und noch zwei weitere Gedanken
    1) Statt des Hilfsmerkers "InitDone" könnte man einen weiteren Betriebsart-Enumeratinswert (AutoBereit) oder wie auch immer deklarieren und die Betriebsart nach Ablauf von "InitTime" auf diesen Wert setzen. Ob das der Übersicht dient, wirst Du anhand des Umfangs Deiner Aufgabe besser wissen als ich.
    2) Wenn Dir die IF THEN ELSIF-Konstruktion für den Wechsel der Betriebsarten über den Kopf wächst, nimm auch dafür CASE OF.

  2. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    xinix (05.04.2011)

  3. #12
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Streich Merker, wenn du schon eine Case-Struktur hast. Jedem Case entspricht einem Zustand. Z.B, bei der Ampel sind es die Zustände Rot, Rot-Gelb, Gelb, Grün.

    Übertragen kann man das auf eine Maschine:

    Code:
    PowerUp
    Init
    InitReady
    Run
    ...
    ...
    Das hat den Vorteil, dass man mit den Merkern nicht durcheinanderkommt und es braucht nicht diese Menge an IF-THEN-ELSE . Du kannst jederzeit einen Zustand einfügen, wenn du einen vergessen hast.



    Jetzt das Bsp:

    Code:
    CASE Zustand OF
       PowerUp:
      Alarmlicht := True;
      Zustand := Init;
       Init:
      Betriebsart = Drehschalter;
      Zustand := InitReady;
    InitReady:
      IF timerStartupReady.Q THEN
        Zustand := Auto;
      END_IF
       Auto:
    blablabla
    END_CASE;
    Geändert von drfunfrock (05.04.2011 um 13:14 Uhr)

  4. Folgender Benutzer sagt Danke zu drfunfrock für den nützlichen Beitrag:

    xinix (05.04.2011)

  5. #13
    xinix ist offline Benutzer
    Themenstarter
    Registriert seit
    29.01.2010
    Beiträge
    46
    Danke
    11
    Erhielt 1 Danke für 1 Beitrag

    Daumen hoch

    Das sind zwei super Ansätze! Vielen Dank sage ich auch für Eure Mühe mir die einzelheiten zu erläutern!!

    Eine Frage bleibt noch zu folgenden Beispiel:

    Zitat Zitat von drfunfrock Beitrag anzeigen
    Code:
    CASE Zustand OF
       PowerUp:
      Alarmlicht := True;
      Zustand := Init;
       Init:
      Betriebsart = Drehschalter;
      Zustand := InitReady;
    InitReady:
      IF timerStartupReady.Q THEN
        Zustand := Auto;
      END_IF
       Auto:
    blablabla
    END_CASE;
    Wenn ich das richtig verstanden habe, sind "PowerUp, Init, InitReady usw. die Merker. Nur wie gebe ich den Merkern vor dem CASE die inhaltliche Bedingung?

    Etwa so?

    Code:
    IF iTankLevel_T1<iTankLevel_Start THEN
    PowerUp := FALSE
    Init :=TRUE
    InitReady:= FALSE
    AUS:= FALSE
    ELSE_IF iTankLevel_T1>iTankLevel_Start THEN
    PowerUp := TRUE
    Init :=FALSE
    InitReady:= FALSE
    AUS:= FALSE
    ELSE
    PowerUp := FALSE
    Init :=FALSE
    InitReady:= FALSE
    AUS:= TRUE
    END_IF
    Aber irgendwie frage ich mich warum der ganze aufwand? Wenn ich auf diese Art die Bedingungen an die Merker knöpfe, kann ich doch gleich den jeweiligen CODE unter die IF-Anweisung schreiben?

    Vielen Dank noch mal!

  6. #14
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Du brauchst nur die Zustandvar.

    Code:
    TYPE 
      tBetriebsarten : (   Init, PowerUp,   Auto ); 
    END_TYPE
    VAR
      Zustand : tBetriebsart := Init;
    END_VAR
    
    CASE Zustand OF
    Init:
        AUS := False;
        if iTankLevel_T1>iTankLevel_Start then
          Zustand := PowerUp;
        end_if;
    PowerUp:
        AUS := False;
        if iTankLevel_T1>iTankLevel_Start then
          Zustand := Auto;
        end_if;
     Auto: 
       AUS := True;
       if alles_aus or (iTankLevel_T1<iTankLevel_Start) then
         Zustand := Init;
       end_if
    END_CASE
    Der Zustand PowerUp ist nicht notwendig. Und deine 4 Merker sind viel zu kompliziert.
    Geändert von drfunfrock (05.04.2011 um 17:58 Uhr)

  7. #15
    xinix ist offline Benutzer
    Themenstarter
    Registriert seit
    29.01.2010
    Beiträge
    46
    Danke
    11
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von drfunfrock Beitrag anzeigen
    Du brauchst nur die Zustandvar.
    Ach soooooooo!!!

    Das habe ich ja dann vorher immer ganz anders versrtanden...

    und die Aktionen kommen dann auch in die jeweilige CASE ?

    So zum beispiel:

    Code:
    CASE Zustand OF
    Init:
        AUS := False;
        if iTankLevel_T1>iTankLevel_Start then
          Zustand := PowerUp;
        end_if;
        xPumpe1:=TRUE
        xPumpe2:=FALSE
    PowerUp:
        AUS := False;
        if iTankLevel_T1>iTankLevel_Start then
          Zustand := Auto;
        end_if;
        xPumpe1:=FALSE
        xPumpe2:=TRUE
     Auto: (* usw.... *)
    1000 Dank!

  8. #16
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Genau so! Das lässt sich auch leicht Debuggen, weil du den Zustand anzeigen lassen kannst, um dann nur diese Codezeilen zu betrachten. Vergess nicht die Initialisierung der Zustands-var im VAR-Teil


    Viel Spass
    Geändert von drfunfrock (06.04.2011 um 14:33 Uhr)

  9. #17
    xinix ist offline Benutzer
    Themenstarter
    Registriert seit
    29.01.2010
    Beiträge
    46
    Danke
    11
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke ! :-d

  10. #18
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    757
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Wenn Du die Steuerzúng des Zustandswechsels und die bei den Zuständen notwendigen Aktionen in das selbe CASE OF-Konstrukt packst, entsteht folgende Sondersituation: In dem Zyklus, in dem Du den Zustand wechselst, werden trotzdem noch die Aktionen entsprechend dem bisherigen Zustand ausgeführt. Die Aktionen hinken immer um einen Zyklus hinter den Zustandswechseln her. Das mag sich bei einem einfachen Programm nicht nach aussen hin auswirken, kann aber bei Erweiterungen zum Fallstrick werden, denn wirklich gewollt ist das ja eigentlich nicht.
    Ich würde deshalb zwei CASE OF schreiben. Das Erste nur für die Zustandswechsel, das Zweite für die Aktionen.

  11. #19
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Ich würde es anders sagen:
    Der Automat hier braucht immer einen Zyklus um auf Eingangsänderungen zu reagieren. Wenn man es vermeiden kann, sollte man es so belassen, weil der Code dann übersichtlicher wird.

    Wenn man in einen Zyklus eine Ausnahme machen will, so kann man die Ausgänge auch in IF-Zweig des Zustandswechsels schalten. Wenn das allerdings zur Regel wird, empfiehlt sich tatsächlich ein zweiter Case-Zweig, in dem die Zustände mit den Eingängen vernüpft werden, um den Ausgang zu ermitteln.

  12. #20
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    757
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von drfunfrock Beitrag anzeigen
    Wenn man in einen Zyklus eine Ausnahme machen will, so kann man die Ausgänge auch in IF-Zweig des Zustandswechsels schalten.
    Dann erfolgen die Ausgangszuweisungen aber nur im Zyklus des Zustandswechsels. Geht also nur für Ausgänge, die für die Dauer des neuen Zustandes ihren Status nicht mehr ändern sollen.

Ähnliche Themen

  1. Broadcast-wie kann man das machen/nutzen
    Von Holger Levetzow im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 25.05.2010, 14:00
  2. Antworten: 8
    Letzter Beitrag: 29.12.2008, 14:47
  3. Wer kann mir das machen ??
    Von Tomi200 im Forum Stammtisch
    Antworten: 11
    Letzter Beitrag: 15.07.2008, 22:01
  4. Kann man Beckhoffvisu so öffnen, dass man nicht die PLC öffnet?
    Von Tigerkroete im Forum Sonstige Steuerungen
    Antworten: 2
    Letzter Beitrag: 31.12.2007, 11:52
  5. Seriöse Quelle, dass Siemens Marktführer ist.
    Von Tigerkroete im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 25.09.2006, 20:58

Lesezeichen

Berechtigungen

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