以结构作为输入参数的C代码的FMU导出

时间:2018-08-14 08:24:44

标签: c fmi

我的研究项目组正在尝试将matlab代码导出为FMU。 我们想到的一种方法是从matlab脚本生成c代码并将c代码导出为FMU。 我很好奇是否有任何工具可以将C代码打包为FMU?如果没有,是否还有另一种方法可以实现?

在@mklingn的答案后更新问题
我尝试使用 bouncingball.c 进行编辑,但是在提供的每个示例中,我面临的问题是变量被视为布尔或双精度数据类型。在我的情况下,输入之一是结构,例如,我生成的c文件是

#include "mult.h"

/* Function Definitions */

/*
 * Arguments    : double u
 *                double v
 *                const struct0_T *m
 * Return Type  : double
 */
double mult(double u, double v, const struct0_T *m)
{
  double y;
  y = u * v * m->x[2];

  /*  fcn(u,v ,'parameter1',m,'parameter2',n) */
  return y;
}

生成的.h文件是

#ifndef MULT_H
#define MULT_H
typedef struct {
  char y[6];
  double x[6];
} struct0_T;
extern double mult(double u, double v, const struct0_T *m);
#endif

因此,根据您的观点2:FMI 2.0版无法进行这种导出。我了解您的观点正确吗?

1 个答案:

答案 0 :(得分:0)

您可以抓住FMU Software Development Kit for version 2.0。它有几个用C实现的示例,分别用于协同仿真(我想是您想要的)和模型交换。

您可以使用示例之一作为起点(例如,上面链接的zip文件中的fmu20 / src / models / bouncingBall)。适应它是很多手工工作,但是您会学到很多有关界面的知识。

请记住两点:

  1. 请注意,只有一小部分Matlab功能可以导出到C代码。请参阅MATLAB Language Features Supported for C/C++ Code Generation以获得列表。
  2. FMI尚未处理数组变量。这是planned for version 3.0。因此,您仅限于传递标量变量。

上面显示的结构类型不能按原样传递给FMU。没有遵循该标准的调用程序可以知道如何定义您的内部结构。它们只能传递FMI标准指定的原始标量数据类型。

信息,但是,可以传递。您可以定义一个名为例如的双模型变量 x2 并修改 mult 函数以直接使用它,或在FMU内部重建结构。