Этот пример показывает много инструментов и методов, которые составляют рабочий процесс для данных управления с моделью - ссылкой.
Для основного введения в эту тему см.: Введение в Данные Управления с Моделью - ссылкой.
Во время этого примера 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
), который содержит три Блока модели: Counter1, Counter2 и Counter3. Эти блоки ссылаются на ту же модель (sldemo_mdlref_counter_datamngt
).
Модель, на которую ссылаются, реализует ограниченный встречный алгоритм что:
Сбрасывает счетчик, если первый триггер вводил изменения
Постепенно увеличивает счетчик заданной суммой, если второй входной параметр изменяется
Насыщает счетчик между заданным верхним и нижними пределами
Образцовые выходные параметры, на которые ссылаются, сигнал шины, который содержит:
Количество: значение счетчика как 8-битное целое число
OverflowState: перечисляемое значение, которое указывает, является ли счетчик в верхнем пределе, нижнем пределе, или в области значений
Эта модель сконфигурирована, чтобы показать много сотрудничества функций Simulink:
Структуры настраиваемого параметра: Соберите переменные в структуру MATLAB, которая параметризовала модель. В этом примере образцовые аргументы модели, на которую ссылаются, заданы как структуры параметра.
Образцовые аргументы: Передайте различные значения параметров каждому экземпляру модели - ссылки.
Объекты шины: Задайте "форму" структур для сигналов и параметров, используемых в интерфейсе модели - ссылки. Задайте имя типа для параметров структуры и сигналов в сгенерированном коде.
Simulink. Bus.createMATLABStruct: Статический метод для создания структуры MATLAB, которая совпадает с формой объекта шины.
Инициализация шины: Использует структуру параметра, чтобы инициализировать сигналы шины и состояния.
Блок модели маскированный: Создает индивидуально настраиваемый интерфейс для блока модели - ссылки.
Инициированная модель - ссылка: Явное управление планированием компонентов.
Этот пример также использует другие функции, которые полезны для данных управления в Simulink:
Simulink.saveVars: Сериализируйте переменные рабочей области к скрипту MATLAB. Поддерживает инкрементную модификацию, данные differencing и система контроля версий.
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 дает возможность создавать и изменять структуру параметра вне модели. Это также упрощает инкрементные изменения, систему контроля версий и данные differencing.
Установите источник данных в диалоговом окне рабочего пространства модели.
Также можно установить источник данных из командной строки MATLAB:
hWS = get_param('sldemo_mdlref_counter_datamngt', 'ModelWorkspace'); hWS.DataSource = 'MATLAB File'; hWS.FileName = 'sldemo_mdlref_counter_datamngt_wsdata.m'; hWS.reload;
Можно использовать Образцовый Проводник, чтобы просмотреть и отредактировать содержимое рабочего пространства модели.
Установите флажок 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');
Примечание: В целом, при инициализации сигнала шины или состояния, структура параметра не должна совпадать с типом шины точно, но его поля должны быть подмножеством элементов в объекте шины, и атрибуты этих полей должны совпадать с элементами в объекте шины.
Часто полезно замаскировать модель, на которую ссылаются, чтобы настроить пользовательский интерфейс. Можно создать маску на модели и затем сослаться на него от Блока модели. Чтобы замаскировать модель, нажмите Create Model Mask в разделе рабочего пространства модели Образцового Проводника для модели.
Когда вы ссылаетесь на модель маскированную от Блока модели, маска сгенерирована автоматически на Блоке модели. Для получения дополнительной информации смотрите, что тема Создает и Ссылается на Модель Маскированную.
Модель, на которую ссылаются, сконфигурирована, чтобы принять структуру для ее образцового аргумента. Этот пример вызывает каждый экземпляр модели, на которую ссылаются, с различными значениями параметров.
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. Установите параметры маски на Блоках модели маскированных, чтобы использовать эти параметры.
Например, параметры первого Блока модели ('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.