Globale Konstante lokal im Baustein deklarieren, wie? (Codesys 2.3)

König777

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

habe Verstdänisprobleme in Bezug auf Global definierte Variable, die unter anderem lokal in einem FB verwendet wird.

Ich habe ein Array welches ich in der Zukunft erweitern will. Dies will ich am Besten nur an einer Stelle im Programm machen. Dazu die Globale Konstante, die die obere Grenze des Array [0..i_max_Regler] definiert.

Globale Konstante deklariert:

VAR_GLOBAL CONSTANT
i_max_Regler:INT:=12; (*Größe Array of Temp_Regler_E/A*)
END_VAR

Diese Konstante definiert das Ende eines Array, im Moment zum Testen im PROGRAM Temperaturmessung deklariert.

PROGRAM Temperaturmessung
VAR
tre: ARRAY [0..i_max_Regler] OF Temp_Regler_E;
usw.
schnell2: Visu_Temp_Regler_Schnellzugriff
END_VAR

Im Programm Temperaturmessung gibt es den FB (schnell2: Visu_Temp_Regler_Schnellzugriff). In diesem Funktionbaustein wird die globale Konstante ebenfalls zu Festlegung der Array Größe verwendet.

FUNCTION_BLOCK Visu_Temp_Regler_Schnellzugriff

VAR_IN_OUT
TRE:Temp_Regler_E;
ar_TRE:ARRAY [0..i_max_Regler] OF TEMP_Regler_E;
END_VAR

VAR_EXTERNAL CONSTANT
i_max_Regler:INT:=12; (*Größe Array of Temp_Regler_E/A*)
END_VAR


Nun meine Frage: Ich habe festgestellt, das ich die globale Konstante nicht zwingend lokal deklarieren muss. Wenn ich diese komplett entferne, funktioniert die Festlegung des Array alleine über die Globale Deklarartion.

Im Fachbuch heißt es dazu: Auf ein Global deklarierte Variable kann von der POE lesend und schreibend zugegriffen werden. Hierzu muss die Variable in den anderen POEs unter VAR_EXTERNAL mit identischem Namen und identischem TYP angegeben werden.

Wenn ich diese lokale Deklaration VAR_EXTERNAL CONSTANT im Funktionsblock nicht angebe, taucht ja im Code des FB eine Variable auf, die erst einmal nicht deklariert ist. Das ist doch nicht gut.

Ich bin etwas irritiert, das ohne Bekanntgabe der Globalen Variable in der lokalen Deklartion des FB diese trotzdem abgearbeit wird.
Das heißt für mich: Ist eine Variable nicht LOKAL deklariert ist diese automatisch GLOBAL? Ich dachte in einem FB ist VAR_GLOBAL nicht zulässig?

Oder ist hier vom FB auszugehen, d.h. der FB kann keine globale Variable direkt bereitstellen aber trotzdem eine Globale direkt lesen?

Wie wird das am Besten und nach welchen Regeln gemacht.

Vielen Dank im Voraus.

Gruß König
 
Globale Variablen kann jeder lesen. Es kommt nur auf die Disziplin des Programmierers drauf an, daß er das nicht tut, sondern Werte nur über die Bausteinschnittstelle übergibt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

vielen Dank für die Rückmeldung. Dann ist alles eine Frage der Selbstdisziplin des Programmierers. Wie realisierst Du das in deinen Projekten?
Warum läßt dann ein Programmiersystem ein Lesen einer Globalen Variablen in einem FB ohne lokale Bekanntgabe zu?

Danke und Gruß

König
 
Oh, da hatte ich Dich wohl nicht ganz richtig verstanden.

Ich kenne das Codesys 2.3 nicht gut genug, ich habe es noch nicht versucht, globale Variablen bzw. Konstanten zu verwenden ohne sie in VAR_EXTERNAL zu deklarieren. Doch nach meinem Verständnis dürfte das nicht gehen, globale Variablen oder Konstanten zu verwenden ohne sie in VAR_EXTERNAL zu deklarieren. Da sollte eine Fehlermeldung kommen.

Harald
 
Hallo,

