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.
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".
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.
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.
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.
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.
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".
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.
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.
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.
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.
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.
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
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.
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 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...).
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;
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!
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 |