Сконфигурируйте пользовательские типы данных

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

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

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

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

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

Чтобы зарегистрировать пользовательский тип данных, распознаваемый 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-функцию, которая обращается к функциям Target Language Compiler, чтобы сгенерировать код с пользовательскими типами данных. Для получения дополнительной информации смотрите Inlining S-Functions (Simulink Coder).

См. также

| | |

Похожие темы