Этот пример показывает ряд инструментов и методов, которые составляют рабочий процесс для управления данными со модель-ссылка.
Базовое введение в эту тему смотрите в разделе «Введение в управление данными с помощью Модели-ссылки».
Во время этого примера Simulink ® и Simulink ® Coder™ сгенерировать код в папке генерации кода, созданной в текущей директории. Если вы не хотите (или не можете) генерировать файлы в этой директории, необходимо изменить рабочую директорию. Simulink Coder требуется для генерации модели-ссылки двоичных файлов, которые будут развернуты в автономных приложениях.
Если вы планируете изменить модели примера:
1. Сохраните пример в его исходном состоянии, скопировав следующие файлы из директории установки MATLAB ®, не меняя их имен, в другую директорию:
toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_datamngt.slx toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_datamngt_wsdata.m toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_counter_datamngt.slx toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_counter_datamngt_types.m toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_counter_datamngt_wsdata.m
2. Измените текущую директорию на директорию, в которую вы скопировали файлы.
3. Продолжите с примером.
open_system('sldemo_mdlref_datamngt')
Этот пример использует верхнюю часть (sldemo_mdlref_datamngt
), который содержит три блока Model: Counter1, Counter2 и Counter3. Эти блоки ссылаются на ту же модель (sldemo_mdlref_counter_datamngt
).
Ссылочная модель реализует алгоритм ограниченного счетчика, который:
Сбрасывает счетчик, если первый вход триггера изменяется
Увеличивает счетчик на заданную величину, если изменяется второй вход
Насыщает счетчик между заданными верхним и нижним пределами
Модель-ссылка выводит сигнал шины, который содержит:
Счетчик: значение счетчика в виде 8-битного целого числа
OverflowState: перечисленное значение, которое указывает, находится ли счетчик на верхнем пределе, нижнем пределе или в области значений
Эта модель сконфигурирована, чтобы показать ряд функций Simulink, работающих вместе:
Настраиваемые параметры: Собирайте переменные в структуру MATLAB, которая параметризирует модель. В этом примере аргументы модели ссылочной модели заданы как структуры параметров.
Аргументы модели: Передайте различные значения параметров каждой модели-ссылке образца.
Объекты шины: Задайте «форму» структур для сигналов и параметров, используемых в интерфейсе модели-ссылки. Задайте имя типа для параметров структуры и сигналов в сгенерированном коде.
Simulink.Bus.createMATLABStruct: статический метод для создания структуры MATLAB, которая совпадает с формой объекта шины.
Инициализация шины: Использует структуру параметра для инициализации сигналов шины и состояний.
Маскированный Блок Model: Создает настраиваемый интерфейс для блока модели-ссылки.
Инициированная модель-ссылка: Явное управление планированием компонентов.
Этот пример также использует другие функции, которые полезны для управления данными в Simulink:
Simulink.saveVars: Сериализируйте переменные рабочей области в скрипт MATLAB. Поддерживает инкрементальное изменение, дифференцирование данных и систему контроля версий.
Simulink.findVars: Узнайте, как переменные рабочей области используются моделью.
Последовательность шагов в примере следующая:
1. Подготовим ссылку на модель (sldemo_mdlref_counter_datamngt
) использовать структуры для сигналов и параметров во внешнем интерфейсе.
2. Подготовим верхнюю часть (sldemo_mdlref_datamngt
), чтобы вызвать ссылочную модель.
3. Симулируйте верхнюю модель и исследуйте результаты.
4. Сгенерируйте код, чтобы создать независимый исполняемый файл для модели верхней части.
Модель-ссылка имеет два аргумента модели (CounterParams, CounterICs), которые параметризируют блоки в модели. Аргументы модели обеспечивают различные значения параметров каждому образцу модели-ссылки. В этой модели аргументы заданы как структуры параметров, чтобы уменьшить количество аргументов, передающихся в модель-ссылку.
Процесс определения аргументов модели следующий:
1. Откройте ссылочную модель (sldemo_mdlref_counter_datamngt
).
2. Задайте структуры MATLAB, чтобы параметризовать ссылочную модель.
CounterParams.Increment = int8(1); CounterParams.LowerLimit = int8(-10); CounterParams.UpperLimit = int8(10);
CounterICs.Count = int8(0); CounterICs.OverflowState = SlDemoRangeCheck.InRange;
ПРИМЕЧАНИЕ. Этот пример использует 8-битное целое число для счетчика, поэтому в числовых полях также используются 8-битные целые числа.
3. Используйте структуры MATLAB в качестве аргументов модели.
Аргументы модели заданы как переменные в рабочем пространстве модели ссылочной модели. Можно инициализировать рабочее пространство модели из ряда различных источников данных. Этот пример использует скрипт MATLAB (sldemo_mdlref_counter_datamngt_wsdata
), чтобы создать структуры параметров для аргументов модели. Использование скрипта MATLAB облегчает создание и изменение структуры параметра вне модели. Это также облегчает инкрементальные изменения, систему контроля версий и дифференцирование данных.
Установите источник данных в диалоговом окне рабочего пространства модели.
Также можно задать источник данных из командной строки MATLAB:
hWS = get_param('sldemo_mdlref_counter_datamngt', 'ModelWorkspace'); hWS.DataSource = 'MATLAB File'; hWS.FileName = 'sldemo_mdlref_counter_datamngt_wsdata.m'; hWS.reload;
Можно использовать Обозреватель моделей (Model Explorer), чтобы просмотреть и отредактировать содержимое рабочего пространства модели.
Установите флажок Аргумент, чтобы сконфигурировать переменные как аргументы модели.
Также можно задать список аргументов модели из командной строки MATLAB:
set_param('sldemo_mdlref_counter_datamngt', ... 'ParameterArgumentNames', 'CounterParams,CounterICs');
4. Исследуйте, как модель-ссылка использует аргументы модели.
В ряде блоков в модели-ссылке используются аргументы модели:
Блок Constant задает шаг (CounterParams.Increment).
Различные блоки внутри подсистемы «Range Check» используют значения нижнего и верхнего пределов (CounterParams.LowerLimit и CounterParams.UpperLimit).
Различные блоки используют начальное условие счетчика (CounterICs.Count).
Корневой блок Outport использует начальную структуру условий (CounterICs), чтобы инициализировать вывод системы перед выполнением.
Можно использовать Simulink.findVars, чтобы обнаружить блоки, которые используют аргумент модели.
paramInfo = Simulink.findVars('sldemo_mdlref_counter_datamngt', ... 'Name', 'CounterParams'); icInfo = Simulink.findVars('sldemo_mdlref_counter_datamngt', ... 'SearchMethod', 'cached', ... 'Name', 'CounterICs'); paramBlks = paramInfo.UsedByBlocks icBlks = icInfo.UsedByBlocks
paramBlks = 3x1 cell array {'sldemo_mdlref_counter_datamngt/Increment' } {'sldemo_mdlref_counter_datamngt/Range Check/Detect Overflow'} {'sldemo_mdlref_counter_datamngt/Range Check/Saturate Count' } icBlks = 3x1 cell array {'sldemo_mdlref_counter_datamngt/Initial Count' } {'sldemo_mdlref_counter_datamngt/Previous Count'} {'sldemo_mdlref_counter_datamngt/outputs' }
ПРИМЕЧАНИЕ: После компиляции модели можно использовать Simulink.findVars, чтобы получить информацию об использовании переменной 'cached'.
Ссылочная модель выдаёт два результата и упаковывает их в сигнал шины:
Счетчик: значение счетчика в виде 8-битного целого числа
OverflowState: перечисленное значение, которое указывает, находится ли счетчик на верхнем пределе, нижнем пределе или в области значений
Чтобы определить тип шины для корневого выхода ссылочных моделей:
1. Используйте Редактор шин, чтобы задать объект шины (OutputType).
Также можно создать объект шины в командной строке MATLAB:
OutputType = Simulink.Bus; OutputType.Elements = Simulink.BusElement; OutputType.Elements(1).Name = 'Count'; OutputType.Elements(1).DataType = 'int8'; OutputType.Elements(2) = Simulink.BusElement; OutputType.Elements(2).Name = 'OverflowState'; OutputType.Elements(2).DataType = 'Enum: SlDemoRangeCheck';
2. Сконфигурируйте корневой выходной порт ссылочной модели, чтобы вывести невиртуальный сигнал шины на основе этого объекта шины (OutputType).
Также можно задать параметры блоков из командной строки MATLAB:
set_param('sldemo_mdlref_counter_datamngt/outputs', ... 'UseBusObject', 'on', ... 'BusObject', 'OutputType', ... 'BusOutputAsStruct', 'on');
3. Создайте скрипт MATLAB, чтобы воссоздать этот объект шины.
Этот пример использует скрипт MATLAB (sldemo_mdlref_counter_datamngt_types
) для воссоздания объектов шины, используемых ссылочными моделями.
Вы можете создать этот скрипт MATLAB вручную или использовать Simulink.saveVars:
Simulink.saveVars('sldemo_mdlref_counter_datamngt_types.m', 'OutputType');
4. Сконфигурируйте ссылку на модель, чтобы создать глобальные данные, которые она использует.
Модель обычно воссоздает все глобальные данные и типы, которые она использует. В этом примере ссылка на модель PreLoadFcn используется для выполнения скрипта MATLAB, который создает объекты шины для ссылок на модель. Ссылка на модель не использует никаких других глобальных переменных.
Чтобы задать PreLoadFcn
Коллбэк модели откройте диалоговое окно Свойства модели (Model Properties) на вкладке Моделирование (Modeling), нажав кнопку Настройки модели (Model Settings стрелы, а затем в разделе Верхней части Модель (Model), выбрав Свойства модели (Model Properties). На вкладке Callbacks диалогового окна Свойства, в окне функции предварительной загрузки модели, вызовите sldemo_mdlref_counter_datamngt_types
скрипт, а затем нажмите Применить.
Также можно задать коллбэк из командной строки MATLAB.
set_param('sldemo_mdlref_counter_datamngt', ... 'PreLoadFcn', 'sldemo_mdlref_counter_datamngt_types');
5. Исследуйте, как тип шины используется в иерархии модели.
Этот тип шины образует часть интерфейса для модели-ссылки и упоминается блоками как в верхней, так и в ссылочной моделях. Используйте find_mdlrefs и Simulink.findVars, чтобы узнать обо всех местах, где этот объект шины используется в иерархии модели-ссылки.
models = find_mdlrefs('sldemo_mdlref_datamngt'); open_system(models); varInfo = Simulink.findVars(models, 'Name', 'OutputType'); blks = vars.UsedByBlocks
models = 2x1 cell array {'sldemo_mdlref_counter_datamngt'} {'sldemo_mdlref_datamngt' } blks = 7x1 cell array {'sldemo_mdlref_counter_datamngt/Initial Count' } {'sldemo_mdlref_counter_datamngt/Previous Count' } {'sldemo_mdlref_counter_datamngt/Range Check/Bus Creator'} {'sldemo_mdlref_counter_datamngt/outputs' } {'sldemo_mdlref_datamngt/Counter1' } {'sldemo_mdlref_datamngt/Counter2' } {'sldemo_mdlref_datamngt/Counter3' }
В целом начальные значения для сигналов шины и состояний могут быть заданы как '0', в этом случае все элементы шины будут инициализированы в нуль (или соответствующее значение заземления). Однако в некоторых случаях желательно задать ненулевые начальные значения для сигналов шины и состояний. В этом примере начальное условие счетчика настраивается, поэтому начальное значение выхода сигнала должно быть установлено последовательно.
Чтобы задать начальное значение выхода ссылочной модели:
1. Создайте структуру параметра, которая совместима с сигналом шины, который вы хотите инициализировать. Один из аргументов модели (CounterICs) является структурой параметра, которая соответствует форме выходного сигнала. Эта структура была определена следующим образом:
CounterICs.Count = int8(0); CounterICs.OverflowState = SlDemoRangeCheck.InRange;
Кроме того, можно было использовать статический метод, Simulink .Bus.createMATLABStruct, чтобы создать структуру с помощью значения заземления OutputType.
CounterICs = Simulink.Bus.createMATLABStruct('OutputType');
2. Откройте диалоговое окно для корневого выхода и введите имя структуры (CounterICs) в поле Initial outport.
Также можно задать параметры блоков из командной строки MATLAB:
set_param('sldemo_mdlref_counter_datamngt/outputs', ... 'InitialOutput', 'CounterICs');
ПРИМЕЧАНИЕ: В целом при инициализации сигнала или состояния шины структура параметра не должна точно совпадать с типом шины, но ее поля должны быть подмножеством элементов объекта шины, а атрибуты этих полей должны совпадать с элементами объекта шины.
Часто полезно замаскировать ссылку на модель для настройки пользовательского интерфейса. Можно создать маску на модели и затем ссылаться на нее из блока Model. Чтобы замаскировать модель, щелкните Создать маску модели (Create Model Mask) в разделе рабочего пространства модели Проводника модели (Model Explorer) для модели.
Когда вы ссылаетесь на маскированную модель из блока Model, маска генерируется автоматически на блоке Model. Для получения дополнительной информации см. раздел «Создание и привязка маскированной модели».
Модель-ссылка сконфигурирована, чтобы принять структуру для своего аргумента модели. Этот пример вызывает каждый образец ссылочной модели с различными значениями параметров.
1. Откройте верхнюю часть (sldemo_mdlref_datamngt
).
2. Создайте параметр структуры с той же «формой», что и аргументы модели, заданные в модели-ссылке.
Param1.Increment = int8(1); Param1.LowerLimit = int8(-20); Param1.UpperLimit = int8(20);
Param2 = Param1; Param2.Increment = int8(2);
IC1.Count = int8(0); IC1.OverflowState = SlDemoRangeCheck.InRange;
IC2 = IC1; IC2.Count = int8(-10);
3. Установите параметры маски в маскированных блоках Model, чтобы использовать эти параметры.
Для примера, параметры первого блока Model ('sldemo_mdlref_datamngt/Counter1'
) устанавливаются как:
Param1 для параметров Counter
IC1 для Начальных условий
Также можно задать параметры блоков из командной строки MATLAB:
set_param('sldemo_mdlref_datamngt/Counter1', ... 'CounterParams', 'Param1', ... 'CounterICs', 'IC1');
3. Создайте скрипт MATLAB, чтобы воссоздать эти переменные рабочей области.
Этот пример использует скрипт MATLAB (sldemo_mdlref_datamngt_wsdata
), чтобы воссоздать эти переменные рабочей области.
Вы можете создать этот скрипт MATLAB вручную или использовать Simulink.saveVars:
Simulink.saveVars('sldemo_mdlref_datamngt_wsdata.m', 'Param*');
4. Сконфигурируйте верхнюю часть, чтобы создать все глобальные переменные.
Для модели верхней части рекомендуется воссоздать все глобальные данные и типы, используемые в иерархии модели-ссылки. Это строение избегает загрузки ссылочных моделей при симуляции верхней модели.
В этом примере PreLoadFcn верхней модели используется для выполнения скриптов MATLAB, которые создают данные рабочей области для верхней модели и типы для модели-ссылки. Ссылка на модель не использует никаких глобальных данных.
set_param('sldemo_mdlref_datamngt', ... 'PreLoadFcn', ['sldemo_mdlref_datamngt_wsdata; ', ... 'sldemo_mdlref_counter_datamngt_types']);
Как упоминалось ранее, ссылочная модель реализует алгоритм ограниченного счетчика с двумя триггерными входами. Алгоритм обнаруживает «восходящие ребра» в триггерных входах и реагирует следующим образом:
Сбрасывает счетчик, если первый вход триггера изменяется.
Увеличивает счетчик на заданную величину, если изменяется второй вход.
В этом примере вы управляете всем тремя образцами алгоритма счетчика с одинаковыми триггерными входами, сгенерированными подсистемой Stimulus. Период и шаг расчета входов триггера определяются значениями, введенными для параметров маски подсистемы Stimulus:
Сбрасывайте счетчик каждые 4 секунды.
Шаг счетчика 5 раз в секунду (период = 0,2 секунды).
Шаг расчета составляет 0,1 секунды.
ПРИМЕЧАНИЕ. Периоды сброса и шага должны быть как минимум в 2 раза больше, чем шаг расчета.
1. Сохраните или закройте ссылочную модель.
Вам нужно сохранить модель-ссылку, прежде чем она может быть использована верхней моделью. Кроме того, можно закрыть ссылочную модель и использовать исходную версию модели, предоставленную в этом примере.
2. Симулируйте верхнюю часть, выбрав команду Симуляция (Simulation) > Выполнить (Run).
ПРИМЕЧАНИЕ. Симуляция верхней части автоматически генерирует цель симуляции для модели-ссылки.
3. Проверьте результаты симуляции, отображаемые блоками Scope.
Чтобы сгенерировать код и создать автономный исполняемый файл для верхней части, откройте верхнюю часть, а затем нажмите Ctrl + B.
Кроме того, используйте rtwbuild
в командной строке MATLAB.
rtwbuild('sldemo_mdlref_datamngt')
ПРИМЕЧАНИЕ: Когда вы генерируете код для верхней части, Simulink Coder автоматически генерирует код для модели-ссылки. Используйте Embedded Coder™, чтобы сгенерировать встраиваемый код для производственного развертывания.
По умолчанию Simulink Coder генерирует автоматическое имя для типа структур параметров. Это имя уникально и детерминированно, но его нелегко распознать. Вы можете управлять этим именем типа, используя объекты Simulink .Parameter для определения структур параметров и Simulink объекты .Bus для определения типа.
1. Определите тип шины для аргумента модели с помощью редактора шины или путем ввода следующих команд в командной строке MATLAB:
CounterParamType = Simulink.Bus; CounterParamType.Elements = Simulink.BusElement; CounterParamType.Elements(1).Name = 'Increment'; CounterParamType.Elements(1).DataType = 'int8'; CounterParamType.Elements(2) = Simulink.BusElement; CounterParamType.Elements(2).Name = 'LowerLimit'; CounterParamType.Elements(2).DataType = 'int8'; CounterParamType.Elements(3) = Simulink.BusElement; CounterParamType.Elements(3).Name = 'UpperLimit'; CounterParamType.Elements(3).DataType = 'int8';
2. Измените существующий скрипт MATLAB, чтобы воссоздать этот объект шины.
Этот тип шины должен быть определен в базовом рабочем пространстве вместе с типом шины для ссылочных моделей выхода. Можно вручную изменить скрипт MATLAB, который задает типы для ссылочной модели, или использовать Simulink.saveVars, чтобы добавить эту переменную к существующему скрипту MATLAB.
Simulink.saveVars('sldemo_mdlref_counter_datamngt_types.m', 'CounterParamType', '-append');
3. Создайте Simulink. Параметры, чтобы задать аргументы модели.
Чтобы связать типы шин с аргументами модели, необходимо использовать Simulink. Параметр объекты вместо структур MATLAB в рабочем пространстве модели ссылочной модели.
CounterParams = Simulink.Parameter;
CounterParams.Value.Increment = 1;
CounterParams.Value.LowerLimit = -10;
CounterParams.Value.UpperLimit = 10;
CounterParams.DataType = 'Bus: CounterParamType';
CounterICs = Simulink.Parameter;
CounterICs.Value.Count = 0;
CounterICs.Value.OverflowState = SlDemoRangeCheck.InRange;
CounterICs.DataType = 'Bus: OutputType';
ПРИМЕЧАНИЕ. Когда вы устанавливаете тип данных объекта параметра как шину, можно использовать значения двойной точности для числовых полей структуры параметра. Simulink преобразует эти значения двойной точности в соответствующий тип числовых данных во время компиляции модели.
Можно вручную изменить скрипт MATLAB, который задает аргумент модели, или использовать Simulink.saveVars, чтобы обновить существующий скрипт MATLAB.
Simulink.saveVars('sldemo_mdlref_counter_datamngt_wsdata.m', '-update');
ПРИМЕЧАНИЕ. Когда вы используете опцию -update, вам не нужно задавать переменные, которые будут выписываться, потому что Simulink.saveVars записывает только значения переменных, уже заданные в скрипте MATLAB.
5. Перезагрузите содержимое рабочего пространства модели.
Вы изменили источник данных, который используется рабочей областью модели-ссылки. Если эта модель открыта, необходимо перезагрузить содержимое рабочего пространства модели.
Перезагрузить можно с помощью диалогового окна рабочего пространства модели или в командной строке MATLAB.
hWS = get_param('sldemo_mdlref_counter_datamngt', 'ModelWorkspace'); hWS.reload;
Можно использовать подобный подход для преобразования параметра структур в модели верхней части, чтобы использовать объекты Simulink. Параметр. Это строение позволяет управлять именем типа и управлять тем, как эти параметры появляются в сгенерированном коде.
1. Создайте Simulink объекты .Parameter с помощью класса памяти ExportedGlobal, чтобы определить структуры параметров для модели верхней части как экспортированные настраиваемые переменные в сгенерированном коде.
Param1 = Simulink.Parameter; Param1.Value.Increment = 1; Param1.Value.LowerLimit = -10; Param1.Value.UpperLimit = 10; Param1.DataType = 'Bus: CounterParamType'; Param1.CoderInfo.StorageClass = 'ExportedGlobal';
Param2 = Param1.copy; Param2.Value.Increment = 2;
IC1 = Simulink.Parameter; IC1.Value.Count = 0; IC1.Value.OverflowState = SlDemoRangeCheck.InRange; IC1.DataType = 'Bus: OutputType'; IC1.CoderInfo.StorageClass = 'ExportedGlobal';
IC2 = IC1.copy; IC2.Value.Count = -10;
2. Измените существующий скрипт MATLAB, чтобы воссоздать эти переменные рабочей области.
Можно вручную изменить скрипт MATLAB, который определяет параметры для верхней части, или использовать Simulink.saveVars, чтобы обновить существующий скрипт MATLAB.
Simulink.saveVars('sldemo_mdlref_datamngt_wsdata.m', '-update');
ПРИМЕЧАНИЕ. Когда вы используете опцию -update, вам не нужно задавать переменные, которые будут выписываться, потому что Simulink.saveVars записывает только значения переменных, уже заданные в скрипте MATLAB.
Чтобы сгенерировать код и создать автономный исполняемый файл для верхней части, откройте верхнюю часть, а затем нажмите Ctrl + B.
Кроме того, используйте rtwbuild
в командной строке MATLAB.