Changeset 13379


Ignore:
Timestamp:
2012-10-14T22:49:11+02:00 (12 years ago)
Author:
wbraun
Message:
  • fixed event handling in new fmi import
Location:
trunk/Compiler
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Compiler/Template/CodegenFMU.tpl

    r13346 r13379  
    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     
     
    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     
     
    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     
     
    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     
     
    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     
     
    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     
     
    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     
     
    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     
     
    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     
     
    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     
     
    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;
     
    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;
     
    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;
  • trunk/Compiler/runtime/FMIWrapper.c

    r13273 r13379  
    158158 * Returns status.
    159159 */
    160 int fmiSetTime_OMC(void* fmi, double time)
    161 {
    162   return fmi1_import_set_time((fmi1_import_t*)fmi, time);
     160double fmiSetTime_OMC(void* fmi, double time, double dummy)
     161{
     162  fmi1_import_set_time((fmi1_import_t*)fmi, time);
     163  return dummy;
    163164}
    164165
     
    197198 * Returns states.
    198199 */
    199 void fmiGetContinuousStates_OMC(void* fmi, int numberOfContinuousStates, double* states)
     200void fmiGetContinuousStates_OMC(void* fmi, int numberOfContinuousStates, double* states, double dummy)
    200201{
    201202  fmi1_status_t fmistatus = fmi1_import_get_continuous_states((fmi1_import_t*)fmi, (fmi1_real_t*)states, numberOfContinuousStates);
     
    214215 * Returns status.
    215216 */
    216 int fmiSetContinuousStates_OMC(void* fmi, int numberOfContinuousStates, double* states)
    217 {
    218   return fmi1_import_set_continuous_states((fmi1_import_t*)fmi, (fmi1_real_t*)states, numberOfContinuousStates);
     217double fmiSetContinuousStates_OMC(void* fmi, int numberOfContinuousStates, double* states, double dummy)
     218{
     219  fmi1_import_set_continuous_states((fmi1_import_t*)fmi, (fmi1_real_t*)states, numberOfContinuousStates);
     220  return dummy;
    219221}
    220222
     
    223225 * Returns events.
    224226 */
    225 void fmiGetEventIndicators_OMC(void* fmi, int numberOfEventIndicators, double* events)
     227void fmiGetEventIndicators_OMC(void* fmi, int numberOfEventIndicators, double* events, double dummy)
    226228{
    227229  fmi1_status_t fmistatus = fmi1_import_get_event_indicators((fmi1_import_t*)fmi, (fmi1_real_t*)events, numberOfEventIndicators);
     
    240242 * Returns states.
    241243 */
    242 void fmiGetDerivatives_OMC(void* fmi, int numberOfContinuousStates, double* states)
     244void fmiGetDerivatives_OMC(void* fmi, int numberOfContinuousStates, double* states, double dummy)
    243245{
    244246  fmi1_status_t fmistatus = fmi1_import_get_derivatives((fmi1_import_t*)fmi, (fmi1_real_t*)states, numberOfContinuousStates);
     
    257259 * Returns realValues.
    258260 */
    259 void fmiGetReal_OMC(void* fmi, int numberOfValueReferences, int* realValuesReferences, double* realValues)
     261void fmiGetReal_OMC(void* fmi, int numberOfValueReferences, int* realValuesReferences, double* realValues, double dummy)
    260262{
    261263  fmi1_status_t fmistatus = fmi1_import_get_real((fmi1_import_t*)fmi, (fmi1_value_reference_t*)realValuesReferences, numberOfValueReferences, (fmi1_real_t*)realValues);
     
    283285 * Returns integerValues.
    284286 */
    285 void fmiGetInteger_OMC(void* fmi, int numberOfValueReferences, int* integerValuesReferences, int* integerValues)
     287void fmiGetInteger_OMC(void* fmi, int numberOfValueReferences, int* integerValuesReferences, int* integerValues, double dummy)
    286288{
    287289  fmi1_status_t fmistatus = fmi1_import_get_integer((fmi1_import_t*)fmi, (fmi1_value_reference_t*)integerValuesReferences, numberOfValueReferences, (fmi1_integer_t*)integerValues);
     
    300302 * Returns status.
    301303 */
    302 int fmiSetInteger_OMC(void* fmi, int numberOfValueReferences, int* integerValuesReferences, int* integerValues)
     304int fmiSetInteger_OMC(void* fmi, int numberOfValueReferences, int* integerValuesReferences, int* integerValues, double dummy)
    303305{
    304306  return fmi1_import_set_integer((fmi1_import_t*)fmi, (fmi1_value_reference_t*)integerValuesReferences, numberOfValueReferences, (fmi1_integer_t*)integerValues);
     
    326328 * Returns status.
    327329 */
    328 int fmiSetBoolean_OMC(void* fmi, int numberOfValueReferences, int* booleanValuesReferences, int* booleanValues)
     330int fmiSetBoolean_OMC(void* fmi, int numberOfValueReferences, int* booleanValuesReferences, int* booleanValues, double dummy)
    329331{
    330332  return fmi1_import_set_boolean((fmi1_import_t*)fmi, (fmi1_value_reference_t*)booleanValuesReferences, numberOfValueReferences, (fmi1_boolean_t*)booleanValues);
     
    352354 * Returns status.
    353355 */
    354 int fmiSetString_OMC(void* fmi, int numberOfValueReferences, int* stringValuesReferences, char** stringValues)
     356int fmiSetString_OMC(void* fmi, int numberOfValueReferences, int* stringValuesReferences, char** stringValues, double dummy)
    355357{
    356358  return fmi1_import_set_string((fmi1_import_t*)fmi, (fmi1_value_reference_t*)stringValuesReferences, numberOfValueReferences, (fmi1_string_t*)stringValues);
     
    371373 * Wrapper for the FMI function fmiCompletedIntegratorStep.
    372374 */
    373 int fmiCompletedIntegratorStep_OMC(void* fmi, int in_callEventUpdate)
     375double fmiCompletedIntegratorStep_OMC(void* fmi, int in_callEventUpdate, double dummy)
    374376{
    375377  fmi1_status_t fmistatus = fmi1_import_completed_integrator_step((fmi1_import_t*)fmi, (fmi1_boolean_t*)&in_callEventUpdate);
    376378  //fprintf(stderr, "fmiCompletedIntegratorStep_OMC in_callEventUpdate = %d\n", in_callEventUpdate);fflush(NULL);
    377   return in_callEventUpdate;
     379  return dummy;
    378380}
    379381
Note: See TracChangeset for help on using the changeset viewer.