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

Этот пример показывает, как создать модель с графиком 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. В графике дважды кликните функциональный meanstats, чтобы отредактировать его тело функции в редакторе.

  8. В функциональном редакторе выберите Tools> Model Explorer, чтобы открыть Model Explorer.

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

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

  10. Назад в графике, дважды кликните функциональный stdevstats и повторите предыдущие два шага.

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

    Имя

    Осциллограф

    Размер

    invals

    Input

    4

    mean

    Output

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

    stdev

    Output

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

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

    После того, как вы добавите данные invals, mean и 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. 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. Сохраните модель снова.