Step 7 Ampelsteuerung für Parkplatz

Zuviel Werbung?
-> Hier kostenlos registrieren
Auch wenn man FP und FN in AWL nicht unbedingt braucht, so sind sie zumindest bequem und ich nutze sie auch. :)
Wenn man in FUP oder KOP programmiert dann haben -(P)- und -(N)- allerdings durchaus eine sinnvolle Berechtigung - sie erhöhen ungemein die Übersichtlichkeit und Verstehbarkeit. Da gibt es dann auch noch die Spezial-Versionen der POS/NEG-Boxen. In TIA haben sich die Entwickler dann regelrecht ausgetobt, da gibt es eine total unübersichtliche Vielfalt spezieller Flanken-Anweisungen, als ob die heutigen SPS-Programmierer zu keinem eigenen Können mehr fähig wären... ;)

Harald
 
Moin Onkel Dagobert!
Was hast du denn an #8 nicht verstanden? Ich habe mich doch eigentlich sehr präzise ausgedrückt.
... in gewohnt präziser Weise, möchte ich hinzufügen. Bin mir keiner Schuld bewusst - wo liegt das Problem? "Wenn" bedeutet "wenn" und es war nicht irgendwie als Unterstellung gemeint. Sorry vielstmals, wenn das schief rüber gekommen ist.
Bin selbst auch um präzise Formulierungen bemüht und weiss, dass sie trotzdem genauso präzise missverstanden werden können. Unterschiedliche Erfahrungen und auch unterschiedliche Assoziationen können zu überraschend unterschiedlichen "Deutungen" führen. Ist leider hin und wieder so und - zumindest in diesem Forum - auch nicht weiter schlimm - man kann ja nachhaken.
Gruss, Heinileini
 
Hallo Onkel Dagobert!
Ich fand deine Aussagen etwas widersprüchlich und war dadurch nur etwas verdutzt.
Widersprüche lassen sich aufklären oder bereinigen. Darfst mich gerne mit der Nase drauf stoßen ;o)

Ein einziger Widerspruch ist mir bewusst, habe ihn aber trotzdem belassen.
Hatte anfangs gesagt "vorbehaltlos einverstanden" und später beim Thema Opas Geldbörse , dass "nix 4 Flanken in einer der beiden erwarteten Reihenfolgen".
Ersteres bezog sich auf ein störungsfreies Funktionieren und letzteres auf ein gestörtes. Ja, das war nicht allzu konsequent.

Ein Thema, wo man leicht aneinander vorbei redet, sind diese verdammten Flanken. Ich hatte deshalb das Diagramm eingefügt und die 4 Flanken durchnummeriert, eben um Missverständnissen vorzubeugen.
Du sprachst von nur 1 Flanke (z.B. die positive von Signal1) und meintest damit - nach meinem Verständnis - zwei verschiedene Flanken nämlich bei "vorwärts" die positive Flanke von Signal1 an der Stelle 0 und bei "rückwärts" die positive Flanke von Signal1 an der Stelle 2.

Welche Widersprüche haben Dich irritiert?

Gruss, Heinileini
 
.. Du sprachst von nur 1 Flanke (z.B. die positive von Signal1) und meintest damit - nach meinem Verständnis - zwei verschiedene Flanken nämlich bei "vorwärts" die positive Flanke von Signal1 an der Stelle 0 und bei "rückwärts" die positive Flanke von Signal1 an der Stelle 2.

Welche Widersprüche haben Dich irritiert?

Gruss, Heinileini

Dass mein Vorschlag mit nur einer Flanke keine gute Lösung ist und dass ich es in der Praxis ganz anders mache, hatte ich bereits eingeräumt. Wir hatten also nur ganz leicht aneinander vorbei geredet. Alles gut gut.

@Frank, sorry für die Verwirrung ;) .
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Heinileini,

das mit den Flanken kann ich so ganz gut nachvollziehen, wie du es beschreibst.

Weiß du vielleicht (oder sonst jemand) wie man in FUP ein und-Gatter mit mehr als 2 Eingängen hinbekommt? Ich hab da zwar was gelesen von rechter Maustaste, aber bei meiner (Studenten-) Version scheint das nicht zu gehen.
 
In der Menüleiste oben drüber das 5. Icon von rechts. Mit einem dickeren Eingang in der Mitte.
Einen der bestehenden Eingänge vorher markieren, damit das Icon aktiviert wird.

Zusätzlicher Eingang.jpg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo nochmal,

ich hab jetzt mal versucht, den Zähler (den wir nicht benutzen sollen) durch eine Variable zu ersetzen. Hier mal mein Versuch:

