exponenta event banner

Настройка пользовательских типов данных

Пользовательские типы данных в C S-функциях

C S-функции могут взаимодействовать с использованием пользовательских типов данных. Существует две широкие категории для этих типов данных:

  • Распознаваемые пользовательские типы данных Simulink ® - это пользовательские типы данных из Simulink.AliasType, Simulink.Bus, Simulink.NumericTypeили тип данных Enumerated, который также может взаимодействовать с другими блоками Simulink.

  • Непрозрачные типы данных - это типы данных для использования только с S-функциональными блоками, запрограммированными на их понимание. Можно определить непрозрачные типы данных в случаях, когда другим блокам Simulink не требуется использовать эти типы данных.

Использование распознаваемых типов данных Simulink в C S-функциях

Чтобы зарегистрировать пользовательский тип данных, распознаваемый Simulink, S-функция mdlInitializeSizes подпрограмма должна регистрировать тип данных, используя ssRegisterTypeFromNamedObject.

Например, следующий код помещается в начале mdlInitializeSizes определяет пользовательский тип данных из Simulink.AliasType объект с именем u8 в рабочей области MATLAB ®. В этом примере пользовательский тип данных назначается первому порту вывода.

int id1;
ssRegisterTypeFromNamedObject(S, "u8", &id1);
ssSetOutputPortDataType(S, 0, id1);

Кроме того, можно использовать идентификатор id1 для назначения этого типа данных параметрам S-функций, векторам DWork и портам ввода.

Использование непрозрачных типов данных в C S-функциях

Для случаев, когда S-функции должны взаимодействовать с использованием типа данных, который не может быть понят Simulink, S-функция mdlInitializeSizes подпрограмма должна:

  1. Зарегистрируйте тип данных, используя ssRegisterDataType.

  2. Укажите объем памяти в байтах, необходимый для хранения экземпляра типа данных, используя ssSetDataTypeSize.

  3. Укажите значение, представляющее нуль для типа данных, используя ssSetDataTypeZero.

Определите определяемый пользователем тип данных во внешнем файле заголовка для включения в S-функцию уровня 2 C.

/* Define the structure of the user-defined data type */
typedef struct{
    int8_T   a;
    uint16_T b;
}myStruct;

Разместите следующий код в начале mdlInitializeSizes задание размера и нулевого представления пользовательского типа данных myStruct.

/* Define variables */
int_T   status;
DTypeId  id;

myStruct tmp;

/* Register the user-defined data types */
id = ssRegisterDataType(S, "myStruct");
if(id == INVALID_DTYPE_ID) return;

/* Set the size of the user-defined data type */
status = ssSetDataTypeSize(S, id, sizeof(tmp));
if(status == 0) return;

/* Set the zero representation */
tmp.a = 0;
tmp.b = 1;
status = ssSetDataTypeZero(S, id, &tmp);

Примечание

При использовании Simulink Coder™ нельзя использовать программное обеспечение для создания кода S-функций, содержащих макросы, для определения пользовательских типов данных. Для создания кода с пользовательскими типами данных необходимо использовать встроенную S-функцию, которая обращается к функциям компилятора целевого языка. Дополнительные сведения см. в разделе Вложение S-функций (Simulink Coder).

См. также

| | |

Связанные темы