Графики 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,...)
Например, оператор
передает возвращаемые значения от функции MATLAB [a, b, c] = ml.matfunc(x, y)
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,...);
является выражением, которое выполнено в рабочем пространстве MATLAB. Это содержит команду MATLAB (или набор команд, каждый разделенный точкой с запятой), чтобы выполниться наряду со спецификаторами формата (evalString
%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)'
, показанный в предыдущем операторе формата. Данные Stateflow evalString
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, а не 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,...)
является переменной рабочего пространства MATLAB и var
, является функция MATLAB, не может быть известен до времени выполнения.func
Данные Stateflow типа ml
Графические функции, которые возвращают данные Stateflow типа ml
То, когда эти выражения появляются в действиях, генерация кода Stateflow создает временные данные, чтобы содержать промежуточное звено, возвращается для оценки полного выражения, которого они - часть. Поскольку размер этих возвращаемых значений неизвестен, пока время выполнения, программное обеспечение Stateflow не должно использовать правила контекста вывести размеры для создания временных данных.
В течение времени выполнения, если фактическое возвращенное значение от одной из этих команд отличается от выведенного размера временной переменной, которая хранит его, появляется ошибка несоответствия размера. Чтобы предотвратить ошибки времени выполнения, используйте следующие инструкции, чтобы записать действия с данными ml
или командами MATLAB:
Инструкция | Пример | |
---|---|---|
Возвратите размеры команд MATLAB, или данные в выражении должны соответствовать, возвращают размеры равноправных выражений. | В выражении | |
Выражения, которые возвращают скаляр, никогда не производят ошибку. Можно объединить матрицы и скаляры в больших выражениях, потому что команды MATLAB используют скалярное расширение. | В выражении То же правило применяется к вычитанию ( | |
Команды MATLAB или данные Stateflow типа | Аргументы Выражение для каждого аргумента функции является большим выражением, для которого размер возврата команд MATLAB или данные Stateflow типа должен быть определен | В выражении |
Индексы массива Выражение для индекса массива является независимым уровнем выражения, которое должно быть скаляром в размере. | В выражении | |
Размер возврата для доступа к элементу индексного массива должен быть скаляром. | Выражение | |
Команда MATLAB или элементы данных, используемые в выражении для входного параметра функции MATLAB, названной через оператор пространства имен | В вызове функции | |
Команда MATLAB или элементы данных, используемые для входного параметра для графической функции в выражении, разрешены для размера прототипом функции. | Если графическая функция | |
Вызовы функции | В выражении | |
В присвоении размер правого выражения должен совпадать с размером левого выражения за одним исключением. Если левым выражением является одна переменная MATLAB, такая как | В выражении | |
В присвоении вектор-столбцы Stateflow на левой стороне совместимы со строкой MATLAB или вектор-столбцами, одного размера на правой стороне. Матрица, которую вы задаете с размерностью строки 1, рассматривается вектором - строкой. Матрица, которую вы задаете с одной размерностью или с размерностью столбца 1, рассматривается вектор-столбцом. | В выражении | |
Если вы не можете разрешить размер возврата команды MATLAB или элементов данных в большем выражении ни по одному из предыдущих правил, они приняты, чтобы возвратить скалярные значения. | В выражении | |
Предыдущие правила для решения размера членских команд MATLAB или данных Stateflow типа ПримечаниеЧленские команды MATLAB или данные типа | Выражение |
Особые случаи существуют, в котором никакая проверка размера не происходит, чтобы разрешить размер команды 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 любого размера и типа, и
является графической функцией Stateflow, которая возвращает данные Stateflow типа gfunc()
ml
. Несмотря на то, что проверка размера не происходит для входного типа, если переданный - в данных не имеет ожидаемого типа, ошибка следует из вызова функции
.ml.func()
Аргументы для графической функции, которые заданы как данные Stateflow типа ml
в его прототипном операторе
Если вы заменяете входные параметры в предыдущих случаях с неMATLAB числовые данные Stateflow, преобразование в тип ml
происходит.