Диаграммы Stateflow ® в моделях Simulink ® имеют свойство языка действий, определяющее синтаксис действий состояния и перехода. Значок в левом нижнем углу холста диаграммы указывает язык действий для диаграммы.
MATLAB ® в качестве языка действий.
C как язык действий.
В диаграммах, использующих C в качестве языка действий, можно вызвать встроенные функции MATLAB и получить доступ к переменным рабочей области MATLAB с помощью ml оператор пространства имен или ml функция.
Внимание
Поскольку функции MATLAB недоступны в целевой среде, не используйте ml оператор пространства имен и ml функция, если планируется создать цель генерации кода.
ml Оператор пространства именДля диаграмм C, ml оператор пространства имен использует стандартную точку (.) для ссылки на переменные и функции MATLAB. Например, оператор a = ml.x возвращает значение переменной рабочей области MATLAB x к данным потока состояний a.
Для функций используется следующий синтаксис:
[return_val1, return_val2,...] = ml.matfunc(arg1, arg2,...)
Например, оператор [a, b, c] = ml. передает возвращаемые значения из функции MATLAB matfunc(x, y)matfunc к данным потока состояний a, b, и c.
Если вызываемая функция MATLAB не требует аргументов, необходимо по-прежнему включать круглые скобки. Если опустить круглые скобки, программа Stateflow интерпретирует имя функции как переменную рабочей области, которая, если она не найдена, создает ошибку времени выполнения во время моделирования.
В этих примерах x, y, и z являются переменными рабочей области и d1 и d2 являются данными потока состояний:
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 вызов функции эквивалентен вызову MATLAB eval функции с помощью ml оператор пространства имен, если аргументы ограничены скалярами или литералами в следующей команде:arg1, arg2,...
ml.eval(ml.sprintf(evalString, arg1, arg2,...))
Спецификаторы формата, используемые в ml функция должна либо соответствовать типам данных аргументов, либо аргументы должны быть типов, которые могут быть повышены до типа, представленного спецификатором формата.
Программное обеспечение Stateflow предполагает скалярные возвращаемые значения от ml оператор пространства имен и ml вызывает функцию, когда они используются в качестве аргументов в этом контексте. См. раздел Как диаграммы определяют размер возврата для выражений ml.
В этих примерах x является переменной рабочей области MATLAB, и d1 и d2 являются данными потока состояний:
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)' показано в предыдущем операторе формата. Данные о потоке состояний evalStringd1 и d2 вставляются в это выражение со спецификаторами формата %g и %fсоответственно. ''abcdefg'' - литерал, заключенный в две одиночные пары кавычек, поскольку он является частью выражения вычисления, которое уже заключено в одиночные кавычки.
sfmat_44 = ml('rand(4)')
В этом примере возвращается квадратная матрица 4 на 4 случайных чисел от 0 до 1, которая назначается данным Stateflow. sf_mat44. Данные о потоке состояний sf_mat44 должен быть определен как массив 4 на 4 перед моделированием. Если его размер отличается, во время выполнения генерируется ошибка несоответствия размеров.
ml ВыраженияДля диаграмм C можно смешивать 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 находится в рабочей области, он отображается в выражение как evalStringX. Возведение в квадрат каждого операнда выполняется с помощью MATLAB power функция, которая принимает два аргумента: значение в квадрат и значение мощности 2.
Выражения с использованием ml оператор пространства имен и ml функция может использоваться в качестве аргументов для ml оператор пространства имен и 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 затем устанавливается на добавление A и его транспонирующую матрицу, A', которая создает симметричную матрицу. Потому что ml оператор пространства имен не может вычислить выражение A', ml вместо нее используется функция. Однако можно вызвать функцию MATLAB. transpose с ml оператор пространства имен в следующем эквивалентном выражении:
B = ml.A + ml.transpose(ml.A)
В качестве другого примера нельзя использовать аргументы с массивами ячеек или подстрочные выражения, включающие двоеточия с ml оператор пространства имен. Однако они могут быть включены в ml вызов функции.
ml Тип данныхДанные потока состояния типа 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 данные с областью Константа.
Эта опция отключена в диалоговом окне Свойства данных (Data properties) и в Обозревателе моделей (Model Explorer for 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 являются данными потока состояний типа ml:
mldata1 = ml.rand(3); mldata2 = ml.transpose(mldata1);
В первой строке этого примера: mldata1 получает возвращаемое значение функции MATLAB rand, который в данном случае возвращает массив случайных чисел 3 на 3. Обратите внимание, что mldata1 не указан как массив и не имеет размера. Он может получать любые данные рабочей области MATLAB или возвращать любую функцию MATLAB, поскольку она определена как данные потока состояний типа 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., varml., или func()ml(, где evalString, arg1, arg2,...) является переменной рабочей области MATLAB и var является функцией MATLAB, не может быть известна до времени выполнения.func
Данные потока состояния типа ml
Графические функции, возвращающие данные Stateflow типа ml
Когда эти выражения появляются в действиях, создание кода Stateflow создает временные данные для хранения промежуточных результатов для оценки полного выражения, частью которого они являются. Поскольку размер этих возвращаемых значений неизвестен до времени выполнения, программное обеспечение Stateflow должно использовать правила контекста для вывода размеров для создания временных данных.
Во время выполнения, если фактическое возвращенное значение одной из этих команд отличается от выводимого размера временной переменной, хранящей его, появляется ошибка несоответствия размеров. Чтобы предотвратить ошибки во время выполнения, используйте следующие инструкции для записи действий с помощью команд MATLAB или ml данные:
| Директива | Пример | |
|---|---|---|
Возвращаемые размеры команд MATLAB или данных в выражении должны соответствовать возвращаемым размерам одноранговых выражений. | В выражении | |
Выражения, возвращающие скаляр, никогда не приводят к ошибке. Можно комбинировать матрицы и скаляры в выражениях большего размера, поскольку команды MATLAB используют скалярное расширение. | В выражении То же правило применяется к вычитанию ( | |
команды MATLAB или данные потока состояния типа | Аргументы Выражение для каждого аргумента функции является большим выражением, для которого возвращаемый размер команд MATLAB или данных Stateflow типа | В выражении |
Индексы массива Выражение для индекса массива является независимым уровнем выражения, который должен быть скалярным по размеру. | В выражении | |
Возвращаемый размер для доступа к элементу индексированного массива должен быть скаляром. | Выражение | |
команда MATLAB или элементы данных, используемые в выражении для входного аргумента функции MATLAB, вызываемой через | В вызове функции | |
Команда MATLAB или элементы данных, используемые для входного аргумента графической функции в выражении, разрешаются прототипом функции для размера. | Если графическая функция | |
| В выражении | |
В назначении размер правого выражения должен соответствовать размеру левого выражения, за одним исключением. Если левое выражение является единственной переменной MATLAB, например | В выражении | |
В назначении векторы столбцов Stateflow на левой стороне совместимы с векторами строк или столбцов MATLAB того же размера на правой стороне. Матрица с размером строки 1 считается вектором строки. Матрица, определяемая одним размером или размером столбца 1, считается вектором столбца. | В выражении | |
Если ни одно из предыдущих правил не позволяет разрешить возвращаемый размер команды MATLAB или элементов данных в большем выражении, предполагается, что они возвращают скалярные значения. | В выражении | |
Предшествующие правила для разрешения размера элементов команд MATLAB или данных Stateflow типа Примечание Команды MATLAB элемента или данные типа | Выражение | |
Существуют особые случаи, когда не выполняется проверка размера для разрешения размера команд MATLAB или выражений данных, являющихся частью выражений большего размера. Использование следующих выражений не требует принудительного выполнения проверки размера во время выполнения:
ml.var
ml.func()
ml(evalString, arg1, arg2,...)
Данные потока состояния типа 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 numeric Stateflow преобразование в ml имеет место тип.