Как экспортировать файл / функцию c в FMU с помощью fmusdk

Это моя функция. Я пытаюсь экспортировать этот код в fmu. Я использую fmusdk.

Для каждого цикла (временного шага),

  1. my input следует изменить на значение, указанное во время моделирования.
  2. myexecute() должен быть вызван.
  3. значения input и pout должны быть сохранены во время моделирования, чтобы мы могли построить значения после моделирования.

Я пробовал примеры (BouncingBall и значения), приведенные в fmusdk. Я создал соответствующие 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 методов. Я могу создать содержимое для функций.


c fmi
person Nandha    schedule 07.07.2017    source источник


Ответы (1)


Рассмотрим файл C, приведенный ниже, похожий на упомянутые вами файлы bouncingBall.c или valus.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"
person Community    schedule 07.07.2017