Диаграммы Stateflow ® в моделях Simulink ® имеют свойство языка действий, определяющее синтаксис действий состояния и перехода. Значок в левом нижнем углу холста диаграммы указывает язык действий для диаграммы.
MATLAB ® в качестве языка действий.
C как язык действий.
Можно вызвать это подмножество функций Математической библиотеки C (C Math Library):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* Поток статусов | |||||
* * Можно также заменить вызовы библиотеки C Math реализациями, специфичными для данного подмножества функций. Дополнительные сведения см. в разделе Замена функций математической библиотеки реализациями приложения. | |||||
При вызове этих функций применяется двойная точность, если все входные аргументы явно не являются одной точностью. При несовпадении типов приведение входных аргументов к ожидаемому типу заменяет исходные аргументы. Например, при вызове sin функция с целым аргументом, приведением входного аргумента к числу с плавающей запятой типа double заменяет исходный аргумент.
Примечание
Поскольку входные аргументы для функций библиотеки C сначала приводятся к числам с плавающей запятой, вызов функции выполняется с аргументами типа int64 или uint64 может привести к потере точности.
При вызове других функций библиотеки C, не перечисленных выше, включите соответствующие #include... на панели Цель моделирования (Simulation Target) окна Параметры конфигурации (Configuration Parameters).
Толкование Статефлоу abs функция выходит за рамки стандартной версии C и включает целочисленные аргументы и аргументы с плавающей запятой всех типов следующим образом:
Если x является целым числом типа int32 или int64, стандартная функция C abs относится к x, или abs(x).
Если x является целым числом типа int16 или int8, стандарт C abs функция применяется к приведению x как целое число типа int32, или abs((int32)x).
Если x является числом с плавающей запятой типа double, стандартная функция C fabs относится к x, или fabs(x).
Если x является числом с плавающей запятой типа single, стандартная функция C fabs относится к a отливка x в качестве double, или fabs((double)x).
Если x - число с фиксированной точкой, стандартная функция C fabs применяется к приведению числа с фиксированной точкой как double, или fabs((double) Vx), где Vx - реальная стоимость x.
Если вы хотите использовать abs функция в строгом смысле стандарта C, приведёт свой аргумент или возвращает значения целочисленным типам. См. раздел Операции литейной формы.
Примечание
При объявлении x в пользовательском коде стандарт C abs функция применяется во всех случаях. Инструкции по вставке пользовательского кода в диаграммы см. в разделе Повторное использование пользовательского кода в диаграммах Stateflow.
Вы можете позвонить min и max путем автоматического создания следующих макросов в верхней части сгенерированного кода.
#define min(x1,x2) ((x1) > (x2) ? (x2):(x1)) #define max(x1,x2) ((x1) > (x2) ? (x1):(x2))
Обеспечение совместимости с графическими функциями пользователя с именем min() или max(), в созданном коде используется искаженное имя следующей формы: <prefix>_min. Однако при экспорте min() или max() графические функции для других диаграмм в модели, имя этих функций больше не может быть выдано с искаженными именами в сгенерированном коде и возникает конфликт. Чтобы избежать этого конфликта, переименуйте min() и max() графические функции.
Можно настроить генератор кода на изменение кода, создаваемого им для функций математической библиотеки, так, чтобы код соответствовал требованиям приложения. Для этого необходимо настроить генератор кода на применение библиотеки замены кода (CRL) во время создания кода. При наличии лицензии Embedded Coder ® можно разрабатывать и применять пользовательские библиотеки замены кода.
Дополнительные сведения о замене кода с помощью библиотек замены кода, предоставляемых MathWorks ®, см. в разделе Что такое замена кода? (Simulink Coder) и библиотеки замены кода (Simulink Coder). Сведения о разработке пользовательских библиотек замены кода см. в разделе Что такое настройка замены кода? (Встроенный кодер) и Код, который можно заменить из моделей Simulink (Встроенный кодер).
Можно указать пользовательские функции кода для использования в диаграммах C для моделирования и генерации кода C.
Рекомендации по вызову пользовательских функций C в вашей диаграмме
Рекомендации по написанию пользовательских функций C, имеющих доступ к векторам ввода
Чтобы задать пользовательские функции C для моделирования:
Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).
Выберите пункт Цель моделирования (Simulation Target).
Укажите пользовательские C-файлы, как описано в разделе Доступ к пользовательскому C-коду в небиблиотечных диаграммах.
Чтобы указать пользовательские функции C для создания кода:
Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).
Выберите «Создание кода» > «Пользовательский код».
Укажите пользовательские файлы C, как описано в разделе Интеграция внешнего кода для всех диаграмм (Simulink Coder).
Определите функцию по ее имени, любым аргументам в скобках и необязательной точке с запятой.
Передача параметров записанным пользователем функциям с помощью одинарных кавычек. Например, func('string').
Действие может вложить вызовы функций.
Действие может вызывать функции, возвращающие скалярное значение (типа double в случае функций MATLAB и любого типа в случае функций С, написанных пользователем).
Используйте sizeof для определения длины входного вектора.
Например, пользовательская функция может включать цикл for, который использует sizeof следующим образом:
for(i=0; i < sizeof(input); i++) {
......
}Если пользовательская функция использует значение длины входного вектора несколько раз, включите в функцию ввод, определяющий длину входного вектора.
Например, можно использовать input_length как второй вход в sum выполнять следующие функции:
int sum(double *input, double input_length)
Ваш sum функция может включать цикл for, который итерирует по всем элементам входного вектора:
for(i=0; i < input_length; i++) {
......
}Примеры форматов вызовов функций с использованием нотации действия перехода отображаются на следующей диаграмме.

Вызов функции fcn1 происходит с arg1, arg2, и arg3 если выполняются следующие условия:
S1 активен.
Событие e происходит.
Состояние c является правдой.
Место назначения перехода S2 является действительным.
Переходное действие при переходе от S2 кому S3 показывает вызов функции, вложенный в другой вызов функции.
Примеры форматов вызовов функций с использованием записи действия состояния отображаются на следующей диаграмме.

Выполнение диаграммы происходит следующим образом:
Когда переход по умолчанию в S1 происходит, S1 становится активным.
entry действие, вызов функции fcn1 с указанными аргументами, выполняется.
Через 5 секунд моделирования, S1 становится неактивным и S2 становится активным.
during действие, вызов функции fcn2 с указанными аргументами, выполняется.
После 10 секунд моделирования, S2 становится неактивным и S1 снова становится активным.
Шаги 2-5 повторяются до окончания моделирования.
Действие Stateflow может передавать аргументы написанной пользователем функции по ссылке, а не по значению. В частности, действие может передавать указатель на значение, а не на само значение. Например, действие может содержать следующий вызов:
f(&x);
где f - пользовательская функция кода C, которая ожидает указатель на x в качестве аргумента.
Если x - имя элемента данных, определенного в иерархии Stateflow, применяются следующие правила:
Не используйте указатели для передачи элементов данных, введенных из модели Simulink.
Если необходимо передать элемент ввода по ссылке, например массив, присвойте элемент локальному элементу данных и передайте локальный элемент по ссылке.
Если x является элементом выходных данных Simulink, имеющим тип данных, отличный от double, свойство диаграммы Использовать строгий ввод данных с Simulink I/O должно быть включено (см. раздел Задание свойств для диаграмм потока состояний).
Если тип данных x является boolean, необходимо отключить параметр кодера Use bitsets for storage state configuration.
Если x является массивом с первым свойством индекса, равным 0 (см. раздел Задание свойств данных), после чего необходимо вызвать функцию следующим образом.
f(&(x[0]));
Это передает указатель на первый элемент x к функции.
Если x - массив с первым свойством индекса, имеющим ненулевое число (например, 1), функция должна вызываться следующим образом:
f(&(x[1]));
Это передает указатель на первый элемент x к функции.