:Revision=14
:html
<<
128.145
GlobalVar-Objekt|GlobalVar
--
Das IP-Objekt <!RW>GlobalVar erlaubt das Anlegen globaler Variablen, die ber das Ende eines Interpreterschrittes hinaus erhalten bleiben.

Globale Variablen heien zwar 'Variablen', haben aber mit den normalen Interpretervariablen, die im VAR-Block definiert werden mssen, nichts zu tun. Die Globalen Variablen werden nicht vom Interpreterschritte verwaltet, sondern in einer eigenen, Interpreter-unabhngigen Liste gefhrt. Jeder Eintrag in dieser Liste stellt eine globale Variable dar und hat einen Namen, eine Lebensdauer, einen Datentyp und einen Wert.

Globale Variablen drfen von einem beliebigen Typ (auer <!RW>COMOBJECT) sein und werden ber einen String referenziert.
Der String gibt den Namen der Globalen Variablen an, dabei wird nicht zwischen Gro- und Kleinschreibung unterschieden.

Beim Auslesen einer Globalen Variablen wird immer der Typ zurckgegeben, mit dem die Variable zuletzt beschrieben wurde. Eine automatische Umwandlung z.B. von Real nach String findet nicht statt.

Globale Variable haben unterschiedliche 'Lebensdauern'.
<ul indent=12>
<li>Globale Variable, die in Systemsteps (IP_LOOP, IP_BOOT...) erzeugt wurden, werden vom System nicht mehr gelscht.</li>
<li<>Globale Variable, die in Prfsteps erzeugt wurden, werden bei Prfungsende und Programmreset gelscht. Durch Angabe einer 'Lebensdauer' bei GlobalVar.Set kann dieses Verhalten gendert werden.</li>
<li>Auerdem gibt es persistente ('ewig lebende') globale Variable, die in der Grundeinstellung definiert werden und ihre Existenz und Wert auch bei einem Programmneustart nicht verlieren.</li>
</ul>
>>
<<
128.145.1
GlobalVar.Set|Set
!128.145.6 - Beispiele
--
<!DEF>
procedure <!TW>GlobalVar.Set (sName : string; .Value : string|real|vector|stringvector [; rScope : real]);
<!TXT>
Setzt die globale Variable namens <!PW>sName auf den angegebenen Wert.
Existiert noch keine solche Variable, so wird sie erzeugt, existiert sie schon, so wird sie berschrieben.
<!PW>rScope legt die 'Lebensdauer' der Variablen fest:
<!STBL>
<!+>rScope<!+>Lebensdauer<!+>
<!c>1<!><b>Test</b> - Variable wird bei Testende oder Reset gelscht<!>
<!c>2<!><b>System</b> - Variable lebt bis zum Programmende<!>
<!c>0<br>(Default)<!><b>Test</b>, wenn Befehl in normalem Prfschritt<br>
                         <b>System</b>, wenn Befehl in einem Systemstep<!>
<!ETBL>

Es ist nicht mglich, persistente Variable aus einem IP-Befehl zu erzeugen. Dies muss in der Grundeinstellung geschehen.
Es ist auch nicht mglich, die Lebensdauer einer persistenten Variable auf eine andere Stufe zu setzen. Fr solche Variablen wird <!PW>rScope ignoriert.

Beispiel:
Annahmen:
<ul indent=12>
<li>die Variable existiert noch nicht</li>
<li>normale Prfschritt</li>
</ul>

<!CODE>
GlobalVar.Set ('X', 111);
<!TXT>
Erzeugt eine Globale Variable mit dem Namen 'X' dem Wert 111 und der Lebensdauer 'Test'

<!CODE>
GlobalVar.Set ('X', 222, 2);
<!TXT>
ndert den Wert der Globalen Variablen 'X' auf 222 und ihre Lebensdauer auf 'System'

