В этом примере показано, как создать модель, которая использует блок MATLAB Function для вычисления среднего и стандартного отклонения для вектора значений.
Создайте новый Simulink® модели и вставки блока MATLAB Function из библиотеки User-Defined Functions.
Добавьте блок Constant и установите его значение на вектор [2 3 4 5]
. Добавьте два блока Display к модели.
Сохраните модель как call_stats_block1
.
Запрограммируйте блок, чтобы вычислить среднее и стандартное отклонение для вектора значений:
Дважды кликните MATLAB Function блок. Сигнатура функции по умолчанию появится в редакторе блоков MATLAB Function. Запишите любой код в определенные сигнатуры функции.
Отредактируйте линию заголовка функции:
function [mean,stdev] = stats(vals)
Из этого кода вы задаете функцию, вызываемую stats
, который вычисляет статистическое среднее и стандартное отклонение для значений в векторе vals
. Заголовок функции объявляет vals
как аргумент к stats
функция, с mean
и stdev
как возвращаемые значения.
В редакторе MATLAB Function блоков введите пространство линий после заголовка функции и добавьте следующий код:
% Calculates a statistical mean and a standard % deviation for the values in vals. len = length(vals); mean = avg(vals,len); stdev = sqrt(sum(((vals-avg(vals,len)).^2))/len); plot(vals,'-+'); function mean = avg(array,size) mean = sum(array)/size;
Завершите соединения с блоком MATLAB Function, как показано на рисунке.
Сохраните модель как call_stats_block2
.
После программирования блока в модели Simulink можно создать функцию и протестировать на ошибки. Для создания блока MATLAB Function требуется поддерживаемый компилятор. MATLAB® автоматически выбирает компилятор по умолчанию. Если в системе установлено несколько поддерживаемых MATLAB компиляторов, можно изменить компилятор по умолчанию с помощью mex -setup
команда. См. Раздел «Изменение компилятора по умолчанию».
Смотрите список компиляторов для создания моделей, содержащих симуляцию блоков MATLAB Function и генерацию кода.
Перейдите на страницу Поддерживаемые и совместимые компиляторы и выберите свою платформу.
Перейдите к таблице в разделе «Семейство продуктов Simulink».
Чтобы проверить таблицу для моделей, которые содержат блоки MATLAB Function для симуляции, найдите компиляторы, проверенные в столбце с названием Simulink For Model Referencing, Accelerator mode, Rapid Accelerator mode, and MATLAB Function blocks
.
Чтобы проверить таблицу для моделей, которые содержат блоки MATLAB Function и генерируют код, найдите компиляторы, проверенные в столбце под названием
Simulink Coder™
.
Чтобы сгенерировать код для моделей, которые содержат блоки MATLAB Function, можно использовать любой из компиляторов C, поддерживаемых программным обеспечением Simulink, для генерации кода с Simulink Coder. Список этих компиляторов:
Перейдите на веб-страницу Поддерживаемые и совместимые компиляторы.
Выберите свою платформу.
В таблице для Simulink и связанных с ним продуктов найдите компиляторы, проверенные в столбце под названием Simulink Coder.
Если в процессе сборки возникают ошибки, в Diagnostics Viewer окне перечисляются ошибки со ссылками на нарушающий код.
В следующем упражнении показан способ найти и исправить ошибку в блоке MATLAB Function.
В stats
function, изменить локальную функцию avg
к фиктивной локальной функции aug
и повторите компиляцию, чтобы увидеть следующие сообщения в окне. В Diagnostics Viewer окне отображается каждая обнаруженная ошибка с заштрихованной красной линией.
Исследуйте ошибку под названием Undefined function or variable 'aug'
. В диагностическом сообщении для выбранной ошибки щелкните синюю ссылку после имени функции, чтобы отобразить нарушающий код. Автономная линия появляется подсвеченной в MATLAB Function Block Editor
.
Сообщение также ссылается на отчет о информации о типах во время компиляции для переменных и выражений в функциях MATLAB. Эта информация помогает вам диагностировать сообщения об ошибке и понять правила распространения типов. Для получения дополнительной информации об отчете смотрите Отчеты о функциях MATLAB. Чтобы увидеть отчет, щелкните подсвеченную синюю ссылку в линии называется Launch diagnostic report
Исправьте ошибку, изменив aug
назад к avg
и перекомпилировать.
По умолчанию входные параметры функции и выходы наследуют свой тип данных и размер от сигналов, присоединенных к их портам. Исследуйте входные и выходные данные для блока MATLAB Function, чтобы убедиться, что он наследует правильный тип и размер.
Дважды кликните MATLAB Function блок stats
.
В редакторе блоков MATLAB function выберите Edit Data. The Ports and Data Manager
открывает, чтобы помочь вам задать аргументы для блоков MATLAB Function.
На левой панели отображается аргумент vals
и возврат значения mean
и stdev
который вы уже создали для блока MATLAB Function. Наблюдайте за этим vals
присваивается возможности Input
, что сокращение от Input from Simulink. mean
и stdev
назначены Возможности Output
, что сокращение от выход до Simulink.
На левой панели Диспетчера портов и данных щелкните в любом месте строки для vals
чтобы выделить его.
На правой панели отображается диалоговое окно «Свойства данных» для vals
. По умолчанию класс, размер, модули и сложность входа и выходных аргументов наследуются от сигналов, присоединенных к каждому входу или выходу порту. Наследование определяется установкой параметра Size на -1
, Сложность в Inherited
, и введите в Inherit: Same as Simulink
.
Фактические унаследованные значения размера и типа задаются во время компиляции модели и отображаются в столбцах Скомпилированный тип и Скомпилированный размер левой панели.
Можно задать тип входа или выходного аргумента в поле Type диалогового окна Свойств данных, для примера, double
. Можно также задать размер входного или выходного аргумента путем ввода выражения в поле Size. Для примера можно ввести [2 3]
в поле Size для задания vals
как 2-by-3
матрица. Смотрите Аргументы функции типа и Аргументы функции размера для получения дополнительной информации о выражениях, которые можно ввести для типа и размера.
Примечание
Первый индекс по умолчанию для любых массивов, которые вы добавляете к функции MATLAB Function блока 1
, так же, как это было бы в MATLAB.
Существует два программных подхода к конфигурированию блока MATLAB Function:
Использование MATLABFunctionConfiguration
объект для запроса и изменения свойств блока. Можно идентифицировать блок в модели, используя путь блока или вызывая gcb
функция.
Использование Stateflow.EMChart
объект для доступа к входам, выходам и свойствам блока. Идентифицируйте блок в модели путем навигации по иерархии Stateflow® Объекты API.
Рассмотрим модель call_stats_block1
описан в предыдущем примере. Вы можете получить доступ к MATLABFunctionConfiguration
объект для блока MATLAB Function в этой модели вызовом get_param
функция:
config = get_param('call_stats_block1/MATLAB Function', ... 'MATLABFunctionConfiguration');
Чтобы запросить или изменить свойства в объекте строения, используйте запись через точку с именем объекта:
myConfig.UpdateMethod
ans = 'Inherited'
config.Description = 'Calculate the mean and standard deviation for a vector of values.';
Дополнительные сведения о свойствах, которые можно изменить в объекте строения MATLAB Function, см. в разделе MATLABFunctionConfiguration
.
Для большего программного управления вашим MATLAB Function блоком получите доступ к его Stateflow.EMChart
объект вызовом find
(Stateflow) функция для Simulink.Root
объект на верхнем уровне иерархии объектов Stateflow.
rt = sfroot; block = find(rt,'-isa','Stateflow.EMChart', ... 'Path','call_stats_block1/MATLAB Function');
Чтобы запросить или изменить свойства в объекте строения, используйте запись через точку с именем объекта:
block.ChartUpdate
ans = 'INHERITED'
block.Description = 'Calculate the mean and standard deviation for a vector of values.';
The Stateflow.EMChart
Объект предоставляет вам доступ к дополнительным свойствам, которые недоступны в MATLABFunctionConfiguration
объект. Например, чтобы создать table
из входов и выходов блока введите:
info = get([block.Inputs;block.Outputs],{'Name','Scope','Port'}); T = table(info(:,2),cell2mat(info(:,3)), ... 'VariableNames',{'Scope','Port'}, ... 'RowNames',info(:,1)); T.Scope = categorical(T.Scope)
T = 3×2 table Scope Port ______ ____ vals Input 1 mean Output 1 stdev Output 2
Для получения дополнительной информации смотрите Обзор Stateflow API (Stateflow).
Чтобы сгенерировать код из алгоритма MATLAB в блоке MATLAB Function, необходимо явным образом присвоить класс, размер и сложность локальных переменных, прежде чем использовать их в операциях или возвращать их в качестве выходов (см. Определение данных для генерации кода). В функцию , взятую в качестве примера, stats
, локальная переменная len
определяется перед использованием для вычисления среднего и стандартного отклонения:
len = length(vals);
Если вы присваиваете свойства переменной, вы не можете переопределить ее класс, размер или сложность в другом месте тела функции за некоторыми исключениями (см. «Переназначение свойств переменной»).
Откройте call_stats_block2
модель, которую вы сохранили в конце Program the Блока MATLAB function.
Дважды кликните stats
блок.
Выберите Build Model > Build, чтобы скомпилировать и создать модель примера.
Если вы получите ошибку, связанную с Variable-step
решатель, от Configuration Parameters > Solver, смените тип решателя на Fixed-step
решатель и перезапустите сборку. Чтобы узнать больше о различиях между решателями с фиксированным шагом и переменным шагом, смотрите Fixed-Step Versus Variable-Step Solvers.
Если ошибок не происходит, в Diagnostics Viewer окне отображается сообщение об успехе. В противном случае это окно поможет вам найти ошибки, как описано в разделе Locate и Fix Errors.
add_block
| gcb
| get_param
| MATLAB Function | MATLABFunctionConfiguration
| Stateflow.EMChart
| table