KOP - Ausgang rücksetzen und Block mit Ret verlassen

Tobias5

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich habe eine eventuell Grundlegende Frage zur Kontaktplan-Programmierung.
Folgende Situation:
Im ersten Netzwerk eines Programmblogs frage ich eine Bedingung ab. Wenn diese erfüllt ist möchte ich einen Merker setzten, einen Ausgang rücksetzten (Power Enable eines Frequenzrichters) und dann den Programm Block verlassen, ohne dass die weiteren Netzwerke ausgeführt werden.

Ich könnte natürliche die Negierung dieser Bedingung zu Beginn der anderen Netzwerke abfragen, aber eigentlich wollte ich das nicht.
Ich hatte mir überlegt den RET Befehl zu verwenden, dieser darf aber nicht zusammen mit Zweigen mit mehreren Ausgängen verwendet werden.
Gibt es eine andere elegante Methode einen Ausgang auf Null zu setzen ohne die Verwendung von -(R)-I ?
Wie würde man dies anständig in Kontaktplan Programmieren?
Ich habe einen screenshot von meiner ursprünglichen Idee in den Anhang gepackt.
RET und R.PNG
(Den set Befehl könnte ich durch eine assignment ersetzten, dann bleiben aber immernoch zwei "Ausgangszweige")

Vielen Dank für eure Tipps
 
Warum alles in ein Netzwerk quetschen? Du könntest das -(RET) im nächsten Netzwerk machen:
Code:
  "xyz"      "M1"
---| |---+---(S)
         |
         |   "A1"
         +---(R)

   "M1"
---| |------(RET)

Oder Du machst an Deinen Merker eine Zuweisung und verwendest ihn gleich für das RET mit Hilfe eines "Connectors #":
Code:
  "xyz"      "M1"
