使用 SQLite 数据库中的参数初始化可构建的 Matlab Simulink 模型

Initialize buildable Matlab Simulink Model with parameters from SQLite Database

上下文: 我有一个巨大的 Simulink 模型,将用于 Debian 10 上的自动仿真。因此,它必须作为独立的 C 代码使用Matlab 编码器。然后调用此代码以开始模拟。

我需要什么:我需要找到一种方法来用大约 500 个参数初始化我构建的模型。这些随着每次模拟 运行 而变化,并存储在 SQLite 文件中。目标是将参数写入数据库,然后启动模型,该模型在初始化期间从 SQLite 读取参数(可能使用 InitFcn 模型回调,尽管我对替代方案持开放态度)。

我试过的:

  1. 直接SQL接口:我尝试使用直接的Matlab-SQL接口,例如JDBC(因为我无权访问数据库-toolbox) 但这些是 not supported 用于代码生成。

  2. 编写一个读取 SQLite 文件的 C 函数,然后在初始化期间使用 coder.ceval 在 InitFcn 回调中调用该函数,如下所示:

   data = 0;
   err = coder.ceval('read_function',4, 2, 12, coder.wref(data));
   parameter = data;
   Error evaluating 'InitFcn' callback of block_diagram 'Model'.
   Caused by:
   The coder.wref function is not supported in MATLAB.

所以我对第二种方法的问题是,我无法在初始化期间调用 C 函数。

  1. 使用 Matlab 函数块读取参数并不是一个真正的选择,因为我必须将所有信号路由出去,这使得模型的维护和进一步开发变得非常困难。另外我的建议是,模型甚至不会 运行 因为需要参数来初始化模型。

问题:

  1. 有没有办法使上述方法之一起作用?如果是,如何?我的错误在哪里?
  2. 还有其他(更简单的)选项可以将数据作为数组或结构传递到我的模型吗?

数据库如下所示:

Identifier               Default         
latitude                    52.5
longitude                   13.4
electricity_consumption   4000.0
ventilation_stream          50.0
PV_peak                     30.0
PV_orientation               0.0
no_vessels                  28.0
heatpump_exists              1.0
hotwater_consumption      1000.0
.
.
.

在这个问题上花了这么多时间,我想分享一下我在这个问题上的经验:

SQLite: 这种方法对我没有用,因为代码生成不支持直接 SQL-Matlab 接口。 实际上可以编写一个 C 函数,它从 SQLite 读取并通过 coder.ceval 在 Matlab 函数块中调用该函数,这允许在模拟期间读取信号。这也适用于代码生成(Simulink 编码器)。然而,这不适用于初始化(见问题)。

所以 none 我最初的方法最终奏效了。

解决方法: 我最终切换到基于 Simulink RSIM 目标的方法,该方法生成代码(也适用于 Linux)并且可以参数化 via a .mat file wich contains all the parameters. The .mat file can be modified to update parameters. This required some additional code wich automates this step. Also the model configuration for RSIM is a bit tricky.