Skip to content

Commit

Permalink
- Updated OM for FMIL 2.0.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@22252 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
perost committed Sep 10, 2014
1 parent 7c65241 commit f53eacf
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 9 deletions.
52 changes: 49 additions & 3 deletions Compiler/runtime/FMIImpl.c
Expand Up @@ -523,8 +523,8 @@ void FMIImpl__initializeFMI1Import(fmi1_import_t* fmi, void** fmiInfo, fmi_versi
}
}

void FMIImpl__initializeFMI2Import(fmi2_import_t* fmi, void** fmiInfo, fmi_version_enu_t version, void** experimentAnnotation, void** modelVariablesInstance,
void** modelVariablesList, int input_connectors, int output_connectors)
void FMIImpl__initializeFMI2Import(fmi2_import_t* fmi, void** fmiInfo, fmi_version_enu_t version, void** typeDefinitionsList, void** experimentAnnotation,
void** modelVariablesInstance, void** modelVariablesList, int input_connectors, int output_connectors)
{
/* Read the model name from FMU's modelDescription.xml file. */
const char* modelName = fmi2_import_get_model_name(fmi);
Expand Down Expand Up @@ -580,6 +580,52 @@ void FMIImpl__initializeFMI2Import(fmi2_import_t* fmi, void** fmiInfo, fmi_versi
/* construct FMIINFO record */
*fmiInfo = FMI__INFO(mk_scon_check_null(fmi_version_to_string(version)), mk_icon(fmiType), mk_scon_check_null(modelName), mk_scon_check_null(modelIdentifier), mk_scon_check_null(guid), mk_scon_check_null(description),
mk_scon_check_null(generationTool), mk_scon_check_null(generationDateAndTime), mk_scon_check_null(namingConvention), continuousStatesList, eventIndicatorsList);

fmi2_import_type_definitions_t* typeDefinitions = fmi2_import_get_type_definitions(fmi);
size_t typeDefinitionsSize = typeDefinitions ? fmi2_import_get_type_definition_number(typeDefinitions) : 0;
*typeDefinitionsList = mk_nil();
void* enumItems = mk_nil();

for(i = 0; i < typeDefinitionsSize; ++i) {
fmi2_import_variable_typedef_t* variableTypeDef = fmi2_import_get_typedef(typeDefinitions, i);
const char* name = fmi2_import_get_type_name(variableTypeDef);
char* name_safe = makeStringFMISafe(name);
void* typeName = mk_scon_check_null(name_safe);
free(name_safe);
const char* description = fmi2_import_get_type_description(variableTypeDef);

/* check if type is enum */
if(fmi2_import_get_base_type(variableTypeDef) != fmi1_base_type_enum) {
continue;
}

/* get the TypeDefinition as EnumerationType */
fmi2_import_enumeration_typedef_t* enumTypeDef = fmi2_import_get_type_as_enum(variableTypeDef);
const char* quantity = "";
int min = 0;
int max = 0;
unsigned itemsSize = 0;
enumItems = mk_nil();
void* enumItem = NULL;

if(enumTypeDef) {
quantity = fmi2_import_get_type_quantity(variableTypeDef);
min = fmi2_import_get_enum_type_min(enumTypeDef);
max = fmi2_import_get_enum_type_max(enumTypeDef);
itemsSize = fmi2_import_get_enum_type_size(enumTypeDef);

for(unsigned j = itemsSize; j > 0; --j) {
const char* itemName = fmi2_import_get_enum_type_item_name(enumTypeDef, j);
const char* itemDescription = fmi2_import_get_enum_type_item_description(enumTypeDef, j);
enumItem = FMI__ENUMERATIONITEM(mk_scon_check_null(itemName), mk_scon_check_null(itemDescription));
enumItems = mk_cons(enumItem, enumItems);
}
}

void* typeDefinition = FMI__ENUMERATIONTYPE(typeName, mk_scon_check_null(description), mk_scon_check_null(quantity), mk_icon(min), mk_icon(max), enumItems);
*typeDefinitionsList = mk_cons(typeDefinition, *typeDefinitionsList);
}

/* Read the FMI Default Experiment Start value from FMU's modelDescription.xml file. */
double experimentStartTime = fmi2_import_get_default_experiment_start(fmi);
/* Read the FMI Default Experiment Stop value from FMU's modelDescription.xml file. */
Expand Down Expand Up @@ -777,7 +823,7 @@ int FMIImpl__initializeFMIImport(const char* file_name, const char* working_dire
return 0;
}
#endif
FMIImpl__initializeFMI2Import(fmi, fmiInfo, version, experimentAnnotation, modelVariablesInstance, modelVariablesList, input_connectors, output_connectors);
FMIImpl__initializeFMI2Import(fmi, fmiInfo, version, typeDefinitionsList, experimentAnnotation, modelVariablesInstance, modelVariablesList, input_connectors, output_connectors);
}
/* everything is OK return success */
return 1;
Expand Down
23 changes: 17 additions & 6 deletions SimulationRuntime/c/fmi/FMI2ModelExchange.c
Expand Up @@ -70,20 +70,21 @@ void* FMI2ModelExchangeConstructor_OMC(int fmi_log_level, char* working_director
FMI2ME->FMIInstanceName = (char*) malloc(strlen(instanceName)+1);
strcpy(FMI2ME->FMIInstanceName, instanceName);
FMI2ME->FMIDebugLogging = debugLogging;
fmi2_import_instantiate_model(FMI2ME->FMIImportInstance, FMI2ME->FMIInstanceName, NULL, fmi2_false);
fmi2_import_instantiate(FMI2ME->FMIImportInstance, FMI2ME->FMIInstanceName, fmi2_model_exchange, NULL, fmi2_false);
fmi2_import_set_debug_logging(FMI2ME->FMIImportInstance, FMI2ME->FMIDebugLogging, 0, NULL);
FMI2ME->FMIToleranceControlled = fmi2_true;
FMI2ME->FMIRelativeTolerance = 0.001;
FMI2ME->FMIEventInfo = malloc(sizeof(fmi2_event_info_t));
fmi2_import_initialize_model(FMI2ME->FMIImportInstance, FMI2ME->FMIToleranceControlled, FMI2ME->FMIRelativeTolerance, FMI2ME->FMIEventInfo);
fmi2_import_enter_initialization_mode(FMI2ME->FMIImportInstance);
fmi2_import_exit_initialization_mode(FMI2ME->FMIImportInstance);
return FMI2ME;
}

void FMI2ModelExchangeDestructor_OMC(void* in_fmi2me)
{
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
fmi2_import_terminate(FMI2ME->FMIImportInstance);
fmi2_import_free_model_instance(FMI2ME->FMIImportInstance);
fmi2_import_free_instance(FMI2ME->FMIImportInstance);
fmi2_import_destroy_dllfmu(FMI2ME->FMIImportInstance);
fmi2_import_free(FMI2ME->FMIImportInstance);
fmi_import_free_context(FMI2ME->FMIImportContext);
Expand Down Expand Up @@ -156,8 +157,17 @@ void fmi2GetDerivatives_OMC(void* in_fmi2me, int numberOfContinuousStates, doubl
int fmi2EventUpdate_OMC(void* in_fmi2me, int intermediateResults, double flowStates)
{
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
fmi2_import_eventUpdate(FMI2ME->FMIImportInstance, intermediateResults, FMI2ME->FMIEventInfo);
return FMI2ME->FMIEventInfo->stateValuesChanged;
fmi2_event_info_t *eventInfo = FMI2ME->FMIEventInfo;
fmi2_import_enter_event_mode(FMI2ME->FMIImportInstance);
eventInfo->newDiscreteStatesNeeded = fmi2_true;
eventInfo->terminateSimulation = fmi2_false;

while(eventInfo->newDiscreteStatesNeeded && !eventInfo->terminateSimulation) {
fmi2_import_new_discrete_states(FMI2ME->FMIImportInstance, eventInfo);
}

fmi2_import_enter_continuous_time_mode(FMI2ME->FMIImportInstance);
return eventInfo->valuesOfContinuousStatesChanged;
}

/*
Expand All @@ -178,7 +188,8 @@ int fmi2CompletedIntegratorStep_OMC(void* in_fmi2me, double flowStates)
{
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
fmi2_boolean_t callEventUpdate = fmi2_false;
fmi2_import_completed_integrator_step(FMI2ME->FMIImportInstance, &callEventUpdate);
fmi2_boolean_t terminateSimulation = fmi2_false;
fmi2_import_completed_integrator_step(FMI2ME->FMIImportInstance, fmi2_true, &callEventUpdate, &terminateSimulation);
return callEventUpdate;
}

Expand Down

0 comments on commit f53eacf

Please sign in to comment.