Code:
      U     #ZV
      L     #Zaehlerstand
      L     1
      +I    
      U     #ZR
      L     #Zaehlerstand
      L     1
      -I    
      T     #Zaehlerstand

Ich hab das in einen FB gepackt. ZV und ZR sind Eingangsvariablen, Zaehlerstand ist STAT, weil es ja länger erhalten bleiben soll (k.A. ob das so Sinn macht).

Was ich noch gar nicht kapiere, wozu dieser DB genau gut sein soll, der ja zu jedem FB gehören muss (?) und wie man darin die Variable speichert.
 
Ich hab das in einen FB gepackt. ZV und ZR sind Eingangsvariablen, Zaehlerstand ist STAT, weil es ja länger erhalten bleiben soll (k.A. ob das so Sinn macht).

STAT macht Sinn. Dann wird die Variable im Instanzdb angelegt und über das Zyklusende gespeichert.

Desweiteren Lade und Transferbefehle (sovie Mathematische Funktionen) sind VKE unabhängig. Ein U vor einem L/T/+I/*I etc. bewirkt also für das L genau garnichts. Wenn du also wenn das U nicht erfüllt ist (VKE = 0) das L T +1 nicht ausführen willst, muss dieses übersprungen werden

Was ich noch gar nicht kapiere, wozu dieser DB genau gut sein soll, der ja zu jedem FB gehören muss (?) und wie man darin die Variable speichert.

Genau dafür um Variablen im STAT irgendwo abzulegen. Die landen genau da drin, genauso wie einfache Variablen an IN und OUT.

mfG René
 
Hab es jetzt mal mit einem Sprung versucht, paßt es dann jetzt so?

Code:
      U     #ZR
      SPB   M001

      L     #Zaehlerstand
      L     1
      +I    
      T     #Zaehlerstand
      BEA   

M001: L     #Zaehlerstand
      L     1
      -I    
      T     #Zaehlerstand
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      L     #Zaehlerstand
      L     1
      UN    #ZR
      SPB   M001
      -I    
      SPA   M002
M001: UN    #ZV
      SPB   M003
      +I    
M002: T     #Zaehlerstand
M003:

oder - ohne eigenen Baustein - direkt in den letzten Vorschlag aus #2 reingestrickt,
für Zählerstände 0 bis 255:

Code:
      L    #Zaehlerstand
      UN   E 20.1
      U    #Flankenmerker
      U    E 20.2
      SPB  M001
      SPA  M002
M001: INC  1           
M002: U    E 20.1
      FP   #Flankenmerker
      U    E 20.2
      SPB  M003
      SPA  M004
M003: DEC  1
M004: T    #Zaehlerstand

oder für Zählerstände -32.768 bis 32.767

Code:
      L    0
      UN   E 20.1
      U    #Flankenmerker
      U    E 20.2
      SPB  M001
      SPA  M002
M001: L    1            
M002: U    E 20.1
      FP   #Flankenmerker
      U    E 20.2
      SPB  M003
      SPA  M004
M003: L    -1     
M004: L    #Zaehlerstand
      +I
      T    #Zaehlerstand
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
O.k., so geht es jetzt. Ich hab jetzt noch eine OUT-Variable "Parkplatz_voll" deklariert, weil ja die Ampel angesteuert werden soll. Nun sieht das so aus:
Code:
      L     #Zaehlerstand
      L     1
      UN    #ZR
      SPB   M001
      -I    
      SPA   M002
M001: UN    #ZV
      SPB   M003
      +I    
M002: T     #Zaehlerstand
M003: L     #Zaehlerstand
      L     0
      ==I   
      =     #Parkplatz_voll

Probleme macht jetzt noch der FB, aus dem der Zähler aufgerufen wird:
Code:
      U     #neg_Flanke
      U     #Se2
      =     #rein
      U     #pos_Flanke
      U     #Se2
      =     #raus
      ON    #raus
      ON    #rein
      SPB   M001

      CALL  "Zähler" , DB1
       ZV            :=   raus
       ZR            :=    rein
       Parkplatz_voll:= 

M001: NOP   0
Hier sind die beiden Zeilen mit ZV und ZR im CALL-Aufruf rot, und es kommt die Meldung: "Deklarationsbereich der Aktualseite VAR_OUTPUT paßt nicht zum formalen Deklarationsbereich VAR_INPUT des Formalparameters ZV (bzw. ZR)"
Dabei hab ich ZV und ZR im Zähler-FB als IN deklariert, und raus und rein in diesem FB hier als OUT. Wo ist denn da noch der Wurm drin?
 
Moin Frank!
ON #raus
ON #rein
SPB M001
ändern in
UN #raus
UN #rein
SPB M001
weil sonst nur "geCALLt" wird, wenn rein & raus gleichzeitig true sind (also nie)!

VAR_OUTPUT benutzt Du meines Wissens nicht ausserhalb des aufrufenden Bausteins - könnte also durchaus etwas Temporäres sein. Vielleicht stört das?
Sind rein und raus als Bits (BOOL) im aufrufenden und im aufgerufenen Baustein deklariert?
Habe hier leider nichts zum Testen - hoffentlich liest jemand mit, der S7 gut kennt und Dir helfen kann ;o)

Gruss, Heinileini

PS: hab's blöd formuliert, wollte sagen:
die "rein" und "raus" des aufrufenden Bausteins, benutzt dieser Baustein ja nicht als OUTPUT an den ihn aufrufenden Baustein (z.B. OB1).
Deshalb denke ich, dass Du rein und raus nicht als OUTPUT deklarieren musst. Könntest dafür eigentlich temporäre Bits nehmen.
Ich kann mir aber nicht wirklich vorstellen, dass das die Ursache für das "Erröten" und die Meldung ist ...

... andererseits: wenn sie als OUTPUT deklariert sind, darf der aufrufende Baustein diese Bits zwar beschreiben, aber nicht lesen - und im CALL müssen sie gelesen werden, sonst können sie nicht an den aufgerufenen übergeben werden!?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
nochmal eine Verständnisfrage zum Zähler:

Code:
      L     #Zaehlerstand
      L     1
      UN    #ZR
      SPB   M001
      -I    
      SPA   M002
M001: UN    #ZV
      SPB   M003
      +I    
M002: T     #Zaehlerstand
M003: L     #Zaehlerstand
      L     0
      ==I   
      =     #Parkplatz_voll
Ich habe Zaehlerstand als STAT deklariert, weil es ja dauerhaft gespeichert werden muß. Wenn nun aber das Ergebnis an den OB1 zurückgeliefert werden soll, muß dann nicht in der Anweisung "T #Zaehlerstand" eine OUT-Variable stehen? Und diese müßte ja dann einen anderen Namen haben, also z.B. "Zaehlerstand_out"?
 
Moin Frank!
Für #Zaehlerstand gilt eigentlich das gleiche, wie für #Parkplatz_voll, das ja wohl auch "global" verfügbar sein soll.
Ich neige dazu, sie als global zu deklarieren.
Dann wäre es aber überflüssig, eine Kopie (#Zaehlerstand) davon - nur im Baustein gültig - zu haben.
Diese wäre dann auch von der Sorte IN-OUT, da sie am Beginn des Bausteins erstmal auf den aktuellen Stand gebracht werden muss.
Ich kann leider nur allgemeines BlaBla dazu sagen - ich weiss einfach nicht mehr, was wie und wo deklariert werden kann/muss.
Mach Dich fit im Kennenlernen und Anwenden der Möglichkeiten - wenn das Verstehen der Beschreibungen Schwierigkeiten macht, hilft Testen weiter.
Es ist zu lange her, dass ich mit S7 zu tun hatte. S5 ist zwar noch länger her, aber da gab es diese "Probleme" gar nicht - da war alles global - und für die "PrivatSphäre" in den Bausteinen musste man selber sorgen (am Anfang von Bausteinen DatenWorte aus DBs in MerkerWorte schaufeln und am Ende diese MerkerWorte wieder zurück in die DatenWorte).
Sorry & Gruss, Heinileini
 
Ich hab jetzt mal mit dem Simulieren angefangen. Da gibt es bei dem Zähler noch ein Problem:
Code:
      L     #Zaehlerstand
      L     1
      UN    #ZR
      SPB   M001
      -I    
      SPA   M002
M001: UN    #ZV
      SPB   M003
      +I    
M002: T     #Zaehlerstand_out
M003: L     #Zaehlerstand
      L     0
      ==I   
      =     #Parkplatz_voll

"Zaehlerstand" ist als STAT deklariert mit Anfangswert 50. Es wird aber immer nur bis 51 gezählt und bleibt dann so, und in der anderen Richtung springt er auf 49 und bleibt so. Es sieht also so aus, als ob der Anfangswert bei jedem Aufruf des FBs wieder neu auf 50 gesetzt wird. Gibt es da noch einen Trick, damit die Variable nur beim allerersten Mal auf 50 gesetzt wird, und dann den aktuellen Wert beibehält?
 
Zurück
Oben