Skip to content

Commit f24ef2c

Browse files
authored
Do not call fmi2SetTime in instantiated state (#9542)
* Do not call fmi2SetTime in instantiated state Use fmi2SetupExperiment * Use Modelica time as startTime for fmi2SetupExperiment
1 parent af61c13 commit f24ef2c

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

OMCompiler/Compiler/Template/CodegenFMU.tpl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2114,7 +2114,7 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
21142114
Real triggerDSSEvent;
21152115
Real nextEventTime(fixed = true);
21162116
initial equation
2117-
flowStartTime = fmi2Functions.fmi2SetTime(fmi2me, time, 1);
2117+
flowStartTime = fmi2Functions.fmi2SetupExperiment(fmi2me, false, 0.0, time, false, 0.0, flowParamsStart+flowInitInputs);
21182118
flowEnterInitialization = fmi2Functions.fmi2EnterInitialization(fmi2me, flowParamsStart+flowInitInputs+flowStartTime);
21192119
flowInitialized = fmi2Functions.fmi2ExitInitialization(fmi2me, flowParamsStart+flowInitInputs+flowStartTime+flowEnterInitialization);
21202120
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then
@@ -2221,6 +2221,18 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
22212221
<%dumpFMITypeDefinitionsArrayMappingFunctions(fmiTypeDefinitionsList)%>
22222222

22232223
package fmi2Functions
2224+
function fmi2SetupExperiment
2225+
input FMI2ModelExchange fmi2me;
2226+
input Boolean inToleranceDefined;
2227+
input Real inTolerance;
2228+
input Real inStartTime;
2229+
input Boolean inStopTimeDefined;
2230+
input Real inStopTime;
2231+
input Real inFlow;
2232+
output Real outFlow = inFlow;
2233+
external "C" fmi2SetupExperiment_OMC(fmi2me, inToleranceDefined, inTolerance, inStartTime, inStopTimeDefined, inStopTime) annotation(Library = {"OpenModelicaFMIRuntimeC", "fmilib"});
2234+
end fmi2SetupExperiment;
2235+
22242236
function fmi2SetTime
22252237
input FMI2ModelExchange fmi2me;
22262238
input Real inTime;

OMCompiler/SimulationRuntime/c/fmi/FMI2ModelExchange.c

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ void* FMI2ModelExchangeConstructor_OMC(int fmi_log_level, char* working_director
9797
}
9898
debugLoggingStatus = fmi2_import_set_debug_logging(FMI2ME->FMIImportInstance, FMI2ME->FMIDebugLogging, categoriesSize, categories);
9999
if (debugLoggingStatus != fmi2_status_ok && debugLoggingStatus != fmi2_status_warning) {
100-
ModelicaFormatMessage("fmi2SetDebugLogging failed with status : %s\n", fmi1_status_to_string(debugLoggingStatus));
100+
ModelicaFormatMessage("fmi2SetDebugLogging failed with status : %s\n", fmi2_status_to_string(debugLoggingStatus));
101101
}
102102
}
103103
FMI2ME->FMIToleranceControlled = fmi2_true;
@@ -120,6 +120,20 @@ void FMI2ModelExchangeDestructor_OMC(void* in_fmi2me)
120120
free(FMI2ME->FMIEventInfo);
121121
}
122122

