Frage zu Temp-Variablen...

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

ich habe eine Frage zu den TEMP-Variablen…

In einem FB1 werden zwei OUT-Parameter deklariert und in einem FB2 zwei IN-Parameter.

Ist es nun möglich, im OB1 als Bindeglied zw. IN und OUT (der zwei FB's) zwei TEMP-Parameter zu deklarieren oder müssen hierzu zwingend Merker verwendet werden?

Hinweis:

Momentan funktioniert es auch mit zwei TEMP-Parametern; aber ist das wirklich zuverlässig? :confused:

Lieben Dank!
 
Wenn du die Variablen zuerst zuweist und dann direkt danach abfragst, dann funktioniert es.
Wenn dazwischen andere Aufrufe sind, dann kann es in die Hose gehen.


bike
 
Super, vielen Dank!

Wenn beispielsweise ein Aufruf einer anderen Fkt. dazwischen wäre - dann könnten durch deren Aufruf die Variablen verändert werden, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nun, ich würde da Folgendes zu bedenken geben:
die Weckalarme (oder auch Alarme, Uhrzeitalarme).
Weiss wer ob die an Befehls/Baustein/Netzwerk- Grenzen aufgerufen werden?
OB1 ist üblichweise der niederpriorste Baustein, die Alarm-OB's höherprior.
Also in Unkenntnis der genauen Funktionsweise wann ein OB aufgerufen wird, würde ich das nicht mit Temp- Variablen machen.
 
Hm, also dann doch mit Merkern - oder gäbe es eine andere, elegantere, Möglichkeit?

Danke, borromeus!
 
Nun, ich würde da Folgendes zu bedenken geben:
die Weckalarme (oder auch Alarme, Uhrzeitalarme).
Weiss wer ob die an Befehls/Baustein/Netzwerk- Grenzen aufgerufen werden?
OB1 ist üblichweise der niederpriorste Baustein, die Alarm-OB's höherprior.
Also in Unkenntnis der genauen Funktionsweise wann ein OB aufgerufen wird, würde ich das nicht mit Temp- Variablen machen.

Ich denke das macht nichts, da ja ein AlarmOB auch während deines FB/FC aufrufs aufgerufen werden kann, und deine Lokaldaten trotzdem noch stimmen (also wiederhergestellt werden!). Aber Ich würde sowas trotzdem nicht machen, ist nicht gerade toller Codeingstiel!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, dank' euch!

Jetzt stellt sich mir halt nur die Frage - wie könnte man (frau auch) das dann "schöner" lösen?

Oder geht das dann wirklich nur über Merker?
 
Danke, steht das irgendwo beschrieben?
Ja, das steht irgendwo beschrieben.
Siemens-Handbuch "Programmieren mit STEP 7" schrieb:
27.2.3.3 Lokaldaten-Stack
Der L-Stack speichert:
• die temporären Variablen der Lokaldaten von Bausteinen
• die Startinformation der Organisationsbausteine
• Informationen zum Übergeben von Parametern
• Zwischenergebnisse der Logik in Kontaktplan-Programmen
Beim Erstellen von Organisationsbausteinen können Sie temporäre Variablen (TEMP) deklarieren, die
nur während der Bearbeitung des Bausteins zur Verfügung stehen und dann wieder überschrieben
werden. Vor dem ersten Zugriff müssen die Lokaldaten initialisiert werden. Außerdem benötigt jeder
Organisationsbaustein für seine Startinformation 20 Lokaldaten-Byte.
Die CPU besitzt einen begrenzten Speicher für die temporären Variablen (Lokaldaten) gerade
bearbeiteter Bausteine. Die Größe dieses Speicherbereichs, des Lokaldaten-Stacks, ist CPUabhängig.
Der Lokaldaten-Stack wird zu gleichen Teilen unter den Prioritätsklassen aufgeteilt
(Voreinstellung). Das bedeutet, jede Prioritätsklasse verfügt über einen eigenen Lokaldatenbereich.
Damit ist gewährleistet, dass auch hochpriore Prioritätsklassen und ihre zugeordneten OBs Platz für
ihre Lokaldaten zur Verfügung haben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, steht das irgendwo beschrieben?
Das steht mit Sicherheit irgendwo unter einem entsprechenden Stichwort in der Step7-Hilfe.
Praktisch ist es so, das jede Aufrufpriorität auch einen eigenen Temp-Stack hat.
Es werden also keine Daten der niedrigeren Prioritäten "wiederhergestellt", sondern da diese auf anderen Adressen liegen werden diese "nie" verändert.

Mfg
Manuel

Wenn das nicht so wäre, dann wären Temp-Daten absolut komplett sinnfrei, da "gefährlich".

Mfg
Manuel
 
Ich würde noch eine weitere Möglichkeiten in Betracht ziehen:

Aufruf des FB2 in den FB1 schreiben.

Da es ja scheinbar einen Bezug zwischen den Bausteinen gibt könnte das durchaus "elegant" sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde noch eine weitere Möglichkeiten in Betracht ziehen:

Aufruf des FB2 in den FB1 schreiben.

Da es ja scheinbar einen Bezug zwischen den Bausteinen gibt könnte das durchaus "elegant" sein.

Ui, das klingt ja interessant! Habe ich allerdings noch nie gemacht... wie schaut denn sowas aus?

Lieben Dank!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke tigerente,

wie d..f von mir! Ja, ist einfach...

ABER: Macht bei mir vermutlich doch keinen Sinn, da in FB2 alle Alarme stehen. Somit sollte dieser FB2 eigentlich ja doch "unabhängig" im OB1 aufgerufen werden.

Somit bleibt dann ja nur die Möglichkeit über die Temp-Variablen (suboptimal?) oder halt über ganz normale Merker, richtig?
 
Wovon hängt es denn ab, ob es in die Hose geht oder nicht?
Zwischen dem Beschreiben der TEMP-Variablen und dem Lesen am nächsten Bausteinaufruf könnten Operationen oder aufgerufene Bausteine die Variablen "sichtbar" ändern.
Ein dazwischen aufgerufener Baustein könnte die Vorgänger-Lokaldaten "unsichtbar" verändern.
Das würde ich aber nicht als "kann es [zufällig] in die Hose gehen" bezeichnen. Das kann auch alles bei Verwendung von Globaldaten passieren.

Bei FB können Parameterwerte aber auch direkt ohne Zwischenvariablen übergeben werden:
Code:
CALL "FB1","DB1"
 IN1 :=
 OUT1:="DB2".IN2

CALL "FB2","DB2"
 IN2 :=                //wurde direkt von FB1 beschrieben
 OUT2:=                //wird direkt von FB3 gelesen

CALL "FB3","DB3"
 IN3 :="DB2".OUT2
 OUT3:=

Harald
 
Solange der Aufruf von FB1 nicht bedingt geschieht, wäre das auch kein Problem. Es kommt eben auf die Programmstruktur an, ob das Sinn macht. Wenn im FB2 alle Alarme stehen, ist es wiederum vielleicht nicht so "elegant", diesen Aufruf in einen FB zu schreiben. Pauschal lässt sich das aber nicht sagen.
 
Zurück
Oben