Как хранить произвольные типы в Simulink в блочной области?

Очевидно, Simulink поддерживает только несколько типов данных.

Итак, как сохранить что-то другое? Я хочу создавать изображения из каталога, как сохранить список каталогов и текущую позицию?

Следующий код вызывает ошибку

function DoPostPropSetup(block)

  block.NumDworks = 1;

  block.Dwork(1).Name            = 'Filelist';
  block.Dwork(1).Dimensions      = 1;
  % block.Dwork(1).DatatypeID      = -10;      % MATLAB Array  % does not work
  block.Dwork(1).DatatypeID      = 0;      % double
  block.Dwork(1).Complexity      = 'Real'; % real
  block.Dwork(1).UsedAsDiscState = true;

  block.Dwork(1).Data = dir(block.DialogPrm(1).Data);

person Suzan Cioc    schedule 17.07.2013    source источник


Ответы (1)


Вы не можете хранить нечисловые типы в s-функции уровня 2 Dwork. Для вашего использования вам может потребоваться преобразовать список файлов в строку символов с разделителем пути и использовать тип char для его хранения. Вам нужен другой Dwork для хранения позиции.

Другой подход состоит в том, чтобы сохранить список в виде символьной матрицы с меньшими именами файлов, дополненными пробелами или любыми символами, которые не являются частью действительного имени файла. Сохранение в виде матрицы упростит индексацию списка.

person Navan    schedule 17.07.2013
comment
Невероятно сложный. В настоящее время я сохраняю переменные рабочей области модели. Недостатки этого способа в том, что он модельный. - person Suzan Cioc; 17.07.2013
comment
P.S. Тип char также не разрешен в DWork, как я обнаружил. так что мне нужно прилагать огромные усилия по преобразованию в каждом цикле... невероятно! - person Suzan Cioc; 17.07.2013
comment
Если ваш список одинаков для всей модели, вы также можете использовать постоянную переменную внутри своей функции. - person Navan; 17.07.2013
comment
Блок состоит из нескольких функций. - person Suzan Cioc; 17.07.2013
comment
постоянная переменная может находиться в общей подфункции, вызываемой несколькими функциями - person Navan; 18.07.2013
comment
Хорошо, но я думаю, что это будет шире, чем область видимости модели. Переменные будут одинаковыми во всех блоках во всех моделях. - person Suzan Cioc; 18.07.2013
comment
Можно ли как-то хранить переменные в области блока? Я могу создать hashmap на уровне модели, но это очень сложно... - person Suzan Cioc; 18.07.2013
comment
В каждом блоке есть поле UserData, где вы можете хранить любое значение. См. mathworks.com/help/simulink/ug / - person Navan; 19.07.2013
comment
Круто! что, если я хочу сохранить несколько параметров? Как хранить struct там? Могу ли я изменить отдельные поля структуры, хранящиеся в UserData? - person Suzan Cioc; 21.07.2013
comment
очевидно, я должен get использовать свой параметр перед использованием, а затем set вернуть его после модификации... очень некрасиво - person Suzan Cioc; 21.07.2013
comment
На самом деле это не так уродливо. Сначала может показаться, что это так; думайте об этом как о сейфе, где есть небольшие накладные расходы, чтобы извлечь и заменить контейнер, но тогда у вас есть свобода помещать в него что угодно (включая структуру MATLAB или дескриптор объекта класса) - person Jason S; 08.11.2013