Доступ к функциям MATLAB и данным о рабочей области в графиках C

Графики Stateflow® в моделях Simulink® имеют свойство языка действия, которое задает синтаксис для действий перехода и состояния. Значок в нижнем левом углу холста графика указывает на язык действия для графика.

  • MATLAB® как язык действия.

  • C как язык действия.

В графиках, которые используют C в качестве языка действия, можно вызвать встроенные функции MATLAB и переменные рабочего пространства MATLAB доступа при помощи оператора пространства имен ml или функции ml.

Внимание

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

Оператор пространства имен ml

Для графиков C оператор пространства имен ml использует обозначение (.) точки стандарта для ссылочных переменных MATLAB и функций. Например, оператор a = ml.x возвращает значение переменной x рабочего пространства MATLAB к данным Stateflow a.

Для функций синтаксис следующие:

[return_val1, return_val2,...] = ml.matfunc(arg1, arg2,...)

Например, оператор [a, b, c] = ml.matfunc(x, y) передает возвращаемые значения от функции MATLAB matfunc к данным Stateflow a, b и c.

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

Примеры

В этих примерах x, y и z являются переменными рабочей области, и d1 и d2 являются данными Stateflow:

  • a = ml.sin(ml.x)

    В этом примере функция MATLAB sin оценивает синус x, который затем присвоен переменной данных Stateflow a. Однако, потому что x является переменной рабочей области, необходимо использовать оператор пространства имен, чтобы получить доступ к нему. Следовательно, ml.x используется вместо только x.

  • a = ml.sin(d1)

    В этом примере функция MATLAB sin оценивает синус d1, который присвоен переменной данных Stateflow a. Поскольку d1 является данными Stateflow, можно получить доступ к нему непосредственно.

  • ml.x = d1*d2/ml.y

    Результат выражения присвоен x. Если x не существует до симуляции, он автоматически создается в рабочем пространстве MATLAB.

  • ml.v[5][6][7] = ml.matfunc(ml.x[1][3], ml.y[3], d1, d2, 'string')

    Переменные x и y рабочей области являются массивами. x[1][3] является элементом (1,3) двумерной переменной типа массив x. , y[3] является третьим элементом одномерной переменной типа массив y. Последний аргумент, ' string ', является вектором символов.

    Возврат от вызова до matfunc присвоен элементу (5,6,7) массива рабочей области, v. Если v не существует до симуляции, он автоматически создается в рабочем пространстве MATLAB.

Функция ml

Для графиков C можно использовать функцию ml, чтобы задать вызовы функций MATLAB. Формат для вызова функции ml использует это обозначение:

ml(evalString, arg1, arg2,...);

evalString является выражением, которое выполнено в рабочем пространстве MATLAB. Это содержит команду MATLAB (или набор команд, каждый разделенный точкой с запятой), чтобы выполниться наряду со спецификаторами формата (%g, %f, %d, и т.д.), которые обеспечивают отформатированную замену других аргументов (arg1, arg2, и т.д.) в evalString.

Спецификаторы формата, используемые в функциях ml, совпадают с используемыми в функциях C printf и sprintf. Вызов функции ml эквивалентен вызову функции eval MATLAB с оператором пространства имен ml, если аргументы arg1, arg2,... ограничиваются скалярами или литералами в следующей команде:

ml.eval(ml.sprintf(evalString, arg1, arg2,...))

Программное обеспечение Stateflow принимает скалярные возвращаемые значения от оператора пространства имен ml и вызовов функции ml, когда они используются в качестве аргументов в этом контексте. Смотрите, Как Графики Выводят Размер Возврата для ml Выражений.

Примеры

