EBSILON®Professional Online Dokumentation
EbsScript / Anwendung
In diesem Thema
    Anwendung
    In diesem Thema

    Anwendung von EbsScript


    Erstellung und Ausführung

    The Modul EbsScript ermöglicht eine automatisierte Durchführung von Zuweisungen und Berechnungen. Zur Anwendung muss zunächst ein Programm (das "EbsScript") erstellt werden unter Verwendung des EbsScript Editors. Als Programmiersprache dient PASCAL, mit auf EBSILON zugeschnittenen Spracherweiterungen. Nach der Erstellung des Scripts, kann man mit Hilfe des EbsScriptCompilers die Richtigkeit der Syntax zu überprüfen und das EbsScript ausführen. Bereits fertig gestellte EbsScripte kann man auch ohne den Editor direkt mit dem EbsScriptExecutor compilieren und ausführen.

    Während man mit dem EbsScript Editor arbeitet, kann man zum EBSILON-Modell umschalten und wieder zurück zum Editor. Dies ist hilfreich, wenn man bestimmte Namen oder Werte nachschauen will. Man kann auch das Ebsilon-Modell modifizieren, während der EbsScript Editor geöffnet ist. Wenn man allerdings im Modell Objekte eingefügt, gelöscht oder umbenannt hat, sollte man den Objektbaum im Editor aktualisieren, in dem man Menü-Kommando ”Extras" à"Objektbaum neu erstellen" verwendet.

    Wenn Sie mehrere Modelle geöffnet haben, können Sie für jedes dieser Modelle einen EbsScript Editor öffnen. Auf dem Bildschirm sehen Sie nur einen EbsScript Editor, nämlich den, der dem gerade aktiven Modell zugeordnet ist. Andere EbsScript Editoren sind unsichtbar. Wenn Sie von einem zum anderen Modell umschalten, wird der entsprechende Editor des anderen Modells sichtbar.

    Sie können mehrere EbsScript für ein Modell entwickeln. Diese Scripts werden innerhalb der ”.ebs” Datei gespeichert. Dort gibt es Import/Export Funktionen, die den Transfer von EbsScript von einem zum anderen Modell möglich machen.

     

    Zugriff auf Modelldaten

    EbsScript ist besonders darauf angelegt, Modelldaten zu verarbeiten. Die in der Schaltung vorhandenen Namen können deshalb direkt in EbsScript verwendet werden. Um z.B. einer Turbinenscheibe mit dem Namen NDT_2B einen Wert für den isentropen Wirkungsgrad zuzuweisen, verwendet man die Syntax

    NDT_2B.ETAIN:=0.89;

    Genau wie in den Eingabefeldern selbst können hierbei einem Spezifikationswert auch Ausdrücke zugewiesen werden. Zur Realisierung dieser Zugriffsmöglichkeiten bedient sich EbsScript eines eigenen primitiven Datentyps "ebsvar".

     

    Eingabe und Ausgabe

    Es gibt mehrere Möglichkeiten, Daten für die Ausführung des EbsScripts einzugeben:

    Um EbsScript Ergebnisse zu erhalten, kann man

    Da einige EbsScript-Funktionen Teil des Ebsilon Performance Optimization Systems, EPOS, sind, können sie nur mit entsprechenden Zusatzlizenzen genutzt werden. Einzelheiten sind in der Funktionsliste aufgeführt.

     

    Einheitensysteme

    Innerhalb von EbsScript kann man direkt auf Modellgrößen zugreifen. Dabei werden allerdings nicht die in der Oberfläche angezeigten Einheiten zugrundegelegt, sondern die intern gespeicherten, auch im Ebsilon-Rechenkern verwendeten Einheiten des SI Einheiten Systems:

    Deshalb bedeutet eine direkte Zuordnung wie

    Turbine.M1N := 100;

    immer 100 kg/s.

     

    Profile

    Einer der Hauptvorteile von EbsScript ist das Feature, mit dem Sie Berechnungen für unterschiedliche Profile durchführen können. Innerhalb von EbsScript können Sie neue Profile erstellen und von einem zum anderen Profil umschalten. Für die Profiloperationen werden folgende Profile festgelegt:

    Das aktuelle Berechnungsprofil wird zur Durchführung einer Rechnung verwendet.  Es wird weiterhin zum Lesen von Werten aus demModell oder zum Schreiben von Werten ins Modell benutzt. Zusätzlich gelten eine Menge Profiloperationen für dieses Profil (siehe Kapitel "Profile" in der EbsScript-Funktionsübersicht).

    Das aktuelle Elternprofil wird zur Erstellung eines neuen Unterprofils verwendet, d.h. das neue Unterprofil ist ein Kindprofil des aktuellen Elternprofils. Das aktuelle Elternprofil muss nicht das Elternprofil des aktuellen Berechnungsprofils sein (dies ist allerdings dann der Fall, wenn man in einem Unterprofil arbeitet, das man gerade innerhalb EbsScripts erstellt hat).

    Wenn man EbsScript startet, werden beide, das aktuelle Berechnungs- und das aktuelle Elternprofil, auf das Profil gesetzt, das aktiv war, als EbsScript aufgerufen wurde.

    Beispiel: Wenn Sie EbsScript starten, während Sie sich in Profil A befinden und die Befehle

    newSubProfile;
    newSubProfile;

    ausführen, erhalten Sie zwei neue Profile, die Kinder von Profil A sind.

     

    Anwendung von EbsScript


    Erstellung und Ausführung

    The Modul EbsScript ermöglicht eine automatisierte Durchführung von Zuweisungen und Berechnungen. Zur Anwendung muss zunächst ein Programm (das "EbsScript") erstellt werden unter Verwendung des EbsScript Editors. Als Programmiersprache dient PASCAL, mit auf EBSILON zugeschnittenen Spracherweiterungen. Nach der Erstellung des Scripts, kann man mit Hilfe des EbsScriptCompilers die Richtigkeit der Syntax zu überprüfen und das EbsScript ausführen. Bereits fertig gestellte EbsScripte kann man auch ohne den Editor direkt mit dem EbsScriptExecutor compilieren und ausführen.

    Während man mit dem EbsScript Editor arbeitet, kann man zum EBSILON-Modell umschalten und wieder zurück zum Editor. Dies ist hilfreich, wenn man bestimmte Namen oder Werte nachschauen will. Man kann auch das Ebsilon-Modell modifizieren, während der EbsScript Editor geöffnet ist. Wenn man allerdings im Modell Objekte eingefügt, gelöscht oder umbenannt hat, sollte man den Objektbaum im Editor aktualisieren, in dem man Menü-Kommando ”Extras" à"Objektbaum neu erstellen" verwendet.

    Wenn Sie mehrere Modelle geöffnet haben, können Sie für jedes dieser Modelle einen EbsScript Editor öffnen. Auf dem Bildschirm sehen Sie nur einen EbsScript Editor, nämlich den, der dem gerade aktiven Modell zugeordnet ist. Andere EbsScript Editoren sind unsichtbar. Wenn Sie von einem zum anderen Modell umschalten, wird der entsprechende Editor des anderen Modells sichtbar.

    Sie können mehrere EbsScript für ein Modell entwickeln. Diese Scripts werden innerhalb der ”.ebs” Datei gespeichert. Dort gibt es Import/Export Funktionen, die den Transfer von EbsScript von einem zum anderen Modell möglich machen.

     

    Zugriff auf Modelldaten

    EbsScript ist besonders darauf angelegt, Modelldaten zu verarbeiten. Die in der Schaltung vorhandenen Namen können deshalb direkt in EbsScript verwendet werden. Um z.B. einer Turbinenscheibe mit dem Namen NDT_2B einen Wert für den isentropen Wirkungsgrad zuzuweisen, verwendet man die Syntax

    NDT_2B.ETAIN:=0.88;

    Genau wie in den Eingabefeldern selbst können hierbei einem Spezifikationswert auch Ausdrücke zugewiesen werden. Zur Realisierung dieser Zugriffsmöglichkeiten bedient sich EbsScript eines eigenen primitiven Datentyps "ebsvar".

     

    Eingabe und Ausgabe

    Es gibt mehrere Möglichkeiten, Daten für die Ausführung des EbsScripts einzugeben:

    Um EbsScript Ergebnisse zu erhalten, kann man

    Da einige EbsScript-Funktionen Teil des Ebsilon Performance Optimization Systems, EPOS, sind, können sie nur mit entsprechenden Zusatzlizenzen genutzt werden. Einzelheiten sind in der Funktionsliste aufgeführt.

    Hinweise

    1. In EbsScripten, die immer einem Bauteil zugeordnet sind (z.B. Bauteil 93-KernelScript, Macro-Scripte, Kernel-Expressions) kann nun (wie in Textfeld-Ausdrücken) der Platzhalter „$“ für das aktuelle Bauteil verwendet werden. Achtung: „$“ ist keine EbsScript-Funktion, sondern wird beim Kompilieren durch das aktuelle Bauteil ersetzt. Eine Verwendung von „$“ in Units ist nicht möglich.
    2. Partielle Initialisierung von Konstanten möglich: Bei der Initialisierung eines Arrays darf auch nur ein Anfangsstück initialisiert werden (der Rest wird Default-Initialisiert, d.h. 0 bzw. Leerer-String gesetzt). Bei der Initialisierung eines Record dürfen Elemente ausgelassen werden (ausgelassene Elemente werden Default-Initialisiert).

      Beispiel:

       const ROWS = 5;
       const COLS = 6;
       const a:array [1..ROWS,1..COLS] of integer = ((1,2),(4,5,6),(),(1));
       const b:array [1..ROWS,1..COLS] of integer = ((1,2,3),(),(4,5,6),(7,8,9),(-8));  
       
       type rectype = record
          i,j:integer;
          s:string;
          b:boolean;
       end;
       
       const reca:rectype =     (i: 42; s:"hallo");
       const recb:rectype =     (j:-41; b:true   );
       
       var c,r:integer; 
       begin
          println ("Array a");
          for r := 1 to ROWS do begin
             for c := 1 to COLS do begin
                 print (a[r,c]:2, " ");
             end;
             println (" ");
          end;
          println ("\nArray b:");
          for r := 1 to ROWS do begin
             for c := 1 to COLS do begin
                print (b[r,c]:2, " ");
             end;
             println (" ");
          end; 
          println (" ");
          println ("reca: ", reca.i:4, " ", reca.j:4, " ", reca.b:6, " ", reca.s);
          println ("recb: ", recb.i:4, " ", recb.j:4, " ", recb.b:6, " ", recb.s);
      end.


      Output:

      Array a

       1  2  0  0  0  0 
       4  5  6  0  0  0 
       0  0  0  0  0  0 
       1  0  0  0  0  0 
       0  0  0  0  0  0 

      Array b:
       1  2  3  0  0  0 
       0  0  0  0  0  0 
       4  5  6  0  0  0 
       7  8  9  0  0  0 
      -8  0  0  0  0  0

      reca:   42    0 false hallo
      recb:    0  -41 true

       

    3. Instanzen von Record-Typen können als Konstanten inline im Code definiert werden. Der Syntax hierfür ist:

    Typname( feld1:wert1; feld2:wert2; … )

    z.B.

    type person_type=record
    last_name:string;
    middle_name:string;
    first_name:string;
    end;

    var person:person_type;
    begin
    //...
    person:=person_type(last_name:"Miller"; first_name:"Arthur");
    //...
    end;

     

    Wie bei der Definition von Record-Konstanten, müssen die Felder in der Initialisierung in der gleichen Reihenfolge, wie in der Definition des Records vorkommen, es dürfen aber Felder ausgelassen werden (diese werden Default-Initialisiert).

    ACHTUNG: Diese Erweiterung gilt nur für Record-Typen, NICHT für Class-Typen.

     

    Einheitensysteme

    Innerhalb von EbsScript kann man direkt auf Modellgrößen zugreifen. Dabei werden allerdings nicht die in der Oberfläche angezeigten Einheiten zugrundegelegt, sondern die intern gespeicherten, auch im Ebsilon-Rechenkern verwendeten Einheiten des SI Einheiten Systems:

    Deshalb bedeutet eine direkte Zuordnung wie

    Turbine.M1N := 100;

    immer 100 kg/s.

     

    Profile

    Einer der Hauptvorteile von EbsScript ist das Feature, mit dem Sie Berechnungen für unterschiedliche Profile durchführen können. Innerhalb von EbsScript können Sie neue Profile erstellen und von einem zum anderen Profil umschalten. Für die Profiloperationen werden folgende Profile festgelegt:

    Das aktuelle Berechnungsprofil wird zur Durchführung einer Rechnung verwendet.  Es wird weiterhin zum Lesen von Werten aus demModell oder zum Schreiben von Werten ins Modell benutzt. Zusätzlich gelten eine Menge Profiloperationen für dieses Profil (siehe Kapitel "Profile" in der EbsScript-Funktionsübersicht).

    Das aktuelle Elternprofil wird zur Erstellung eines neuen Unterprofils verwendet, d.h. das neue Unterprofil ist ein Kindprofil des aktuellen Elternprofils. Das aktuelle Elternprofil muss nicht das Elternprofil des aktuellen Berechnungsprofils sein (dies ist allerdings dann der Fall, wenn man in einem Unterprofil arbeitet, das man gerade innerhalb EbsScripts erstellt hat).

    Wenn man EbsScript startet, werden beide, das aktuelle Berechnungs- und das aktuelle Elternprofil, auf das Profil gesetzt, das aktiv war, als EbsScript aufgerufen wurde.

    Beispiel: Wenn Sie EbsScript starten, während Sie sich in Profil A befinden und die Befehle

    newSubProfile;
    newSubProfile;

    ausführen, erhalten Sie zwei neue Profile, die Kinder von Profil A sind.

    Wenn das zweite neue Profil ein Kind des ersten sein soll, müssen Sie

         i:=newSubProfile;
         setParentProfile( i );
         newSubProfile;

    schreiben.

     

    COM-Interface

    Es besteht die Möglichkeit, auf COM-Bibliotheken zuzugreifen. Die entsprechenden Datentypen und Funktionen sind in der interface “@ComObj´“definiert

    Unter „EbsScript -> Add Unit from Typelib“ kann im EbsScript-Editor ein Typbibliotheks-Importier-Dialog geöffnet werden. Mit den damit erstellten EbsScript-Units können COM-Objekte instantiiert und verwendet werden. Damit ist eine einfache Kommunikation zwischen EbsScript und COM-fähigen Programmen möglich. 

     

    Python-Interface

    Die Interface-Unit „@Python“ ermöglicht das Ausführen von Python-Code direkt aus EbsScript heraus. Es können sowohl Code direkt als auch Python-Dateien (*.py) ausgeführt werden. Zum Verwenden der Schnittstelle muss   

    1. Es muss Python installiert sein (Version 2.7 oder 3.0 oder neuer). Python für Windows kann von https://www.python.org/downloads/windows/ heruntergeladen werden.
    2. die Python-Erweiterung "Python for Windows Extensions" muss installiert sein (siehe z. B. http://sourceforge.net/projects/pywin32/ ).
    3. die COM-Klasse "EbsScriptPython.Interpreter" muss registriert werden: führen Sie dazu das Python-Skript “<Ebsilon-Install-Path>/Data/Python/ebsscript_python_interpreter.py” mit Python aus.

    Während der Ausführung eines EbsScripts bleibt das globale Dictionary von Python erhalten, d.h. mehrere hintereinander ausgeführte Aufrufe an Python können z.B. Python-Variablen anlegen und anschließend auslesen.

    ACHTUNG: Nach der Beendigung eines EbsScripts wird das globale Python-Dictionary gelöscht. Ein Zugriff auf Variablen aus
    einem vorhergehenden EbsScript-Laufes ist damit über das Dictionary nicht möglich (kann z.B. mittels „Python-pickling“ erreicht werden).

    Folgende Funktionen/Prozeduren sind in „@Python“ enthalten:

    function pyEvaluate(expression:string):variant; internal;
    Evaluiert  „expression” und gibt das Ergebnis zurück.

    procedure pyExecute(expression:string); internal;
    Führt den Code in „expression” aus.

    procedure pyExecuteFile(file:string); internal;
    Führt den in „file” enthaltenen Code aus.

    function pyGetVariable(name:String):variant; internal;
    gibt den Wert der globalen Variablen „name“ (d.h. Element des globalen Dictionary) zurück.

    procedure pySetVariable(name:String; const value:variant); internal;
    setzt den Wert der globalen Variablen „name“.

    Wenn das zweite neue Profil ein Kind des ersten sein soll, müssen Sie

         i:=newSubProfile;
         setParentProfile( i );
         newSubProfile;

    schreiben.


     

    COM-Interface

    Es besteht die Möglichkeit, auf COM-Bibliotheken zuzugreifen. Die entsprechenden Datentypen und Funktionen sind in der interface “@ComObj´“definiert

    Unter „EbsScript -> Add Unit from Typelib“ kann im EbsScript-Editor ein Typebibliotheks-Importier-Dialog geöffnet werden. Mit den damit erstellten EbsScript-Units können COM-Objekte instantiiert und verwendet werden. Damit ist eine einfache Kommunikation zwischen EbsScript und COM-fähigen Programmen möglich. 

     

    Anonyme Funktionen

    Anonyme Funktionen sind Funktionen oder Prozeduren ohne Namen. Zwei einfache Beispiele:

    var p:procedure();
    begin
         p:=procedure ()
         begin
           println(445);
        end;
        p();
    end;

     

    var f:function():string;
    begin
        f:=function ():string
        begin
            println(445);
            result := "Hi";
        end;
        println (f());
    end;

    Besonders nützlich sind anonyme Funktionen in Textfeldern oder Ausdrücken.

    Sie erlauben hier die Verwendung von Variablen und Funktionsaufrufen (es besteht Zugriff auf alle EbsScript-Funktionen).

     

    Leistung einer Windturbine als Funktion der Windgeschwindigkeit
    { function (v : real):string
         var s:string; P:real;
         begin 
             s := "Aktuelle Windgeschwindigkeit: " + printtostring (v:5:2);
             s := s + "  m/s \nLeistung ";
             P := Windturb.CLPower.interpolate(v);
             s := s + printtostring (P:5:2) + "  MW\n";
            result := s;
      end (Sun.VWIND)   }

    Weitere Beispiele finden sie unter den mitgelieferten Beispielen (Dateinamen beginnen mit anonymous_functions...).

     

    Multiples Implementieren von Interfaces

    Eine EbsScript-Klassen (NUR „Class“, KEIN „Record“!) kann nun mehre Interfaces gleichzeitig implementieren.
    Hier z.B. die Definition eine Amphibienfahrzeugs, welches schwimmen und rollen kann:

    type ICanSwim = interface
    procedure swim;
    end;
    type IHasWheels = interface
    procedure roll;
    end;
     
    
    type AmphibiousVehicle = class(ICanSwim, IHasWheels)
    procedure swim;override;
    procedure roll;override;
    end;

    Sollte es beim multiplen Implementieren von Interfaces zu Namenskonflikten kommen, dann kann mittels der Methodenzuordnungsklausel die Standardzuordnung außer Kraft gesetzt werde:

    type ICanSwim = interface
    procedure swim;
    procedure honk;
    end;
    type IHasWheels = interface
    procedure roll;
    procedure honk;
    end;
     
    
    type AmphibiousVehicle = class(ICanSwim, IHasWheels)
    procedure swim;override;
    procedure roll;override;

    procedure blow_foghorn; virtual; // honking when swimming
    procedure trot; virtual; // honking on wheels

    procedure ICanSwim.honk = blow_foghorn;
    procedure IHasWheels.honk = trot;
    end;

     

    Schlüsselworte "is" und "as"

    Die Schlüsselworte „is" und „as" werden im Zusammenhang mit EbsScript-Klassen (NUR „Class", KEINE „Record"!) und Interfaces verwendet.

    Das Schlüsselwort „is" ermöglicht zu testen, ob der Laufzeittyp einer Klassen- oder Interfaceinstanz vom Typ einer bestimmte Klasse ist oder ein bestimmtes Interface implementiert (Sämtliche Kombinationen von Klassen und Interfaces sind hierbei zulässig.).

    Folgendes Programm zeigt mögliche Verwendungen von „is" und „as":

    type IAnimal = interface
    
    
       function make_noise : string;
    
    end;
    
     
    
    type Dog = Class (IAnimal)
    
       function make_noise : string; override;
    
       procedure tell(command:string);
    
    end;
    
     
    
    function Dog.make_noise : string;
    
    begin
    
       result:="woof";
    
    end;
    
     
    
    procedure Dog.tell(command:string);
    
    begin
    
       println("Executing command: ", command);
    
    end;
    
     
    
    type Cat = Class (IAnimal)
    
       function make_noise : string; override;
    
       procedure relax();
    
    end;
    
     
    
    function Cat.make_noise : string;
    
    begin
    
       result:="purr";
    
    end;
    
     
    
    procedure Cat.relax;
    
    begin
    
       println("relaxing...");
    
    end;
    
     
    
     
    
    procedure interact(animal:IAnimal);
    
    begin
    
       println(animal.make_noise());
    
     
    
       if animal is Dog then begin
    
    
          (animal as Dog).tell("Sitz!");
    
       end;
    
     
    
       if animal is Cat then begin
    
    
          (animal as Cat).relax();
    
       end;
    
     
    
    end;
    
     
    
    var
    
       a_cat:Cat;
    
       a_dog:Dog;
    
    begin
    
       a_cat:= Cat.Create();
    
       interact(a_cat);
    
       a_dog:= Dog.Create();
    
       interact(a_dog);
    
    end;
    

     

     

    Ausgabe des Programms:

    purr
    relaxing...
    woof
    Executing command: Sitz!

     

     

    Überladen von Klassen-Operatoren

    Das Überladen von impliziten und expliziten Operatoren wurde mit Release 16 vollständig überarbeitet und bisher fehlende Operatoren ergänzt. Seitdem sind folgende Operatoren für Klassen überladbar:

    Operator Kategorie Deklarationssignatur Symbolzuordnung

    Implicit

    Konvertierung

    Implicit(a : Typ): Ergebnistyp;

    Implizite Typumwandlung

    Explicit

    Konvertierung

    Explicit(a: Typ): Ergebnistyp;

    Explizite Typumwandlung

    Negative

    Unär

    Negative(a: Typ): Ergebnistyp;

    -

    Positive

    Unär

    Positive(a: Typ): Ergebnistyp;

    +

    Inc

    Unär

    Inc(a: Typ): Ergebnistyp;

    Inc

    Dec

    Unär

    Dec(a: Typ): Ergebnistyp

    Dec

    LogicalNot

    Unär

    LogicalNot(a: Typ): Ergebnistyp;

    not

    Trunc

    Unär

    Trunc(a: Typ): Ergebnistyp;

    Trunc

    Round

    Unär

    Round(a: Typ): Ergebnistyp;

    Round

    Equal

    Vergleich

    Equal(a: Typ; b: Typ): Boolean;

    =

    NotEqual

    Vergleich

    NotEqual(a: Typ; b: Typ): Boolean;

    <>

    GreaterThan

    Vergleich

    GreaterThan(a: Typ; b: type) Boolean;

    >

    GreaterThanOrEqual

    Vergleich

    GreaterThanOrEqual(a: Typ; b: Typ): Boolean;

    >=

    LessThan

    Vergleich

    LessThan(a: Typ; b: Typ): Boolean;

    <

    LessThanOrEqual

    Vergleich

    LessThanOrEqual(a: Typ; b: Typ): Boolean;

    <=

    Add

    Binär

    Add(a: Typ; b: Typ): Ergebnistyp;

    +

    Subtract

    Binär

    Subtract(a: Typ; b: Typ): Ergebnistyp;

    -

    Multiply

    Binär

    Multiply(a: Typ; b: Typ): Ergebnistyp;

    *

    Divide

    Binär

    Divide(a: Typ; b: Typ): Ergebnistyp;

    /

    IntDivide

    Binär

    IntDivide(a: Typ; b: Typ): Ergebnistyp;

    div

    Modulus

    Binär

    Modulus(a: Typ; b: Typ): Ergebnistyp;

    mod

    LeftShift

    Binär

    LeftShift(a: Typ; b: Typ): Ergebnistyp;

    shl

    RightShift

    Binär

    RightShift(a: Typ; b: Typ): Ergebnistyp;

    shr

    LogicalAnd

    Binär

    LogicalAnd(a: Typ; b: Typ): Ergebnistyp;

    and

    LogicalOr

    Binär

    LogicalOr(a: Typ; b: Typ): Ergebnistyp;

    or

    LogicalXor

    Binär

    LogicalXor(a: Typ; b: Typ): Ergebnistyp;

    xor

    BitwiseAnd

    Binär

    BitwiseAnd(a: Typ; b: Typ): Ergebnistyp;

    bitwiseand

    BitwiseOr

    Binär

    BitwiseOr(a: Typ; b: Typ): Ergebnistyp;

    bitwiseor

    BitwiseXor

    Binär

    BitwiseXor(a: Typ; b: Typ): Ergebnistyp;

    bitwisexor