<!CODE>
GlobalVar.Set ('X', 333);
<!TXT>
ndert den Wert der Globalen Variablen 'X' auf 333 nicht jedoch ihre Lebensdauer
>>
<<
128.145.2
GlobalVar.Exists|Exists
!128.145.4 - GetTypeCode
!128.145.6 - Beispiele
--
<!DEF>
function <!TW>GlobalVar.Exists (sName: string) : real;
<!TXT>
Liefert <!RW>TRUE, wenn eine Globale Variable mit diesem Namen existiert (= zuvor angelegt wurde).
>>
<<
128.145.3
GlobalVar.Get|Get
!128.145.6 - Beispiele
--
<!DEF>
function <!TW>GlobalVar.Get (sName : string [; .DefaultValue : string|real|vector|stringvector]) : string|real|vector|stringvector;
<!TXT>
Liefert den Wert der Globalen Variablen mit dem Namen <!PW>sName. Wenn die Variable nicht existiert, wird der <!PW>DefaultValue geliefert, ist dieser nicht angegeben, dann wird ein Laufzeitfehler erzeugt.
>>
<<
128.145.4
GlobalVar.GetTypeCode|GetTypeCode
!128.145.2 - Exists
!128.145.5 - Beispiele
--
<!DEF>
function <!TW>GlobalVar.GetTypeCode (sName : string) : real;
<!TXT>
Bestimmt den Typ der globalen Variable mit dem Namen <!PW>sName:
<!STBL>
<!>0<!>keine solche existiert<!>
<!>1<!>Real<!>
<!>2<!>String<!>
<!>3<!>Vector<!>
<!>4<!>StringVector<!>
<!>-1<!>nicht untersttztes Format<!>
<!ETBL>
>>
<<
128.145.5
GlobalVar.Delete|Delete
--
<!DEF>
procedure <!TW>GlobalVar.Delete (sName : string);
<!TXT>
Entfernt die Globale Variable namens <!PW>sName. Anstatt eines Variablen Namens kann auch ein Variablen Filter angegeben werden.

Die Regeln fr die Filter sind wie folgt:

- Ein * steht fr eine belibige Anahl von Zeichen (0-unendlich)
- Ein ? steht fr ein belibiges Zeichen
- Innerhalb von [] knnen fr ein zeichen eine Mgliche Menge angegeben werden

Hier einige Beispiel:
- Test*     = steht fr alle Globalen Variablen die mit Test anfangen und 0 oder mehr belibige Zeichen.
- Test?     = steht fr alle Globalen Variablen die mit Test anfangen und ein weiteres belibige Zeichen.
- Test[0-9] = steht fr alle Globalen Variablen die mit Test anfangen und mit Zahl aufhhren.
- Test[abc] = steht fr alle Globalen Variablen die mit Test anfangen und mit a, b oder c aufhhren.

Persistente ('ewig lebende') globale Variable, die in der Grundeinstellung definiert sind, knnen vom Interpreter nicht gelscht werden.


>>
<<
128.145.6
GlobalVar.Beispiele|Beispiele
--
<h4>1. Abspeichern eines Wertes unter einem festen Namen:</h4>
<!CODE>
rVSoll:= 2.54 * ME3000.ADW.Get (1);
GlobalVar.Set ('grVSoll', rVSoll);
<!TXT>
Erzeugt eine globale Variable mit dem Names 'grVSoll'. Diese Methode bietet eine gute Lesbarkeit des Quelltextes, ist aber wenig flexibel, was nderungen des Variablennamens angeht.

<h4>2.  Abspeichern unter einem Namen aus der Datenbank</h4>
<!CODE>
PARAMETER
  psGVarName : (12, string, 'Name Globale Variable', '');
  :
VAR
  rVSoll : real;
  :
STEP
  :
  rVSoll:= 2.54 * ME3000.ADW.Get (1);
  GlobalVar.Set (psGVarName, rVSoll);
