C S-функции может передать использующие пользовательские типы данных. Существует две широких категории для этих типов данных:
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-функцию, что Компилятор Выходного языка доступов функционирует, чтобы сгенерировать код с пользовательскими типами данных. Для получения дополнительной информации смотрите S-функции Встраивания (Simulink Coder).
ssSetNumInputPorts
| ssSetNumOutputPorts
| ssGetNumInputPorts
| ssGetNumOutputPorts