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

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

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

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

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

Внимание

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

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

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

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

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

Например, оператор [a, b, c] = мл 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] = мл 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 Функция

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

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

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

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

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

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

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

Примеры

В этих примерах 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 = мл ('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 Выражения

Для графиков С можно смешать ml оператор пространства имен и 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. Квадратура каждого операнда выполняется с помощью MATLAB power функция, которая принимает два аргумента: значение в квадрат и значение степени, 2.

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

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

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

Программное обеспечение Stateflow проверяет выражения на несоответствия размера данных в действиях при обновлении или симуляции модели. Потому что возврат значения для ml выражения не известны до момента выполнения, программное обеспечение Stateflow должно вывести размер их возвращаемых значений. См. раздел «Как графики вводят размер возврата» для ml Expressions.

Какие ml Должен ли я использовать?

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

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

    Следующий график потока создает четыре новые матрицы MATLAB:

    The 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 для графиков С. Можно присвоить (сохранить) любой тип данных, доступных в иерархии Stateflow, типу данных ml. Эти типы включают любой тип данных, определенный в иерархии Stateflow или возвращенный из рабочего пространства MATLAB с ml оператор или ml пространства имен функция.

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

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

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

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

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

  • Вы не можете определить ml данные с возможностями Constant.

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

В качестве примера в следующих операторах 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 вызов функции

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

  • Stateflow данных типа ml

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

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

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

ДирективаПример

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

В выражении мл. func() * (x + ml.y), если x матрица 3 на 2, затем мл 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 является массивом данных Stateflow 2 на 3, вызывающим выражением 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, мл 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(), где мл. 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 возвращает размеры соответствия во время выполнения, если они возвращают нескалярные значения, возникает ошибка несоответствия размера.

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

Примечание

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

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

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

  • мл. var

  • мл. func()

  • мл (evalString, arg1, arg2,...)

  • Stateflow данных типа ml

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

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

  • Назначение, в котором левая сторона является переменным Рабочим пространством MATLAB

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

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

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

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

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

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

    Примечание

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