123+
/*
124+
* Wrapper for the FMI function fmi2SetupExperiment.
125+
*/
126+
void fmi2SetupExperiment_OMC(void* in_fmi2me, int toleranceDefined, double tolerance, double startTime, int stopTimeDefined, double stopTime)
127+
{
128+
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
129+
if (FMI2ME->FMISolvingMode == fmi2_instantiated_mode) {
130+
fmi2_status_t status = fmi2_import_setup_experiment(FMI2ME->FMIImportInstance, toleranceDefined, tolerance, startTime, stopTimeDefined, stopTime);
131+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
132+
ModelicaFormatError("fmi2SetupExperiment failed with status : %s\n", fmi2_status_to_string(status));
133+
}
134+
}
135+
}
136+
123137
/*
124138
* Wrapper for the FMI function fmi2EnterInitializationMode.
125139
*/
@@ -128,7 +142,7 @@ void fmi2EnterInitializationModel_OMC(void* in_fmi2me)
128142
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
129143
fmi2_status_t status = fmi2_import_enter_initialization_mode(FMI2ME->FMIImportInstance);
130144
FMI2ME->FMISolvingMode = fmi2_initialization_mode;
131-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
145+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
132146
ModelicaFormatError("fmi2EnterInitializationMode failed with status : %s\n", fmi2_status_to_string(status));
133147
}
134148
}
@@ -141,7 +155,7 @@ void fmi2ExitInitializationModel_OMC(void* in_fmi2me)
141155
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
142156
fmi2_status_t status = fmi2_import_exit_initialization_mode(FMI2ME->FMIImportInstance);
143157
FMI2ME->FMISolvingMode = fmi2_event_mode;
144-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
158+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
145159
ModelicaFormatError("fmi2ExitInitializationMode failed with status : %s\n", fmi2_status_to_string(status));
146160
}
147161
}
@@ -155,7 +169,7 @@ void fmi2SetTime_OMC(void* in_fmi2me, double time)
155169
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
156170
if (FMI2ME->FMISolvingMode == fmi2_instantiated_mode || FMI2ME->FMISolvingMode == fmi2_event_mode || FMI2ME->FMISolvingMode == fmi2_continuousTime_mode) {
157171
fmi2_status_t status = fmi2_import_set_time(FMI2ME->FMIImportInstance, time);
158-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
172+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
159173
ModelicaFormatError("fmi2SetTime failed with status : %s\n", fmi2_status_to_string(status));
160174
}
161175
}
@@ -170,7 +184,7 @@ void fmi2GetContinuousStates_OMC(void* in_fmi2me, int numberOfContinuousStates,
170184
{
171185
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
172186
fmi2_status_t status = fmi2_import_get_continuous_states(FMI2ME->FMIImportInstance, (fmi2_real_t*)states, numberOfContinuousStates);
173-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
187+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
174188
ModelicaFormatError("fmi2GetContinuousStates failed with status : %s\n", fmi2_status_to_string(status));
175189
}
176190
}
@@ -185,7 +199,7 @@ double fmi2SetContinuousStates_OMC(void* in_fmi2me, int numberOfContinuousStates
185199
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
186200
if (numberOfContinuousStates > 0) {
187201
fmi2_status_t status = fmi2_import_set_continuous_states(FMI2ME->FMIImportInstance, (fmi2_real_t*)states, numberOfContinuousStates);
188-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
202+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
189203
ModelicaFormatError("fmi2SetContinuousStates failed with status : %s\n", fmi2_status_to_string(status));
190204
}
191205
}
@@ -201,7 +215,7 @@ void fmi2GetEventIndicators_OMC(void* in_fmi2me, int numberOfEventIndicators, do
201215
{
202216
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
203217
fmi2_status_t status = fmi2_import_get_event_indicators(FMI2ME->FMIImportInstance, (fmi2_real_t*)events, numberOfEventIndicators);
204-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
218+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
205219
ModelicaFormatError("fmi2GetEventIndicators failed with status : %s\n", fmi2_status_to_string(status));
206220
}
207221
}
@@ -216,7 +230,7 @@ void fmi2GetDerivatives_OMC(void* in_fmi2me, int numberOfContinuousStates, doubl
216230
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
217231
if (FMI2ME->FMISolvingMode == fmi2_continuousTime_mode){
218232
fmi2_status_t status = fmi2_import_get_derivatives(FMI2ME->FMIImportInstance, (fmi2_real_t*)states, numberOfContinuousStates);
219-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
233+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
220234
ModelicaFormatError("fmi2GetDerivatives failed with status : %s\n", fmi2_status_to_string(status));
221235
}
222236
}
@@ -231,20 +245,20 @@ int fmi2EventUpdate_OMC(void* in_fmi2me)
231245
FMI2ModelExchange* FMI2ME = (FMI2ModelExchange*)in_fmi2me;
232246
fmi2_event_info_t *eventInfo = FMI2ME->FMIEventInfo;
233247
fmi2_status_t status = fmi2_import_enter_event_mode(FMI2ME->FMIImportInstance);
234-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
248+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
235249
ModelicaFormatError("fmi2EnterEventMode failed with status : %s\n", fmi2_status_to_string(status));
236250
}
237251
FMI2ME->FMISolvingMode = fmi2_event_mode;
238252

239253
eventInfo->newDiscreteStatesNeeded = fmi2_true;
240254
eventInfo->terminateSimulation = fmi2_false;
241255
status = fmi2_import_new_discrete_states(FMI2ME->FMIImportInstance, eventInfo);
242-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
256+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
243257
ModelicaFormatError("fmi2NewDiscreteStates failed with status : %s\n", fmi2_status_to_string(status));
244258
}
245259

246260
status = fmi2_import_enter_continuous_time_mode(FMI2ME->FMIImportInstance);
247-
if (status != fmi1_status_ok && status != fmi1_status_warning) {
261+
if (status != fmi2_status_ok && status != fmi2_status_warning) {
248262
ModelicaFormatError("fmi2EnterContinuousTimeMode failed with status : %s\n", fmi2_status_to_string(status));
249263
}
250264
FMI2ME->FMISolvingMode = fmi2_continuousTime_mode;

0 commit comments

Comments
 (0)