Функции C S-Functions могут взаимодействовать с использованием определяемых пользователем типов данных. Для этих типов данных существует две широкие категории:
Simulink® распознаваемые пользовательские типы данных - это пользовательские типы данных от Simulink.AliasType
, Simulink.Bus
, Simulink.NumericType
или тип перечисленных данных, который может также взаимодействовать с другими блоками Simulink.
Непрозрачные типы данных - это типы данных для использования только с блоками S-Function, запрограммированными для их понимания. Вы можете задать непрозрачные типы данных в случаях, когда другим блокам 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-функцию, которая обращается к функциям Target Language Compiler, чтобы сгенерировать код с пользовательскими типами данных. Для получения дополнительной информации смотрите Inlining S-Functions (Simulink Coder).
ssGetNumInputPorts
| ssGetNumOutputPorts
| ssSetNumInputPorts
| ssSetNumOutputPorts