Инициализировать построимую модель Matlab Simulink с параметрами из базы данных SQLite - PullRequest
0 голосов
/ 06 января 2020

Контекст: У меня есть огромная модель Simulink, которая будет использоваться для автоматизированного моделирования в Debian 10. Поэтому она должна быть встроена как автономный C -код с использованием Matlab Coder. Затем вызывается этот код для запуска симуляции.

Что мне нужно: Мне нужно найти способ инициализации моей модели buildt с ~ 500 параметрами. Они меняются при каждом запуске симуляции и сохраняются в файле SQLite. Цель состоит в том, чтобы записать параметры в базу данных, а затем запустить модель, которая считывает параметры из SQLite во время инициализации (предположительно, с помощью обратного вызова модели InitFcn, хотя я открыта для альтернатив).

Что у меня есть пробовал:

  1. Direct SQL интерфейс: я пытался использовать прямой интерфейс Matlab- SQL, такой как JDB C (так как у меня нет доступа к базе данных -toolbox), но они не поддерживаются для генерации кода.

  2. Напишите C -функцию, которая читает файл SQLite, затем вызывает функцию во время инициализации в Обратный вызов InitFcn с использованием coder.ceval примерно так:

   data = 0;
   err = coder.ceval('read_function',4, 2, 12, coder.wref(data));
   parameter = data;
  • Проблема в том, что coder.wref не поддерживается в Matlab и поэтому не ' работать в InitFcn. (Пожалуйста, исправьте меня, если я ошибаюсь :) Кажется, это работает только внутри функционального блока Matlab:
   Error evaluating 'InitFcn' callback of block_diagram 'Model'.
   Caused by:
   The coder.wref function is not supported in MATLAB.

Так что моя проблема со вторым подходом заключается в том, что я не могу вызвать C -функция при инициализации.

Использование Matlab-function-Block для чтения параметров на самом деле не вариант, так как мне пришлось бы маршрутизировать все сигналы, что усложняет поддержание и дальнейшее развитие модели. Также я предлагаю, чтобы модель даже не работала, потому что параметры необходимы для инициализации модели.

Вопросы:

  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
.
.
.

1 Ответ

0 голосов
/ 04 февраля 2020

Потратив так много времени на эту проблему, я хотел бы поделиться своим опытом по этой проблеме:

SQLite: Этот подход не сработал для меня, потому что прямой SQL -Matlab интерфейсы не поддерживаются для генерации кода. Фактически возможно написать C -функцию, которая читает из SQLite и вызывает эту функцию в Matlab-function-block через coder.ceval, который позволяет считывать сигнал во время симуляции. Это работает и для генерации кода (Simulink Coder). Однако это не сработает для инициализации (см. Вопрос).

Так что ни один из моих оригинальных подходов не сработал.

Обходной путь: Я закончил тем, что переключился на подход, основанный на подходе на Simulink RSIM-target, который генерирует код (также для Linux) и может параметризоваться через файл .mat , который содержит все параметры. .Mat файл может быть изменен для обновления параметров. Это потребовало некоторого дополнительного кода, который автоматизирует этот шаг. Также конфигурация модели для RSIM немного сложнее .

...