В этом примере показано, как создать модель, которая использует блок 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