Temp-Variablen bei FCs

!Chris!

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
wenn man bei nem FC temporäre Variablen anlegt (temp), wo werde die dann konkret abgelegt. Hatte neulich den Eindruck, dass sich der Speicherbereich mit einem Teil meines allgemeinen Merkerbereich überschneidet, da die Merker plözlich nur noch Blödsinn gemacht haben.

Danke!
Gruß aus Ulm

Chris
 
Zuletzt bearbeitet:
Die werden auf dem Stack abgelegt, der aber nur eine begrenzte Größe hat. (Ich glaube Standard 256 Byte). Bei einigen CPU kann man die Größe ändern (31. Sollte der Stack überlaufen, kann durchaus irgenwo in der SPS "Datensalat" entstehen. Auch der Aufruf bestimmter Funktionen wie Block_Move benötigt zusätzlich Platz auf dem Stack. Wenn du im Manager Die Objekteigenschaften eines Bausteines anschaust, wird auch die Größe der Lokaldaten dieses Bausteines angezeigt, wenigstens ein Hilfsmittel. Leider gibt es wohl keine Hilfe beim Programmieren, um einen Stacküberlauf sicher auszuschließen, was mich etwas entsetzt, da hier durchaus die SPS zu einem ungewollten Eigenleben erwachen kann. (Ausgänge schalten, die im Programm gar nicht vergeben sind etc.)

Ein häufigerer Fehler beim Umgang mit Temp-Variablen ist aber deren Benutzung, ohne sie vorher korrekt zu initialisieren. Dann zeigt eine Temp-Var einen belieigen Wert, abhängig von der Stackbelegung in irgendwelchen vorherigen Bausteinen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
also temp variable werden im lokaldatenbereich abgelegt, deine merker sind davon unabhängig, was allerdings zu einem problem führen könnte ist das die lokaldaten vor einer zuweisung einen unbestimmten zustand führen können .
also z.b.


netzwerk 1
l #temp //temporäre variable
t mw0

würde in dein mw0 einen zufälligen wert laden.


bitte um korrektur falls ich daneben liege .

gruß thomas
 
Hier die Siemens-Hilfe dazu:

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 CPU-abhä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.

Nachfolgendes Bild zeigt die Zuordnung von Lokaldaten zu den Prioritätsklassen in einem Beispiel, in dem im L-Stack der OB 1 vom OB 10 unterbrochen wird, der dann wiederum vom OB 81 unterbrochen wird.

http://www.esatex.com/SPS-Forum/attachment.php?attachmentid=729&d=1145434457

Vorsicht
Alle temporäre Variablen (TEMP) eines OB und seiner unterlagerten Bausteine werden im L-Stack gespeichert. Wenn Sie viele Schachtelungsebenen in Ihrer Bausteinbearbeitung verwenden, kann der L-Stack überlaufen.
S7-CPUs wechseln in den Betriebszustand "STOP", wenn Sie die zulässige L-Stack-Größe für ein Programm überschreiten.
Testen Sie den L-Stack (die temporären Variablen) in Ihrem Programm.
Berücksichtigen Sie den Lokaldatenbedarf von Synchronfehler-OBs.


Zuordnen von Lokaldaten zu Prioritätsklassen

Nicht jede Prioritätsklasse benötigt gleich viel Speicher im Lokaldaten-Stack. Durch Parametrierung mit STEP 7 können Sie bei S7-400-CPUs und bei der CPU 318 die Größe des Lokaldatenbereichs für die einzelnen Prioritätsklassen unterschiedlich festlegen. Nicht benötigte Prioritätsklassen können Sie abwählen. Bei S7-400-CPUs und der CPU 318 wird damit der Speicherbereich für andere Prioritätsklassen erweitert. Abgewählte OBs werden bei der Programmbearbeitung nicht berücksichtigt, dadurch sparen Sie Rechenzeit.

Bei den anderen S7-300-CPUs ist jeder Prioritätsklasse eine feste Anzahl von Lokaldaten zugeordnet (256 Bytes), die nicht verändert werden kann.
 

Anhänge

  • L-Stack.bmp
    113,2 KB · Aufrufe: 240
Zuletzt bearbeitet:
Hier noch eine kleine Anmerkung zu den TEMP-Variablen bei der Programmierung.

Die TEMP-Variablen werden als Zwischenspeicher für den aktuellen Bausteinaufruf verwendet. Wenn ein Baustein mit TEMP-Variablen geöffnet werden, sind diese undiffiniert. Erst durch eine Zuweisung, oder dem Übertragen von Werten, erhalten die Variablen einen diffinierten Wert.

Sollten Signale und Werte über mehrere Zyklen benötigt werden, kann dieses z.B. im FB mit Statischen Variablen erfolgen, oder durch Merker.
 
Zurück
Oben