В этих примерах x является переменной рабочего пространства MATLAB, и d1 и d2 являются данными Stateflow:

  • a = ml('sin(x)')

    В этом примере, вызовы функции ml функция MATLAB sin, чтобы оценить синус x в рабочем пространстве MATLAB. Результат затем присвоен переменной данных Stateflow a. Поскольку x является переменной рабочей области, и sin(x) оценен в рабочем пространстве MATLAB, вы вводите его непосредственно в аргумент evalString ('sin(x)').

  • a = ml('sin(%f)', d1)

    В этом примере функция MATLAB sin оценивает синус d1 в рабочем пространстве MATLAB и присваивает результат переменной данных Stateflow a. Поскольку d1 является данными Stateflow, его значение вставляется в аргумент evalString ('sin(%f)') с помощью выражения формата %f. Это означает это, если d1 = 1.5, выражение, выполненное в рабочем пространстве MATLAB, является sin(1.5).

  • a = ml('matfunc(%g, ''abcdefg'', x, %f)', d1, d2)

    В этом примере выражение 'matfunc(%g, ''abcdefg'', x, %f)' является evalString, показанный в предыдущем операторе формата. Данные Stateflow d1 и d2 вставляются в то выражение со спецификаторами формата %g и %f, соответственно. ''abcdefg'' является литералом, заключенным с двумя одной парами кавычек, потому что это - часть выражения анализа, которое уже заключено в одинарные кавычки.

  • sfmat_44 = ml('rand(4)')

    В этом примере квадратная матрица 4 на 4 случайных чисел между 0 и 1 возвращена и присвоена данным Stateflow sf_mat44. Данные Stateflow sf_mat44 должны быть заданы как массив 4 на 4 перед симуляцией. Если его размер отличается, ошибка несоответствия размера сгенерирована во время времени выполнения.

Выражения ml

Для графиков C можно смешать оператор пространства имен ml и выражения function ml наряду с данными Stateflow в больших выражениях. Следующий пример придает квадратную форму sine и cosine угла в переменной X рабочей области и добавляет их:

ml.power(ml.sin(ml.X),2) + ml('power(cos(X),2)')

Первый операнд использует оператор пространства имен ml, чтобы вызвать функцию sin. Его аргументом является ml.X, поскольку X находится в рабочем пространстве MATLAB. Второй операнд использует функцию ml. Поскольку X находится в рабочей области, это появляется в выражении evalString как X. Обработка на квадрат каждого операнда выполняется с функцией power MATLAB, которая берет два аргумента: значение к квадрату и значение степени, 2.

Выражения с помощью оператора пространства имен ml и функции ml могут использоваться в качестве аргументов для оператора пространства имен ml и выражений function ml. Следующие вложенные множества в качестве примера выражения ml на трех разных уровнях:

a = ml.power(ml.sin(ml.X + ml('cos(Y)')),2)

В создании ваших выражений ml выполните уровнями до конца набора приоритета в Бинарных операциях. Используйте круглые скобки вокруг выражений степени с оператором ^, когда вы будете использовать их в сочетании с другими арифметическими операторами.

Программное обеспечение Stateflow проверяет выражения на несоответствия размера данных в ваших действиях во время парсинга графиков и в течение времени выполнения. Поскольку возвращаемые значения для выражений ml не известны до времени выполнения программное обеспечение Stateflow должно вывести размер их возвращаемых значений. Смотрите, Как Графики Выводят Размер Возврата для ml Выражений.

Который ml я должен использовать?

В большинстве случаев обозначение оператора пространства имен ml является более прямым. Однако использование вызова функции ml действительно предлагает несколько преимуществ:

  • Используйте функцию ml, чтобы динамически создать переменные рабочей области.

    Следующая блок-схема создает четыре новых матрицы MATLAB:

    Цикл for создает четыре новых матричных переменные в рабочем пространстве MATLAB. Переход по умолчанию инициализирует счетчик Stateflow i к 0, в то время как сегмент перехода между лучшими двумя соединениями постепенно увеличивает его 1. Если i - меньше чем 5, сегмент перехода назад к главному соединению оценивает вызов функции ml ml('A%d = rand(%d)',i,i) для текущего значения i. Когда i больше, чем или равен 5, сегмент перехода между нижней частью, два соединения происходят и остановки выполнения.

    Переход выполняет следующие команды MATLAB, которые создают скаляр рабочей области (A1) и три матрицы (A2, A3, A4):

    A1 = rand(1)
    A2 = rand(2)
    A3 = rand(3)
    A4 = rand(4)
    
  • Используйте функцию ml с полным обозначением MATLAB.

    Вы не можете использовать полное обозначение MATLAB с оператором пространства имен ml, когда следующий пример показывает:

    ml.A = ml.magic(4)
    B = ml('A + A''')
    

    Этот пример устанавливает переменную A рабочей области на волшебную матрицу 4 на 4 с помощью оператора пространства имен ml. B данных Stateflow затем установлен в сложение A и транспонировать матрицу, A', который производит симметрическую матрицу. Поскольку оператор пространства имен ml не может выполнить выражение A', функция ml используется вместо этого. Однако можно вызвать функцию MATLAB transpose с оператором пространства имен ml в следующем эквивалентном выражении:

    B = ml.A + ml.transpose(ml.A)
    

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

