Программируйте функцию 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 строка под столбцом Size, чтобы задать размер vals на 4.

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

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

    Имя

    Возможности

    Размер

    invals

    Input

    4

    mean

    Output

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

    stdev

    Output

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

    Теперь вы должны увидеть следующие данные в Model Explorer.

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

  12. Соедините блоки Constant и Display с портами блока Chart и сохраните модель.

Программные функции MATLAB

Для программирования функций meanstats и stdevstats, выполните следующие шаги:

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

  2. На графике откройте функцию meanstats.

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

    function meanout = meanstats(vals)

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

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

    %#codegen

    The %#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 в meanout данных Stateflow. Поскольку эти данные определены для родительской диаграммы Stateflow, можно использовать их непосредственно в функции MATLAB.

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

    Функция MATLAB использует функции avg и sum для вычисления значения mean. sum - функция, поддерживаемая для генерации кода. 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. Сохраните модель еще раз.