Предположим, что вам нужно получить значение сигнала на вашем входном порту, чтобы использовать в вашей S-функции. Необходимо записать код так, чтобы указатель на вход значение был правильно введен, чтобы значения, считанные с входом порта, были правильно интерпретированы. Для этого можно использовать следующие шаги, которые показаны в коде примера ниже:
Создайте пустой указатель на значение входного сигнала.
Получите идентификатор типа данных порта входа используя ssGetInputPortDataType
.
Используйте идентификатор типа данных, чтобы получить тип контейнера хранения входов.
Иметь регистр для каждого входа типа контейнера хранения, который необходимо обработать. В каждом случае вам потребуется выполнить следующее каким-либо образом:
Создайте указатель правильного типа в соответствии с контейнером хранилища и приведите исходный указатель на пустое поле в новый полностью введенный указатель (см. a
и c
).
Теперь можно хранить и использовать значение, разыменовав новый, полностью набранный указатель мыши (см. b
и d
).
Для примера,
static void mdlOutputs(SimStruct *S, int_T tid) { const void *pVoidIn = (const void *)ssGetInputPortSignal( S, 0 );(1)
DTypeId dataTypeIdU0 = ssGetInputPortDataType( S, 0 );(2)
fxpStorageContainerCategory storageContainerU0 = ssGetDataTypeStorageContainCat( S, dataTypeIdU0 );(3)
switch ( storageContainerU0 ) { case FXP_STORAGE_UINT8:(4)
{ const uint8_T *pU8_Properly_Typed_Pointer_To_U0;(a)
uint8_T u8_Stored_Integer_U0;(b)
pU8_Properly_Typed_Pointer_To_U0 = (const uint8_T *)pVoidIn;(c)
u8_Stored_Integer_U0 = *pU8_Properly_Typed_Pointer_To_U0;(d)
<snip: code that uses input when it's in a uint8_T> } break; case FXP_STORAGE_INT8:(4)
{ const int8_T *pS8_Properly_Typed_Pointer_To_U0;(a)
int8_T s8_Stored_Integer_U0;(b)
pS8_Properly_Typed_Pointer_To_U0 = (const int8_T *)pVoidIn;(c)
s8_Stored_Integer_U0 = *pS8_Properly_Typed_Pointer_To_U0;(d)
<snip: code that uses input when it's in a int8_T> } break;