EBSILON®Professional Online Dokumentation
EBSILON Professional Objekte / Bauteile - Allgemeines und Gruppen / Rechner / Bauteil 65: Programmierbares Bauteil
In diesem Thema
    Bauteil 65: Programmierbares Bauteil
    In diesem Thema

    Bauteil 65: Programmierbares Bauteil


    Vorgaben

    Die Zahl der Anschlüsse wurde auf 10 Eingänge und 10 Ausgänge erweitert. Der Programmierer der DLL entscheidet, wie diese anzuwenden sind.

    Leitungsanschlüsse

    1

    Eingang 1

    2

    Eingang 2

    3

    Eingang 3

    4

    Eingang 4

    5

    Eingang 5

    6

    Eingang 6

    7

    Ausgang 1

    8

    Ausgang 2

    9

    Ausgang 3

    10

    Ausgang 4

    11

    Ausgang 5

    12

    Ausgang 6

    13

    Ausgang 7

    14

    Ausgang 8

    15

    Ausgang 9

    16

    Ausgang10

    17

    Eingang 7

    18

    Eingang 8

    19

    Eingang 9

    20

    Eingang 10

      

    Allgemeines

     

    Das Bauteil 65 kann verwendet werden, um ein selbst geschriebenes Programm zur Berechnung eines Bauteils in Ebsilon einzubinden. Die Einbindung erfolgt in Form einer DLL. Zur Erstellung einer solchen DLL müssen geeignete Entwicklungswerkzeuge verfügbar sein.

    Beim Aufruf der DLL werden die das entsprechende Bauteil betreffenden Daten aus der Ebsilon-Schaltung an diese DLL übergeben, die dann bestimmte Berechnungen damit durchführen kann. Die Ergebniswerte werden dann von Ebsilon übernommen.

    Bei diesem Bauteil gibt es wie beim Bauteil 93 (KernelScripting) auch die Möglichkeit, Gleichungen abzusetzen. Dazu ist die Verwendung des „Extended Interface“ und eine Programmierung in C++ erforderlich.

    Der Pfad zur DLL kann  beim Bauteil direkt  angegeben werden. Bisher war dies nur in den allgemeinen Einstellungen global für alle Schaltungen und Bauteile möglich. Damit ist auch Verwendung unterschiedlicher DLLs in einer Schaltung möglich.

    Das ”Anschlüsse” -Blatt zeigt die Fluidtypen, wie sie den Komponentenverbindungspunkten zugeteilt sind.

    Es gibt einen Eintritt für jeden Verbindungspunkt. Er enthält die Nummer des Verbindungspunktes und eine Kombobox, die den ständig angepassten Fluidtyp anzeigt.

    Indem Sie in die Fluidtypen-Kombobox klicken und einen der Typen aus der angezeigten Liste auswählen, können Sie den Fluidtyp von Verbindungspunkten ändern.

    Es besteht auch die Möglichkeit, durch eine Auswahl "keine" einen Anschluss komplett auszublenden.

     

    Hinweis:

    Bei diesen Bauteilen gibt es auch Kennlinien, Ergebnisarrays, Vorgabematrizen und Ergebnismatrizen. Es besteht die Möglichkeit, Ergebniswerte in jedem Iterationsschritt berechnen zu lassen. Siehe dazu Blatt "Rechnung" -->"Berechnungsoptionen" --> "Ergebnisberechnung" --> (1) "Ergebniswerte in jedem Iterationsschritt berechnen"

    Für das Bauteil 65 gibt es zusätzliche Interfaces. Siehe dazu Blatt "Experten" und Hinweise im Kapitel "Komponenten bearbeiten" --> Blatt "Experten".

     


     

    Vorgabewerte  

    DLLPATH

    Alternativer Pfad zur Programmable.DLL

    Dieser Eintrag ist optional. Wenn hier kein Pfad spezifiziert wird, wird der Pfad aus den allgemeinen Einstellungen verwendet.

    FSEQ

    Schalter für die Aufrufreihenfolge:
    Wie im Elternprofil (Unterprofil nur optional)

    Ausdruck

    =0: Parallel zu anderen Komponenten
    =1: Später, nach Neuberechnung der Fluide

    FTAKEOVERNOMINALVALUES

    Nominalwerte übernehmen: Nach einer erfolgreichen (lokalen) Teillastrechnung wird Anhand dieses Spezwerts entschieden, ob die Werte von SPEC1,...,SPEC80 als Nominalwerte übernommen werden.


    Wie im Elternprofil (Unterprofil nur optional)

    Ausdruck

    =0: Funktion XUI_hasNominalValues aufrufen und anhand des Ergebnis' verfahren 
    =1: Ja im Auslegungsmodus; nein im Teillastmodus
    =2: Ja (Nominalwerte übernehmen)
    =3: Nein (Nominalwerte nicht übernehmen)
    =4: Wert aus dem Alias "FMODE" verwenden: =0 -> global; >0 -> nein/lokale Teillast; <0-> ja/lokale Auslegung 

    FPROG

    Programm-ID (Klassifizierung des vom Anwender vorgegeben Bauteil-Untertyps)

    SPEC1,..., SPEC80

    Vom Anwender definierbare Spezifikationswerte (auch als Nennwerte verwendbar)
    Hinweis: Durch die Erweiterung der Zahl der Anschlüsse können sich Änderungen ergeben, wenn im Script bzw. Programm
    über alle Anschlüsse iteriert wurde.

     

    Generell sind alle sichtbaren Eingaben erforderlich. Häufig werden jedoch Standardwerte zur Verfügung gestellt.

    Für weitere Informationen über die Farbe der Eingabefelder und ihre Beschreibungen siehe Komponenten bearbeiten\Vorgabewerte

    Für weitere Informationen über Auslegung vs. Teillast und Nominalwerte siehe Allgemeines\Nominalwerte übernehmen

     

     


    Überblick 

    Für die Erstellung eines Programms in C/C++ wird ein eigener C/C++-Compiler benötigt, der eine dynamic link library (DLL) erzeugt, die die DLL Programmable.dll bzw. xui_dll.dll ersetzt. Diese DLL wird zusammen mit EBSILON®Professional benötigt, um eine Berechnung mit diesem Bauteil durchzuführen. 

    Es können mehrere Typen von selbst definierten Bauteilen implementiert werden, die dann durch den Spezifikationswert FPROG unterschieden werden. Dieser Wert legt fest, welcher Typ verwendet wird. Da die Programmable.DLL nur einmal vorhanden ist, kann jeder Typ in allen Modellen bzw. Schaltungen verwendet werden.
    Die Programmable.dll wird vom Ebsilon-Rechenkern verwendet, nicht von der grafischen Benutzeroberfläche (zum Datenaustausch mit der Oberfläche kann z.B. EbsOpen verwendet werden). Sie wird während des Lösungsverfahrens in jedem Iterationsschritt aufgerufen, und ist deshalb Bestandteil des Iterationsprozesses. Deshalb ist es wichtig, dass die DLL über entsprechende Konvergenzeigenschaften verfügt. Andernfalls wird die Berechnung mehr Iterationsschritte benötigen oder überhaupt nicht mehr konvergieren.
    Der Rechenkern ruft die DLL mit einer Schnittstelle auf, die in der Headerdateien EbsUser.h und xui.h beschrieben ist. Diese Dateien sind im Verzeichnis Examples\xui_dll zu finden.
    Die DLL-Schnittstelle für C besteht aus einer einzigen Funktionen mit dem Namen EbsUser_Comp65. Diese Funktion liefert als Rückgabewert eine Integer-Zahl, die nach Belieben festgelegt werden kann. Der Rechenkern wertet diesen Rückgabewert in folgender Weise aus:

     

    Die DLL-Schnittstelle für C++ besteht aus mehreren Funktionen deren Namen alle mit „XUI_“ beginnen. Die Beschreibung dieser Funktionen ist in den Headerdateien EbsUser.h und xui.h enthalten (nur in Englisch vorhanden).

    Im Falle eines Fehlers oder einer Warnung wird der Rückgabewert im Fehleranalyse-Fenster angezeigt:

     

    Das einzige Argument der Funktion EbsUser_Comp65 ist ein Zeiger auf eine EBSPROG_CALC_DATA -Struktur. Diese Struktur ist definiert als

    typedef struct {
          int             compno;      // lfd. Nr. (1 = 1. Bauteil 65 in der Schaltung, 2 = 2. Bauteil 65...)
          int             nrule;        // Nr. der Berechnungsvorschrift (= 1. Spezifikationswert)
          int             nspecs;       // Zahl der Spezifikationswerte
          int             nresults;     // Zahl der Ergebniswerte
          int             n_inlines;   // Zahl der Eingangsleitungen
          int             n_outlines;   // Zahl der Austrittsleitungen
          int             n_materials;  // Maximalzahl der Bestandteile in der chemischen Zusammensetzung einer Leitung
          EBSPROG_PARAMS  calcparams; // Berechnungsparameter
          double          *specs;       // Feld aus 'nspecs' Komponenten-Spezifikationswerten
                                       // Leere Vorgaben werden als '-999' dargestellt
          double          *results;     // Feld aus 'nresults' Komponenten-Ergebniswerten
          EBSPROG_LINEVAL *in;         // Feld aus 'n_inlines' Werten der Eingangsleitungen
          EBSPROG_LINEVAL *out;        // Feld aus 'n_outlines' Werten der Austrittsleitungen
    } EBSPROG_CALC_DATA;

    Bevor der Ebsilon-Rechenkern Ihre DLL aufruft, legt er diese Struktur an und kopiert die Daten aus dem aktuellen Iterationsschritt in diese Struktur. Somit haben Sie in Ihrer DLL Zugriff auf alle diese Daten in der Struktur.

    Die Datei EbsUser.c enthält Beispiele, die den Zugriff auf Ebsilon-Spezifikationswerte und Leitungsergebnisse und die Vorgabe Ihrer Ergebnisse verdeutlichen.

    Der Parameter compno gibt an, welches der Bauteile 65 (in der Schaltung können mehrere sein) gerade berechnet wird.

    Der Parameter nrule ist derselbe Werte, der als Spezifikationswert FPROG im Eigenschaftsfenster definiert wurde. Damit kann man verschiedene Typen von benutzerdefinierten Bausteinen unterscheiden, falls Sie unterschiedliche implementieren wollen.

    Die Parameter nspecs, nresults, n_inlines, n_outlines und n_materials geben die Größe der entsprechenden Felder an. In Ihrem Code sollten Sie stets diese Größen an Stelle von absoluten Zahlen (wie 39, 40, 6) verwenden, da sich diese Werte in zukünftigen Ebsilon-Versionen ändern könnten. 

     

    EBSPROG_PARAMS ist eine Struktur, die die Umstände und die Einstellungen der Berechnung angibt.

    typedef struct {
        int     mode;       // Aufruf-Modus: Initialisierung (1), Berechnung (2), Beendigung (3)
                            // Modus 1: Empfang der Spezifikationswerte und Durchführung der Initialisierung
                            //         Kein Datentransfer zurück zu Ebsilon
                            // Modus 2: Empfang der Leitungswerte von Ebsilon und Durchführung der Berechnung
                            //         Leitungsergebnisse werden an Ebsilon zurückgegeben
                            // Modus 3: Spezifikationswerte und Komponentenergebnisse werden an Ebsilon zurückgegeben
        int     itno;       // Nummer des aktuellen Iterationsschritts (von 1 bis 998)
        int     design;     // Auslegung (0) / Teillast (1) Rechnung
        int     wst;        // Zu verwendende Wasserdampftafel: 0=IFC-67, 1=IAPWS-IF97
    } EBSPROG_PARAMS;

    Den Parameter mode können Sie in Ihrem Programm verwenden, um Initialisierungs- oder Beendigungsarbeiten zu erledigen, wie z.B. das Zuweisen und Freigeben von Speicherplatz oder das Öffnen und Schließen von Dateien.

    Der Parameter itno dient zur Ihrer Information über den gerade durchgeführten Iterationsschritt.

     

    EBSPROG_PARAMS ist eine Struktur, die die Umstände und die Einstellungen der Berechnung angibt.

    typedef struct {
        int     mode;       // Aufruf-Modus: Initialisierung (1), Berechnung (2), Beendigung (3)
                            // Modus 1: Empfang der Spezifikationswerte und Durchführung der Initialisierung
                            //         Kein Datentransfer zurück zu Ebsilon
                            // Modus 2: Empfang der Leitungswerte von Ebsilon und Durchführung der Berechnung
                            //         Leitungsergebnisse werden an Ebsilon zurückgegeben
                            // Modus 3: Spezifikationswerte und Komponentenergebnisse werden an Ebsilon zurückgegeben
        int     itno;       // Nummer des aktuellen Iterationsschritts (von 1 bis 998)
        int     design;     // Auslegung (0) / Teillast (1) Rechnung
        int     wst;        // Zu verwendende Wasserdampftafel: 0=IFC-67, 1=IAPWS-IF97
    } EBSPROG_PARAMS;

    Den Parameter mode können Sie in Ihrem Programm auswerten, um Initialisierungs- oder Beendigungsarbeiten zu erledigen, wie z.B. das Zuweisen und Freigeben von Speicherplatz oder das Öffnen und Schließen von Dateien.

    Der Parameter itno dient zur Ihrer Information über den gerade durchgeführten Iterationsschritt.

     Der Parameter design ist aus zwei Gründen wichtig:

    Der Parameter wst wird zum Aufruf von Stoffwerttabellen benötigt. Aus Gründen der Einheitlichkeit muss in Ihrer DLL dieselbe Formulierung der Wasser/Dampf-Tafeln wie in Ebsilon benutzt werden.

    EBSPROG_LINEVAL ist eine Struktur, die die Leitungswerte enthält. Für die Eingabezeilen liefert Ebsilon diese Werte für Ihre Berechnung. Für die Ausgabezeilen erwartet Ebsilon, dass Ihr Programm diese Werte errechnet.

    typedef struct {
    
          double      p;          //  Druck [bar]
    
          double      h;          //  Enthalpie [kJ/kg]
    
          double      m;          //  Massenstrom [kg/s]
    
          double      ncv;        //  unterer Heizwert [kJ/kg]
    
          MT_ANALYSE ana;        //  Zusammensetzung
    
          double      fugit;      //  Flüchtige Anteile (nur Kohle)
    
          double      rho;        //  Dichte (nur Kohle)
    
          double      zfac;       //  Z-Faktor (nur Öl)
    
          int         fcoal;      //  Kohleart (nur Kohle)
    
    } EBSPROG_LINEVAL;
    

    Mit  der Struktur MT_ANALYSE wird die Stoffzusammensetzung vorgegeben, sie wird in material_table.h definiert. Siehe die Beschreibung der Stoffwerttabellen-Funktionen für Einzelheiten.

     

    Es ist Aufgabe des Anwenders, festzulegen, wie die Werte der 10 Austrittsanschlüsse von den Eintrittswerten der 10 Eintrittsanschlüsse abhängen.

    Sind mehr als 6 Eintritts- oder 6 Austrittsanschlüsse erforderlich, können mehrere dieser Bauteile kombiniert werden (unterschieden durch den Parameter FPROG).

    Es können alle Stofftabellen-Funktionen (Wasser und Verbrennung) durch das C-Programm aufgerufen werden.

    Jedes andere Programm oder jede API kann einfach durch Modifikation des Make-files einschließlich zusätzlicher Header-files integriert werden.

    Beachten Sie, dass die implementierten Berechnungen in jedem Iterationsschritt der Simulation ausgeführt werden, und einen Einfluss auf das Konvergenzverhalten haben.

    Die Ebsilon-Schaltung kann mehrere Bauteile des Typs 65 enthalten. Jedes muss eine gültige Unterbauteilnummer FPROG bekommen. Jede vergebene Unterbauteilnummer (FPROG) muss im C-Code bzw. in der DLL bekannt sein.

    In "Data\Examples\Programmable\ebsuser.c " sind 3 Beispiele für Unterbauteile gegeben. Diese Beispiele wurden mit Microsoft Developer Studio 6.0 (Visual C++) getestet. Die entsprechenden Schaltungen sind im Verzeichnis data\Examples\components\ des EBSILON®Professional Installationsverzeichnis unter den Namen Component_65.ebs, Component_65_2.ebs und Component_65_3. abgelegt.


    Vorbereitungen zur Implementierung eines neuen Bauteils

     

    Es wird die mit EBSILON®Professional ausgelieferte Datei ebsuser.c verwendet. Vor einer Modifikation der Datei, erzeugen Sie eine eigene DLL  programmable.dll durch Kompilation und Linken des Originalfiles.

    Sie müssen folgendes tun: Die Dateien

    sind zusammen in dem Verzeichnis Data\Examples\Programmable\ abgelegt, das als EBSILON®Professional Installations-Verzeichnis ausgewählt wurde.

    Wenn Sie Visual C++ installiert haben, müssen Sie folgendermaßen vorgehen

    Es wird dann ebsuser.obj und die DLL ProgrammableUser.dll erzeugt.

    Ersetzen der Programmable.dll, die mit EBSILON®Professional ausgeliefert wird, durch die von Ihnen erzeugte und umbenannte Kopie. Vergessen Sie nicht, vorher ein Backup der Original-DLL zu machen, falls Ihre DLL nicht ordnungsgemäß funktioniert. 


    Implementierung der ebsuser_Comp65-Routine

    Zur Implementierung Ihres eigenen Unterbauteils ändern Sie die Funktion ebsuser_Comp65, die Bestandteil von ebsuser.c ist. Diese Funktion sieht folgendermaßen aus:

    LINKDLL     int   EbsUser_Comp65    (EBSPROG_CALC_DATA  *data)
    
    {
    
        int     rc;
    
       
    
        switch (data->nrule) {
    
            case 1:
    
                      .....  code for sub type 1
    
                break;
    
            case 2:
    
                      .....  code for sub type 2
    
                break;
    
            case 3:
    
                      .....  code for sub type 3
    
                break;
    
            default:
    
                rc = -999;
    
                break;
    
        }
    
     
    
        return rc;
    
    } 
    

     

     

    Hinzufügen eines Unterbauteils bedeutet innerhalb eines Blocks einen neuen Fall mit einem Schalter (FPROG) hinzufügen.

    Die verfügbare Eingabe sind Felder für

    Jede Größe enthält die Werte aller 6 Eingabe-Leitungen.

    Als Beispiele enthält das mit EBSILON®Professional ausgelieferte ebsuser.c drei Unterbauteile (FPROG 1, 2 und 3).

    Das erste Beispiel (FPROG = 1) verwendet alle Eingaben und Ausgaben für Leitungen. Es wird in EBSILON®Professional Beispiel Component_65.ebs, das im Verzeichnis examples\components\ des Installationsverzeichnisses abgelegt ist, verwendet.

    Das zweite Beispiel (FPROG = 2) (detaillierte Beschreibung) verwendet die Eingabeleitungen 5 und 6 und die Ausgabeleitungen 2 und 3. Es wird in EBSILON®Professional Beispiel Component_65_2.ebs , das im Verzeichnis Examples\components\ des Installationsverzeichnisses abgelegt ist, verwendet. In diesem Beispiel wird die Schnittstelle zu den Stoffwertetabellen (allerdings nur Wasser-Dampftafel) verwendet.

    Das dritte Beispiel (FPROG = 3) (Component_65_3.ebs, abgelegt im Verzeichnis Examples\components\ des Installationsverzeichnisses), spaltet einen Rohgasmassenstrom in drei Massenströme auf:

    In diesem Beispiel wird die Schnittstelle zu den Verbrennungstabellen verwendet, der untere Heizwert des resultierenden Massenstroms wird berechnet.


    Kompilieren und Verlinken

     

    Das Make-file (Data\Examples\Programmable\Programmable.mak ), das mit EBSILON®Professional ausgeliefert wird, kann verwendet und geändert werden. Sie können einen eigenen Compiler, Linker, Makefile etc. oder jedes andere Werkzeug verwenden.

    Die von Ihnen erzeugte DLL muss eine multithreaded DLL sein. Verwenden Sie keine MFC.


    Verfügbare Stoffwerttabellen-Funktionen

     

    Die verfügbaren Funktionen sind unten aufgelistet. Bei Aufruf der Funktion müssen die Eingabewerte wie dargestellt spezifiziert sein.

    Verwendete Abkürzungen sind

    Abkürzung

    Englisch

    Deutsch

    Dampf

     

     

    p

    pressure

    Druck

    T

    temperature

    Temperatur

    h

    specific enthalpy

    spezifische Enthalpie

    s

    specific entropy

    spezifische Entropie

    v

    specific volume

    spezifisches Volumen

    cp

    isobaric specific heat

    Isobare spezifische Wärmekapazität

    x

    quality

    Dampfgehalt

    Rauchgas

     

     

    p

    pressure

    Druck

    T

    temperature

    Temperatur

    h

    specific enthalpy

    Spezifische Enthalpie

    s

    specific entropy

    Spezifische Entropie

    v

    specific volume

    Spezifisches Volumen

    cp

    isobaric specific heat

    Isobare spezifische Wärmekapazität

    x

    water content

    Wassergehalt

    xs

    saturation water ratio

    Maximaler Dampfgehalt (gesättigt)

    MRAT

    mass ratios

    Massenanteil

    VRAT

    volume ratio

    Volumenanteil

    MG

    molar weight

    Molgewicht

    HU

    lower calorific heating value

    unterer Heizwert

     

    Verfügbare Funktionen für Wasser und Dampf

    Ergebnis►

    spezifische Enthalpie

    Druck

    spezifische Entropie

    Temperatur

    spezifisches Volumen

    Isobare spezifische Wärme

    Dampfgehalt

    Eingabe▼

    Druck, Temperatur

    h = f (p, T) 

     

    s = f (p, T) 

     

    v = f (p, T) 

     

     

    Druck, spezifische Enthalpie

     

     

    s = f (p, h) 

    T = f (p, h) 

    v = f (p, h) 

    cp = f (p, h) 

     x = f (p, h)

    Druck, spezifische Entropie

    h = f (p, s) 

     

     

    T = f (p, s) 

     

     

     

    Temperatur

     

    p = f (T)
    0  =<  x  =< 1

     

     

     

     

     

    spezifische Entropie

     

    p = f (s)
    with x = 1.0

     

     

     

     

     

    spezifische Enthalpie

     

    p = f (h)
    with x = 0.0

     

     

     

     

     

    Druck

    h = f (p)
    with x = 1.0

    h = f (p)
    with x = 0.0

     

     

    T = f (p)
    0  =<  x  =< 1

     

     

     

     

    Verfügbare Funktionen für andere Fluide

    Fluide können aus mehreren Substanzen bestehen. Die Massenanteile der einzelnen Substanzen müssen vorgegeben werden.

    Zusätzlich zu den Eingabewerten, die in den Tabellen spezifiziert sind, benötigen nahezu alle Berechnungen auch diese Massenanteile. Nur die Berechnung der Massenanteile selbst benötigt die Volumenanteile.

    Funktionen für Gase (Luft, Rauchgas, Brenngas, Rohgas)

    Ergebnis ►

    spezifische Enthalpie

    spezifische Entropie

    Temperatur

    spezifisches Volumen

    spezifische Wärme

    Fluid Wasseranteil

    Sättigung Wasser Verhältnis

    Volumen-verhältnisse

    Massen-verhältnisse

    unterer Heizwert

    Mol-gewicht

    Eingabe ▼

    Druck, Temperatur

    h = f (p, T)

    s = f (p, T)

     

    v = f (p, T)

    cp = f (p, T)

    x = f (p, T)

    xs = f (p, T)

     

     

     

     

    Druck, spezifische Enthalpie

     

    s = f (p, h)

    T = f (p, h) 

     

    cp = f (p, h)

    x = f (p, h)

     

     

     

     

     

    Druck, spezifische Entropie

    h = f (p, s)

     

    T = f (p, s)

     

     

     

     

     

     

     

     

    nur Massenverhältnis

     

     

     

     

     

     

     

    VRAT

    MRAT

    HU

    MG

    Funktionen für Kohle und Öl

    Ergebnis►

    spezifische Enthalpie

    Temperatur

    spezifische Wärme 

    unterer Heizwert

    Eingabe▼

    Druck, Temperatur

    h = f (p, T)

     

    cp = f (p, T)

     

    Druck, spezifische Enthalpie

     

    T = f (p, h) 

    cp = f (p, h)

     

    nur Massenverhältnis

     

     

     

    Hu

     


    Vorgabe und Analyse der Stoffwertzusammensetzung

     

    Brennstoffe und Rauchgase können aus mehreren Stoffbestandteilen bestehen. Die Massenanteile dieser Stoffe müssen vorgegeben werden.

    Zusätzlich zu den Eingabewerten, die in den Tabellen oben spezifiziert sind, benötigen nahezu alle Berechnungen diese Massenverhältnisse. Nur die Berechnung der Massenanteile selbst benötigt die Volumenverhältnisse.

    Um eine Zusammensetzung vorzugeben, werden nur die Funktionen mt_init_analyse () und mt_set_analyse () verwendet:

    void mt_init_analyse (MT_ANALYSE         *analyse,
                          MT_ANALYSE_TYPE     analyse_id);
     

    BOOL mt_set_analyse  (MT_ANALYSE         *analyse, 
                          MT_ANALYSE_PART     Bauteil_id, 
                          doppelt             Anteil);

    Um eine Zusammensetzung abzufragen, muss nur mt_inq_analyse () aufgerufen werden :

    BOOL mt_inq_analyse  (MT_ANALYSE         *analyse,
                          MT_ANALYSE_PART     Bauteil_ID, 
                          doppelt                  *Anteil);

    (die Deklaration der Strukturen ist in der Header-Datei materials_table.h enthalten).


    Aufruf einer Stoffwerttabellen-Funktion

    Zur Verwendung der Stoffwerttabellen steht die Funktion mt_calc () zur Verfügung. Diese Funktion ist folgendermaßen definiert:

    BOOL mt_calc  (MT_ANALYSE_TYPE     table_id,         // Materialtyp (= Fluid-Typ) (Eingabe)
                   MT_FUNC_ID           func_id,          // Gewünschte Funktion (Eingabe)
                   double               para_1,           // 1. Parameter der Funktion (Eingabe)
                   double               para_2,           // 2. Parameter der Funktion (Eingabe, falls noch erforderlich)

                   MT_ANALYSE           *analyse,         // Materialzusammensetzung (Eingabe, bei MT_VRAT_OF_MRAT
                                                          // oder MT_MRAT_OF_VRAT Eingabe und Ausgabe)
                   double               *result,          // Berechnetes Ergebnis der gewünschten Funktion (Ausgabe) 
                   MT_PHASE_ID          *phase_id,        // Phase für Wasser (Ausgabe, wenn vorhanden)
                   MT_FORMULATION       formulation,      // zu verwendende Wasser/Dampf-Tafel Formulierung(Eingabe)
                   long                 *error_id);       // Fehlercode (0 = erfolgreich)


    Es müssen alle Parameter spezifiziert werden. Die verfügbaren Datentypen und Werte sind im Header-file materials_table.h definiert.

    Parameter

    Datentyp

    Zweck

    Gültige Werte

    table_id

    MT_TABLE_TYPE

    Spezifiziert die zu verwendende Stofftabelle

    MT_AT_WATER
    MT_AT_FLUEGAS
    MT_AT_GAS
    MT_AT_COAL
    MT_AT_CRUDEGAS
    MT_AT_OIL
    MT_AT_USER

    func_id

    MT_FUNC_ID

    Spezifiziert die Funktion , die ausgeführt werden soll. Die Buchstaben vor _OF_ spezifizieren das Ergebnis, die Buchstaben dahinter den Eingabeparametern: z.B. PT bedeutet Druck und Temperatur, so bedeutet H_OF_PT: Enthalpie als Funktion von Druck und Temperatur

    Die kleinen Buchstaben f und g werden wie Indizes verwendet:
    f bedeutet Siedeflüssigkeit,
    g bedeutet Sattdampf und
    fg bedeutet Nassdampf.

    MT_H_OF_PT
    MT_H_OF_PS
    MT_Hf_OF_Pfg
    MT_Hg_OF_Pfg
    MT_S_OF_PT
    MT_S_OF_PH
    MT_T_OF_PH
    MT_T_OF_PS
    MT_Tfg_OF_Pfg
    MT_Pfg_OF_Tfg
    MT_Pfg_OF_Hf
    MT_Pfg_OF_Sg
    MT_CP_OF_PT
    MT_CP_OF_PH
    MT_V_OF_PT
    MT_V_OF_PH
    MT_X_OF_PT
    MT_X_OF_PH
    MT_XG_OF_PT
    MT_MOLM_OF_MRAT
    MT_NCV_OF_MRAT
    MT_VRAT_TO_MRAT
    MT_MRAT_TO_VRAT

    para_1

    double

    Dies ist der 1. Eingabeparameter

    der jeweiligen Funktion entsprechend:
    z.B. Druck-Eingabe bei MT_H_OF_PT

    para_2

    double

    Dies ist der 2. Eingabeparameter

    der jeweiligen Funktion entsprechend:
    z.B. Temperatur-Eingabe bei MT_H_OF_PT

    analyse

    MT_ANALYSE_TYPE

    spezifiziert die Stoffzusammensetzung (Gas, Flüssigkeit, Kohle) .
    Soll NULL für Wasser oder Dampf sein.

    Verwendung der Funktionen mt_init_analyse und
    mt_set_analyse zum Ändern oder
    mt_inq_analyse zum Lesen der Zusammensetzung.

    Die Anteile müssen als double-Werte gegeben sein. Der Stoffwert-Typ muss :
    MT_AT_FLUEGAS,
    MT_AT_GAS,
    MT_AT_COAL,
    MT_AT_CRUDEGAS,
    MT_AT_OIL or
    MT_AT_USER

    sein.  

    result

    double

    Dies ist der Ergebniswert.

    der jeweiligen Funktion entsprechend:
    z.B. Ergebnis-Enthalpie bei MT_H_OF_PT

    phase_id

    MT_PHASE_ID

    Dies ergibt die Phase von Wasser/Dampf.

    MT_PI_FLUID
    MT_PI_GAS
    MT_PI_SUPER_CRITICAL
    MT_PI_WET_STEAM
    MT_PI_NONE

    formulation

    MT_FORMULATION

    Formulierung der Wasser/Dampftafeln

    MT_FORM_WST67
    MT_FORM_WST97

    error_id

    long

     

    0 bei Erfolg.

     

     

    Wenn z.B. die spezifische Enthalpie von Dampf berechnet werden soll und p und T gegeben sind, kann spezifiziert werden:

    • MT_AT_WATER als func_id,
    • MT_H_OF_PT als table_id,
    • der Druck als para_1,
    • die Temperatur als para_2 und
    • NULL als MT_ANALYSE_TYPE 

    Oder es soll die spezifische Enthalpie von Rohgas berechnet werden und p und s sind gegeben. Dann muss spezifiziert werden:



    Beispiel: Modellierung Bauteil 8 (Pumpe)

    Dieses Beispiel zeigt die Modellierung von Bauteil 8 (siehe weiter unten) durch Verwendung des Bauteils 65.

     

     

     

    Bauteilnummer 8 (beispielhaft genutzt mit drei Anschlüssen) :

    Das folgende Bild zeigt den oben modellierten Kreislauf mit Verwendung des Bauteils 65. Die Eintritte sind an der unteren und rechten Seite angeordnet, die Austritte an der oberen und linken Seite. Der Spezifikationswert FPROG ist zu 2 gesetzt.

     

     

    Gegenüber dem vorherigen Modell, werden nun vier Anschlüsse verwendet:


    Im Folgenden sind die Spezifikationswerte für die Pumpe im Originalmodell und der zugehörigen Code im File ebsuser.c dargestellt. Die Namen der Variablen entsprechen den in der Online Hilfe für Bauteil 8 verwendeten Namen und Gleichungen. Die erforderlichen Spezifikationswerte für die Pumpe sind als Konstanten vorgegeben. Die Kennlinien sind nicht implementiert. Dies ist ohne Belang, da im Originalmodell

    case 2:
    //
    // Fall 2 (FPROG = 2):
    //
    // Modellierung einer Pumpe als Ersatz für Bauteil Nr. 8
    //
    // Zu den Gleichungen siehe Online Hilfe von Bauteil 8
    //
    // Der Wassereintritt ist verbunden mit Anschluss 6 von Bauteil 65.
    // Der zu erzeugende Druck ist verbunden mit Eingabeanschluss 5 von Bauteil 65.
    // Der Wasseraustritt ist verbunden mit Anschluss 2 von Bauteil 65.
    // Die Welle ist verbunden mit Anschluss 3 von Bauteil 65.
    //
    // Die Spezifikationswerte sind:
    // ETAIN = SPEC1
    // ETAM = SPEC2
    // M1N = SPEC3
    //
    // Die Ergebniswerte sind:
    // ETAI = RES1
    //
    // Indizes in C beginnen bei 0 (d.h. SPEC1 = specs[0],...)

    int rc = 0;
    double etain, etai; // Isentroper Wirkungsgrad (Nennwert und aktueller Wert)
    double etam; // Mechanischer Wirkungsgrad
    double m1n; // Nenndurchsatz
    double p1,h1,m1;
    double p2,h2,m2;
    int rcmt; // Rückkehrcode von mt_calc
    double s1,t2s,h2s,dhs,dh,t2,q2,q3;
    int ii;
    int phase = 0, error = 0;
    MT_FORMULATION form;

    // Einlesen der Spezifikationswerte
    etain = data->specs[0];
    etam = data->specs[1];
    m1n = data->specs[2];

    // Einlesen der Werte für den Wassereintritt (6) in die lokalen Variablen
    p1 = data->in[5].p;
    h1 = data->in[5].h;
    m1 = data->in[5].m;

    // Einlesen der Druckvorgabe (Leitung 5) in die lokale Variable
    p2 = data->in[4].p;

    // Berechnung des aktuellen Wirkungsgrads
    if (data->calcparams.design == 0) {
    etai = etain;
    }
    else {
    etai = etain * (m1 / m1n);
    }

    // Einlesen der Wasserdampftafel
    form = data->calcparams.wst;

    // Gleichungen der Komponente 8
    rcmt = mt_calc (MT_AT_WATER, MT_S_OF_PH, p1, h1, NULL, &s1 , &phase, form, &error);
    assert (rcmt);
    rcmt = mt_calc (MT_AT_WATER, MT_T_OF_PS, p2, s1, NULL, &t2s, &phase, form, &error);
    assert (rcmt);
    rcmt = mt_calc (MT_AT_WATER, MT_H_OF_PS, p2, s1, NULL, &h2s, &phase, form, &error);
    assert (rcmt);

    dhs = h2s - h1;
    dh = dhs / etai;
    h2 = h1 + dh;
    rcmt = mt_calc (MT_AT_WATER, MT_T_OF_PH, p2, h2, NULL, &t2 , &phase, form, &error);
    assert (rcmt);
    m2 = m1;
    q2 = m2 * h2;
    q3 = (m2 * h2 - m1 * h1) / etam;

    // Initialisierung der Ausgabewerte
    for (ii = 0; ii < 6; ii++)
    {
    data->out[ii].p = 0.0;
    data->out[ii].h = 0.0;
    data->out[ii].m = 0.0;
    }

    // Setzen der Werte für den Wasseraustritt
    data->out[1].p = p2;
    data->out[1].h = h2;
    data->out[1].m = m2;

    // Setzen der Werte Ausgabe für die Welle (p und m sind notwendige Dummy-Werte)
    data->out[2].p = 0.01;
    data->out[2].h = q3;
    data->out[2].m = 1.0;

    // Berechnung der Ergebniswerte (nur im letzten Iterationsschritt)
    if (data->calcparams.mode == 3) {
    data->results[0] = etai;

    // im Design-Fall: M1N definieren
    if (data->calcparams.design == 0) {
    data->specs[2] = m1;
    }
    }

    // Festlegen von M1N im Auslegungsfall im letzten Itarationsschritt
    return rc;
    }
    break;

    Wenn der Kreislauf und der Code erzeugt sind, kann kompiliert und gelinkt werden, um die DLL zu erzeugen.

    Weitere Beispiele

    Klicken Sie hier >> Bauteil 65 Demo 1 << um ein Beispiel 1 (einfach) zu laden.

    Klicken Sie hier >> Bauteil 65 Demo 2 << um ein Beispiel 2 (Simulation einer Pumpe wie dargestellt) zu laden.

    Klicken Sie hier >> Bauteil 65 Demo 3 << um ein Beispiel 3 (Verwendung Analyse) zu laden.

     

    Siehe auch