Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 16a7626

Browse files
sjoelundOpenModelica-Hudson
authored andcommitted
Handle dassl better in opc-ua
1 parent 7b440a1 commit 16a7626

File tree

6 files changed

+28
-22
lines changed

6 files changed

+28
-22
lines changed

SimulationRuntime/c/simulation/solver/embedded_server.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
#define DLL_EXT ".so"
4343
#endif
4444

45-
void* no_embedded_server_init(DATA *data, double tout, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port, int *didEventStep)
45+
void* no_embedded_server_init(DATA *data, double tout, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port)
4646
{
4747
return NULL;
4848
}
@@ -51,15 +51,16 @@ void no_embedded_server_deinit(void *handle)
5151
{
5252
}
5353

54-
void no_embedded_server_update(void *handle, double tout)
54+
int no_embedded_server_update(void *handle, double tout)
5555
{
56+
return 0;
5657
}
5758

58-
void* (*embedded_server_init)(DATA *data, double tout, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port, int *didEventStep) = no_embedded_server_init;
59+
void* (*embedded_server_init)(DATA *data, double tout, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port) = no_embedded_server_init;
5960
void (*embedded_server_deinit)(void*) = no_embedded_server_deinit;
6061
// Tells the embedded server that a simulation step has passed; the server
6162
// can read/write values from/to the simulator
62-
void (*embedded_server_update)(void*, double tout) = no_embedded_server_update;
63+
int (*embedded_server_update)(void*, double tout) = no_embedded_server_update;
6364

6465
void* embedded_server_load_functions(const char *server_name)
6566
{

SimulationRuntime/c/simulation/solver/embedded_server.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@
3737
extern "C" {
3838
#endif
3939

40-
extern void* (*embedded_server_init)(DATA *data, double tout, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port, int *didEventStep);
40+
extern void* (*embedded_server_init)(DATA *data, double tout, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port);
4141
extern void (*embedded_server_deinit)(void *handle);
4242
/* Tells the embedded server that a simulation step has passed; the server
4343
* can read/write values from/to the simulator
4444
*/
45-
extern void (*embedded_server_update)(void *handle, double tout);
45+
extern int (*embedded_server_update)(void *handle, double tout);
4646
/* Give the filename or generic name to use for loading an embedded server */
4747
extern void* embedded_server_load_functions(const char *name);
4848
extern void embedded_server_unload_functions(void *dllHandle);

SimulationRuntime/c/simulation/solver/perform_simulation.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ static void fmtInit(DATA* data, MEASURE_TIME* mt)
183183
}
184184
}
185185

