Графики Stateflow® в моделях Simulink® имеют свойство языка действия, которое задает синтаксис для действий перехода и состояния. Значок в нижнем левом углу холста графика указывает на язык действия для графика.
MATLAB® как язык действия.
C как язык действия.
Можно вызвать это подмножество Математических Библиотечных функций C:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* | |||||
** Можно также заменить вызовы Математической Библиотеки C со специализированными реализациями для этого подмножества функций. Для получения дополнительной информации смотрите Замену Математических Библиотечных функций с Внедрениями приложения. |
Когда вы вызываете эти функции, двойная точность применяется, если все входные параметры не являются явным образом одинарной точностью. Когда несоответствие типов происходит, бросок входных параметров к ожидаемому типу заменяют исходные аргументы. Например, если вы вызываете 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 в вашем графике
Инструкции для записи пользовательских функций 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
isvalid.
Действие перехода в переходе от 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
к функции.