Предположим, что необходимо получить значение сигнала на входном порте для использования в 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;