Skip to content

Commit 182ec2d

Browse files
author
Willi Braun
committed
- fixed event handling in new fmi import
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13379 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 6864c6c commit 182ec2d

File tree

2 files changed

+72
-48
lines changed

2 files changed

+72
-48
lines changed

Compiler/Template/CodegenFMU.tpl

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,8 +1205,9 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
12051205
function fmiSetTime
12061206
input fmiImportInstance fmi;
12071207
input Real in_time;
1208-
output Integer status;
1209-
external "C" status = fmiSetTime_OMC(fmi, in_time) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1208+
input Real inFlow;
1209+
output Real status;
1210+
external "C" status = fmiSetTime_OMC(fmi, in_time, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12101211
end fmiSetTime;
12111212

12121213
function fmiInitialize
@@ -1218,36 +1219,41 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
12181219
function fmiGetContinuousStates
12191220
input fmiImportInstance fmi;
12201221
input Integer numberOfContinuousStates;
1222+
input Real inFlow;
12211223
output Real fmi_x[numberOfContinuousStates];
1222-
external "C" fmiGetContinuousStates_OMC(fmi, numberOfContinuousStates, fmi_x) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1224+
external "C" fmiGetContinuousStates_OMC(fmi, numberOfContinuousStates, fmi_x, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12231225
end fmiGetContinuousStates;
12241226

12251227
function fmiSetContinuousStates
12261228
input fmiImportInstance fmi;
12271229
input Real fmi_x[:];
1228-
output Integer status;
1229-
external "C" status = fmiSetContinuousStates_OMC(fmi, size(fmi_x, 1), fmi_x) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1230+
input Real inFlow;
1231+
output Real status;
1232+
external "C" status = fmiSetContinuousStates_OMC(fmi, size(fmi_x, 1), fmi_x, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12301233
end fmiSetContinuousStates;
12311234

12321235
function fmiGetEventIndicators
12331236
input fmiImportInstance fmi;
12341237
input Integer numberOfEventIndicators;
1238+
input Real inFlow;
12351239
output Real fmi_z[numberOfEventIndicators];
1236-
external "C" fmiGetEventIndicators_OMC(fmi, numberOfEventIndicators, fmi_z) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1240+
external "C" fmiGetEventIndicators_OMC(fmi, numberOfEventIndicators, fmi_z, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12371241
end fmiGetEventIndicators;
12381242

12391243
function fmiGetDerivatives
12401244
input fmiImportInstance fmi;
12411245
input Integer numberOfContinuousStates;
1246+
input Real inFlow;
12421247
output Real fmi_x[numberOfContinuousStates];
1243-
external "C" fmiGetDerivatives_OMC(fmi, numberOfContinuousStates, fmi_x) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1248+
external "C" fmiGetDerivatives_OMC(fmi, numberOfContinuousStates, fmi_x, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12441249
end fmiGetDerivatives;
12451250

12461251
function fmiGetReal
12471252
input fmiImportInstance fmi;
12481253
input Integer realValuesReferences[:];
1254+
input Real inFlow;
12491255
output Real realValues[size(realValuesReferences, 1)];
1250-
external "C" fmiGetReal_OMC(fmi, size(realValuesReferences, 1), realValuesReferences, realValues) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1256+
external "C" fmiGetReal_OMC(fmi, size(realValuesReferences, 1), realValuesReferences, realValues, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12511257
end fmiGetReal;
12521258

12531259
function fmiSetReal
@@ -1261,8 +1267,9 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
12611267
function fmiGetInteger
12621268
input fmiImportInstance fmi;
12631269
input Integer integerValuesReferences[:];
1270+
input Real inFlow;
12641271
output Integer integerValues[size(integerValuesReferences, 1)];
1265-
external "C" fmiGetInteger_OMC(fmi, size(integerValuesReferences, 1), integerValuesReferences, integerValues) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1272+
external "C" fmiGetInteger_OMC(fmi, size(integerValuesReferences, 1), integerValuesReferences, integerValues, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12661273
end fmiGetInteger;
12671274

12681275
function fmiSetInteger
@@ -1276,8 +1283,9 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
12761283
function fmiGetBoolean
12771284
input fmiImportInstance fmi;
12781285
input Integer booleanValuesReferences[:];
1286+
input Real inFlow;
12791287
output Boolean booleanValues[size(booleanValuesReferences, 1)];
1280-
external "C" fmiGetBoolean_OMC(fmi, size(booleanValuesReferences, 1), booleanValuesReferences, booleanValues) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1288+
external "C" fmiGetBoolean_OMC(fmi, size(booleanValuesReferences, 1), booleanValuesReferences, booleanValues, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12811289
end fmiGetBoolean;
12821290

12831291
function fmiSetBoolean
@@ -1291,8 +1299,9 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
12911299
function fmiGetString
12921300
input fmiImportInstance fmi;
12931301
input Integer stringValuesReferences[:];
1302+
input Real inFlow;
12941303
output String stringValues[size(stringValuesReferences, 1)];
1295-
external "C" fmiGetString_OMC(fmi, size(stringValuesReferences, 1), stringValuesReferences, stringValues) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1304+
external "C" fmiGetString_OMC(fmi, size(stringValuesReferences, 1), stringValuesReferences, stringValues, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
12961305
end fmiGetString;
12971306

12981307
function fmiSetString
@@ -1314,8 +1323,9 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
13141323
function fmiCompletedIntegratorStep
13151324
input fmiImportInstance fmi;
13161325
input Boolean in_callEventUpdate;
1317-
output Boolean out_callEventUpdate;
1318-
external "C" out_callEventUpdate = fmiCompletedIntegratorStep_OMC(fmi, in_callEventUpdate) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
1326+
input Real inFlow;
1327+
output Real out_Flow;
1328+
external "C" out_Flow = fmiCompletedIntegratorStep_OMC(fmi, in_callEventUpdate, inFlow) annotation(Library = {"omcruntime", "fmilib"<%if stringEq(platform, "win32") then ", \"shlwapi\""%>});
13191329
end fmiCompletedIntegratorStep;
13201330

13211331
function fmiTerminate
@@ -1339,27 +1349,39 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
13391349
constant Integer jmSuccess=1;
13401350
constant Integer jmWarning=2;
13411351
end jmStatus;
1352+
Real flowControlTime;
1353+
Real flowControlEvent;
1354+
Real flowControlStatesInputs;
1355+
Boolean initializationDone(start=false);
13421356
initial algorithm
1343-
fmiFunctions.fmiInstantiateModel(fmi, "<%fmiInfo.fmiModelIdentifier%>");
1344-
fmi_status := fmiFunctions.fmiSetDebugLogging(fmi, debugLogging);
1345-
fmi_status := fmiFunctions.fmiSetTime(fmi, time);
1346-
<%/*if not stringEq(realStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetReal(fmi, {"+dumpStartRealVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartRealVariablesName(fmiModelVariablesList)+"});"%>
1347-
<%if not stringEq(integerStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetInteger(fmi, {"+dumpStartIntegerVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartIntegerVariablesName(fmiModelVariablesList)+"});"%>
1348-
<%if not stringEq(booleanStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetBoolean(fmi, {"+dumpStartBooleanVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartBooleanVariablesName(fmiModelVariablesList)+"});"%>
1349-
<%if not stringEq(stringStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetString(fmi, {"+dumpStartStringVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartStringVariablesName(fmiModelVariablesList)+"});"*/%>
1350-
eventInfo := fmiFunctions.fmiInitialize(fmi);
1351-
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then "fmi_x := fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates);"%>
1352-
equation
1353-
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then "der(fmi_x) = fmiFunctions.fmiGetDerivatives(fmi, numberOfContinuousStates);"%>
1354-
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then "fmiFunctions.fmiSetTime(fmi, time);" else "fmi_status = fmiFunctions.fmiSetTime(fmi, time);"%>
1357+
// ensure that all initialization
1358+
// functions are called only once!
1359+
if not initializationDone then
1360+
fmiFunctions.fmiInstantiateModel(fmi, "<%fmiInfo.fmiModelIdentifier%>");
1361+
fmiFunctions.fmiSetDebugLogging(fmi, debugLogging);
1362+
flowControlTime := fmiFunctions.fmiSetTime(fmi, time, 1);
1363+
<%/*if not stringEq(realStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetReal(fmi, {"+dumpStartRealVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartRealVariablesName(fmiModelVariablesList)+"});"%>
1364+
<%if not stringEq(integerStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetInteger(fmi, {"+dumpStartIntegerVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartIntegerVariablesName(fmiModelVariablesList)+"});"%>
1365+
<%if not stringEq(booleanStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetBoolean(fmi, {"+dumpStartBooleanVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartBooleanVariablesName(fmiModelVariablesList)+"});"%>
1366+
<%if not stringEq(stringStartVariables, "0") then "fmi_status := fmiFunctions.fmiSetString(fmi, {"+dumpStartStringVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartStringVariablesName(fmiModelVariablesList)+"});"*/%>
1367+
eventInfo := fmiFunctions.fmiInitialize(fmi);
1368+
initializationDone := true;
1369+
end if;
1370+
// fmiSet* is only needed to set startValues
13551371
<%/*if not stringEq(realStartVariables, "0") then "fmi_status = fmiFunctions.fmiSetReal(fmi, {"+dumpStartRealVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartRealVariablesName(fmiModelVariablesList)+"});"%>
13561372
<%if not stringEq(integerStartVariables, "0") then "fmi_status = fmiFunctions.fmiSetInteger(fmi, {"+dumpStartIntegerVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartIntegerVariablesName(fmiModelVariablesList)+"});"%>
13571373
<%if not stringEq(booleanStartVariables, "0") then "fmi_status = fmiFunctions.fmiSetBoolean(fmi, {"+dumpStartBooleanVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartBooleanVariablesName(fmiModelVariablesList)+"});"%>
13581374
<%if not stringEq(stringStartVariables, "0") then "fmi_status = fmiFunctions.fmiSetString(fmi, {"+dumpStartStringVariablesValueReference(fmiModelVariablesList)+"}, {"+dumpStartStringVariablesName(fmiModelVariablesList)+"});"*/%>
1359-
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then "fmi_status = fmiFunctions.fmiSetContinuousStates(fmi, fmi_x);"%>
1375+
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then "fmi_x := fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, 1);"%>
1376+
algorithm
1377+
initializationDone := true;
1378+
equation
1379+
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then "der(fmi_x) = fmiFunctions.fmiGetDerivatives(fmi, numberOfContinuousStates, flowControlStatesInputs);"%>
1380+
flowControlTime = fmiFunctions.fmiSetTime(fmi, time, 1);
1381+
<%if intGt(listLength(fmiInfo.fmiNumberOfContinuousStates), 0) then "flowControlStatesInputs = fmiFunctions.fmiSetContinuousStates(fmi, fmi_x, flowControlTime);"%>
13601382
<%if intGt(listLength(fmiInfo.fmiNumberOfEventIndicators), 0) then
13611383
<<
1362-
fmi_z = fmiFunctions.fmiGetEventIndicators(fmi, numberOfEventIndicators);
1384+
fmi_z = fmiFunctions.fmiGetEventIndicators(fmi, numberOfEventIndicators, flowControlEvent);
13631385
for i in 1:size(fmi_z,1) loop
13641386
fmi_z_positive[i] = fmi_z[i] > 0;
13651387
end for;
@@ -1371,20 +1393,20 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
13711393
when (<%fmiInfo.fmiNumberOfEventIndicators |> eventIndicator => "change(fmi_z_positive["+eventIndicator+"])" ;separator=" or "%>) and not initial() then
13721394
//eventInfo := fmiFunctions.fmiEventUpdate(fmi, callEventUpdate, eventInfo);
13731395
fmiFunctions.fmiEventUpdate(fmi, callEventUpdate, eventInfo);
1374-
fmi_x_new := fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates);
1396+
fmi_x_new := fmiFunctions.fmiGetContinuousStates(fmi, numberOfContinuousStates, flowControlEvent);
13751397
<%fmiInfo.fmiNumberOfContinuousStates |> continuousStates => "reinit(fmi_x["+continuousStates+"], fmi_x_new["+continuousStates+"]);" ;separator="\n"%>
13761398
end when;
13771399
>>
13781400
%>
13791401
when terminal() then
1380-
fmiFunctions.fmiTerminate(fmi);
1402+
fmi_status := fmiFunctions.fmiTerminate(fmi);
13811403
end when;
13821404
equation
1383-
fmiFunctions.fmiCompletedIntegratorStep(fmi, callEventUpdate);
1384-
<%if not stringEq(realVariables, "0") then "{"+dumpRealVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetReal(fmi, {"+dumpRealVariablesVR(fmiModelVariablesList)+"});"%>
1385-
<%if not stringEq(integerVariables, "0") then "{"+dumpIntegerVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetInteger(fmi, {"+dumpIntegerVariablesVR(fmiModelVariablesList)+"});"%>
1386-
<%if not stringEq(booleanVariables, "0") then "{"+dumpBooleanVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetBoolean(fmi, {"+dumpBooleanVariablesVR(fmiModelVariablesList)+"});"%>
1387-
<%if not stringEq(stringVariables, "0") then "{"+dumpStringVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetString(fmi, {"+dumpBooleanVariablesVR(fmiModelVariablesList)+"});"%>
1405+
flowControlEvent = fmiFunctions.fmiCompletedIntegratorStep(fmi, callEventUpdate, flowControlStatesInputs);
1406+
<%if not stringEq(realVariables, "0") then "{"+dumpRealVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetReal(fmi, {"+dumpRealVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
1407+
<%if not stringEq(integerVariables, "0") then "{"+dumpIntegerVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetInteger(fmi, {"+dumpIntegerVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
1408+
<%if not stringEq(booleanVariables, "0") then "{"+dumpBooleanVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetBoolean(fmi, {"+dumpBooleanVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
1409+
<%if not stringEq(stringVariables, "0") then "{"+dumpStringVariablesName(fmiModelVariablesList)+"} = fmiFunctions.fmiGetString(fmi, {"+dumpStringVariablesVR(fmiModelVariablesList)+"}, flowControlStatesInputs);"%>
13881410
annotation(experiment(StartTime=<%fmiExperimentAnnotation.fmiExperimentStartTime%>, StopTime=<%fmiExperimentAnnotation.fmiExperimentStopTime%>, Tolerance=<%fmiExperimentAnnotation.fmiExperimentTolerance%>));
13891411
end <%fmiInfo.fmiModelIdentifier%>_<%getFMIType(fmiInfo)%>_FMU;
13901412
>>

0 commit comments

Comments
 (0)