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