C S-функции могут взаимодействовать с использованием пользовательских типов данных. Существует две широкие категории для этих типов данных:
Распознаваемые пользовательские типы данных Simulink ® - это пользовательские типы данных из Simulink.AliasType, Simulink.Bus, Simulink.NumericTypeили тип данных Enumerated, который также может взаимодействовать с другими блоками Simulink.
Непрозрачные типы данных - это типы данных для использования только с S-функциональными блоками, запрограммированными на их понимание. Можно определить непрозрачные типы данных в случаях, когда другим блокам Simulink не требуется использовать эти типы данных.
Чтобы зарегистрировать пользовательский тип данных, распознаваемый Simulink, S-функция mdlInitializeSizes подпрограмма должна регистрировать тип данных, используя ssRegisterTypeFromNamedObject.
Например, следующий код помещается в начале mdlInitializeSizes определяет пользовательский тип данных из Simulink.AliasType объект с именем u8 в рабочей области MATLAB ®. В этом примере пользовательский тип данных назначается первому порту вывода.
int id1; ssRegisterTypeFromNamedObject(S, "u8", &id1); ssSetOutputPortDataType(S, 0, id1);
Кроме того, можно использовать идентификатор id1 для назначения этого типа данных параметрам S-функций, векторам DWork и портам ввода.
Для случаев, когда S-функции должны взаимодействовать с использованием типа данных, который не может быть понят Simulink, S-функция mdlInitializeSizes подпрограмма должна:
Зарегистрируйте тип данных, используя ssRegisterDataType.
Укажите объем памяти в байтах, необходимый для хранения экземпляра типа данных, используя ssSetDataTypeSize.
Укажите значение, представляющее нуль для типа данных, используя 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).
ssGetNumInputPorts | ssGetNumOutputPorts | ssSetNumInputPorts | ssSetNumOutputPorts