Программируйте функцию MATLAB в графике

Функция MATLAB® в графике Stateflow® является графическим элементом, который вы используете, чтобы написать алгоритмы, которые легче реализовать путем вызова встроенных функций MATLAB. Этот тип функции полезен для алгоритмов кодирования, которые более легко описываются при помощи MATLAB вместо графических построений Stateflow. Для получения дополнительной информации смотрите Повторное использование код MATLAB путем Определения функций MATLAB.

В функции MATLAB можно вызвать эти типы функций:

  • Локальные функции заданы в теле функции MATLAB.

  • Графический, Simulink®, таблица истинности и другие функции MATLAB в графике.

  • Встроенные функции MATLAB та генерация кода поддержки. Эти функции генерируют код С для создания целей, которые соответствуют памяти и требованиям типа данных встроенных сред.

  • Внешние функции MATLAB, которые не поддерживают генерацию кода. Эти функции выполняются только в рабочем пространстве MATLAB в процессе моделирования модели. Для получения дополнительной информации смотрите функции MATLAB Значения внешних параметров Вызова в диаграммах Stateflow.

  • Simulink Design Verifier™ функционирует для свойства, доказывающего и генерации тестов. Эти функции включают:

В этом примере показано, как создать модель с диаграммой Stateflow, которая вызывает две функции MATLAB, meanstats и stdevstats:

  • meanstats вычисляет среднее значение значений в vals.

  • stdevstats вычисляет стандартное отклонение для значений в vals.

Создайте модель

Выполните эти шаги:

  1. Создайте новую модель со следующими блоками:

  2. Сохраните модель как call_stats_function_stateflow.

  3. В модели дважды кликните блок Chart.

  4. Перетащите две функции MATLAB в пустой график с помощью этого значка из панели инструментов:

    Текстовое поле с высвечивающимся курсором появляется посреди каждой функции MATLAB.

  5. Пометьте каждую функцию как показано:

    Необходимо пометить функцию MATLAB ее подписью. Используйте следующий синтаксис:

    [return_val1, return_val2,...] = function_name(arg1, arg2,...)
    

    Можно задать несколько возвращаемых значений и несколько входных параметров, как показано в синтаксисе. Каждое возвращаемое значение и входной параметр могут быть скаляром, вектором или матрицей значений.

    Совет

    Для функций MATLAB только с одним возвращаемым значением можно не использовать скобки в метке подписи.

  6. В графике вовлеките переход по умолчанию в завершающий работу перекресток с этим действием условия:

    {
    mean = meanstats(invals);
    stdev = stdevstats(invals);
    }
    

    График должен выглядеть примерно так:

    Совет

    Если формальные аргументы функциональной подписи являются скалярами, проверяют, что вводы и выводы вызовов функции следуют правилам скалярного расширения. Для получения дополнительной информации смотрите Значения Присвоения ко Всем Элементам Матрицы.

  7. Во вкладке Modeling, под Design Data, выбирают Model Explorer.

  8. В панели Model Hierarchy Model Explorer выберите функциональный meanstats.

    Панель Contents отображает входной параметр vals и выходной аргумент meanout. Оба - скаляры типа double по умолчанию.

  9. Дважды кликните vals строка в соответствии со столбцом Размера, чтобы установить размер vals к 4.

  10. В панели Model Hierarchy Model Explorer выберите функциональный stdevstats и повторите предыдущий шаг.

  11. В панели Model Hierarchy Model Explorer выберите Chart и добавьте следующие данные:

    Имя

    Осциллограф

    Размер

    invals

    Input

    4

    mean

    Output

    Скаляр (никакое изменение)

    stdev

    Output

    Скаляр (никакое изменение)

    Необходимо теперь видеть следующие данные в Model Explorer.

    После того, как вы добавляете данные invalsсреднее значение, и stdev к графику соответствующие порты ввода и вывода появляются на блоке Stateflow в модели.

  12. Соедините Постоянные блоки и блоки Отображения к портам блока Chart и сохраните модель.

Функции MATLAB программы

