Вызовите библиотечные функции C в графиках C

Графики Stateflow® в моделях Simulink® имеют свойство языка действия, которое задает синтаксис для действий перехода и состояния. Значок в нижнем левом углу холста графика указывает на язык действия для графика.

  • MATLAB® как язык действия.

  • C как язык действия.

Вызовите библиотечные функции C

Можно вызвать это подмножество Математических Библиотечных функций C:

abs* **

acos**

asin**

atan**

atan2**

ceil**

cos**

cosh**

exp**

fabs

floor**

fmod**

labs

ldexp**

log**

log10**

pow**

rand

sin**

sinh**

sqrt**

tan**

tanh**

 

* abs Stateflow функция идет кроме того ее стандарта C дубликат со своей собственной встроенной функциональностью. Для получения дополнительной информации смотрите, Вызывают Функцию abs.

** Можно также заменить вызовы Математической Библиотеки C со специализированными реализациями для этого подмножества функций. Для получения дополнительной информации смотрите Замену Математических Библиотечных функций с Внедрениями приложения.

Когда вы вызываете эти функции, двойная точность применяется, если все входные параметры не являются явным образом одинарной точностью. Когда несоответствие типов происходит, бросок входных параметров к ожидаемому типу заменяют исходные аргументы. Например, если вы вызываете sin функция с целочисленным аргументом, броском входного параметра к числу с плавающей запятой типа double заменяет исходный аргумент.

Примечание

Поскольку входные параметры к библиотечным функциям C сначала брошены к числам с плавающей запятой, вызовам функции с аргументами типа int64 или uint64 может привести к потере точности.

Если вы вызываете другие библиотечные функции C, не упомянутые выше, включаете соответствующий #include... оператор в панели Simulation Target Параметров конфигурации.

Вызовите Функцию abs

Интерпретация 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 и макс. Функции

Можно вызвать 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 функционирует для симуляции:

  1. Откройте диалоговое окно Model Configuration Parameters.

  2. Выберите Simulation Target.

  3. Задайте свои пользовательские файлы C, как описано в доступе к Пользовательскому коду С в Графиках Небиблиотеки.

Задайте пользовательские функции C для генерации кода

Задавать пользовательский C функционирует для генерации кода:

  1. Откройте диалоговое окно Model Configuration Parameters.

  2. Выберите Code Generation> Custom Code.

  3. Укажите, что ваши пользовательские файлы C, как описано в Интегрируют Внешний Код для Всех Графиков (Simulink Coder).

Инструкции для того, чтобы вызвать пользовательские функции C в вашем графике

  • Задайте функцию ее именем, любыми аргументами в круглых скобках и дополнительной точкой с запятой.

  • Передайте параметры написанным пользователем функциям с помощью одинарных кавычек. Например, func('string').

  • Действие может вложить вызовы функции.

  • Действие может вызвать функции, которые возвращают скалярное значение (типа double в случае функций MATLAB и любого типа в случае написанных пользователем функций C).

Инструкции для записи пользовательских функций 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 показывает вызов функции, вложенный в рамках другого вызова функции.

Вызов функции в состоянии активности

Форматы в качестве примера вызовов функции с помощью обозначения состояния активности появляются в следующем графике.

Стройте диаграмму выполнение происходит можно следующим образом:

  1. Когда переход по умолчанию в S1 происходит, S1 становится активным.

  2. entry действие, вызов функции к fcn1 с заданными аргументами, выполняется.

  3. После 5 секунд времени симуляции, S1 становится неактивным и S2 становится активным.

  4. during действие, вызов функции к fcn2 с заданными аргументами, выполняется.

  5. После 10 секунд времени симуляции, S2 становится неактивным и S1 становится активным снова.

  6. Повторение шагов 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 к функции.