Тип данных ml

Данные Stateflow типа, ml вводится внутренне с MATLAB, вводят mxArray для графиков C. Можно присвоить (хранят) любой тип доступных данных в иерархии Stateflow к данным типа ml. Эти типы включают любой тип данных, заданный в иерархию Stateflow, или возвратились из рабочего пространства MATLAB с оператором пространства имен ml или функцией ml.

Правила для Использования типа данных ml

Эти правила применяются к данным Stateflow типа ml:

  • Можно инициализировать данные ml из рабочего пространства MATLAB точно так же, как другие данные в иерархии Stateflow (см., Инициализируют Данные из Базового рабочего пространства MATLAB).

  • Любой числовой скаляр или массив данных ml в иерархии Stateflow могут участвовать в любом виде унарной операции и любом виде бинарной операции с любыми другими данными в иерархии.

    Если данные ml участвуют в какой-либо числовой операции с другими данными, размер данных ml должен быть выведен из контекста, в котором это используется, как возвращают данные из оператора пространства имен ml, и функция ml. Смотрите, Как Графики Выводят Размер Возврата для ml Выражений.

    Примечание

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

  • Вы не можете задать данные ml с осциллографом Констант.

    Эта опция отключена в диалоговом окне Свойств данных и в Model Explorer для данных Stateflow типа ml.

  • Можно использовать данные ml, чтобы создать цель симуляции, но не создать встраиваемую цель генерации кода.

  • Если данные типа, ml содержит массив, можно получить доступ к элементам массива через индексацию с этими правилами:

    1. Можно индексировать только массивы с числовыми элементами.

    2. Можно индексировать числовые массивы только их размерностью.

      Другими словами, можно получить доступ только к одномерным массивам одним индексным значением. Вы не можете получить доступ к многомерному массиву с одним индексным значением.

    3. Первое индексное значение для каждой размерности массива равняется 1, а не 0, как в массивах языка C.

    В примерах, которые следуют, mldata является данными Stateflow типа ml, ws_num_array является массивом рабочего пространства MATLAB 2 на 2 с численными значениями, и ws_str_array является массивом рабочего пространства MATLAB 2 на 2 со значениями вектора символов.

    mldata = ml.ws_num_array; /* OK */
    n21 = mldata[2][1]; /* OK for numerical data of type ml */
    n21 = mldata[3]; /* NOT OK for 2-by-2 array data */
    mldata = ml.ws_str_array; /* OK */
    s21 = mldata[2][1]; /* NOT OK for character vector data of type ml*/
    
  • Данные ml не могут иметь осциллографа вне графика C; то есть, вы не можете задать осциллограф данных ml как Вход от Simulink или Вывода к Simulink.

Заполнитель для данных о рабочей области

И оператор пространства имен ml и функция ml могут получить доступ к данным непосредственно в рабочем пространстве MATLAB и возвратить его в график C. Однако поддержание данных в рабочем пространстве MATLAB может подарить пользователям Stateflow конфликты с другими данными, уже резидентскими в рабочей области. Следовательно, с типом данных ml, можно поддержать данные ml в графике и использовать его для вычислений MATLAB в графиках C.

Как пример, в следующих операторах, mldata1 и mldata2 являются данными Stateflow типа ml:

mldata1 = ml.rand(3);
mldata2 = ml.transpose(mldata1);

В первой строке этого примера mldata1 получает возвращаемое значение функции MATLAB rand, который, в этом случае, возвращает массив 3х3 случайных чисел. Обратите внимание на то, что mldata1 не задан как массив или измерен в любом случае. Это может получить любые данные о рабочем пространстве MATLAB или возврат любой функции MATLAB, потому что это задано как данные Stateflow типа ml.

