Этот пример показывает много инструментов и методов, которые составляют рабочий процесс для данных об управлении с моделью - ссылкой.
Для основного введения в эту тему см.: Введение в Данные об Управлении с Моделью - ссылкой.
Во время этого примера 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.