Этот пример показывает много инструментов и методов, которые составляют рабочий процесс для данных об управлении с моделью - ссылкой.
Для основного введения в эту тему см.: Введение в Данные об Управлении с Моделью - ссылкой.
Во время этого примера 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, чтобы просмотреть и отредактировать содержимое рабочего пространства модели.
Установите флажок Argument, чтобы сконфигурировать переменные в качестве образцовых аргументов.
Также можно установить список образцовых аргументов из командной строки MATLAB:
set_param('sldemo_mdlref_counter_datamngt', ... 'ParameterArgumentNames', 'CounterParams,CounterICs');
4. Исследуйте, как модель, на которую ссылаются, использует образцовые аргументы.
Много блоков в модели, на которую ссылаются, используют образцовые аргументы:
Блок Constant задает инкрементную сумму (CounterParams. Шаг).
Различные блоки в подсистеме "Проверки диапазона" используют значения нижних и верхних пределов (CounterParams. LowerLimit и CounterParams. UpperLimit).
Различные блоки используют начальное условие счетчика (CounterICs. Количество.
Корневой блок 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, чтобы получить 'кэшируемую' переменную информацию об использовании.
Модель, на которую ссылаются, приводит к двум результатам и группирует их в сигнал шины:
Количество: значение счетчика как 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 из меню File модели или установите его из командной строки 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 поле вывода.
Также можно установить параметры блоков из командной строки 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 для Встречных параметров
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']);
Как отмечалось ранее, реализации модели, на которые ссылаются, ограниченное отвечают на алгоритм двумя триггерными входными параметрами. Алгоритм обнаруживает "возрастающие ребра" в триггере, вводит и реагирует можно следующим образом:
Сбрасывает счетчик, если первый триггер вводил изменения.
Постепенно увеличивает счетчик заданной суммой, если второй вход изменяется.
В этом примере вы управляете всеми тремя экземплярами встречного алгоритма с теми же триггерными входными параметрами, сгенерированными подсистемой Стимула. Период и шаг расчета триггерных входных параметров заданы значениями, ввел для параметров маски подсистемы Стимула:
Сбрасывайте счетчик каждые 4 секунды.
Инкрементный счетчик 5 раз в секунду (период = 0,2 секунды).
Шаг расчета составляет 0,1 секунды.
ПРИМЕЧАНИЕ: Сброс и инкрементные периоды должны быть по крайней мере 2 раза шагом расчета.
1. Сохраните или закройте модель, на которую ссылаются.
Необходимо сохранить модель, на которую ссылаются, прежде чем она сможет использоваться топ-моделью. Также можно закрыть модель, на которую ссылаются, и использовать исходную версию модели, которой предоставляют этот пример.
2. Моделируйте топ-модель путем выбора Simulation> Run.
ПРИМЕЧАНИЕ: Симуляция топ-модели автоматически генерирует цель симуляции для модели, на которую ссылаются.
3. Рассмотрите результаты симуляции, как отображено блоками Scope.
Сгенерируйте код и создайте независимый исполняемый файл для топ-модели путем выбора Code> C/C ++ Code> Build Model.
rtwbuild('sldemo_mdlref_datamngt')
ПРИМЕЧАНИЕ: Когда вы генерируете код для топ-модели, Simulink Coder автоматически генерирует код для модели, на которую ссылаются. Используйте Embedded Coder™, чтобы сгенерировать встроенный код для производственного развертывания.
По умолчанию Simulink Coder генерирует автоматическое имя для типа структур параметра. Это имя уникально и детерминировано, но не легко распознать. Можно управлять этим именем типа при помощи Simulink. Объекты параметра, чтобы задать структуры параметра и Simulink. Соедините шиной объекты задать тип.
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');
ПРИМЕЧАНИЕ: Когда вы используете - опция обновления, вы не должны задавать переменные, которые будут выписаны, потому что Simulink.saveVars выписывает только значения переменных, уже заданных в скрипте MATLAB.
5. Перезагрузите содержимое рабочего пространства модели.
Вы изменили источник данных, который используется рабочей областью ссылаемой модели. Если эта модель открыта, необходимо перезагрузить содержимое рабочего пространства модели.
Можно перезагрузить при помощи диалогового окна рабочего пространства модели или в командной строке MATLAB.
hWS = get_param('sldemo_mdlref_counter_datamngt', 'ModelWorkspace'); hWS.reload;
Можно использовать аналогичный подход, чтобы преобразовать структуры параметра в топ-модели, чтобы использовать Simulink. Объекты параметра. Эта настройка дает вам контроль над именем типа и позволяет вам управлять, как эти параметры появляются в сгенерированном коде.
1. Создайте Simulink. Объекты параметра с классом памяти 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');
ПРИМЕЧАНИЕ: Когда вы используете - опция обновления, вы не должны задавать переменные, которые будут выписаны, потому что Simulink.saveVars выписывает только значения переменных, уже заданных в скрипте MATLAB.
Сгенерируйте код и создайте независимый исполняемый файл для топ-модели путем выбора Code> C/C ++ Code> Build Model.