<!TXT>
Der Name der erzeugten globalen Variable entspricht dem Wert des Parameters aus der Datenbank. Diese Methode bietet gute Flexibilitt, macht aber den Quelltext weniger lesbar. Wie die Globale Variable wirklich heit, ergibt sich erst aus den Parametern.

<h4>3a.  Abspeichern unter einem dynamisch erzeugten Namen</h4>
Annahme: Ein Multi-Barcode-Scanner liefert 1 bis n Barcodes. Diese werden in Globalen Variablen gespeichert.
<!CODE>
VAR
  sBarCode,
  sGVName : string;
  rBCAnzahl : real;

STEP
  RS232.Send ('BCReader', '<D>');               // Scanner Triggern
  rBCAnzahl:=0;                                 // noch keine
  repeat
    sBarCode:=RS232.Get('BCReader');    // BarCode einlesen
    if sBarCode<>'' then begin          // wenn einer da,
      inc (rBCAnzahl);                          // Anzahl erhhen
      sGVName:='BC'+Str(rBCAnzahl);             // Name erzeugen (BC1, BC2 ...)
      GlobalVar.Set (sGVName, sBarCode);  // ablegen
    end;
  until sBarCode='';                            // bis keiner da
  GlobalVar.Set ('BCAnzahl', rBCAnzahl);        // Anzahl noch merken!
end;
<!TXT>

<h4>3b. Auslesen unter einem dynamisch erzeugten Namen</h4>
<!CODE>
VAR
  sBarCode,
  sGVName : string;
  rBCAnzahl,
  rBCNum : real;

STEP
  rBCAnzahl:=GlobalVar.Get ('BCAnzahl', 0);
  for rBCNum:=1 to rBCAnzahl do begin
    sGVName:='BC'+Str(rBCNum);          // Name erzeugen (BC1, BC2 ...)
    sBarCode:=GlobalVar.Get (sGVName);          // holen
    :
  end;

  // geht auch ohne Zusatzvariablen so:
  for rBCNum:=1 to GlobalVar.Get ('BCAnzahl', 0) do begin
    sBarCode:=GlobalVar.Get ('BC'+Str(rBCNum));         // holen
    :
  end;
end;
<!TXT>
>>
<<
128.145.7
GlobalVar.Get.Comment|Get.Comment
--
<!DEF>
function <!TW>GlobalVar.Get.Comment (sName : string) : string;
<!TXT>
Liefert den Kommentar der Globalen Variablen mit dem Namen <!PW>sName. Wenn die Variable nicht existiert oder sie keinen Kommentar besitzt, wird ein Leerstring zurckgegeben.
>>
<<
128.145.8
GlobalVar.Set.Comment|Set.Comment
--
<!DEF>
procedure <!TW>GlobalVar.Set.Comment (sName : string; sComment : string);
<!TXT>
Setzt den Kommentar der Globalen Variablen mit dem Namen <!PW>sName auf <!PW>sComment. Wenn die Variable nicht existiert passiert nichts.
>>
<<
128.145.9
GlobalVar.First|First
!128.145.10
--
<!DEF>
function <!TW>GlobalVar.First : string;
<!TXT>
Liefert den Namen der ersten globalen Variablen oder '', wenn keine globale Variable existiert.

Beispiel siehe <!RW>Global.Next
>>
<<
128.145.10
GlobalVar.Next|Next
!128.145.9
--
<!DEF>
function <!TW>GlobalVar.Next : string;
<!TXT>
Liefert den Namen der nchsten globalen Variablen oder '', wenn keine globale Variable (mehr) existiert.

Kann zusammen mit <!RW>GlobalVar.First zum Durschsuchen aller Variablen benutzt werden.

<!CODE>
var
  s : string;
begin
  s:=GlobalVar.First;
  while s<>'' do begin
    Debug.Show (1, s,'=',GlobalVar.Get(s), 'Info =', GlobalVar.Get.Comment (s));
    s:=GlobalVar.Next;
  end;
end;
>>