Во второй строке примера mldata2, также типа данных Stateflow ml, получает транспонировать матрицу матрицы в mldata1. Это присвоено возвращаемое значение функции MATLAB transpose, в котором mldata1 является аргументом.

Отметьте различия в обозначении, если предыдущий пример должен был использовать данные о рабочем пространстве MATLAB (wsdata1 и wsdata2) вместо Stateflow данные ml, чтобы содержать сгенерированные матрицы:

ml.wsdata1 = ml.rand(3);
ml.wsdata2 = ml.transpose(ml.wsdata1);

В этом случае к каждым данным о рабочей области нужно получить доступ через оператор пространства имен ml.

Как графики выводят размер возврата для выражений ml

В графиках C выражения Stateflow с помощью оператора пространства имен ml и функции ml оценивают в рабочем пространстве MATLAB во время выполнения. Фактический размер данных, возвращенных в следующие типы выражения, известен только во время выполнения:

  • Данные о рабочем пространстве MATLAB или функции с помощью оператора пространства имен ml или вызова функции ml

    Например, размер возвращаемых значений от выражений, ml.var, ml.func() или ml(evalString, arg1, arg2,...), где var является переменной рабочего пространства MATLAB и func, является функция MATLAB, не может быть известен до времени выполнения.

  • Данные Stateflow типа ml

  • Графические функции, которые возвращают данные Stateflow типа ml

То, когда эти выражения появляются в действиях, генерация кода Stateflow создает временные данные, чтобы содержать промежуточное звено, возвращается для оценки полного выражения, которого они - часть. Поскольку размер этих возвращаемых значений неизвестен, пока время выполнения, программное обеспечение Stateflow не должно использовать правила контекста вывести размеры для создания временных данных.

В течение времени выполнения, если фактическое возвращенное значение от одной из этих команд отличается от выведенного размера временной переменной, которая хранит его, появляется ошибка несоответствия размера. Чтобы предотвратить ошибки времени выполнения, используйте следующие инструкции, чтобы записать действия с данными ml или командами MATLAB:

ИнструкцияПример

Возвратите размеры команд MATLAB, или данные в выражении должны соответствовать, возвращают размеры равноправных выражений.

В выражении ml.func() * (x + ml.y), если x 3 2 матрица, то ml.func() и ml.y также приняты, чтобы оценить к 3 2 матрицам. Если любой возвращает значение различного размера (кроме скаляра), ошибка заканчивается во время времени выполнения.

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

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

В выражении ml.x + y, если y 3 2 матрица и ml.x, возвращает скаляр, получившееся значение является результатом добавления скалярного значения ml.x каждому члену y, чтобы произвести матрицу с размером y, то есть, 3 2 матрица.

То же правило применяется к вычитанию (-), умножение (*), деление (/) и любые другие бинарные операции.

Команды MATLAB или данные Stateflow типа, ml может быть членами этих независимых уровней выражения, для которого разрешение размера возврата необходимо:

Аргументы

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

В выражении z + func(x + ml.y) размер ml.y независим от размера z, потому что ml.y используется на уровне аргумента функции. Однако размер возврата для func(x + ml.y) должен совпадать с размером z, потому что они оба в том же уровне экспрессии.

Индексы массива

Выражение для индекса массива является независимым уровнем выражения, которое должно быть скаляром в размере.

В выражении x + array[y] размер y независим от размера x, потому что y и x на разных уровнях выражения. Кроме того, y должен быть скаляром.

Размер возврата для доступа к элементу индексного массива должен быть скаляром.

Выражение x[1][1], где x 3 2 массив, должно оценить к скаляру.

Команда MATLAB или элементы данных, используемые в выражении для входного параметра функции MATLAB, названной через оператор пространства имен ml, разрешены для размера. Это разрешение использует правило для равноправных выражений (предшествующий правилу 1) для самого выражения, потому что никакой прототип определения размера не доступен.

В вызове функции ml.func(x + ml.y), если x 3 2 массив, ml.y, должен возвратиться 3 2 массив или скаляр.

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

Если графическая функция, gfunc имеет прототип gfunc(arg1), где arg1 2 3 массив данных Stateflow, выражение вызова, gfunc(ml.y + x), требует, чтобы и ml.y и x оценили к массивам 2х3 (или скаляры) во время времени выполнения.

