Uživatelské nástroje

Nástroje pro tento web


projekty:modelica_control_layer_library

Modelica Control Layer

Cílem je vytvořit bloky pro Modelicu, které budou sloužit pro propojování a definování celkového chování výsledné aplikace. Koncový uživatel tak bude mít možnost aplikaci složit s jednotlivých skompilovaných modelů a oken grafického rozhraní, které boudou reprezentovány blokmi v jazyce Modelica s externím voláním.

Grafika i model se budou propojovat na základě seznamů promněnných, které budou vždy dodány s každým modelem nebo grafickým oknem.

Modelica model interface (SimClientDSModel)

Standardné vstupy skompilovaného modelu je možné napojit přes udělátko PrepareInitialValues. Standardné výstupy z doběhnutého modelu je možné číst pomocí udělátka MatFile. Libovolný modelicový Modelicový model bez předchozí úpravy je tak možné spouštet v dávkach.

Každý model poskytuje propojení v podobě jednoznačných modelových názvů promněnných.

Externí ANSI C rozhraní (pro volání z jazyku Modelica) může vypadat následovně:
extern „C“
{
int getModelID(const char* modelName, const char* *inputVariableNames, const char* *outputVariablesNames, int inputVariablesCount, int outputVariablesCount, double time);
void run(int modelID, const double* inputValues, double* outputCurvesData, int inputVariablesCount, int outputVariablesCount, int timeStepsCount, double time);
}

  • funkce getModelID může vytvořit globální struktury v čistě C-čkovské knihovne, která si interně propojí indexy promněnných modelu podle pole daných názvů.
  • funkce run připraví vstupní hodnoty, spustí model a načte požadované výstupní křivky, které vrátí v již před voláním naalokovanom poli outputCurvesDatao velkosti outputVariablesCount*timeStepsCount. Výstupní data z modelu je tak nutno interpolovat na požadovaný počet bodů!


Propojení na straně Modelica (volání daného interface v ANSI C):
model SimulationModel

function getModelID
input String modelName;
input String inputVariableNames[:];
input String outputVariablesNames[:];
input Real t;
output Integer modelID;
external „C“ modelID=getModelID(modelName,inputVariableNames,outputVariablesNames, size(inputVariableNames,1), size(outputVariablesNames,1),t)
annotation (Include=“#include \“Pokus.h\““, Library=„Pokus“);
end getModelID;

function run
input Integer modelID;
input Real inputValues[:];
input Integer timeStepsCount;
input Integer outputVariablesCount;
input Real t;
output Real outputCurvesData[timeStepsCount,outputVariablesCount];
external „C“ run(modelID,inputValues,outputCurvesData, size(inputValues,1), outputVariablesCount, timeStepsCount, t)
annotation (Include=“#include \“Pokus.h\““, Library=„Pokus“);
end run;

annotation (uses(Modelica(version=„3.1“)));

parameter Integer id(fixed=false);
parameter String inames[:]={„aa“,“bb“,“ccc“};
parameter String onames[:]={„aa3“,“bb2“,“ccc1“,“dd0“};
parameter Integer timeStepsCount = 10;
input Boolean trigger;
input Real inputVals[size(inames,1)];
output Real data[timeStepsCount,size(onames,1)];

initial equation
id=getModelID(„ahoj“,inames,onames,time);
equation
when trigger then
datas = run(id,inputVals,timeStepsCount,size(onames,1),time);
end when;
end SimulationModel;

Komunikační interface

Tenká vrstva sloužící jenom na komunikaci dvou a více paralelně běžících procesů. Je nutná pro oddělení běhu různých oken grafiky (samostatné nezávislé procesy) od logiky aplikace.

Externí ANSI C rozhraní (pro volání z jazyku Modelica) může vypadat následovně:
extern „C“
{
int getWindowID(const char* windowName, const char* *displayVariableNames, const char* *controlVariableNames, int displayVariablesCount, int controlVariablesCount, double time);
void showWindow(int windowID, bool visibility);
void set(int windowID, const double* displayCurvesData, int displayVariablesCount, int timeStepCount, double time);
void get(int windowID, int controlVariableID, double value, double time);
}

  • funkce getWindowID (v čistě C-čkovské knihovne) pokaď neexistje tak vytvoří komunikační vrstvu, vytvoří očíslovanou globální strukturu pro komunikaci s konkrétní instanci GUI okna (tu spustí jako nový proces). Tato struktura si interně propojí indexy promněnných modelu podle pole daných názvů.
  • funkce showWindow zobrazí nebo skryje dané okno.
  • funkce set nastaví hodnoty z modelu pro zobrazování. Data jsou uloženy časovo ekvidistantne po jednotlivých časových bodoch v poli displayCurves velkosti displayVariablesCount * timeStepCount.
  • funkce get načte aktuální hodnoty nastavené pomocí grafických komponent.


Je možné použít udělátko SimServer. Jeho výhodou by mohla být možnost oddělení běhu simulace na internetovém servru od grafiky, která může být na internetovém klientu.

Grafický klient nad komunikační vrstvou poskytuje propojení v podobě jednoznačných grafických názvů promněnných.

Blend komunikační interface - datový prvok pre Blend, který propojuje hodnoty promněnných s komunikační vrstvou buď ako vstupy, nebo jako výstupy.

Flash komunikační interface - funkce pro Flash, která propojuje hodnoty promněnných s komunikační vrstvou buď ako vstupy, nebo jako výstupy. Inspiraci pro TCP spojeni vo Flashi je mozn cerpat z projektu \\file-server\kofrlab\interaktivní průvodce Prahou .

projekty/modelica_control_layer_library.txt · Poslední úprava: 2011/05/24 16:09 autor: marek