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



## König777 (23 Februar 2018)

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


----------



## PN/DP (23 Februar 2018)

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


----------



## König777 (24 Februar 2018)

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


----------



## PN/DP (25 Februar 2018)

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


----------



## König777 (26 Februar 2018)

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


----------



## oliver.tonn (27 Februar 2018)

König777 schrieb:


> 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.
> 
> ...


----------



## König777 (27 Februar 2018)

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


----------



## oliver.tonn (28 Februar 2018)

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'}".


----------



## PN/DP (28 Februar 2018)

oliver.tonn schrieb:


> 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


----------



## KingHelmer (8 März 2018)

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


----------



## oliver.tonn (8 März 2018)

PN/DP schrieb:


> Hast Du mal einen Link zu dem Zitat?


Hallo Harald,
bitte entschuldige, ich hatte Deine Frage glatt überlesen.
Das von mir erwähnte Zitat ist hier zu finden.


----------



## PN/DP (8 März 2018)

Danke. Wie findet man zu dieser Hilfe, wenn man nicht weiß daß es sie gibt?

Harald


----------



## oliver.tonn (8 März 2018)

PN/DP schrieb:


> Wie findet man zu dieser Hilfe, wenn man nicht weiß daß es sie gibt?


Hallo Harald,
ich habe bei Tante Google einfach "VAR_EXTERNAL" und "Codesys" eingegeben, da kam bei mir die Hilfe als zweiter Vorschlag.

Von irgendwas mit Internetzugang gesendet


----------



## alainrohr (8 April 2018)

.........................bitte löschen....................


----------



## KingHelmer (9 April 2018)

Beiträge werden für gewöhnlich nicht gelöscht, da sie dem nächsten Suchenden helfen können, ohne dass dieser einen Beitrag verfassen muss


----------