Вызовы функции ml могут взять только скаляр или аргументы литерала вектора символов. Любая команда MATLAB или данные, которые задают аргумент для функции ml, должны возвратить скалярное значение.

В выражении a = ml('sin(x)'), вызовы функции ml функция MATLAB sin, чтобы оценить синус x в рабочем пространстве MATLAB. Переменная данных Stateflow хранилища a тот результат.

В присвоении размер правого выражения должен совпадать с размером левого выражения за одним исключением. Если левым выражением является одна переменная MATLAB, такая как ml.x или данные Stateflow типа ml, правое выражение определяет размеры обоих выражений.

В выражении s = ml.func(x), где x 3 2 матрица и s, является скалярными данными Stateflow, ml.func(x) должен возвратить скаляр, чтобы совпадать с левым выражением, s. Однако в выражении ml.y = x + s, где x является 3 2 массивом данных и s, является скаляром, левое выражение, переменная y рабочей области, присвоено размер 3 2 массив, чтобы совпадать с размером правого выражения, x+s, 3 2 массив.

В присвоении вектор-столбцы Stateflow на левой стороне совместимы со строкой MATLAB или вектор-столбцами, одного размера на правой стороне.

Матрица, которую вы задаете с размерностью строки 1, рассматривается вектором - строкой. Матрица, которую вы задаете с одной размерностью или с размерностью столбца 1, рассматривается вектор-столбцом.

В выражении s = ml.func(), куда ml.func() возвращается 1 3 матрица, если s является вектором размера 3, присвоение допустимо.

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

В выражении ml.x = ml.y + ml.z ни одно из предыдущих правил не может быть использовано, чтобы вывести общий размер среди ml.x, ml.y и ml.z. В этом случае и ml.y и ml.z приняты, чтобы возвратить скалярные значения. Даже если ml.y и ml.z возвращают соответствие с размерами во времени выполнения, если они возвращают нескалярные значения, ошибка несоответствия размера заканчивается.

Предыдущие правила для решения размера членских команд MATLAB или данных Stateflow типа, который ml в большем выражении применяет только к случаям, в которых числовые значения ожидаются для того участника. Для нечисловых возвратов заканчивается ошибка времени выполнения.

Примечание

Членские команды MATLAB или данные типа, ml в большем выражении ограничивается числовыми значениями (скаляр или массив), только если они участвуют в числовых выражениях.

Выражение x + ml.str, где ml.str является переменной рабочей области вектора символов, производит ошибку времени выполнения, утверждая, что ml.str не является числовым типом.

Особые случаи существуют, в котором никакая проверка размера не происходит, чтобы разрешить размер команды MATLAB или выражений данных, которые являются частью больших выражений. Использование следующих выражений не требует осуществления проверки размера во времени выполнения:

  • ml.var

  • ml.func()

  • ml(evalString, arg1, arg2,...)

  • Данные Stateflow типа ml

  • Графическая функция, возвращающая данные Stateflow типа ml

В этих случаях присвоение возврата левой стороне оператора присваивания или аргумента функции происходит, не проверяя на несоответствие размера между двумя:

  • Присвоение, в котором левая сторона является переменной рабочего пространства MATLAB

    Например, в выражении ml.x = ml.y, ml.y является переменной рабочего пространства MATLAB любого размера и типа (структура, массив ячеек, вектор символов, и так далее).

  • Присвоение, в котором левая сторона является данными типа ml

    Например, в выражении m_x = ml.func(), m_x является данными Stateflow типа ml.

  • Входные параметры функции MATLAB

    Например, в выражении ml.func(m_x, ml.x, gfunc()), m_x является данными Stateflow типа ml, ml.x является переменной рабочего пространства MATLAB любого размера и типа, и gfunc() является графической функцией Stateflow, которая возвращает данные Stateflow типа ml. Несмотря на то, что проверка размера не происходит для входного типа, если переданный - в данных не имеет ожидаемого типа, ошибка следует из вызова функции ml.func().

  • Аргументы для графической функции, которые заданы как данные Stateflow типа ml в его прототипном операторе

    Примечание

    Если вы заменяете входные параметры в предыдущих случаях с неMATLAB числовые данные Stateflow, преобразование в тип ml происходит.