VAR_STAT oder VAR in einen FB deklarieren?

Bergmann

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

ich habe einen FB erstellt statische Variablen deklariert und Instanzen drei Instanzen gebildet.

Code:
VAR_STAT
    wtest:WORD;
    wtest1:WORD;
END_VAR

Bei einem Test habe ich festgestellt, dass die statischen Variablen der drei Instanzen die gleichen Werte besitzen obwohl nur bei einer die Eingangsvariablen verändert wurden.
Nachdem ich die Variablendeklaration von VAR_STAT nach VAR geändert habe funktioniert alles wie beabsichtigt.
Was mache ich falsch?:confused:
Ich möchte statische Variablen verwenden damit sie bei einem online change nicht neu initialisiert werden.
Ich arbeite mit CoDeSys 3.5 auf einem Raspberry.

Grüße
 
Kurzer Auszug:


Statische Variablen - VAR_STAT Diese Funktionalität ist eine Erweiterung bezüglich der Norm IEC 61131-3.

Statische Variablen können in Funktionsblöcken, Funktionen und Methoden verwendet werden. Sie müssen lokal zwischen den Schlüsselwörtern VAR_STAT und

END_VAR deklariert werden und werden beim ersten Aufruf des jeweiligen Bausteins initialisiert.

Auf statische Variablen kann nur innerhalb des Namensraums, in dem sie deklariert sind, zugegriffen werden (wie bei statischen Variablen in C), aber wie eine Globale Variable
behalten sie ihren Wert auch nachdem der Baustein wieder verlassen wird. Sie können beispielsweise als Zähler für Funktionsaufrufe verwendet werden. Beachten Sie die Möglichkeit, "VAR_STAT" mit einem Attribut zu erweitern.
 
Genau aus diesem Grund habe ich mich für statische Var entschieden.
aber wie eine Globale Variable behalten sie ihren Wert auch nachdem der Baustein wieder verlassen wird. Sie können beispielsweise als Zähler für Funktionsaufrufe verwendet werden.
Jede Instanz hat ihren eigen stat Datenbereich.
Oder?
 
Lege ich einen Zeiger bei VAR_STAT Deklaration auf

Code:
VAR_OUTPUT
	
	DataPoin	:POINTER TO WORD:=ADR(wtest);
	
END_VAR

erhalte ich an allen drei Instanzen die selben Adressen.
Ist die Deklaration VAR sind die Adressbereiche verschieden Adressen und alles ist gut.

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Inwiefern ist das Zitat der Hilfe zu VAR_STAT hilfreich für den TE? Für mich steckt da keinerlei Information drin, welche das spezielle Problem des TE betrifft.

Gibt es in dem Codesys 3.5 vielleicht eine Beschreibung, wo mal eindeutig steht, daß sich alle Instanzen eines Funktionsbausteins dieselbe Instanz VAR_STAT teilen? (ich kann mir kaum vorstellen, wozu etwas derartiges gut sein soll) Oder kann/muß man vielleicht über ein Attribut einstellen, daß jede FB-Instanz auch seine eigene VAR_STAT-Instanz hat?

Harald
 
Also mit dieser Aussage:

aber wie eine Globale Variable behalten sie ihren Wert auch nachdem der Baustein wieder verlassen wird. Sie können beispielsweise als Zähler für Funktionsaufrufe verwendet werden.

ist für mich die Frage des TE beantwortet.

Die VAR_STAT ist in jeder Instanz auf der selben Adresse wie der TE mit einem Zeiger selbst festgestellt hat.

Und wozu so etwas gut sein soll steht ebenfalls in der Aussage.

Zumindest wäre für mich die Frage damit geklärt gewesen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

ich habe einen FB erstellt statische Variablen deklariert und Instanzen drei Instanzen gebildet.

...

Bei einem Test habe ich festgestellt, dass die statischen Variablen der drei Instanzen die gleichen Werte besitzen obwohl nur bei einer die Eingangsvariablen verändert wurden.

Kannst du vielleicht mal die 3 Aufrufe deines FB'S mit seinen Instanzen posten ? Ich vermute (da ich dich nicht kenne), dass du bei jedem Aufruf die selbe Instanz verwendet haben könntest ...

Gruß
Larry
 
