考虑下面给出的 C 文件,类似于您提到的文件 bouncingBall.c 或 values.c 。由于您已经myexecute
从另一个 c 文件中引用了该函数,因此请替换yourCFile.c
和/或yourHFile.h
使用正确的文件。此外,您的 modelDescription.xml 应该与此 C 文件同步。例如)guid
两个文件中的值应该相同。标量变量的值引用也应该相同。分析<ScalarVariable name="pin" valueReference="0">
和#define pin_ 0
。同样对于pout
。创建一个类似于 bouncingBall 的文件夹结构。创建一个单独的批处理文件,因为我们必须包含其他文件(yourCFile.c
和/或yourHFile.h
)
// define class name and unique id
#define MODEL_IDENTIFIER modelName
#define MODEL_GUID "{8c4e810f-3df3-4a00-8276-176fa3c90123}"
// define model size
#define NUMBER_OF_REALS 2
#define NUMBER_OF_INTEGERS 0
#define NUMBER_OF_BOOLEANS 0
#define NUMBER_OF_STRINGS 0
#define NUMBER_OF_STATES 1
#define NUMBER_OF_EVENT_INDICATORS 0
// include fmu header files, typedefs and macros
#include "fmuTemplate.h"
#include "yourHFile.h"
#include "yourCFile.c"
// define all model variables and their value references
// conventions used here:
// - if x is a variable, then macro x_ is its variable reference
// - the vr of a variable is its index in array r, i, b or s
// - if k is the vr of a real state, then k+1 is the vr of its derivative
#define pin_ 0
#define pout_ 1
// define state vector as vector of value references
#define STATES { pout_ }
// called by fmi2Instantiate
// Set values for all variables that define a start value
// Settings used unless changed by fmi2SetX before fmi2EnterInitializationMode
void setStartValues(ModelInstance *comp) {
r(pin_) = 2;
r(pout_) = 4;
}
// called by fmi2GetReal, fmi2GetInteger, fmi2GetBoolean, fmi2GetString, fmi2ExitInitialization
// if setStartValues or environment set new values through fmi2SetXXX.
// Lazy set values for all variable that are computed from other variables.
void calculateValues(ModelInstance *comp) {
if (comp->state == modelInitializationMode) {
// set first time event
comp->eventInfo.nextEventTimeDefined = fmi2True;
}
}
// called by fmi2GetReal, fmi2GetContinuousStates and fmi2GetDerivatives
fmi2Real getReal(ModelInstance *comp, fmi2ValueReference vr){
switch (vr) {
case pin_ : return r(pin_);
case pout_ : return r(pout_);
default: return 0;
}
}
// used to set the next time event, if any.
void eventUpdate(ModelInstance *comp, fmi2EventInfo *eventInfo, int isTimeEvent, int isNewEventIteration) {
myexecute(&r(pin_), &r(pout_));
}
#include "fmuTemplate.c"