Temporäre Variable

M-Ott

Level-3
Beiträge
1.774
Reaktionspunkte
374
Zuviel Werbung?
-> Hier kostenlos registrieren
Temporäre Variable

Temporäre Variable (TEMP) sind eine Art von Variable, bei deren Verwendung viel falsch gemacht werden kann und regelmäßig wird, deshalb hier die wichtigsten Dinge über TEMP:

TEMP sind als Zwischenspeicher für Ergebnisse gedacht, die nur innerhalb eines Bausteins gebraucht werden. Sie ersetzen die den älteren Semestern durchaus noch bekannten Schmiermerker. TEMP liegen in einem eigenen Speicherbereich innerhalb der CPU. Am Anfang eines Bausteinaufrufs wird hier Speicher für die TEMP des jeweiligen Bausteins reserviert, dieser Speicher bleibt bis zum Ende des Bausteinaufrufs reserviert und wird dann am Ende des Bausteins wieder freigegeben. Dies führt unweigerlich dazu, dass hierbei Speicher verwendet wird, in den unmittelbar vorher ein anderer Baustein seine TEMP geschrieben hat und aufgrunddessen dort beliebige Werte liegen. Daraus ergibt sich, dass man sobald man einen Baustein neu aufruft, zwingend davon ausgehen muss, dass alle TEMP einen zufälligen Zustand haben.

Daraus ergeben sich Probleme, sobald man eine TEMP-Variable abfragt, bevor sie im jeweiligen Bausteinaufruf zugewiesen wurde oder auf andere Weise einen eindeutigen Zustand bekommen hat. Man greift zwar im TEMP-Speicher auf die richtige Adresse zu, erhält aber den Wert, den ein anderer Baustein dort abgelegt hat, also mehr oder weniger einen zufälligen Wert, es ist also so, dass TEMP nur innerhalb eines Bausteinaufrufs und dort nur nach einer wie auch immer gearteten Zuweisung einen definierten Zustand haben.

Aus den oben genannten Gründen lassen sich TEMP nicht sinnvoll an Stellen verwenden, an denen nicht in jedem Zyklus zugewiesen wird (z.B. SR-Glieder) oder an denen die Variable vor einer Zuweisung abgefragt wird.

Da es sich um die wohl häufigsten Fehler im Umgang mit TEMP handelt, möchte ich hier explizit darauf hinweisen:
TEMPORÄRE VARIABLE KÖNNEN NICHT OHNE WEITERES AN SR-GLIEDERN UND FLANKENAUSWERTUNGEN VERWENDET WERDEN! DIES FÜHRT UNWEIGERLICH ZU FEHLERN!

Um dennoch in einem FC ohne Globale Variable SR-Glieder oder Flankenauswertungen zu verwenden, kann die jeweilige Variable als INOUT definiert und von außen mit einer globalen oder statischen Variablen beschaltet werden.

Bei verschachtelten Aufrufen gibt es keine Probleme mit Überschneidungen des TEMP-Speichers, da jeder Baustein zu Beginn des Aufrufs seinen TEMP-Speicher reserviert und diesen über den gesamten Aufruf, auch über Unteraufrufe hinweg, behält, es ist hier nur zu beachten, dass der TEMP-Bereich begrenzt ist und es dadurch bei zu vielen Unteraufrufen oder zu vielen TEMP-Variablen möglicherweise zu Problemen kommen kann, in der Regel ist dies jedoch nicht der Fall.

Interrupts durch Alarm-OBs führen nicht zu Problemen, da jede Prioritätsklasse ihren eigenen TEMP-Speicherbereich besitzt.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben