Stateflow® графики в Simulink® модели имеют свойство языка действий, которое задает синтаксис для действий состояния и перехода. Значок в левом нижнем углу холста графика указывает язык действий для графика.
MATLAB® как язык действий.
C как язык действия.
Можно вызвать это подмножество функций C Math Library:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* The Stateflow | |||||
** Можно также заменить вызовы библиотеки C Math на специфичные для приложения реализации для этого подмножества функций. Для получения дополнительной информации смотрите Замена функций Math Library на Реализации приложения. |
При вызове этих функций применяется двойная точность, если все входные параметры не являются явно одинарной точностью. Когда происходит несоответствие типа, приведение входных параметров к ожидаемому типу заменяет исходные аргументы. Для примера, если вы вызываете sin
функция с целым аргументом, приведение входного параметра к числу с плавающей запятой типа double
заменяет исходный аргумент.
Примечание
Поскольку входные параметры в функции библиотеки C сначала приводятся к числам с плавающей запятой, вызовы функций с аргументами типа int64
или uint64
может привести к потере точности.
Если вы вызываете другие функции библиотеки C, не перечисленные выше, включите соответствующую #include...
оператор на панели Simulation Target параметров конфигурации.
Толкование abs Stateflow
функция выходит за пределы стандартной версии 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)
, где V x
является реальным значением 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). Для получения информации о разработке пользовательских библиотек замещения кода смотрите Что такое индивидуальная настройка замещения кода? (Embedded Coder) и код, который можно заменить из моделей Simulink (Embedded Coder).
Можно задать пользовательские функции кода для использования в графиках C для симуляции и генерации кода C.
Чтобы задать пользовательские функции C для симуляции:
Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).
Выберите Simulation Target.
Укажите свои пользовательские файлы C, как описано в Access Custom C Code in Nonlibrary Charts.
Чтобы задать пользовательские функции C для генерации кода:
Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).
Выберите Code Generation > Custom Code.
Укажите свои пользовательские файлы C, как описано в Integrate External Code for All Charts (Simulink Coder).
Задайте функцию по ее имени, любым аргументам в круглых скобках и необязательной точке с запятой.
Передайте параметры в пользовательские функции с помощью одинарных кавычек. Для примера, func('string')
.
Действие может вложить вызовы функций.
Действие может вызвать функции, которые возвращают скалярное значение (типа double
в случае функций MATLAB и любого типа в случае пользовательских функций C).
Используйте sizeof
функция для определения длины входного вектора.
Например, ваша пользовательская функция может включать цикл for-loop, который использует sizeof
следующим образом:
for(i=0; i < sizeof(input); i++) { ...... }
Если ваша пользовательская функция использует значение длины входного вектора несколько раз, включите в свою функцию вход, который задает длину входного вектора.
Для примера можно использовать input_length
как второй вход в sum
функционировать следующим образом:
int sum(double *input, double input_length)
Ваши sum
функция может включать цикл for-loop, который итератируется по всем элементам входного вектора:
for(i=0; i < input_length; i++) { ...... }
Примеры форматов вызовов функций, использующих обозначение переходного действия, появляются на следующем графике.
Вызов функции для fcn1
происходит с arg1
, arg2
, и arg3
если следующее имеет значение true:
S1
активно.
Событийные e
происходит.
Условие c
является true.
Пункт назначения перехода S2
является допустимым.
Переходное действие на переходном этапе от S2
на S3
показывает вызов функции, вложенный в другой вызов функции.
Примеры форматов вызовов функций, использующих обозначение о состоянии активности, появляются на следующем графике.
Выполнение графика происходит следующим образом:
Когда переход по умолчанию в S1
происходит, S1
становится активным.
The entry
действие, вызов функции для fcn1
с указанными аргументами выполняется.
Через 5 секунд времени симуляции S1
становится неактивным и S2
становится активным.
The during
действие, вызов функции для fcn2
с указанными аргументами выполняется.
Через 10 секунд времени симуляции S2
становится неактивным и S1
снова становится активным.
Шаги 2-5 повторяются до окончания симуляции.
Действие Stateflow может передавать аргументы в написанную пользователем функцию по ссылке, а не по значению. В частности, действие может передать указатель на значение, а не само значение. Для примера действие может содержать следующий вызов:
f(&x);
где f
является пользовательским кодом функции C, которая ожидает, что указатель будет x
как аргумент.
Если x
- имя элемента данных, заданное в иерархии Stateflow, применяются следующие правила:
Не используйте указатели, чтобы передать элементы данных, введенные из модели Simulink.
Если необходимо передать элемент входа по ссылке, для примера массива присвойте элемент локальному элементу данных и передайте локальный элемент по ссылке.
Если x
является выходным элементом данных Simulink, имеющим тип данных, отличный от double
, свойство графика, Use Strong Data Typing with Simulink I/O должно быть включено (см. «Задание свойств для диаграмм Stateflow»).
Если тип данных x
является boolean
необходимо выключить опцию кодера Использовать битсеты для хранения строения состояния.
Если x
- массив с первым индексом набора свойств 0 (см. Set Свойств данных), затем необходимо вызвать функцию следующим образом.
f(&(x[0]));
Это передает указатель на первый элемент x
в функцию.
Если x
- массив с первым индексом, набором свойств ненулевым числом (для примера, 1), функция должна вызываться следующим образом:
f(&(x[1]))
;
Это передает указатель на первый элемент x
в функцию.