Ehrlichgesagt hab ich ein Array noch nie als Konstante gebraucht. Wie muss man sich dessen Anwendung vorstellen?
Hier im Thread haben wir ja gerade ein sehr gutes Beispiel dafür:
...
Code:
[FONT=Courier New]FUNCTION_BLOCK "X_aus_N"
CONST
[COLOR="#00FF00"]N:= 5; // Anzahl Ein-/Ausgänge[/COLOR]
XS:= 2; // Standard-Anzahl max. eingeschalteter Ausgänge
END_CONST
VAR_INPUT
IN: ARRAY [1 .. [COLOR="#00FF00"]N[/COLOR]] OF BOOL; // Neuer Zustand der Eingänge
X: INT; // Anzahl max. eingeschalteter Ausgänge
END_VAR
VAR_OUTPUT
OUT: ARRAY [1 .. [COLOR="#00FF00"]N[/COLOR]] OF BOOL; // Ausgänge
END_VAR
VAR
IN_OLD: ARRAY [1 .. [COLOR="#00FF00"]N[/COLOR]] OF BOOL; // letzter Zustand der Eingänge
ORDER: ARRAY [1 .. [COLOR="#00FF00"]N[/COLOR]] OF INT; // Speicher für Einschaltreihenfolge
END_VAR
...[/FONT]
...
Neben den ganzen Schleifen im Programm hängen auch 4 Arraygrößen von der Anzahl der zu verwendenden Ein-/Ausgänge ab. Da war es bei Classic wirklich toll, die Konstanten noch vor den Variablen im Baustein festlegen zu können. Und das ist ja nur ein kleiner Baustein (vor allem, wenn ich's mit dem Aufwand bei der LOGO! vergleiche).
Auch die Spielfeldgröße bei "4 gewinnt" war ausschlaggebend für die nötige Größe der Arrays und den dann im Programm folgenden Schleifen:
PS: Es gehen damit auch solch nette Sachen (aus der "4 gewinnt"-Sache):
Code:
[FONT=Courier New]CONST
[COLOR="#00FF00"] Spalten:= 7; // Anzahl Spalten
Zeilen := 6; // Anzahl Zeilen[/COLOR]
END_CONST
VAR
SPIELFELD: ARRAY [1 .. [COLOR="#00FF00"]Spalten[/COLOR], 1 .. [COLOR="#00FF00"]Zeilen[/COLOR]] OF INT; // Spielfeld (7 Spalten, 6 Zeilen)
SPIELZUEGE: ARRAY [1 .. [COLOR="#00FF00"]Spalten * Zeilen[/COLOR], 0 .. 3] OF INT; // Speicher Spielzüge (max. 7 Spalten x 6 Zeilen = 42 Spielzüge,
...[/FONT]
Man kann also die nötigen Arraygrößen bei Classic sogar mit mehreren Konstanten berechnen.
Ohne die Konstanten würde so bei der Arraygröße der Spielzüge einfach eine 42 stehen, von der man nicht auf den ersten Blick die Herkunft und somit bei Veränderung der Spielfeldgröße die Notwendigkeit der Anpassung erkennt.
PS: Entsprechendes Kommentieren hilft natürlich.
Ich persönlich ziehe es ausserdem vor Konstanten im Baustein zu haben. Ich will Bausteine von Projekt zu Projekt kopieren können ohne mich noch um externe Variabletabellen kümmern zu müssen.
*ACK*
Wobei dieser Thread wieder auch ein Beispiel für globale Konstanten ist, da in meiner Variante die Anzahl der zu verwendenden Ein-/Ausgänge auf beide FBs Einfluss hat. Am Besten wäre also, wenn man beide Möglichkeiten hätte, wie es bei den Variablen ja auch möglich ist.
Aber gerade für das Kopieren von Projekt zu Projekt sind die lokalen Konstanten bei Classic ein riesen Vorteil, wenn nach dem Kopieren Anpassungen gemacht werden müssen, wie das Beispiel Spielfeldgröße bei "4 gewinnt". Neue Anzahl Zeilen und Spalten festlegen und alles davon Abhängige, einschließlich Arraygrößen, sind dafür passend.
Allerdings war der Hauptnutzen der Konstanten wirklich für
die Werte, die zum Zeitpunkt der Übersetzung feststehen mussten, wie eben die Arraygrößen (und davon abhängige Sachen, wie oben die Schleifen).
Ich mache konstanten mittlerweile in den Temp der Schnittstelle und weise ihnen konstanten zu Beginn des Bausteins zu.
Da man die (globalen) Konstanten eh' nicht für die Array-Deklaration nutzen kann, ist das in meinen Augen auf jeden Fall eine gute Alternative. Das wäre eine Art von "Konstante", die ich bkizilkaya für TIA in Post #35 empfohlen hatte.
Alternativ verwende ich Input-Variablen mit Standardwert.