exponenta event banner

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

Диаграммы 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.matfunc(x, y) передает возвращаемые значения из функции MATLAB 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,...);

evalString - выражение, вычисляемое в рабочей области MATLAB. Он содержит команду MATLAB (или набор команд, каждая из которых разделена точкой с запятой) для выполнения вместе со спецификаторами формата (%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)' является evalString показано в предыдущем операторе формата. Данные о потоке состояний d1 и 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 находится в рабочей области, он отображается в 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.

Который 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. Индексировать можно только массивы с числовыми элементами.

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

  • Данные потока состояния типа 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 или данные потока состояния типа 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. Переменная данных потока состояний a сохраняет этот результат.

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

В выражении s = ml.func(x), где x является матрицей 3 на 2 и s скалярные данные потока состояний, ml.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(), где 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,...)

  • Данные потока состояния типа 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 numeric Stateflow преобразование в ml имеет место тип.