gpt4 book ai didi

boolean - 如何将 boolean 值输入 Simulink C s-function

转载 作者:行者123 更新时间:2023-12-01 15:02:23 29 4
gpt4 key购买 nike

我可以通过将 boolean 数据定义为 int32 将 boolean 数据输入到 C s 函数中(请参见下面的代码)。如何输入 SS_BOOLEAN 或 SS_UINT8 类型的 boolean 数据?我在 Simulink 模型和 s-function 中明确指定了信号数据类型,但是当我将数据定义为 boolean 或 uint8 时,我得到了奇怪的数字,而不是 1 或 0。

 static void mdlInitializeSizes( SimStruct *S )
{
...
ssSetInputPortRequiredContiguous(S, 0, true);
ssSetInputPortDataType(S, 0, SS_INT32);
...
}
static void mdlOutputs( SimStruct *S, int_T tid )
{
const int *myBoolean = (const int*) ssGetInputPortSignal( S, 0 );
...
}

更新(2011 年 5 月 20 日):我尝试了 solution proposed by MikeT无济于事。作为输出,我期待 [10 20 30] 但得到 [1 2 3]。下面是 Simulink 模型、命令窗口的输出和 s-function 代码:

 static void mdlOutputs( SimStruct *S, int_T tid )
{
InputBooleanPtrsType useData1 = (InputBooleanPtrsType) ssGetInputPortSignalPtrs( S, 0 );
InputBooleanPtrsType useData2 = (InputBooleanPtrsType) ssGetInputPortSignalPtrs( S, 1 );
const double *data1 = (const double*) ssGetInputPortSignal( S, 2 );
const double *data2 = (const double*) ssGetInputPortSignal( S, 3 );


double *outputs = (double *) ssGetOutputPortRealSignal( S, 0 );

double *data;
int i;

if (*useData1){data = data1;}
else if (*useData2){data = data2;}

//assign outputs:
for (i=0; i<3; i++){outputs[i] = data[i];}

printf("useData1 = %d\n", *useData1);
printf("useData2 = %d\n", *useData2);
}

static void mdlInitializeSizes( SimStruct *S )
{
int iPort;
if ( !ssSetNumInputPorts( S, 4 ) )
{
return;
}

ssSetInputPortDataType(S, 0, SS_BOOLEAN);
ssSetInputPortDataType(S, 1, SS_BOOLEAN);
ssSetInputPortDataType(S, 2, SS_DOUBLE);
ssSetInputPortDataType(S, 3, SS_DOUBLE);

ssSetInputPortWidth( S, 0, 1 );
ssSetInputPortWidth( S, 1, 1 );
ssSetInputPortWidth( S, 2, 3 );
ssSetInputPortWidth( S, 3, 3 );

for (iPort = 0; iPort < 4 ; iPort++)
{
ssSetInputPortRequiredContiguous(S, iPort, true); /*direct input signal access*/
ssSetInputPortDirectFeedThrough( S, iPort, 1 );
}

if ( !ssSetNumOutputPorts( S, 1 ) )
{
return;
}
ssSetOutputPortDataType(S, 0, SS_DOUBLE);
ssSetOutputPortWidth( S, 0, 3 );

ssSetNumSampleTimes( S, 1 );
ssSetOptions( S, SS_OPTION_EXCEPTION_FREE_CODE );
}

最佳答案

Simulink 中有一个名为 sfun_dtype_io.c 的演示 s-function,它展示了如何设置输入和输出的数据类型。从该演示来看,它是如何处理 boolean 输入的,尽管这不是唯一的方法,

static void mdlInitializeSizes(SimStruct *S) {
...
/* input 2 is a boolean scalar signal. */
ssSetInputPortWidth( S, 2, 1 );
ssSetInputPortDataType( S, 2, SS_BOOLEAN );
ssSetInputPortDirectFeedThrough( S, 2, TRUE );
...
}

static void mdlOutputs (SimStruct *S, int_T tid) {
...
/* The control port is a boolean signal */
InputBooleanPtrsType u2Ptr = (InputBooleanPtrsType)
ssGetInputPortSignalPtrs(S,2);
...
}

关于boolean - 如何将 boolean 值输入 Simulink C s-function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897548/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com