这是我的功能。我正在尝试将此代码导出到fmu。我正在使用fmusdk。
对于每个周期(时间步长),
input
应更改为模拟期间给出的值。myexecute()
。input
和pout
的值,以便我们可以在模拟后绘制值。我尝试了fmusdk中给出的示例(BouncingBall和值)。我创建了相应的fmus并将它们导入Amesim。他们工作正常。但我无法弄清楚如何为我的C文件/功能
做同样的事情/*
* Execution function
*/
void myexecute(double *input, double *pout)
{
(*pout) = 2 * (*input);
}
我检查了bouncingBall.c和values.c,它们只有四种方法
setStartValues(ModelInstance *comp)
calculateValues(ModelInstance *comp)
getReal(ModelInstance *comp, fmi2ValueReference vr)
void eventUpdate(ModelInstance *comp, fmi2EventInfo *eventInfo, int isTimeEvent, int isNewEventIteration)
有人可以帮我完成这个fmi导出吗?总之,我正在寻找上述4个功能的内容。对上述4种方法的解释也就足够了。我可以为函数创建内容。
答案 0 :(得分:2)
考虑下面给出的C文件,类似于您提到的文件bouncingBall.c或valus.c。由于您已从另一个c文件中引用了函数myexecute
,因此请将yourCFile.c
和/或yourHFile.h
替换为正确的文件。
此外,您的modelDescription.xml应与此C文件同步。对于ex),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"