diff --git a/Stair/model.c b/Stair/model.c index 9b55f759..0126621f 100644 --- a/Stair/model.c +++ b/Stair/model.c @@ -1,9 +1,14 @@ -#include // for DBL_EPSILON -#include // for fabs() -#include "config.h" #include "model.h" +static void calculateCounter(ModelInstance* comp) { + + if (comp->nextEventTimeDefined && isClose(comp->time, comp->nextEventTime)) { + M(counter)++; + comp->nextEventTime += 1; + } +} + void setStartValues(ModelInstance *comp) { M(counter) = 1; @@ -38,6 +43,11 @@ Status getInt32(ModelInstance* comp, ValueReference vr, int32_t values[], size_t switch (vr) { case vr_counter: +#if FMI_VERSION == 3 + if (comp->state == EventMode) { + calculateCounter(comp); + } +#endif values[(*index)++] = M(counter); return OK; default: @@ -79,18 +89,13 @@ Status setInt32(ModelInstance* comp, ValueReference vr, const int32_t values[], Status eventUpdate(ModelInstance *comp) { - if (M(counter) >= 10) { + calculateCounter(comp); + + if (M(counter) > 10) { logError(comp, "Variable \"counter\" cannot be incremented for values >= 10."); return Error; } - const double epsilon = (1.0 + fabs(comp->time)) * DBL_EPSILON; - - if (comp->nextEventTimeDefined && comp->time + epsilon >= comp->nextEventTime) { - M(counter)++; - comp->nextEventTime += 1; - } - comp->valuesOfContinuousStatesChanged = false; comp->nominalsOfContinuousStatesChanged = false; comp->terminateSimulation = M(counter) >= 10; diff --git a/tests/test_fmusim.py b/tests/test_fmusim.py index 6872b86e..ba50373e 100644 --- a/tests/test_fmusim.py +++ b/tests/test_fmusim.py @@ -377,8 +377,8 @@ def test_event_mode_time_events(platform): model='Stair.fmu' ) - assert np.all(result['time'] == [0, 1, 1, 2, 2, 2.5, 3, 3, 4, 4, 5, 5]) - assert np.all(result['counter'] == [1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6]) + assert np.all(result['time'] == [0, 1, 1, 2, 2, 2.5, 3, 3, 4, 4, 5, 5]) + assert np.all(result['counter'] == [1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6]) @pytest.mark.parametrize('fmi_version, interface_type', product([2, 3], ['cs', 'me']))