Step 7 Unterschied zwischen temporäre Viariable und Merker

lieuthnant

Level-2
Beiträge
109
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte gern wissen, was ist der Unterschied zwischen einer temporäre variable und einem Merker. Ausserdem kann ich die temporäre Variable ausserhalb des Bausteins genau so wie ein Merker benutzen ??
 
Hallo,
eine temporäre Variable gibt es nur innerhalb des einen Bausteins, in dem sie deklariert wurde. Ihr Inhalt ist erst von dem Moment an definiert, wo du ihn zuweist - er kann nicht von Baustein-Ende bis Baustein-Neuaufruf gehalten werden.
Ein Merker ist eine globale Variable. Er behält seinen Zustand von Zyklus zu Zyklus (außer er bekommt ihn neu zugewiesen). Er ist in allen Bausteine mit seinem Inhalt gültig.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Temporär = Kann innerhalb von ein Baustein genutzt werden.
Besteht von den "L" (Lokal) Datenbereich innerhalb von der Baustein.
Muss (zwingend !!!) initialisert werden bevor man es lesend zugreift.
Hat kein 'Erinnerung' zwischen Baustein Aufrufe.
Ohne initialiserung enthält die Lokaldaten zufällige Datenwerte.
Eine Quelle für viele Anfängerprogrammfehler !

Merker = Globale Variabeln.
Stammt von die gute alte (böse alte) S5-Zeiten.
Problematisch ist das selbst mit zugewiesene Symbole, kann man auf versehen Merkeraddressen zugreifen die man nicht wünscht.
Z.B. MW10 überlappt MD10 und auch MD8. Und, M3.0 ist in MB3, MW2, MW3, MD0, MD1, MD2 und MD3 enthalten.
Eine Quelle für viele Anfängerprogrammfehler !
Merker soll generell vermeidet werden. Kann als "quick-and-dirty" Zwischenablage verwendet werden.
Anstatt Merker empfehlt es sich DB's mit den benötigten Variabel-Struktur zu erzeugen.
 
Ich habe mir offenbar schlecht ausgedruckt.

Der Initialisierung von Temporäre Addressen ist ein absoluten "muss" bevor das man dieselbe Temporäre Adressen lest.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mir offenbar schlecht ausgedruckt.

Der Initialisierung von Temporäre Addressen ist ein absoluten "muss" bevor das man dieselbe Temporäre Adressen lest.

muss und zwingen kommt dann doch irgendwie auf's selbe raus...

Baustein: OB1
Temp-Variable: posFlag_HM

U E1.0
FP posFlag_HM
etc. etc.

funktioniert gut, ohne muss und Zwang ;)
 
Werden Temporäre Datenwerte in OB1 gerettet zwischen OB1 Auführungen ?
Das habe ich nicht gewusst !
Aber in den Fall wäre es eine Ausnahme, weil denselbe Code wird mit Sicherheit nicht funktionieren in andere Baustene, ausser OB1.

Man macht sein Test-Code in OB1, und alles funktioniert bestens, aber wenn man es nach ein realen Program exportiert zu ein FC oder ein FB, dann funktioniert es nicht mehr.
 
Baustein: OB1
Temp-Variable: posFlag_HM

U E1.0
FP posFlag_HM
etc. etc.

funktioniert gut, ohne muss und Zwang
Lass mich raten:

Das funktioniert nur solange man keine anderen OB's mit Temp-Variablen benutzt, die nach Beendigung und vor dem nächsten Aufruf von OB1 gestartet werden und somit den wieder freigegebenen Lokaldatenbereich des OB1 überschreiben könnten?
Frage dazu: Gibt es solche und wenn ja, welche z.B.?

Ansonsten liegt es einfach daran, dass der OB1 während der Abarbeitung der sonstigen FBs/FCs noch offen (in Benutzung) ist und somit seine temporären Daten dadurch vor dem Überschreiben geschützt sind.

Richtig?


In meiner Ausbildung damals wurde gelehrt, im OB1 nur einen FB unbedingt zu starten, in dem dann das gesamte Programm mit seinen FCs und FBs aufgerufen wird. In diesem Fall würde dann Dein Beispiel wahrscheinlich auch sicher in diesem ersten FB funktionieren, oder?


Und das sind dann alles die Ausnahmen, die die Regel bestätigen.
:)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das funktioniert nur solange man keine anderen OB's mit Temp-Variablen benutzt, die nach Beendigung und vor dem nächsten Aufruf von OB1 gestartet werden und somit den wieder freigegebenen Lokaldatenbereich des OB1 überschreiben könnten?
Jeder OB, oder technisch Prioritätsklasse hat einen eigenen Stack in den Lokaldaten, folglich hat jeder OB auch seinen fest zugeordneten Bereich im L-Stack welcher sich auch nicht ändert.
Da die Lokaldaten außerdem auch für den Bausteinaufruf verwendet werden, darf der aufgerufene Baustein natürlich die Lokaldaten des aufrufenden Bausteins nicht verändern.
Insofern ist das für die jeweilige Prioritätsklasse betrachtet auch "nur" ein Merkerbereich.

Wobei man vielleicht ausdrücklich erwähnen sollte, das obiges nur für Step7 gilt, da TIA leider nicht beschriebene Temp-Var auf jeden Fall auf Defaultwerte setzt.

Mfg
Manuel
 
Zuletzt bearbeitet:
Aber in den Fall wäre es eine Ausnahme, weil denselbe Code wird mit Sicherheit nicht funktionieren in andere Baustene, ausser OB1.
Das Problem war bzw. ist in so manchen in Betrieb befindlichen Programm, das dieses "mit Sicherheit" leider nicht wirklich stimmt ... sondern es da durchaus ein paar mehr oder weniger große Zufälle gibt,
wodurch Temp-Flankenmerker durchaus funktionieren können.
 
Wie ist es den mit den CPUs der 15xxer Baureihen, wo es doch möglich ist mehrere
Main OBs zu starten ( war doch so ? ). Teilen diese sich dann unter Umständen einen
L-Stack?
 
Zurück
Oben