Доступ к функциям 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. matfuncx, y передает возвращаемые значения от функции MATLAB matfunc к данным Stateflow aB, и c.

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

Примеры

В этих примерах, xY, и 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 (или набор команд, каждый разделенный точкой с запятой), чтобы выполниться наряду со спецификаторами формата (%gFD, и т.д.), которые обеспечивают отформатированную замену других аргументов (arg1, arg2, и т.д.) в evalString.

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

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

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

Программное обеспечение 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 оператор пространства имен и ml выражения function наряду с данными 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 оператор пространства имен и ml выражения function. Следующие вложенные множества в качестве примера 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 оператор пространства имен. Данные Stateflow B затем установлен в сложение 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 данные с осциллографом Констант.

    Эта опция отключена в диалоговом окне Свойств данных и в 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 не должно использовать правила контекста вывести размеры для создания временных данных.

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

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

Возвратите размеры команд 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 + arrayY, размер 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. funcX, где x 3-на-2 матрица и s скалярные данные Stateflow, ml. funcX должен возвратить скаляр, чтобы совпадать с левым выражением, s. Однако в выражении ml.y = x + s, где x 3 2 массив данных и s скаляр, левое выражение, переменная y рабочей области, присвоен размер 3 2 массив, чтобы совпадать с размером правого выражения, x+s, 3 2 массив.

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

Матрица A, которую вы задаете с размерностью строки 1, рассматривается вектором-строкой. Матрица A, которую вы задаете с одной размерностью или с размерностью столбца 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 тип происходит.