EBSILON®Professional Online Dokumentation
Erste Schritte / Erste Schritte mit EbsScript
In diesem Thema
    Erste Schritte mit EbsScript
    In diesem Thema

    EbsScript Einführung

    EbsScript ist eine eingebettete Skriptsprache innerhalb von EBSILON Professional, die Ihnen Zugang zu EBSILON Eingabe-, Ausgabe- und Berechnungsfunktionen gibt, und diese mit Ihrem Code zu kombinieren:

    Es gibt 6 Situationen, in denen EbsScript verwendet werden kann:

     

    Dieses Kapitel soll für jene einen kurzen Überblick über EbsScript vermitteln, die bereits mit anderen Programmiersprachen, und Programmierung im Allgemeinen, vertraut sind. Es gibt einen Überblick über die EbsScript Syntax, einzelne Code-Stücke gängiger Aufgaben, und Tipps zur Fehlerbehebung. Mehr Details über die Nutzung von EbsScript stehen in der EBSILON Hilfedatei im Kapitel EbsScript zu Verfügung. In diesem Kapitel werden auch die drei wichtigsten Teile der EbsScript-Instrumente (EditorExplorer und Executor) beschrieben.

    EbsScript Syntax         EbsScript Operatoren       EbsScript Decision Making Statements       EbsScript Schleifen Statements

    EbsScript Funktionen    

    Gültigkeitsbereich von Variablen in EbsScript       EbsScript Arrays       EbsScript Debuggen       EbsScript Interface Units       EbsScript Beispiele   

     

     

    EbsScript Syntax

    Die EbsScript Syntax basiert auf der Programmiersprache PASCAL, und einigen Erweiterungen. Auf einem höheren Level bedeutet dies:

               myrealvar := 1.2 ;

               const PI = 3.14159;

             

              {* Dies ist ein mehrzeiliger Kommentar in EbsScript. *}

              {Dies ist ein einzeiliger Kommentar in EbsScript}

              // Dies ist ein einzeiliger Kommentar in EbsScript

       

             Kommentare werden im EbsScript-Editor mit grauer Schrift gekennzeichnet.

               var
               val1, val2 :real;

               offset : integer;
               name   : string;

               flag   : boolean;

               pipe      : ebsPipe  ;

               cmp       : ebsComp  ;

               xsqrd := pow(x,2) ;

    Neben den oben genannten Regeln, sind auch noch folgende Punkte wichtig:

    Reserved / Keywords / Identifiers im EbsScript

    Die Statements in EbsScript verwenden spezielle "PASCAL"-Ausdrücke (bzw. Eigenschaften von "Delphi"), die Reserved oder Keywords genannt werden. Zum Beispiel sind die Wörter while, do, var, real, begin und end Reserved bzw. Keywords. Sie können diese Wörter nicht als Namen für Ihre Variablen, Funktionen oder Prozeduren verwenden. Die nachstehende Tabelle zeigt die Reserved und Keywords in EbsScript:

     

    A

    abstract

    add

    addr

    and

    append

    array

    autodispatch

    autosafearray

    autounknown

    B

    begin  

    bitand

    bitnot

    bitor

    bitwiseand

    bitwiseor

    bitwisexor

    bitxor

    boolean

    break

    C

    callback

    capacity

    case

    char

    class

    comnullptr

    const

    constructor

    continue

    copy

    copymem

    D

    dec

    default

    destructor

    dispatchcall

    dispose

    div

    divide

    do

    downto

    E

    else

    end

    enumstrings

    enumtostring

    equal

    except

    explicit

    F

    false

    finalization

    finally

    for

    forward

    freemem

    function

    G

    getmem

    greaterthan

    greaterthan

    H

    high

    I

    if

    implementation

    implicit

    in

    inc

    index

    inherited

    initialization

    insert

    internal

    intdivide

    integer

    interface

    L

    leftshift

    length

    lessthan

    lessthanorequal

    logicaland

    logicalnot

    logicalor

    logicalxor

    low

    M

    mod

    modulus

    multiply

    N

    negative

    new

    nil

    not

    notequal

    O

    of

    on

    operator

    or

    otherwise

    overload

    override

    P

    pointer

    positive

    print

    println

    private

    procedure

    program

    property

    protected

    public

    R

    raise

    read

    real

    record

    reintroduce

    remove

    repeat

    reserve

    return

    rightshift

    round

    S

    self     

    setlength

    setlow

    shl

    shr

    sizeof

    sliceleft

    slicemid

    sliceright

    smartptr

    static

    step

    string

    subtract

    T

    then

    to

    true

    trunc

    try

    type

    typeof

    U

    unit

    unittest

    until

    uses

    V

    var

    virtual

    W

    while

    write

    Diese Wörter werden im EbsScript-Editor in blauer Schrift angezeigt.

    Ein "Identifikator" bezeichnet in einem Programm ein Objekt (z.B. einen Datentyp, eine Variable oder eine Funktion), welches er eindeutig benennt.
    Daher muss der Bezeichner innerhalb eines Namensraumes eindeutig sein. In der Regel wird für Bezeichner die Kombination einer Zeichenfolge aus Buchstaben und Ziffern verwendet.

     

     

    EbsScript Operatoren

    Arithmetische Operatoren

    Operator

    Description

    +

    Addiert zwei Operatoren

    -

    Subtrahiert den zweiten Operator vom ersten

    *

    Multipliziert beide Operatoren

    div

    Integer Division

    mod

    Modulus Operator UND Rest nach einer ganzzahligen Division

    /

    Floating Point (Real) Division

    Potenzierung

    pow(base, exponent)

    Relationale Operatoren 

    Operator

    Description

    =

    Überprüft ob die Werte von zwei Operatoren gleich sind oder nicht, wenn ja, dann wird die Bedingung wahr.

    <>

    Überprüft ob die Werte von zwei Operatoren gleich sind oder nicht, wenn die Werte nicht gleich sind, dann wird die Bedingung wahr.

    >

    Überprüft ob der Werte des linken Operators größer ist als der des rechten Operators, wenn ja, wird die Bedingung wahr.

    <

    Überprüft ob der Werte des linken Operators kleiner ist als der des rechten Operators, wenn ja, wird die Bedingung wahr.

    >=

    Überprüft ob der Werte des linken Operators größer oder gleich ist als der des rechten Operators, wenn ja, wird die Bedingung wahr.

    <=

    Überprüft ob der Werte des linken Operators kleiner oder gleich ist als der des rechten Operators, wenn ja, wird die Bedingung wahr.


     

    Boolean Operatoren

    Operator

    Description

    and

    Boolean AND Operator. Wenn beide Operatoren wahr sind, dann wird die Bedingung wahr.

    and then

    Ähnlich wie der AND Operator, jedoch garantiert er die Reihenfolge, in der der Compiler den logischen Ausdrucke auswertet. Von links nach rechts, und die rechten Operatoren werden nur dann ausgewertet, wenn notwendig.

    or

    Boolean OR Operator. Wenn einer der Operatoren wahr ist, dann wird die Bedingung wahr.

    or else

    Ähnlich wie der OR Operator, jedoch garantiert er die Reihenfolge, in der der Compiler den logischen Ausdruck auswertet. Von links nach rechts, und die rechten Operatoren werden nur dann ausgewertet, wenn notwendig.

    not

    Boolean NOT Operator wird verwendet, um den logischen Status des Operators umzukehren. Wenn eine Bedingung wahr ist, dann ändert der NOT Operator die Bedingung auf falsch.

     

    EbsScript Decision Making Statements


    EbsScript unterstützt die folgenden Decision Making Statements:

     

    if ... then Statement

    Wenn die Bedingung wahr ist, dann wird der Code innerhalb der if-Anweisung ausgeführt. Wenn die Bedingung falsch ist, dann wird der Code nach dem schließenden „end“ ausgeführt.

        if str <> "" then begin
                    str := StringTrimLeft(str);
                    str := stringLower(str) ;
        end
    ;

    EbsScript betrachtet alle Nicht-Null oder vorhandenen Werte als wahr. Werte von Null oder leere Wertezellen werden als falsch behandelt.

    if ... then ... else  Statement

    Wenn die Bedingung wahr ist, dann wird der if ... then Block des Codes ausgeführt, sonst der else-Block. Zum Beispiel:

     if str <> "" then begin

                    str := StringTrimLeft(str);
                    str := stringLower(str) ;
     end
     else begin
                    UserInput := "" ;
     end;

    Case Statement

    Die Syntax des case-statements lautet wie folgt:

    case (expression) of
        L1 : S1;
        L2: S2;
        ...

        Ln: Sn;
        otherwise: Sotherwise; or else: Selse
    end;

    L1, L2, ….. Ln sind case-lables oder Eingabewerte und können vom Typ Integer, Boolean oder Aufzählungsvariable sein. S1, S2, …. Sn sind EbsScript-Statements, die jeweils mit einem oder mehreren case-lables verbunden sein können. Der Ausdruck wird case-selector oder case-index genannt. Der case-index kann Werte annehmen, die dem case-statement entsprechen. Das case-statement ist immer mit einem end-statement verbunden. Die folgenden Regeln gelten für ein case-statement:

    Zum Beispiel:
    case MacroInterface.LoadMethod of
                    0  :  Programmable.SPEC3 := 0 ;
                    1  :  Programmable.SPEC3 := 2 ; 

                    2  :  Programmable.SPEC3 := 1 ;
                    otherwise Programmable.SPEC3 :=  MacroInterface.LoadMethod ;
    end;


     

    Der Typ bei case of kann auch ein String sein. Dann müssen die einzelnen Ansprungstellen Stringkonstanten sein:

    procedure foo(s:string);
    begin
    case s of "Hallo" : begin
    // ...
    end;
    "Welt" : begin
    // ...
    end
    otherwise begin
    // ...
    end
    end;

    end;

    Der Vergleich findet IMMER Case-Sensitiv statt (Groß/Kleinschreibung wird unterschieden).
    Weiterhin können als Ansprungstellen ganze Bereiche angegeben werden.

    5 .. 10 : // alle Werte größer gleich 5 und kleiner gleich 10
    .. 2    : // alle Werte kleiner gleich 2
    15 ..   : // alle Werte größer gleich 15

    procedure bar(value:integer); begin
    case value of ..-10 : begin
      println("<= -10");
    end;
    20.. : begin
      println("=> 20");
    end;
    5..8 : begin
      println("5 <= .. <= 8");
    end;
    4 : begin
       println("== 4");
    end;
    0 : begin
      println("== 0");
    end
    otherwise begin
      println("something else");
    end
    end;

    end;

    Bei Strings wird hierbei die lexikographische Ordnung verwendet.

     

    EbsScript Schleifen Statements

    Ein Loop- (Schleifen-) Statement ermöglicht einem Skript eine Anweisung -  oder eine Gruppe von Anweisungen -  mehrfach auszuführen. EbsScript unterstützt die folgenden Schleifenanweisungen.

     

    while ... do Schleife

    Eine while-do Schleife erlaubt es, sich wiederholende Berechnungen durchzuführen, bis die gewünschte Bedingung erfüllt ist. Die Syntax einer while-do Schleife sieht wie folgt aus:

    while (condition) do S;

    Dabei ist die Bedingung ein Boolean oder ein relationaler Ausdruck, dessen Wert richtig oder falsch ist, und S ist ein Ausdruck oder eine Gruppe von Ausdrücken, innerhalb des "begin …… end" Blocks.

    while number > 0 do
    begin
       sum := sum + number;
       number := number - 1;
    end;

    Wenn der Ausdruck falsch wird, steuert der Code sofort den nächsten Ausdruck nach dem end-Statement an.

    for ... do Schleife

    Eine for ... do Schleife ist eine effiziente Art, um eine Schleife zu programmieren, die eine bestimmte Anzahl von Wiederholungen durchlaufen soll.

    for < loop-variable-name > := < initial_value > to [downto] < final_value > do  S;

    Der "loop-variable-name" spezifiziert eine Variable von Ordinaltyp, und wird Regelgröße oder Index-Variable genannt. „initial_value“ und „final_value“ sind Werte, die die Regelgröße verwenden kann. S ist eine Anweisung, oder eine Gruppe von Anweisungen, in der for ... do Schleife. Zum Beispiel:

    for i:=1 to n do
     begin
         MacroInterface.ERRARRAY.x[i] := Programmable.RA_2.x[i];
         MacroInterface.ERRARRAY.y[i] := Programmable.RA_2.y[i];
    end;

    Dies ist ein Beispiel, wie der Ablauf in einer for ... do Schleife funktioniert:

    repeat ... until  Schlieife

    Die repeat ... until Schleife ist ähnlich einer While-Schleife, mit der Ausnahme, dass sie mindestens einmal ausgeführt wird. Die Syntax für eine repeat ... until Schleife sieht wie folgt aus:

    repeat
       S1;
       S2;
       ...
       Sn;
       until condition;

    For example:
    repeat
       sum := sum + number;
       number := number - 1;
     until number = 0;

    Beachten Sie, dass die Bedingung erst am Ende der Schleife gesetzt wird, und der Ausdruck der Schleife somit einmal ausgeführt wird, bevor die Bedingung geprüft wird. Ist die Bedingung erfüllt, beginnt der Ablauf von vorne. Dieser Vorgang wiederholt sich, bis die vorgegebene Bedingung falsch ist.

    Break und Continue Statement

    Das break-statement findet in EbsScript folgende Anwendung:

    Das continue-statement in EbsScript arbeitet umgekehrt. Anstatt die Ausführung zu beenden, wird die nächste Iteration gestartet und der verbleibende Code übersprungen. Wenn Continue in einer for ... do Schleife angewandt wird, dann wird die Bedingungsüberprüfung und die Erhöhung oder Verringerung der Schleifenvariable durchgeführt.

    EbsScript Funktionen

    Eine Funktion in EbsScript besteht aus einem Kopfteil, lokalen Deklarationen und dem Funktionshauptteil. Der Funktionskopf besteht aus der Schlüsselwortfunktion und einem Funktionsnamen. Folgend werden die Teile einer Funktionsdeklaration dargestellt:

    Argumente: Die Argumente stellen die Verbindung zwischen den rufenden Programmen und den Funktionskennungen her, und werden auch formale Parameter genannt.  

    Rückgabetypen: Alle Funktionen müssen einen Wert zurückgeben und alle Funktionen müssen einem Typ zugeordnet sein. Der Funktionstyp ist der Datentyp des Werts, den die Funktion zurückgibt. Dies kann ein Standard-Typ sein, benutzerdefiniert Skalar oder Subrange-Typ, aber es kann kein strukturierter Typ sein.

    Lokale Deklarationen: Lokale Deklarationen beziehen sich auf Deklarationen für Lables, Konstanten, Variablen, Funktionen und Prozeduren, die nur für den Körper der Funktion anwendbar sind.

    Funktionskörper: Der Funktionskörper enthält eine Sammlung von Anweisungen, die definieren, was die Funktion tut. Diese sollen immer zwischen den reservierten Ausdrücken "begin ….. end" stehen. Der Funktionskörper ist der Teil einer Funktion, in dem alle Berechnungen durchgeführt werden. Im Funktionskörper muss eine Zuweisung des Typs "function_name := expression;" erfolgen, die der Funktion einen Wert zuordnet. Dieser Wert wird zurückgegeben, wenn die Funktion ausgeführt wird. Die letzte Anweisung im Körper lautet „end“. Um eine Funktion aufzurufen, müssen Sie einfach die gewünschten Parameter zusammen mit dem Funktionsnamen übergeben. Wenn die Funktion einen Wert zurückgibt, dann können Sie diesen einer Variable zuweisen und speichern. Zum Beispiel:

    function test (a, b: Integer ; c: real) : real;
    begin   
                test:= (a+b)*c;
    end;

    begin
                println ( test(2, 5, 7.1));
    end;

    Beachten Sie auch den Strichpunkt nach dem letzten end-statement.

    Gültigkeitsbereich von Variablen in EbsScript

    Der Gültigkeitsbereich in jeder Programmierung ist der Bereich oder Teil des Programms, in dem eine definierte Variable existiert. Außerhalb dieses Bereichs kann auf die Variablen nicht zugegriffen werden. Es gibt drei Bereiche, an denen Variablen in EbsScript deklariert werden können.

    Lokale Variablen
    Variablen, die innerhalb einer Funktion / Prozedur oder einem Codeblock deklariert werden, werden lokale Variablen genannt. Diese Variablen werden nicht von Funktionen / Prozeduren oder Codestücken außerhalb der eigenen Funktion erkannt.

    Globale Variablen
    Globale Variablen werden außerhalb von Funktionen definiert, meist am Beginn des Skripts. Die globalen Variablen halten ihren Wert während der gesamten Laufzeit des Skripts, und können von jeder Funktion im Skript aufgerufen werden.


    Mehr Informationen zum Umfang von Variablen finden Sie unter den Free Pascal language reference.


    Arrays in EbsScript

    EbsScript stellt eine Datenstruktur zu Verfügung, die Array genannt wird. Dieses kann eine sequentielle Auflistung von Elementen des gleichen Typs und fester Größe, speichern. Ein Array wird verwendet, um eine Sammlung von Variablen des gleichen Typs zu speichern. An Stelle der Deklaration einzelner Variablen, wie number1, number2, … und number100, wird eine Array Variable „number“ deklariert und verwendet, um  individuelle Variablen mit numbers[1], numbers[2], … und numbers[100] abzubilden. Einzelne Elemente in einem Array werden durch einen Index abgerufen. Alle Arrays bestehen aus zusammenhängenden Speicherplätzen. Die niedrigste Adresse entspricht dem ersten Element, und die höchste Adresse dem letzten Element. Wenn Sie ein C-Style Array vom Index 0 starten möchten beachten Sie, dass Sie den Index anstelle von 1 nur von 0 beginnen lassen müssen.

    Die allgemeine Form der Typendeklaration von eindimensionalen Arrays ist:

    type  array-identifier = array[index-type] of element-type;

    Wobei:
    array-identifier, gibt den Namen des Array-Typs an.

    index-Typ, gibt den Index des Arrays an, es kann ein beliebiger skalarer Datentyp außer Real sein

    element-Typ, gibt die Art von Werten die gespeichert werden, an

    Zum Beispiel:

     

    type
       vector = array [ 1..25] of real;
    var
       velocity: vector;

    Die Geschwindigkeit ein Variablen Array des Typs Vektor, und ist in der Lage bis zu 25 reelle Zahlen zu speichern. Um das Array von Index 0 zu starten, muss die Deklaration wie folgt lauten:

     

    type

       vector = array [ 0..24] of real;
    var
       velocity: vector;

     

    Typen von Array-Indizes

    In EbsScript kann ein Array-Index von skalarem Typ ein Integer, Boolean, Char oder Subrange-Typ sein. Real ist nicht zulässig. Array-Indizes können auch negative Werte haben, wie zum Beispiel:

    type
       temperature = array [-10 .. 50] of real;
    var
       day_temp, night_temp: temperature;

    Zum Schluss ein Beispiel in dem der Index vom Typ Char ist:

    type
       ch_array = array[char] of 1..26;
    var
       alphabet: ch_array;
       c: char;

    begin

       ...

       for c:= 'A' to 'Z' do

       alphabet[c] :=

    Ein Element wird durch die Indizierung des Array-Namens abgerufen. Dies geschieht durch die Anordnung des Index innerhalb der eckigen Klammern, nach dem Array Namen. Zum Beispiel:

    a: integer;
    a: = alphabet['A'];
    a:= numbers[10];

    Debuggen in EbsScript

    Die Mittel zum Debuggen von EbsScript-Codes hängen davon ab, ob Sie Kernel-Scripting verwenden oder nicht. Wenn das Skript die folgende Zeile enthält, dann wird Kernel Scripting verwendet:

    uses @KernelScripting

    Da das Kernel Scripting in den Solver für das Gesamtgleichungssystem eingebettet ist, können Sie es nicht im Editor debuggen. Alle Debugging-Funktionen im EbsScript-Editor werden deaktiviert, wenn Sie ein Kernel Script bearbeiten. Um diese Einschränkung zu umgehen, können Zwischenergebnisse mit dem Befehl print(ln) ausgegeben werden.

    println("FCTRLMODE =", ::Control.FCTRLMODE);

    Zeigen Sie die Ergebnisse in der the EbsKern-Output tool bar. Um diese anzuzeigen, folgen Sie den nächsten Punkten:

    1.       Wählen Sie die Symbolleiste > aus dem View Pulldown-Menü.

    2.       Wählen Sie EbsKern-Output aus dem Untermenü, um das EbsKern-Output Fenster zu öffnen (siehe nächste Abbildung):


    In der EbsKernel-Ausgabezeile wird für jede, im Modell befindliche Komponente 93, ein Blatt (tab) erstellt, und das Modell, gemeinsam mit einem kompletten Blatt (tab) für alle Ausgaben, ausgeführt.

    Wenn Ihr Skript-Code kein Kernel-Scripting verwendet, dann können Sie Ihren Code debuggen, während ein EbsScript läuft. Debugging macht es möglich, die Ausführung des Skripts zu unterbrechen, und die Werte von Variablen anzuzeigen und zu ändern. Der EbsScript-Debugger ist unter dem Menüpunkt Debug zu finden.

    Um zu debuggen, müssen Breakpoints im EbsScript-Fenster gesetzt werden. Bewegen Sie hierzu den Cursor auf die gewünschte Zeile im Skript und drücken Sie F9 („Switch breakpoint“). Ein weiterer Klick auf F9 entfernt den Breakpoint.

    Das Skript kann dann mit der Taste "F5" gestartet werden (Start / Continue) und wird bis zum ersten gesetzten Breakpoint ausgeführt. Es ist möglich, die Werte der Variablen in der Monitor-Leiste (im EbsScript-Editor unter View > Toolbars > Console) anzusehen und zu ändern.

    Sie können das Skript, durch Drücken der Taste "F10" (über nächste Prozedur hinweg) und "F11" (in Prozeduren), weiter Schritt für Schritt, oder durch "F5" bis zum nächsten Breakpoint, ausführen. Das Debugging Fenster wird in der nächsten Abbildung dargestellt.

     

    Beachten Sie, dass Sie den Debugger auch in einigen Kernel-Skripts verwenden können, indem Sie den Inhalt des Kernel-Skripts in ein externes Skript kopieren. Dabei ist aber vorausgesetzt, dass dieses nicht auf Strom- oder Komponentendaten mittels Funktionen wie "ksGetPipeValue" zugreift. Um die Variablennamen des Modells richtig zu interpretieren, muss das externe Skript im gleichen Kontext ausgeführt werden (z. B.: auf Modellebene, standard gemäß mit Global bezeichnet, oder innerhalb des jeweiligen Makroobjekts, welche das Kernel Skript enthält, im obigen Beispiel mit „Control“ bezeichnet). Sie können den entsprechenden Kontext aus dem Dropdown-Menü im EbsScript-Menü (in der Abbildung oben rot eingekreist) auswählen.

    Wenn Ihr Kernel Skript auf Strom- oder Komponentendaten zugreift, dann ist die Verwendung der println-Anweisung und des EbsKern-Output Fensters die einzige derzeit verfügbare Debugging Möglichkeit.

    Interface Units in EbsScript

    Interface Units sind Bibliotheken von Funktionen, die ihre Implementierung nicht innerhalb von EbsScript haben. Die Funktionen in einer Interface Unit werden direkt in EBSILON®Professional umgesetzt. Eine Interface Unit muss mit dem Skript verknüpft sein, das dessen Funktionen mittels Keyword am Anfang des Skripts aufruft. Zum Beispiel:

    uses @KernelScripting;

    Das „@“ vor dem Einheitennamen dient als Identifikation für eine Interface Unit. EBSILON Professional bietet die folgenden Interface Units:

    KernalScripting
    Fluid
    Variant
    Units
    Covariance
    System
    Epos
    KernelExpression
    MacroHelpers
    TimeSeries
    NNTool
    Standard
    Debug

    Durch öffnen des EbsScript-Editor können Sie sehen, welche Funktionen diese Interface Units zu Verfügung stellen. Wählen Sie hierbei den Punkt „Interface-Unit öffnen“ im EbsScript Pulldown Menü der Menüleiste aus. Beachten Sie, dass einige Interface Units wie NNTool zusätzliche Lizenzierungen benötigen können.



    Custom Units

    In Pascal ist es auch möglich, individuelle Custom-Units zu definieren, die von jedem Skript verwendet werden können.

    Unten ist ein Beispiel für eine solche Custom-Unit dargestellt:


    unit EngineCalcs;
     
    interface
     
    procedure EnginePreProcessing;
    procedure EnginePostProcessing;
    procedure DoMyCalculations( par1:real; var retval1:real, var retval2:real);
     
    implementation
    uses @kernelscripting,@fluid;
     
     
    procedure AddMessage( MessageNumber:integer; MessageMessage: string);
    var len:integer;
    begin
         //::StatusText.text:=printToString( ::StatusText.text, "\n",MessageMessage );
         len:=MacroInterface.Messages.getSize+1;
         MacroInterface.Messages.size:=len;
         MacroInterface.Messages.x[ len ]:= MessageNumber;
    end;

     
    procedure EnginePreProcessing;
    var i,j:integer;
        x,y:real;
    begin
         …
         …
         …
    end;
    procedure EnginePostProcessing;
    var i,j:integer;
        x,y:real;
    begin
         …
         …
         …
    end;
    procedure DoMyCalculations( par1:real; var retval1:real, var retval2:real);
    var i,j:integer;
        x,y:real;
    begin
         …
         …
         …
         retval1 := …;
         retval2 := …;
    end;

     
     
    end.

     
     
    Anwendungsbeispiele:

    Aus einem Makro im „Skript vor der Berechnung“  

    uses EngineCalcs;
     
    begin
         EnginePreProcessing;
    end;

     
    Von jeder Komponente 93 oder „Kernel Expression“ (= spezielle Eingabefelder in Komponenten):

     

    uses EngineCalcs;
     
    var p1, r1,r2;
    begin
         p1:= sqrt(23);
         DoMyCalculations(p1,t1,r2);
         …
         …
    end;

    EbsScript Beispiele

    Die folgenden Beispiele zeigen einige gängige Anwendungen, die mit EbsScript umgesetzt werden können.

    Simulationen unter verschiedenen Profilen in einem Modell laufen lassen:

    var
          i: integer;
    begin
         for i:=1 to 10 do
        begin
              setCalcProfileByName(“first_profile_name”);
              simulate ;

              setCalcProfileByName(“second_profile_name”);
              simulate ;
        end;
    end;

    Einheitenumrechnung – Druck in psia

    Sie können gegebenenfalls direkt mittels EbsScript auf die Modellgrößen zugreifen. Beachten Sie, dass die Modellgrößen intern mit SI-Einheiten abgespeichert werden. Die verwendeten UOM´s (Unit of Measure) lauten wie folgt:

    Daher bedeutet eine direkte Zuordnung wie

    Turbine.M1N := 100;

    immer 100kg/s. EbsScript bietet die Interface-Unit „Units“ die es erlaubt Einheitenumrechnungen in Ihrem Skript-Code durchzuführen. Das folgende Beispiel wandelt den Druck von bar in psia um:

    uses @Units
    unitsConvert(comp122.P1, “BAR”, myPinPsia, “PSIA”) ;


    Der folgende Link öffnet eine Liste aller verfügbaren Maßeinheiten in EBSILON: 

    Ebsilon Units Of Measure


    Einstellen von Spezifikationswerten mit EbsScript

    Um einen Spezifikationswert mit EbsScript zu setzten, fügen Sie eine Funktion, die den gewünschten Spezifikationswert berechnet, im Spezifikationseingabefeld ein. Zum Beispiel:

    function evalexpr:REAL;
    var
    begin

                    // TODO: calculate specification value
                    evalexpr:= calc_result
    end;

    Durchführung einer Eigenschaftsberechnung

    Sie können in EbsScript jede Eigenschaftsberechnung für alle EBSILON Eigenschaften durchführen. Als Beispiel berechnen Sie die Enthalpie aus Druck P und Temperatur T:

    uses @fluid;
    var    
        Pres,Temp,rResult:real;
     iphase:PhaseEnum;
    begin
        Pres:=1.013;
        Temp:=20.0;
     fluidTableWST( rResult, iPhase, Pres, Temp, FuncH_OF_PT);   
     println (rResult);
    end;

    Der folgende Abschnitt des Codes kann angenehmer sein, wenn der Benutzer einen Strom-Typ zu Verfügung hat, auf den er sich beziehen kann:

    begin
                    fluidTableObject( {var rResult:Real}, {var phase:PhaseEnum}, {arg1:Real}, {arg2:Real}, {func:FuncEnum}, {obj:ebsData} );
     
    end;

     
    Der letzte Parameter (obj:ebsData) repräsentiert einen Strom, entweder durch den Namen aus dem Flowsheet, oder durch Bezugnahme auf einen Port (Zum Beispiel: ‚componentname._2‘ für den an Port 2 angeschlossenen Strom).

    Nachstehend ist ein Screenshot der verfügbaren Funktionen der Interface-Unit für Fluid dargestellt:



     

    Verfügbare Aufrufe für thermische Eigenschaften in EbsScript

    Unter dem folgenden Link ist eine Auflistung der verfügbaren Eigenschaftsfunktionen dargestellt, auf die von EbsScript aus zugegriffen werden kann: EbsScript Berechnungsfunktionen

    Auf P, H und M eines Ports einer Komponente zugreifen

    uses @kernelscripting;
    var
                    m14,h14,p14:real;

    begin

    m14:=ksGetPipeValue(14,PhysValueM);
    h14:=ksGetPipeValue(14,PhysValueH);
    p14:=ksGetPipeValue(14,PhysValueP);

    end;

    Überprüfen Sie, ob ein bestimmter Port (Port 7) an einem Makro Objekt verbunden ist, und die Upstream-Komponente übergeben wird:

    uses @MacroHelpers
    var
                    txt    : string;
                    ThisMacro : ebsMacro ;
                    pipe      : ebsPipe  ;
                    cmp       : ebsComp  ;

        ThisMacro := getContainerMacro(MacroInterface);  // Check if logic line is connected

        if  isNull(getPipeAtLink(ThisMacro,7)) then
        begin
                       txt := ThisMacro.name + " fuel logic line at Pin 7 not connected." ;
                     MessageBox(txt) 
                     exit(-1, txt);   // terminate the run and set error message to txt
        end;

        // There's a logic line at Pin 7.  Get it.  
       pipe := getPipeAtLink(ThisMacro,7) ; // Check if it's connected to a pipe              
       if isNull(GetPipeAtLogpipe(pipe, 1)) then
       begin
                       txt := ThisMacro.name + " logic line at Pin 7 not connected to a pipe." ;
                       MessageBox(txt);
                     exit(-1, txt);   // terminate the run
        end;
       // It's connected to a pipe.  Get it.
        pipe := GetPipeAtLogpipe(pipe, 1) ;
      // Get component at upstream end of that pipe
        cmp := GetCompAtPipe(pipe, 1) ;

    Code Aufruf in einem COM Objekt
    callEbsScriptServer( {class:string}, {var var1:(array of) primitive type}, {var var2:(array of) primitive type}{, callBackProc:callback procedure = nil} );

    Beispiel dazu unter Block 750.ebs