Вызовите библиотечные функции 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, не упомянутые выше, включаете соответствующий оператор #include... в панель Simulation Target Параметров конфигурации.

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

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

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

  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 допустимо.

Действие перехода в переходе от 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 к функции.