186-
static void fmtEmitStep(DATA* data, threadData_t *threadData, MEASURE_TIME* mt, int didEventStep)
186+
static void fmtEmitStep(DATA* data, threadData_t *threadData, MEASURE_TIME* mt, SOLVER_INFO* solverInfo)
187187
{
188188
if(mt->fmtReal)
189189
{
@@ -218,11 +218,17 @@ static void fmtEmitStep(DATA* data, threadData_t *threadData, MEASURE_TIME* mt,
218218
}
219219

220220
/* prevent emit if noEventEmit flag is used, if it's an event */
221-
if ((omc_flag[FLAG_NOEVENTEMIT] && didEventStep == 0) || !omc_flag[FLAG_NOEVENTEMIT]) {
221+
if ((omc_flag[FLAG_NOEVENTEMIT] && solverInfo->didEventStep == 0) || !omc_flag[FLAG_NOEVENTEMIT]) {
222222
sim_result.emit(&sim_result, data, threadData);
223223
}
224224
#if !defined(OMC_MINIMAL_RUNTIME)
225-
embedded_server_update(data->embeddedServerState, data->localData[0]->timeValue);
225+
if (embedded_server_update(data->embeddedServerState, data->localData[0]->timeValue)) {
226+
solverInfo->didEventStep = 1;
227+
overwriteOldSimulationData(data);
228+
storePreValues(data); // Maybe??
229+
storeOldValues(data); // Maybe??
230+
sim_result.emit(&sim_result, data, threadData);
231+
}
226232
if (data->real_time_sync.enabled) {
227233
double time = data->localData[0]->timeValue;
228234
int64_t res = rt_ext_tp_sync_nanosec(&data->real_time_sync.clock, (uint64_t) (data->real_time_sync.scaling*(time-data->real_time_sync.time)*1e9));
@@ -455,7 +461,7 @@ int prefixedName_performSimulation(DATA* data, threadData_t *threadData, SOLVER_
455461
syncStep = simulationUpdate(data, threadData, solverInfo);
456462
retry = 0; /* reset retry */
457463

458-
fmtEmitStep(data, threadData, &fmt, solverInfo->didEventStep);
464+
fmtEmitStep(data, threadData, &fmt, solverInfo);
459465
saveIntegratorStats(solverInfo);
460466
checkSimulationTerminated(data, solverInfo);
461467

SimulationRuntime/c/simulation/solver/solver_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ int solver_main(DATA* data, threadData_t *threadData, const char* init_initMetho
705705
}
706706
}
707707
}
708-
data->embeddedServerState = embedded_server_init(data, data->localData[0]->timeValue, solverInfo.currentStepSize, argv_0, omc_real_time_sync_update, port, &solverInfo.didEventStep);
708+
data->embeddedServerState = embedded_server_init(data, data->localData[0]->timeValue, solverInfo.currentStepSize, argv_0, omc_real_time_sync_update, port);
709709
#endif
710710
if(0 == retVal) {
711711
retVal = -1;

SimulationRuntime/opc/ua/omc_opc_ua.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ typedef struct {
5858
int *boolValsInputIndex;
5959
int reinitStateFlag;
6060
int *stateWasUpdatedFlag;
61-
int *didEventStep;
6261
double *updatedStates;
6362
double real_time_sync_scaling;
6463
void (*omc_real_time_sync_update)(DATA *data, double scaling);
@@ -449,7 +448,7 @@ static inline omc_opc_ua_state* addAliasVars(omc_opc_ua_state *state, var_kind_t
449448
}
450449
return state;
451450
}
452-
void* omc_embedded_server_init(DATA *data, double t, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port, int *didEventStep)
451+
void* omc_embedded_server_init(DATA *data, double t, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port)
453452
{
454453
MODEL_DATA *modelData = data->modelData;
455454
omc_opc_ua_state *state = (omc_opc_ua_state*) malloc(sizeof(omc_opc_ua_state));
@@ -467,7 +466,6 @@ void* omc_embedded_server_init(DATA *data, double t, double step, const char *ar
467466
state->server_running = 1;
468467
state->time = t;
469468
state->omc_real_time_sync_update = omc_real_time_sync_update;
470-
state->didEventStep = didEventStep;
471469

472470
pthread_cond_init(&state->cond_pause, NULL);
473471
pthread_mutex_init(&state->mutex_pause, NULL);
@@ -620,13 +618,15 @@ void omc_embedded_server_deinit(void *state_vp)
620618
free(state);
621619
}
622620

623-
void omc_embedded_server_update(void *state_vp, double t)
621+
int omc_embedded_server_update(void *state_vp, double t)
624622
{
625623
omc_opc_ua_state *state = (omc_opc_ua_state*) state_vp;
626-
int i, realIndex=0, boolIndex=0;
624+
int i, realIndex=0, boolIndex=0, res=0;
627625
DATA *data = state->data;
628626
MODEL_DATA *modelData = data->modelData;
629627

628+
waitForStep(state);
629+
630630
pthread_rwlock_wrlock(&state->rwlock);
631631

632632
state->time = t;
@@ -639,12 +639,12 @@ void omc_embedded_server_update(void *state_vp, double t)
639639
}
640640

641641
if (state->gotNewInput) {
642-
*state->didEventStep = 1; /* Trigger an event in the solver, restarting it */
642+
res = 1; /* Trigger an event in the solver, restarting it */
643643
memcpy(data->simulationInfo->inputVars, state->inputVarsBackup, modelData->nInputVars * sizeof(double));
644644
}
645645

646646
if (state->reinitStateFlag) {
647-
*state->didEventStep = 1; /* Trigger an event in the solver, restarting it */
647+
res = 1; /* Trigger an event in the solver, restarting it */
648648
for (i = 0; i < modelData->nStates; i++) {
649649
if (state->stateWasUpdatedFlag[i]) {
650650
state->stateWasUpdatedFlag[i] = 0;
@@ -654,6 +654,5 @@ void omc_embedded_server_update(void *state_vp, double t)
654654
}
655655

656656
pthread_rwlock_unlock(&state->rwlock);
657-
658-
waitForStep(state);
657+
return res;
659658
}

SimulationRuntime/opc/ua/omc_opc_ua.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@
4747
#endif
4848
#endif
4949

50-
OPC_UA_EXPORT void* omc_embedded_server_init(DATA *data, double t, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port, int *didEventStep);
50+
OPC_UA_EXPORT void* omc_embedded_server_init(DATA *data, double t, double step, const char *argv_0, void (*omc_real_time_sync_update)(DATA *data, double scaling), int port);
5151
OPC_UA_EXPORT void omc_embedded_server_deinit(void*);
52-
OPC_UA_EXPORT void omc_embedded_server_update(void*, double t);
52+
OPC_UA_EXPORT int omc_embedded_server_update(void*, double t);
5353

5454
#define OMC_OPC_NODEID_STEP 10000
5555
#define OMC_OPC_NODEID_RUN 10001

0 commit comments

Comments
 (0)