Графики Stateflow® в моделях Simulink® имеют свойство языка действия, которое задает синтаксис для действий перехода и состояния. Значок в нижнем левом углу холста графика указывает на язык действия для графика.
MATLAB® как язык действия.
C как язык действия.
Можно вызвать это подмножество Математических Библиотечных функций C:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* функция abs
Stateflow идет кроме того ее стандарта C дубликат со своей собственной встроенной функциональностью. Смотрите Вызывают Функцию abs.
** Можно также заменить вызовы Математической Библиотеки C со специализированными реализациями для этого подмножества функций. Для получения дополнительной информации смотрите Замену Математических Библиотечных функций с Внедрениями приложения.
Когда вы вызываете эти математические функции, двойная точность применяется, если все входные параметры не являются явным образом одинарной точностью. Когда несоответствие типов происходит, бросок входных параметров к ожидаемому типу заменяют исходные аргументы. Например, если вы вызываете функцию sin
с целочисленным аргументом, броском входного параметра к числу с плавающей запятой типа, double
заменяет исходный аргумент.
Если вы вызываете другие библиотечные функции C, не упомянутые выше, включаете соответствующий оператор #include...
в панель Simulation Target Параметров конфигурации.
Интерпретация функции abs
Stateflow идет вне стандарта C версия, чтобы включать целочисленные и аргументы с плавающей точкой всех типов можно следующим образом:
Если x
является целым числом типа int32
, стандарт 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()
к другим графикам в вашей модели, имя этих функций больше не может испускаться со скорректированными именами в сгенерированном коде, и конфликт происходит. Чтобы избежать этого конфликта, переименуйте графические функции max()
и min()
.
Можно сконфигурировать генератор кода, чтобы изменить код, который он генерирует для математических библиотечных функций, таким образом, что код соответствует требованиям к приложению. Для этого вы конфигурируете генератор кода, чтобы применить заменяющую библиотеку кода (CRL) во время генерации кода. Если у вас есть лицензия Embedded Coder®, можно разработать и применить заменяющие библиотеки пользовательского кода.
Для получения дополнительной информации о замене кода, пользуясь заменяющими библиотеками кода, которые обеспечивает MathWorks®, видят то, Что Замена Кода? (Simulink Coder) и Заменяющие Библиотеки Кода (Simulink Coder). Для получения информации о разработке заменяющих библиотек пользовательского кода смотрите то, Что Заменяющая Индивидуальная настройка Кода? (Embedded Coder) и Код Можно Заменить Из Моделей Simulink (Embedded Coder).
Можно задать функции пользовательского кода для использования в графиках C для симуляции и генерации кода C.
Инструкции для того, чтобы вызвать пользовательские функции C в вашем графике
Инструкции для записи пользовательских функций C того доступа входных векторов
Задавать пользовательский C функционирует для симуляции:
Откройте диалоговое окно Model Configuration Parameters.
Выберите Simulation Target.
Задайте свои пользовательские файлы C, как описано в доступе к Пользовательскому коду С в Графиках Небиблиотеки.
Задавать пользовательский C функционирует для генерации кода:
Откройте диалоговое окно Model Configuration Parameters.
Выберите Code Generation> Custom Code.
Укажите, что ваши пользовательские файлы C, как описано в Интегрируют Внешний Код для Всех Графиков (Simulink Coder).
Задайте функцию ее именем, любыми аргументами в круглых скобках и дополнительной точкой с запятой.
Передайте параметры написанным пользователем функциям с помощью одинарных кавычек. Например, func('string')
.
Действие может вложить вызовы функции.
Действие может вызвать функции, которые возвращают скалярное значение (типа double
в случае функций MATLAB и любого типа в случае написанных пользователем функций C).
Используйте функцию 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
, свойство диаграммы, Use Strong Data Typing with Simulink I/O должен быть включен (см. Specify Properties для диаграмм Stateflow).
Если типом данных x
является boolean
, необходимо выключить опцию кодера Использование bitsets для хранения настройки состояния.
Если x
является массивом со своим первым индексным набором свойств к 0 (см. Set Data Properties), то необходимо вызвать функцию можно следующим образом.
f(&(x[0]));
Это передает указатель на первый элемент x
к функции.
Если x
является массивом со своим первым индексным набором свойств к ненулевому номеру (например, 1), функция должна быть вызвана следующим образом:
f(&(x[1]))
;
Это передает указатель на первый элемент x
к функции.