0

我的研究项目组正在尝试将 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 版无法进行这种导出。我理解你的观点正确吗?

4

1 回答 1

0

您可以获取2.0 版的 FMU 软件开发工具包。它有几个用 C 语言实现的示例,用于协同仿真(我猜这就是您想要的)和模型交换。

您可以使用其中一个示例作为起点(例如,上面链接的 zip 文件中的 fmu20/src/models/bouncingBall)。调整它是相当多的手动工作,但你会学到很多关于界面的知识。

要记住两件事:

  1. 请注意,只有一小部分 Matlab 功能可以导出为 C 代码。有关列表,请参阅C/C++ 代码生成支持的 MATLAB 语言功能
  2. FMI 尚未处理数组变量。这计划用于 3.0 版本。因此,您仅限于传递标量变量。

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

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

于 2018-08-15T07:29:51.060 回答