void exec() { fmi2Flag = fmu.doStep(c, time.to_seconds(), h.to_seconds(), fmi2True); if (fmi2Flag == fmi2Discard) { fmi2Boolean b; // check if model requests to end simulation if (fmi2OK != fmu.getBooleanStatus(c, fmi2Terminated, &b)) { return SC_REPORT_ERROR(name(),"could not complete simulation of the model. getBooleanStatus return other than fmi2OK"); } if (b == fmi2True) { return SC_REPORT_ERROR(name(),"the model requested to end the simulation"); } return SC_REPORT_ERROR(name(),"could not complete simulation of the model"); } if (fmi2Flag != fmi2OK) return SC_REPORT_ERROR(name(),"could not complete simulation of the model"); // FIXME: res = outputRow(fmu, c, time, file, separator, fmi2False); // output values for this step auto res = getRealOutput(&fmu, c, output_index); oval = sub_signal(time, time+h, [this,res](const sc_time& t) { return res; } ); }
// simulate the given FMU from tStart = 0 to tEnd. static int simulate(FMU* fmu, double tEnd, double h, fmi2Boolean loggingOn, char separator, int nCategories, const fmi2String categories[]) { double time; double tStart = 0; // start time const char *guid; // global unique id of the fmu const char *instanceName; // instance name fmi2Component c; // instance of the fmu fmi2Status fmi2Flag; // return code of the fmu functions char *fmuResourceLocation = getTempResourcesLocation(); // path to the fmu resources as URL, "file://C:\QTronic\sales" fmi2Boolean visible = fmi2False; // no simulator user interface fmi2CallbackFunctions callbacks = {fmuLogger, calloc, free, NULL, fmu}; // called by the model during simulation ModelDescription* md; // handle to the parsed XML file fmi2Boolean toleranceDefined = fmi2False; // true if model description define tolerance fmi2Real tolerance = 0; // used in setting up the experiment ValueStatus vs = 0; int nSteps = 0; Element *defaultExp; FILE* file; // instantiate the fmu md = fmu->modelDescription; guid = getAttributeValue((Element *)md, att_guid); instanceName = getAttributeValue((Element *)getCoSimulation(md), att_modelIdentifier); c = fmu->instantiate(instanceName, fmi2CoSimulation, guid, fmuResourceLocation, &callbacks, visible, loggingOn); free(fmuResourceLocation); if (!c) return error("could not instantiate model"); if (nCategories > 0) { fmi2Flag = fmu->setDebugLogging(c, fmi2True, nCategories, categories); if (fmi2Flag > fmi2Warning) { return error("could not initialize model; failed FMI set debug logging"); } } defaultExp = getDefaultExperiment(md); if (defaultExp) tolerance = getAttributeDouble(defaultExp, att_tolerance, &vs); if (vs == valueDefined) { toleranceDefined = fmi2True; } fmi2Flag = fmu->setupExperiment(c, toleranceDefined, tolerance, tStart, fmi2True, tEnd); if (fmi2Flag > fmi2Warning) { return error("could not initialize model; failed FMI setup experiment"); } fmi2Flag = fmu->enterInitializationMode(c); if (fmi2Flag > fmi2Warning) { return error("could not initialize model; failed FMI enter initialization mode"); } fmi2Flag = fmu->exitInitializationMode(c); if (fmi2Flag > fmi2Warning) { return error("could not initialize model; failed FMI exit initialization mode"); } // open result file if (!(file = fopen(RESULT_FILE, "w"))) { printf("could not write %s because:\n", RESULT_FILE); printf(" %s\n", strerror(errno)); return 0; // failure } // output solution for time t0 outputRow(fmu, c, tStart, file, separator, fmi2True); // output column names outputRow(fmu, c, tStart, file, separator, fmi2False); // output values // enter the simulation loop time = tStart; while (time < tEnd) { fmi2Flag = fmu->doStep(c, time, h, fmi2True); if (fmi2Flag == fmi2Discard) { fmi2Boolean b; // check if model requests to end simulation if (fmi2OK != fmu->getBooleanStatus(c, fmi2Terminated, &b)) { return error("could not complete simulation of the model. getBooleanStatus return other than fmi2OK"); } if (b == fmi2True) { return error("the model requested to end the simulation"); } return error("could not complete simulation of the model"); } if (fmi2Flag != fmi2OK) return error("could not complete simulation of the model"); time += h; outputRow(fmu, c, time, file, separator, fmi2False); // output values for this step nSteps++; } // end simulation fmu->terminate(c); fmu->freeInstance(c); fclose(file); // print simulation summary printf("Simulation from %g to %g terminated successful\n", tStart, tEnd); printf(" steps ............ %d\n", nSteps); printf(" fixed step size .. %g\n", h); return 1; // success }