Skip to content

Commit

Permalink
Added initialize function for FMU C file.
Browse files Browse the repository at this point in the history
fmu_model_interface.h contains structure that will be used to store model status information. 
Added checkInvalidState function in fmu_model_interface.c file to verify if a model is in invalid state or not. Added some code to fmi setter/getter functions also.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@6857 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Azam Zia committed Nov 3, 2010
1 parent 5be270a commit 0041e9d
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 16 deletions.
27 changes: 19 additions & 8 deletions Compiler/susan_codegen/SimCode/SimCodeFMU.tpl
Expand Up @@ -317,7 +317,7 @@ case SIMCODE(__) then

<%ModelDefineData(modelInfo)%>
<%setStartValues(simCode)%>
<%initializeFunction(simCode)%>
<%initializeFunction(initialEquations)%>
<%eventUpdateFunction(simCode)%>

>>
Expand Down Expand Up @@ -400,19 +400,30 @@ case SIMCODE(__) then
>>
end setStartValues;

template initializeFunction(SimCode simCode)
"Generates initialize function for c file."
::=
match simCode
case SIMCODE(__) then
template initializeFunction(list<SimEqSystem> initialEquations)
"Generates initialize function for c file."
::=
let &varDecls = buffer "" /*BUFD*/
let eqPart = (initialEquations |> eq as SES_SIMPLE_ASSIGN(__) =>
equation_(eq, contextOther, &varDecls /*BUFC*/)
;separator="\n")
<<
// Used to set the first time event, if any.
void initialize(ModelInstance* comp, fmiEventInfo* eventInfo) {
}
void initialize(ModelInstance* comp, fmiEventInfo* eventInfo) {
{
<%varDecls%>
<%eqPart%>
<%initialEquations |> SES_SIMPLE_ASSIGN(__) =>
'if (sim_verbose) { printf("Setting variable start value: %s(start=%f)\n", "<%cref(cref)%>", <%cref(cref)%>); }'
;separator="\n"%>
}
>>
end initializeFunction;


template eventUpdateFunction(SimCode simCode)
"Generates event update function for c file."
::=
Expand Down
40 changes: 32 additions & 8 deletions c_runtime/fmu_model_interface.c
Expand Up @@ -79,31 +79,35 @@ DllExport fmiStatus fmiCompletedIntegratorStep(fmiComponent c, fmiBoolean* callE
DllExport fmiStatus fmiSetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiReal value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized)
return fmiError;
};
/******************************************************************************/

/******************************************************************************/
DllExport fmiStatus fmiSetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized)
return fmiError;
};
/******************************************************************************/

/******************************************************************************/
DllExport fmiStatus fmiSetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiBoolean value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized)
return fmiError;
};
/******************************************************************************/

/******************************************************************************/
DllExport fmiStatus fmiSetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiString value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized)
return fmiError;
};
/******************************************************************************/

Expand Down Expand Up @@ -140,31 +144,35 @@ DllExport fmiStatus fmiGetEventIndicators(fmiComponent c, fmiReal eventIndicator
DllExport fmiStatus fmiGetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiReal value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized|modelTerminated)
return fmiError;
};
/******************************************************************************/

/******************************************************************************/
DllExport fmiStatus fmiGetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiInteger value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized|modelTerminated)
return fmiError;
};
/******************************************************************************/

/******************************************************************************/
DllExport fmiStatus fmiGetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiBoolean value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized|modelTerminated)
return fmiError;
};
/******************************************************************************/

/******************************************************************************/
DllExport fmiStatus fmiGetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiString value[])
/******************************************************************************/
{
return fmiError;
if(checkInvalidState(model, "fmiGetString", modelInstantiated|modelInitialized|modelTerminated)
return fmiError;
};
/******************************************************************************/

Expand Down Expand Up @@ -208,3 +216,19 @@ DllExport fmiStatus fmiTerminate(fmiComponent c)
return fmiError;
};
/******************************************************************************/


fmiBoolean checkInvalidState((ModelData* model, const char* f, int safeStates)
/******************************************************************************/
{
if(!model)
return fmiTrue;
else if(!(model->state & sateStates)
{
model->state = modelError;
return fmiTrue;
}
else
return fmiFalse;
}
/******************************************************************************/
27 changes: 27 additions & 0 deletions c_runtime/fmu_model_interface.h
@@ -0,0 +1,27 @@

#include <stdio.h>
#include <string.h>
#include <assert.h>

#include "fmiModelFunctions.h"


/*saving states, this will be used later in checkstate function to check
current state of a model. */
typedef enum {
modelInstantiated = 1<<0,
modelInitialized = 1<<1,
modelTerminated = 1<<2,
modelError = 1<<3
} State;

/*This structure will contain data necessary for a model intance. I will
add more values here. */
typedef struct {
fmiReal *realVar;
fmiInteger *intVar;
fmiBoolean *boolVar;
fmiString *strVar;
fmiString instanceName;
State state;
} ModelInstance;

0 comments on commit 0041e9d

Please sign in to comment.