Sonstiges Verständnisproblem des Klammerstacks

4lex

Level-1
Beiträge
6
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Community,

die Forensuche ergab kaum Treffer, jedenfalls finde ich nirgendwo eine gute Erklärung darüber, wie genau der Klammerstack funktioniert.
Auf Youtube habe ich ein Tutorial gefunden, bei welchem ich auch nicht weiter komme. Vor allem der Anfang, bei Minute 2:30 >> hier verstehe ich nicht,
warum bei dieser 1. Zeile mit dem U( Operator automatisch per Definition eine "1" ins VKE geschrieben wird und dann gleich noch um mich vollständig zu verwirren
ein "1-U(" in den Klammerstack, obwohl noch keine Eingangssignale benutzt wurden ?!?

Ich bin absoluter Neuling, sorry :-|
 
Zuletzt bearbeitet:
Hi, ich denke es ist besser das in den Bildern hier zu veranschaulichen, da ich nicht möchte dass jeder sich mühsam erst durch das video klicken muss...

(hab gehört das AWL kaum noch genutzt wird, möchte das aber trotzdem noch verstehen)

Bild1:

Klammerstack.png

Bild2:
Klammerstack2.png

was passiert hier im unteren Bild?

- warum steht im VKE schon eine "1" ? Wo kommt die her ? obwohl noch kein Eingang eingelesen wurde ?!
- warum steht in der 2. Zeile, also bei der Erstabfrage schon ein 1-U( im Klammerstack ?

(Das Video dazu habe ich oben in meinem 1. Post verlinkt - bei Minute 2:19 "erklärt" er es aber ich verstehe das dennoch nicht)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin jetzt auch kein AWL Profi, aber ich denke jedes Netzwerk beginnt erstmal mit VKE = 1 solange der Baustein bearbeitet wird.
Wenn du ein KOP Netzwerk Online anschaust, ist die Linie bis zur ersten Abfrage ja auch immer grün.

Im Klammerstack steht deshalb 1-U, weil das Ergebnis davon abhängt wie das U( mit dem VKE geht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin 4lex,

laut Fachlektüre wird es so beschrieben:
Die Erstabfrage ist die erste nach einer bedingten Operation bearbeitete Abfrageoperation.
Deshalb wird hier eine "1" in die Erstabfrage geschrieben.
Die CPU übernimmt den Wert der Erstabfrage direkt in das VKE. Das alte VKE wird somit überschrieben.
Dabei spielt es keine Rolle ob da U( oder O( steht.

Ich glaube diese Zeile (bzw der Eintrag) hat hauptsächlich eine Bedeutung für die CPU intern.
Für dich wird das VKE erst nach dem ersten Abfrageergebnis interessant.
Im KlammerStack steht die Verschachtelung /-verschachtelungstiefe deiner Operation.
Du kannst somit erkennen welche Binäroperationen direkt zueinander gehören.
Allerdings glaube ich das es diesen "Stack" nur in der Theorie gibt. Ist mir jedenfalls noch nie bewusst aufgefallen.

Gruß, Toki
 
. . . ich denke jedes Netzwerk beginnt erstmal mit VKE = 1 solange der Baustein bearbeitet wird. . .
Bei FUP und KOP sorgt der Editor dafür und bei AWL hoffentlich der Programmierer, aber nicht dafür, dass VKE=1 ist, sondern dafür, dass die erste Verknüpfung auch als ErstVerknüpfung behandelt wird. Und zwar muss diese "FürSorge" im zuvor durchlaufenen Netzwerk bzw. Baustein geschehen (sein), indem die dort zuletzt durchlaufene Verknüpfung auch beendet wird z.B. durch = oder R oder S oder durch einen bedingten Sprung. Siehe "VKE-begrenzend" und "ErstAbfrage".
Dass das VKE bei einer ErstVerknüpfung bei U( bzw. UN( mit 1 vorbesetzt wird, ist logisch, weil das Ergebnis sonst schon auf 0 festgenagelt und nicht mehr von den folgenden Abfragen abhängig wäre.
Eben weil mit U(, UN(, O( oder ON( die Struktur der Abfrage im KlammernStack abgebildet wird, ohne dass bereits ein Bit abgefragt wird, muss eine sinnvolle Vorbesetzung des VKE ausgeführt werden [bei U( oder UN( mit VKE=1 und bei O( oder ON( mit VKE=0].

PS:
Mag sein, dass Toki Recht hat und immer [also auch bei O( bzw. ON( ] VKE=1 vorbesetzt wird.
Auf jeden Fall ist der KlammernStack nicht "imaginär", denn ohne ihn könnte die CPU nicht klarkommen ;o)
Ich habe in der Vergangenheit immer versucht, möglichst wenige bzw. möglichst keine Klammern zu verwenden, weil's für mich sonst zu unübersichtlich wurde.
Man kann schon einiges damit tricksen (z.B. VKE-begrenzende Befehle oder Vergleiche in die VerknüpfungsKette reinschmuggeln), aber - zum Glück - kann man auch darauf verzichten.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mag sein, dass Toki Recht hat und immer [also auch bei O( bzw. ON( ] VKE=1 vorbesetzt wird.
So gelesen in der Lektüre von Hans Berger ;-) Ich habe da jetzt nicht die Muse das in Frage zu stellen...

Dass der Klammerstack real ist, sieht man anhand der Angaben im Gerätehandbuch der CPUs
Das glaube ich sofort, ist ja auch logisch. Nur ist mir der im Step 7 Manager noch nicht aufgefallen,
mit "Theorie" meinte ich das der Stack im Hintergrund gemanaged wird und nicht offensichtlich zu sehen ist wie in der Beschreibung.

Ich denke das unsere Meinungen da allesamt sehr nah beieinander liegen.

Gruß, Toki
 
In Plcsim kannst du dir den Klammerstack auch anzeigen lassen (Ansicht -> Klammerstack).
Dazu vorher im Editor den Baustein online öffnen, CPU auf Testbetrieb schalten und an entsprechender Stelle einen Haltepunkt setzen. Dann kannst du die einzelnen Anweisungen schrittweise durchgehen und siehst in Plcsim den Klammerstack. Da kann man auch sehen wie dieser aufgebaut ist.
Es wird ein Tupel aus Operand (also U(, UN(, ON(, usw.) und Statuswort auf den Klammerstack "gepusht", und mit der geschlossenen Klammer das Tupel vom Klammerstack "gepopt" und dann die Verknüpfung vorgenommen.
plcsim-klammerstack.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auf Youtube habe ich ein Tutorial gefunden [...] bei Minute 2:30 >> hier verstehe ich nicht,
warum bei dieser 1. Zeile mit dem U( Operator automatisch per Definition eine "1" ins VKE geschrieben wird
Bild2:
Anhang anzeigen 43819

was passiert hier im unteren Bild?

- warum steht im VKE schon eine "1" ? Wo kommt die her ? obwohl noch kein Eingang eingelesen wurde ?!
Es muß nicht alles richtig sein was man bei YouTube sehen kann. Auch nicht, wenn es von "staatlichen Berufsschulen" oder von Lehrern/Professoren veröffentlicht wird. (so einige SPS-Fernschüler können davon ein Lied singen ;))

Die Erklärung bei 2:45 ist falsch! ( beim ersten "U(" : VKE (vor der Operation) = 0 | VKE (nach der Operation) = 1 )
Die Klammer-Auf-Operationen "*(" beeinflussen das VKE nicht. Nach einer Klammer-Auf-Operation hat das VKE den selben Zustand wie vor der Operation.
Das STA-Statusbit wird auf 1 gesetzt - allerdings nicht deshalb weil das eine U-Klammer-Auf-Operation ist, sondern das passiert bei allen Klammer-Auf-Operationen ( U( UN( O( ON( X( XN( )
Das besondere (neben dem Klammerstack) an den Klammer-Auf-Operation ist, daß das Erstabfragebit auf 0 gesetzt wird und deshalb eine neue Verknüpfung für den eingeklammerten Teil-Ausdruck (Neben-Verknüpfung) begonnen wird.

Schau Dir mal "aus erster Hand" in Step7 in der "Hilfe zu AWL" die Beschreibungen der Klammer-Auf-Operationen an.
Oder hier im Referenzhandbuch SIMATIC STEP 7 V5.5 Anweisungsliste (AWL) für S7-300/400 ab Kapitel 1.9

PS: Das "=" am Ende der Verknüpfung setzt ebenfalls das Erstabfragebit auf 0 - "es folgt eine Erstabfrage"

Harald
 
Eben weil mit U(, UN(, O( oder ON( die Struktur der Abfrage im KlammernStack abgebildet wird, ohne dass bereits ein Bit abgefragt wird, muss eine sinnvolle Vorbesetzung des VKE ausgeführt werden [bei U( oder UN( mit VKE=1 und bei O( oder ON( mit VKE=0].
Das VKE wird gar nicht vorbesetzt, weder mit 1 noch mit 0 (es bleibt wie es ist). Es wird das Erstabfragebit /ER auf 0 gesetzt und dadurch von der nächsten Verknüpfungsoperation der Status direkt ins VKE geladen (egal ob das eine U-, O- oder X-Verknüpfungsoperation ist! UN-, ON- und XN-Verknüpfungen laden den Status negiert ins VKE).


Deshalb wird hier eine "1" in die Erstabfrage geschrieben.
Die CPU übernimmt den Wert der Erstabfrage direkt in das VKE. Das alte VKE wird somit überschrieben.
Dabei spielt es keine Rolle ob da U( oder O( steht.
Das ist auch nicht ganz richtig formuliert.

Das Erstabfrage-Statusbit ist 0-aktiv, deshalb heißt es "/ER" (negiert ER, NOT ER)
Hilfe zu AWL schrieb:
/ER Erstabfragebit (Statuswort, Bit 0)

• Ist der Signalzustand des /ER-Bits gleich "0", dann beginnt die Verknüpfungskette mit einer Erstabfrage.
d.h. bei der nächsten Verknüpfungsoperation wird der Status des Operanden direkt übernommen und nicht mit dem vorhandenen VKE verknüpft.
Das heiß auch: es ist egal ob die Operation U, O oder X heißt! Die Operation ist nur eine "Lade"-Operation (z.B.: "U E0.0" = "Lade E0.0 ins VKE"):
Code:
S7-AWL                                    (IEC1131-AWL)

Alle 3 Beispiele sind ODER-Verknüpfung, haben das gleiche Ergebnis!
[COLOR="#0000FF"]U[/COLOR]  E0.0     [COLOR="#0000FF"]O[/COLOR]  E0.0     [COLOR="#0000FF"]X[/COLOR]  E0.0           ( LD  %I0.0 )
O  E0.1     O  E0.1     O  E0.1           ( OR  %I0.1 )
=  A0.0     =  A0.0     =  A0.0           ( ST  %Q0.0 )

Alle 3 Beispiele sind UND-Verknüpfung, haben das gleiche Ergebnis!
[COLOR="#0000FF"]O[/COLOR]  E0.0     [COLOR="#0000FF"]U[/COLOR]  E0.0     [COLOR="#0000FF"]X[/COLOR]  E0.0           ( LD  %I0.0 )
U  E0.1     U  E0.1     U  E0.1           ( AND %I0.1 )
=  A0.0     =  A0.0     =  A0.0           ( ST  %Q0.0 )

Übrigens:
In IEC1131-AWL wird der Aufwand mit dem Erstabfragebit nicht betrieben, da gibt es eine extra Anweisung für den Beginn einer neuen (Unter-)Verknüpfung: "LD", wodurch die tatsächliche Arbeitsweise besser sichtbar wird.

Harald
 
Hallo Harald !!

Vielen Dank für Deine ganzen Erläuterungen (und auch allen Anderen hier !!)

das heisst also, dass LD nach IEC1131-AWL sozusagen "Lade" oder "Load" ins VKE bedeuted, egal bei welchem Operand U, O, X da erst mit der nächsten Zeile der aktuelle VKE Zustand verknüpft oder per "=" ausgegen wird. Dann man man den Operanden in der ersten Zeile auch als "LD" sehen.

Das Statuswort hat ja 8 Bit, muss man da immer einen Blick drauf haben, oder läuft das eher "hinter den Kulissen" ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das IEC1131-AWL hatte ich nur zum Vergleich erwähnt, wie man das Problem mit der Erstabfrage auch hätte lösen können. In Step7 hat man mit IEC1131-AWL keine Berührung.

Das Statuswort muß man normalerweise nicht besonders beachten. Die Statusbits im Statuswort werden durch Operationen beeinflußt (siehe jeweils die Step7-Hilfe zur Operation) und "intuitiv" durch spezielle Sprungbefehle ausgewertet:
- SPB, SPBN, SPBB, SPBNB : springen in Abhängigkeit vom VKE
- SPBI, SPBIN : springen in Abhängigkeit vom BIE
- SPZ, SPN, SPP, SPM, SPPZ, SPMZ, SPU : springen in Abhängigkeit von A1 und A0
- SPO, SPS : springen in Abhängigkeit von OV und OS
- CC, BEB : Baustein aufrufen bzw. Baustein beenden abhängig vom VKE

Einige Statuswort-Statusbits kann man ins VKE laden oder mit dem VKE verknüpfen, indem man bei den Bitverknüpfungsoperationen U, UN, O, ON, X, XN als Operand angibt: ==0, <>0, >0, <0, >=0, <=0, UO, OV, OS, BIE, z.B. "O ==0", "U BIE", "UN OV"

Genauso den Klammernstack - den schaut man sich normalerweise auch nicht an.
Merke: in AWL nicht aus Klammern herausspringen und nicht in Klammern hineinspringen. Schlechter Programmierstil!
Wenn man meint, daß man in einer AWL-Sequenz mehr als 2 Klammerebenen braucht, dann sollte man das besser in FUP oder KOP programmieren. Als AWL-Anfänger ist es sehr lehrreich, wenn man in Step7 "classic" V5.x Verknüpfungen in FUP/KOP programmiert und dann die Ansicht auf AWL umstellt, um zu sehen, wie richtige Klammerung ohne überflüssige "Angstklammern" aussieht.

Man kann im Kopf behalten, daß Statuswort und Klammernstack existieren, muß die beim Programmieren aber nicht besonders beachten.

Harald
 
Vielen Dank Harald !! :p Deine Erläuterungen sind echt der Wahnsinn (!) Ich bin jetzt erstmal erschlagen :D Sollte ich jemals einen SPS Kurs bekommen, hoffe ich jemanden als Lehrer zu bekommen, der das so erklären kann wie du.
 
Vielen Dank Harald !! :p Deine Erläuterungen sind echt der Wahnsinn (!) Ich bin jetzt erstmal erschlagen :D Sollte ich jemals einen SPS Kurs bekommen, hoffe ich jemanden als Lehrer zu bekommen, der das so erklären kann wie du.

Das wird schwer (bis evtl. sogar unmöglich), die die das erklären können sind eher in der Arbeitswelt unterwegs und unterrichten nicht.
Mein LF3- Lehrer an der Berufsschule damals war "gut", aber das wars dann auch. Die richtigen Codekünstler saßen dann in den Unternehmen und von denen konnte man dann programmieren lernen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei FUP und KOP sorgt der Editor dafür und bei AWL hoffentlich der Programmierer, aber nicht dafür, dass VKE=1 ist, sondern dafür, dass die erste Verknüpfung auch als ErstVerknüpfung behandelt wird.
In FUP und KOP sorgt der Editor NICHT dafür das der erste Verknüpfung als Erstabfrage behandelt wird.
So lange das man ausschliesslich in FUP oder KOP programmiert ist es kein Problem, weil der KOP und FUP editor sorgt dafür das ein Netzwerk immer abgeschlossen wird.
Wenn man aber gemischt AWL und KOP/FUP programmiert gibt es ein Gefahr.
Siehe Bild, warum ist M0.2 False obwohl M0.1 True ist ?
 

Anhänge

  • STEP7_LAD_does_not_set_RLO_at_start_of_rung.png
    STEP7_LAD_does_not_set_RLO_at_start_of_rung.png
    17,6 KB · Aufrufe: 19
Das hatten wir schon öfter, daß durch unsachgemäßes Einfügen oder Löschen/Auskommentieren von AWL-Code und dadurch fehlende VKE-Abgrenzung (/ER=0) nachfolgende FUP-/KOP-/AWL-Netzwerke beeinflusst werden (weil die dann "unsichtbar" nicht mehr mit einer Erstabfrage beginnen),
z.B. Hilfe, verstehe nicht was da passiert / Verarbeitungsfehler in der SPS?
attachment.php

oder S7 UND Baustein Bedingungen erfüllt, schaltet im FB nicht weiter
Anhang anzeigen 407881. Problem
Anhang anzeigen 407892. Darüberliegende Netzwerke getauscht, da Transferbefehl eventuell die Ursache ist!?

Problem gelöst:
Hier wurde was falsch programmiert,
dies hat die CPU mist machen lassen.
Eine U-Anweisung vor einem Ladebefehl.

Harald
 
In FUP und KOP sorgt der Editor NICHT dafür das der erste Verknüpfung als Erstabfrage behandelt wird.
So lange das man ausschliesslich in FUP oder KOP programmiert ist es kein Problem, weil der KOP und FUP editor sorgt dafür das ein Netzwerk immer abgeschlossen wird.
Wenn man aber gemischt AWL und KOP/FUP programmiert gibt es ein Gefahr.
Stimmt natürlich! Das hatte ich auch geschrieben, allerdings erst im nächsten Satz, den Du nicht mehr zitiert hast:
Bei FUP und KOP sorgt der Editor dafür und bei AWL hoffentlich der Programmierer, aber nicht dafür, dass VKE=1 ist, sondern dafür, dass die erste Verknüpfung auch als ErstVerknüpfung behandelt wird. Und zwar muss diese "FürSorge" im zuvor durchlaufenen Netzwerk bzw. Baustein geschehen (sein), indem die dort zuletzt durchlaufene Verknüpfung auch beendet wird z.B. durch = oder R oder S oder durch einen bedingten Sprung.

@Harald
Ich versuche gerade, die "aus-erster-Hand"-SiemensDoku in mich aufzusaugen und bin bei FN/FP über folgenden merkwürdigen Hinweis gestolpert:
"Die Operation ist nicht sinnvoll, falls das zu überwachende Bit im Prozeßabbild liegt. Denn die Lokaldaten eines Bausteins sind nur zu dessen Laufzeit gültig."
Mir scheint, dass auch Siemens nicht ganz immun gegen GedankenSprüge ist.
Dass es nicht sinnvoll ist, einen FlankenMerker in den LokalDaten zu parken, leuchtet mir unmittelbar ein - es muss ein Bit mit "Langzeitgedächtnis" sein. Aber darauf wird ja nicht wirklich hingewiesen.
Ein Bit im ProzessAbbild mit FN/FP zu überwachen, ist doch durchaus sinnvoll, wenn man's richtig macht!?

Gruss, Heinileini
 
Zurück
Oben