wenn ich in der Steuerungskonfiguration den Ein- oder Ausgängen symbolische Namen zuordne, werden diese als "globale Variablen" aufgeführt. Diese muss ich nicht in einem Programm, FB als Var_External bekanntgeben, sondern kann diese gleich einem Ein- bzw. Ausgang im Programm, FB zuordnen. Mit von mir global deklarierten Variablen verhält es sich gleich. Liege ich da denn richtig? Wie macht Ihr denn das? Bitte um Rückmeldung damit ich nicht länger im Dunkeln stehen muss....

Danke und Gruß

König
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn ich in der Steuerungskonfiguration den Ein- oder Ausgängen symbolische Namen zuordne, werden diese als "globale Variablen" aufgeführt. Diese muss ich nicht in einem Programm, FB als Var_External bekanntgeben, sondern kann diese gleich einem Ein- bzw. Ausgang im Programm, FB zuordnen. Mit von mir global deklarierten Variablen verhält es sich gleich. Liege ich da denn richtig? Wie macht Ihr denn das? Bitte um Rückmeldung damit ich nicht länger im Dunkeln stehen muss....
Na dann werde ich mal Licht ins Dunkel bringen. Globale Variablen müssen in Codesys V2 und seinen Derivaten nicht auch noch lokal über VAR_EXTERNAL deklariert werden, das Konstrukt existiert nur aus Kompatibilitätsgründen zur IEC61131-3. Hier mal ein (englisches) Zitat von der Codesys Webseite:
Codesys schrieb:
External Variables - VAR_EXTERNAL

External variables are global variables that are imported into a block.

You declare these variables between the keywords VAR_EXTERNAL and END_VAR. If the global variable does not exist, then an error message is printed.

Hint

In CODESYS, it is not necessary to declare variables as external. The keyword exists for maintaining compliance with IEC 61131-3.

Example

VAR_EXTERNAL
iVarExt1 : INT; (* 1st external variable *)
 
Hallo Oliver.tonn,

danke für Deine hilfreiche Antwort. Wie machst Du das z.B. bei Codessys V2 in Praxis in einem FB der eine globale Varible benutzt. Gibst Du diese dann trotzdem als VAR_EXTERNAL bekannt, um später besser nachvollziehen zu können, das die Variable eine Globale ist? Oder durch die Bennung der Variblen selbst z.B. "g_x_Taster" (g für global).

Danke im Voraus

König
 
In V2 habe ich die eigentlich immer so genutzt, weil ich von VAR_EXTERNAL bisher auch nichts gewusst habe bis zu Deiner Frage, erst dann hatte ich mich damit beschäftigt. Seit ein paar Jahren arbeite ich allerdings auch fast nur noch mit V3, aber auch da nutze ich, bzw. mein Kunde nicht VAR_EXTERNAL. Da man in V3 im Gegensatz zu V2 eine ENUM-Bezeichnung in verschiedenen ENUM-Objekten und auch globale Variablen in verschiedenen GVL-Objekten deklarieren kann wird hier das Pragma "{attribute 'qualified_only'}".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Globale Variablen müssen in Codesys V2 und seinen Derivaten nicht auch noch lokal über VAR_EXTERNAL deklariert werden, das Konstrukt existiert nur aus Kompatibilitätsgründen zur IEC61131-3. Hier mal ein (englisches) Zitat von der Codesys Webseite:
Hast Du mal einen Link zu dem Zitat?

Ich habe 1997 mit einem IEC1131-"kompatiblen" Programmiersystem (nicht Codesys) gearbeitet, da war VAR_EXTERNAL zwingend nötig für Zugriffe auf globale Variablen. Daß man in Codesys VAR_EXTERNAL zwar hinschreiben, genauso gut aber auch weglassen kann, war mir nicht bekannt (das steht auch nicht im V2.3-Handbuch) - und ich finde das so auch "unglücklich" gelöst (wie so einiges in Codesys).

Harald
 
Na ja, du kannst die Variable doch immer lokal deklarieren und deine globale Variable erst im Bausteinaufruf übergeben.
Globale Variablen lokal in einem Baustein zu benutzen ist nicht die feine Englische.

ich persönlich übergebe deklariere alle meine globalen Variablen mit dem prefix "GVL", um eine Verwechslung auszuschließen.

VAR EXTERNAL habe ich auch noch nie verwendet, da ich natürlich niemals innerhalb eines Bausteins auf globale Variablen zugegriffen habe :rolleyes:
 
Zurück
Oben