Программировать функции meanstats и stdevstats, выполните эти шаги:

  1. Откройте график в модели call_stats_function_stateflow.

  2. В графике откройте функциональный meanstats.

    Функциональный редактор появляется с заголовком:

    function meanout = meanstats(vals)

    Этот заголовок взят из функциональной метки в графике. Можно отредактировать заголовок напрямую в редакторе, и изменения появляются в графике после того, как вы закрываете редактор.

  3. На линии после функционального заголовка, введите:

    %#codegen

    %#codegen директива компиляции помогает обнаружить нарушения времени компиляции синтаксиса и семантики в функциях MATLAB, поддержанных для генерации кода.

  4. Введите пробел линии и этот комментарий:

    % Calculates the statistical mean for vals
    
  5. Добавьте линию:

    len = length(vals);
    

    Функция length пример встроенной функции MATLAB, которая поддерживается для генерации кода. Можно вызвать эту функцию непосредственно, чтобы возвратить длину вектора ее аргумента vals. Когда вы создаете цель симуляции, функциональная длина реализована со сгенерированным кодом C. Функции, поддерживаемые для генерации кода, появляются в Функциях и Объектах, Поддержанных для Генерации кода C/C++ (MATLAB Coder).

    Переменная len пример неявно заявленных локальных данных. Это имеет тот же размер и тип как значение, присвоенное ему — значение, возвращенное функциональным length, скалярный double. Чтобы узнать больше об объявлении переменных, смотрите Основы Определения данных (MATLAB Coder).

    Функция MATLAB обрабатывает неявно объявленные локальные данные как временные данные, которые существуют только, когда функция вызвана и исчезает, когда функция выходит. Можно объявить, что локальные данные для функции MATLAB в графике являются персистентными при помощи persistent создать.

  6. Введите эту линию, чтобы вычислить значение meanout:

    meanout = avg(vals,len);
    

    Функциональный meanstats хранит среднее значение vals в данных Stateflow meanout. Поскольку эти данные заданы для родительской диаграммы Stateflow, можно использовать их непосредственно в функции MATLAB.

    Двумерные массивы с одной строкой или столбцом элементов обработаны как векторы или матрицы в функциях MATLAB. Например, в meanstats, аргумент vals четырехэлементный вектор. Можно получить доступ к четвертому элементу этого вектора с матричным обозначением vals(4,1) или векторное обозначение vals(4).

    Функция MATLAB использует функции avg и sum вычислить значение meanсумма функция, поддерживаемая для генерации кода. avg локальная функция, которую вы задаете позже. При решении имен функций функции MATLAB в графике ищут локальные функции сначала, сопровождаемый функциями, поддерживаемыми для генерации кода.

    Примечание

    Если вы вызываете функцию, которую функция MATLAB не может разрешить как локальная функция или функция для генерации кода, необходимо объявить, что функция значение внешних параметров.

  7. Теперь введите этот оператор:

    coder.extrinsic('plot');
  8. Введите эту линию, чтобы построить входные значения в vals против их векторного индекса.

    plot(vals,'-+');
    

    Вспомните, что вы объявили plot быть внешней функцией, потому что это не поддерживается для генерации кода. Когда функция MATLAB сталкивается с внешней функцией, она отправляет вызов рабочего пространства MATLAB для выполнения в процессе моделирования.

  9. Теперь задайте локальную функцию avg, можно следующим образом:

    function mean = avg(array,size)
    mean = sum(array)/size;
    

    Заголовок для avg задает два аргумента, array и size, и одно возвращаемое значение, mean. Локальная функция avg вычисляет среднее значение элементов в array путем деления их суммы на значение аргумента size.

    Полный код для функционального meanstats выглядит так:

    function meanout = meanstats(vals)
    %#codegen
    
    % Calculates the statistical mean for vals
    
    len = length(vals);
    meanout = avg(vals,len);
    
    coder.extrinsic('plot');
    plot(vals,'-+');
    
    function mean = avg(array,size)
    mean = sum(array)/size;
    
  10. Сохраните модель.

  11. Назад в графике, откройте функциональный stdevstats и добавьте код, чтобы вычислить стандартное отклонение значений в vals. Полный код должен выглядеть так:

    function stdevout = stdevstats(vals)
    %#codegen
    
    % Calculates the standard deviation for vals
    
    len = length(vals);
    stdevout = sqrt(sum(((vals-avg(vals,len)).^2))/len);
    
    function mean = avg(array,size)
    mean = sum(array)/size;
  12. Сохраните модель снова.