В этом примере показано, как создать модель, которая использует блок 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;
Сохраните модель как call_stats_block2
.
После программирования блока в модели Simulink можно создать функцию и протестировать на ошибки. Создание вашего блока MATLAB Function требует поддерживаемого компилятора. MATLAB® автоматически выбирает тот как компилятор по умолчанию. Если у вас есть несколько поддерживаемых MATLAB компиляторов, установленных в вашей системе, можно изменить компилятор по умолчанию с помощью mex -setup
команда. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Просмотрите список компиляторов для того, чтобы создать модели, содержащие симуляцию блоков MATLAB Function и генерацию кода.
Перейдите к странице Supported и Compatible Compilers и выберите свою платформу.
Прокрутите к таблице под Семейством продуктов 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
функция, измените локальную функцию 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. Ports and Data Manager
открывается, чтобы помочь вам задать аргументы для блоков MATLAB Function.
Левая панель отображает аргумент vals
и возвращаемые значения mean
и stdev
то, что вы уже создали для блока MATLAB Function. Наблюдайте тот vals
присвоен Осциллограф Input
, который является сокращением от Входа от 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 в модели и изменить свойства, которые принадлежат этой модели. Запрашивать свойства в call_stats_block2
смоделируйте вы только создали, создайте объект настройки.
myconfig = get_param('call_stats_block2/MATLAB Function', 'MATLABFunctionConfiguration')
myconfig = MATLABFunctionConfiguration with properties: Path: 'call_stats_block2/MATLAB Function' FunctionScript: 'function [mean,stdev] = stats(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;↵' UpdateMethod: Inherited SampleTime: '-1' Description: '' DocumentLink: '' SupportVariableSizing: 1 AllowDirectFeedthrough: 1 SaturateOnIntegerOverflow: 1 TreatAsFi: FixedPoint FimathMode: SameAsMATLAB Fimath: 'fimath('RoundingMethod','Nearest','OverflowAction','Saturate','ProductMode','FullPrecision','SumMode','FillPrecision')'
myconfig.Description = 'This model outputs the mean and standard deviation values of an array'
MATLABFunctionConfiguration
.Чтобы сгенерировать код из алгоритма MATLAB в блоке MATLAB Function, необходимо явным образом присвоить класс, размер и сложность локальных переменных перед использованием их в операциях или возврате их как выходные параметры (см. Определение данных для Генерации кода). В функции, взятой в качестве примера, stats
, локальная переменная len
задан прежде чем быть раньше вычислить среднее и стандартное отклонение:
len = length(vals);
Если вы присваиваете свойства переменной, вы не можете переопределить ее класс, размер или сложность в другом месте в теле функции за некоторыми исключениями (см. Переназначение Variable Properties).
Откройте call_stats_block2
модель, что вы сохраненный в конце Программы блок MATLAB function.
Дважды кликните stats
блок.
Выберите Build Model> Build, чтобы скомпилировать и создать модель в качестве примера.
Если вы связали ошибку с Variable-step
решатель, от Configuration Parameters> Solver, изменяет тип решателя в Fixed-step
решатель и повторно выполненный сборка. Чтобы узнать больше о различиях между фиксированным шагом и решателями переменного шага, смотрите Фиксированный Шаг По сравнению с Решателями Переменного Шага.
Если никакие ошибки не происходят, окно Diagnostics Viewer отображает сообщение, указывающее на успех. В противном случае это окно помогает, вы определить местоположение ошибок, как описано в Определяете местоположение и Фиксируете Ошибки.
В этом примере показано, как программно добавить блок MATLAB Function в модель и заполнить блок с кодом MATLAB. Если вы уже имеете код MATLAB и не хотите добавлять его в блок MATLAB Function вручную, этот рабочий процесс может быть удобным.
Создайте и сохраните модель под названием myModel
.
Создайте MATLAB function со следующим кодом и сохраните его в myAdd.m
.
function c = myAdd(a, b)
c = a + b;
Запишите скрипт MATLAB, который добавляет блок MATLAB Function в myModel
и заполняет его с содержимым myAdd.m
.
% Add a MATLAB Function block to a model and populate the block with MATLAB % code. % % Copyright 2018 The Mathworks, Inc. open_system('myModel.slx'); libraryBlockPath = 'simulink/User-Defined Functions/MATLAB Function'; newBlockPath = 'myModel/myBlockName'; % Add a MATLAB Function to the model add_block(libraryBlockPath, newBlockPath); % In memory, open models and their parts are represented by a hierarchy of % objects. The root object is slroot. This line of the script returns the % object that represents the new MATLAB Function block: blockHandle = find(slroot, '-isa', 'Stateflow.EMChart', 'Path', newBlockPath); % The Script property of the object contains the contents of the block, % represented as a character vector. This line of the script loads the % contents of the file myAdd.m into the Script property: blockHandle.Script = fileread('myAdd.m'); % Alternatively, you can specify the code directly in a character vector. % For example: % blockHandle.Script = 'function c = fcn (a, b)';
Запустите скрипт и наблюдайте новый блок MATLAB Function в myModel
.
Чтобы видеть код, который вы добавили в блок, дважды кликните myBlockName
блок.