---| |-------(#)-------(RET)

PS: Das Zuweisen/Setzen/Rücksetzen von Ausgängen in ...zig verschiedenen Netzwerken ist Pfui. Formuliere für den Power Enable des FU ein vernünftiges eigenes immer ausgeführtes Netzwerk.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die schnelle Antwort Harald!

Warum alles in ein Netzwerk quetschen? Du könntest das -(RET) im nächsten Netzwerk machen:
Ich wollte eine zusätzliche Abfrage und damit einen zuätzlichen "Rechenschritt" vermeiden. Aber vermutlich ist das bei KOP-sps programmierung eh egal. Wenn ich es richtig verstanden habe wird der Ausgang sowie erst am Ende des Zyklus über das Ausgangsabbild rückgesezt. Habe ich das richtig verstanden.


Code:
Code:
  "xyz"      "M1"
---| |---+---(S)
         |
         |   "A1"
         +---(R)

   "M1"
---| |------(RET)


Gefällt mir, danke!


Oder Du machst an Deinen Merker eine Zuweisung und verwendest ihn gleich für das RET mit Hilfe eines "Connectors #":
Code:
Code:
  "xyz"      "M1"
---| |-------(#)-------(RET)

Was bedeutet "connectors #", Aufruf einer Funktion in der ich alles abbarbeite? Oder eine Abfrage im aufrufendem Block und entsprechende abarbeitung in einem neuen Netzwerk dort?


PS: Das Zuweisen/Setzen/Rücksetzen von Ausgängen in ...zig verschiedenen Netzwerken ist Pfui. Formuliere für den Power Enable des FU ein vernünftiges eigenes immer ausgeführtes Netzwerk.
Das hatte auch den Ursprung im "Rechenschritt sparen" macht ja aber keinen Sinn (wenn ich das richtig verstanden habe).

Ich glaube du hast mir gerade indirekt wieder die Grundlagen der SPS-programmierung ins Gedächtnis gerufen. (Habe mich zum ersten mal nach Microcontroller- Programmierung (assembler und C) an SPS-programierung gewagt (es gibt glaube ich eben doch Unterschiede)).
 
Ich wollte eine zusätzliche Abfrage und damit einen zuätzlichen "Rechenschritt" vermeiden. Aber vermutlich ist das bei KOP-sps programmierung eh egal.
Bei Verzweigungen in KOP werden sowieso oft (normalerweise unsichtbar) zusätzliche Operationen vom KOP-Compiler eingefügt, wie z.B. Zwischenspeichern des VKE in TEMP und später wieder lesen. In Step7 "classic" V5.x kann man die Ansicht von KOP auf AWL umschalten, da kann man solche zusätzlichen Operationen sehen.


Wenn ich es richtig verstanden habe wird der Ausgang sowie erst am Ende des Zyklus über das Ausgangsabbild rückgesezt. Habe ich das richtig verstanden.
Richtig


Was bedeutet "connectors #"
Ein "Connector -(#)-" ist die Zusammenfassung einer Zuweisung des VKE an eine Boolsche Variable und Beginn einer neuen Verknüpfung mit der Variable in der selben Linie. Ein Connector "connected" was sonst in 2 Netzwerke geschrieben werden müsste:
Code:
  "xyz"      "M1"
---| |-------(#)-------(RET)

entspricht:

  "xyz"      "M1"
---| |-------( )

  "M1"
---| |-------(RET)

entspricht in AWL:
   U "xyz"
   = "M1"
   U "M1"
   SAVE
   BEB


Ich glaube du hast mir gerade indirekt wieder die Grundlagen der SPS-programmierung ins Gedächtnis gerufen. (Habe mich zum ersten mal nach Microcontroller- Programmierung (assembler und C) an SPS-programierung gewagt (es gibt glaube ich eben doch Unterschiede)).
Ja, da gibt es unglaublich große Unterschiede, bedingt durch die zyklische Abbarbeitung des Programms und das Prozessabbild der E/A. Vor allem muß man aufhören, ereignisorientiert zu Programmieren und zig Spezialbehandlungen IF...THEN und "jetzt sofort" machen zu wollen. Ein SPS-Programm verknüpft hauptsächlich Zustände - wieder und wieder und wieder...

Harald
 
Bei Verzweigungen in KOP werden sowieso oft (normalerweise unsichtbar) zusätzliche Operationen vom KOP-Compiler eingefügt, wie z.B. Zwischenspeichern des VKE in TEMP und später wieder lesen.
Was man oft sieht, um vermeintlich clever "kostbare" Netzwerke zu sparen, bläht in Wirklichkeit das erzeugte Programm unnötig auf - das Konstrukt wird in 11 AWL-Anweisungen kompiliert:
Code:
                            U "Immer1"
                            = tempBit
 "Immer1"    "M1" "M11"     U tempBit
---| |---+---| |---( )      U "M1"
         |                  = "M11"
         |   "M2" "M12"     U tempBit
         +---| |---( )      U "M2"
         |                  = "M12"
         |   "M3" "M13"     U tempBit
         +---| |---( )      U "M3"
                            = "M13"
Die nachfolgende Variante benötigt zwar optisch 3 Netzwerke, wird aber in nur 6 AWL-Anweisungen compiliert:
Code:
   "M1" "M11"     U "M1"
---| |---( )      = "M11"

   "M2" "M12"     U "M2"
---| |---( )      = "M12"

   "M3" "M13"     U "M3"
---| |---( )      = "M13"

Die Anzahl AWL-Anweisungen bezieht sich auf S7-300/400. Für S7-1200/1500 wird der Compiler vermutlich ähnlich compilieren.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Danke Harald!

connectoren kannte ich noch nicht, gut zu wissen, dass es die gibt.

Super interessant das in AWL zu sehen (muss ich mir spatter nochmal genauer anschauen). Wenn es nicht die Vorgabe in KOP zu programmieren gäbe würde ich lieber in AWL programmieren (oder am liebsten in C). Wobei, dann würde ich mich vermutlich oft selbst veräppeln weil ich in MC- und nicht im SPS-style programmieren würde.
 
Zurück
Oben