Ich vermute (da ich dich nicht kenne), dass du bei jedem Aufruf die selbe Instanz verwendet haben könntest ...
Lege ich einen Zeiger bei VAR_STAT Deklaration
[...]
erhalte ich an allen drei Instanzen die selben Adressen.
Ist die Deklaration VAR sind die Adressbereiche verschieden Adressen und alles ist gut.
Also ich glaube schon, daß der TE alles richtig gemacht hat.
Interessant wäre, ob es für dieses (für mich unbekannte) Verhalten in Codesys 3.5 eine eindeutige Dokumentation gibt. (ich kenne Codesys 3.5 nicht)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann misch ich mich auch mal mit ein.
Eins vorweg, VAR_STAT ist für das was der TE möchte völlig falsch PUNKT
Der TE möchte, dass die Werte von Variablen unter bestimmten Bedingungen erhalten bleiben, wobei die vom TE angeführte Bedingung (Online Change) meines Wissens nie zu einem Rücksetzen der Variablen führt. Ein Download oder Neustart der CPU jedoch schon. Er müsste, wie von -J-E- schon erwähnt, Retainvariablen oder Persistente nehmen (Welche von beiden es sein muss oder ob es eine Kombination sein muss bin ich mir im Moment nicht sicher, ich verwechsele die Beiden immer). Worauf auch geachtet werden muss ist, dass das Speichern der Variablenwerte vor einem Neustart der CPU eventuell manuell ausgelöst werden muss, dass ist von der CPU abhängig. Bei den CX CPUs von Beckhoff ist das z.B. so.
VAR_STAT ist eine Variable die pro FB/FC/Methode nur einmal existiert, also in jeder Instanz (Bei Methoden und FBs) die selbe Adresse erhält und somit in jeder Instanz den Selben Wert hat. Bei Funktionen sorgt Sie dafür, dass der Wert auch nach Beendigung der Funktion noch erhalten bleibt.
 
Ich kenne die statischen Variablen nur aus Siemens Instanz DB's. Und ich möchte in jeder Instanz verschiedene z.B. Zählerstände haben und nicht einen für alle.
Statische Variablen - VAR_STAT Diese Funktionalität ist eine Erweiterung bezüglich der Norm IEC 61131-3.
Statische Variablen können in Funktionsblöcken, Funktionen und Methoden verwendet werden. Sie müssen lokal zwischen den Schlüsselwörtern VAR_STAT und

END_VAR deklariert werden und werden beim ersten Aufruf des jeweiligen Bausteins initialisiert.

Auf statische Variablen kann nur innerhalb des Namensraums, in dem sie deklariert sind, zugegriffen werden (wie bei statischen Variablen in C), aber wie eine Globale Variable
behalten sie ihren Wert auch nachdem der Baustein wieder verlassen wird. Sie können beispielsweise als Zähler für Funktionsaufrufe verwendet werden.Beachten Sie die Möglichkeit, "VAR_STAT" mit einem Attribut zu erweitern.

Ich habe das ganze mit RETAIN Variablen gelöst.
Ich bin nur bei der Suche nach einer Lösung, Variablen eines FB's ohne Deklaration VAR_OUTPUT von außen zu lesen auf das Problem gestoßen.

Grüße
 
Ich schätze mal, dass VAR_STAT ursprünglich nur für Funktionen gedacht waren. Dort machen Bezeichnung und Funktionalität einen Sinn. Bei FBs ist das Ganze etwas irreführend, weil deren normale VAR ja auch statisch sind. Aber auch dort gehören VAR_STAT nicht zu den FB-Instanzen, sondern zum FB-Typ, existieren also pro FB nur einmal im System.

Warum willst Du anders als mit VAR_OUTPUT von aussen lesen? Genau dazu sind sie doch da.
 
Der Thread ist zwar schon Jahre alt, jedoch bin ich gerade darauf gestoßen und möchte das Ganze auflösen:
VAR:
Jede Instanz eines Funktionsbausteins (FB) benutzt diesen Speicherbereich, um Werte zu sichern, welche über einen
PLC Zyklus hinaus erhalten bleiben sollen (Flankenerkennung usw...). Der Speicherbereich unterscheidet sich von Instanz zu Instanz.
-> Speicherbereich gehört zum Objekt (Instanz)

VAR_STAT:
Wie oliver.tonn schon geschrieben hat: Eine Variable die in diesem Speicherbereich angelegt ist, kann von jeder Instanz aus erreicht werden!
Genau deswegen eignet sich dieser Bereich als Instanzzähler.
-> Speicherbereich gehört zum Typ (Funktionsbaustein)

Angenommen, es gibt 2 Instanzen eines FB_Example:

Code:
FUNCTION_BLOCK fb_Example
VAR
    nCounter1   : INT;
    bInitDone   : BOOL;
END_VAR
VAR_STAT
    nCounter2   : INT;
END_VAR

IF NOT bInitDone THEN
    nCounter1   := nCounter1 + 1;
    nCounter2   := nCounter2 + 1;
END_IF

nCounter1 wird in jeder Instanz eine "1" anzeigen, wobei nCounter2 eine "2" drin stehen hat, da eine VAR_STAT Variable global über alle Instanzen des FB_Example gilt.

Ist 1:1 in C# so mit Variablen einer Klasse, die mit dem "static"-Schlüsselwort definiert wurden

Ich hoffe ich konnte ein wenig helfen.

-Stirni
 
Zurück
Oben