📄 s_function_ch.c
字号:
* [VARIABLE_SAMPLE_TIME , 0.0 ]
*
* S-function可以从驱动模块获得以下形式中二选一采样时间 :
*
* [INHERITED_SAMPLE_TIME, 0.0 ]
* 或者
* [INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]
*
* 以下几条标出文件可以帮助顶定义采样时间:
*
* o 一个具有在最小综合step下改变值连续的函数应该记录[CONTINUOUS_SAMPLE_TIME, 0.0]采样时间。
* o 一个具有在最小综合step下不改变值连续的函数应该记录[CONTINUOUS_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]采样时间。
* o 一个以特定定义速率便栓的离散函数,应该记录离散采样时间对
* [discrete_sample_period, offset]
* 其中
* discrete_sample_period > 0.0 并且
* 0.0 <= offset < discrete_sample_period
* o 一个可变速率更新的离散的函数,应该记录离散变量[VARIABLE_SAMPLE_TIME, 0.0]
* 采样时间。mdlGetTimeOfNextVarHit函数在离散任务情况下计算下一个采样点。
* 注意VARIABLE_SAMPLE_TIME只能在可变step solvers下使用。
* o 在一个触发子系统可以采用离散模块。为了在触发子系统中或者周期系统中
* 正确使用模块,必须记录[INHERITED_SAMPLE_TIME, 0.0]。在采样时间在整个模块
* 图案中传递完后,触发子系统的采样时间为[INHERITED_SAMPLE_TIME, INHERITED_SAMPLE_TIME]。
* 典型的周期或者在触发系统中的离散模块需要记录继承的采样时间和选项,
* SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME。在mdlSetWorkWidths中,
* 它们需要修改离散和触发修改采样时间。按照下列形式:
* mdlSetWorkWidths:
* if (ssGetSampleTime(S, 0) == CONTINUOUS_SAMPLE_TIME) {
* ssSetErrorStatus(S, "This block cannot be assigned a "
* "continuous sample time");
* }
*
* 如果你的函数没有内在的(instrinsic)采样时间,通过以下方式标识模块采样时间:
*
* o 如果函数随输入改变,即使在最小的综合steps也同样改变,应该记录[INHERITED_SAMPLE_TIME, 0.0]
* 采样时间。
* o 如果函数随输入改变,但在最小的综合steps内不变(在最小step保持不变)
* 应该记录采样时间[INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]。
*
* 在执行的过程中计算采样点(在mdlOutputs或者mdlUpdate中),使用以下两个宏定义
* ssIsSampleHit或者ssIsContinuousTask。如果你的第一个采样时间为连续时间,
* 利用以下代码段计算采样点。注意如果用ssIsSampleHit(S,0,tid).
* if (ssIsContinuousTask(S,tid)) {
* } 将得到错误的结果。
* 换句话,如果测定第三个(离散)任务有采样点,用以下代码段:
* if (ssIsSampleHit(S,2,tid) {
* }
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
/* 记录采样时间对 */
ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
} /* 结束mdlInitializeSampleTimes */
#define MDL_SET_INPUT_PORT_DATA_TYPE /* #undef 去掉函数 */
#if defined(MDL_SET_INPUT_PORT_DATA_TYPE) && defined(MATLAB_MEX_FILE)
/* 函数: mdlSetInputPortDataType =========================================
* 摘要:
* 这种方法在动态输入端口类型设置时使用。如果端口类型可接受,则由他设置。
* 否则,不接受由ssSetErrorStatus报错。任何间接的被已知端口定义的端口数据类型,
* 通过ssSetInputPortDataType和ssSetOutputPortDataType可强行设置。
*
* 察看matlabroot/simulink/include/simstruc_types.h中类型
* SS_DOUBLE, SS_BOOLEAN等.
*
* 察看matlabroot/simulink/src/sfun_dtype_io.c.
*/
static void mdlSetInputPortDataType(SimStruct *S, int portIndex,DTypeId dType)
{
} /* mdlSetInputPortDataType */
#endif /* MDL_SET_INPUT_PORT_DATA_TYPE */
#define MDL_SET_OUTPUT_PORT_DATA_TYPE /* Change to #undef to remove function */
#if defined(MDL_SET_OUTPUT_PORT_DATA_TYPE) && defined(MATLAB_MEX_FILE)
/* 函数: mdlSetOutputPortDataType ========================================
* 这种方法在动态输入端口类型设置时使用。如果端口类型可接受,则由他设置。
* 否则,不接受由ssSetErrorStatus报错。任何间接的被已知端口定义的端口数据类型,
* 通过ssSetInputPortDataType和ssSetOutputPortDataType可强行设置。
*
* 察看matlabroot/simulink/src/sfun_dtype_io.c.
*/
static void mdlSetOutputPortDataType(SimStruct *S,int portIndex,DTypeId dType)
{
} /* mdlSetOutputPortDataType */
#endif /* MDL_SET_OUTPUT_PORT_DATA_TYPE */
#define MDL_SET_DEFAULT_PORT_DATA_TYPES /* Change to #undef to remove function*/
#if defined(MDL_SET_DEFAULT_PORT_DATA_TYPES) && defined(MATLAB_MEX_FILE)
/* 函数: mdlSetDefaultPortDataTypes =====================================
* 摘要:
* 这种方法在没有为模块中每个输入和输出端口提供具体的数据类型时调用。当这种情况下,
* Simulink的数据类型传递引擎为每个动态类型的输入和输出端口提供默认类型设置。
*
* 如果提供这个方法并且没有足够的数据类型给S-function。Simulink将按最大类型的已知端口
* 分配给这个端口。如果没有已知的则设置端口类型为double。
*
* 察看matlabroot/simulink/src/sfun_dtype_io.c为例。
*/
static void mdlSetDefaultPortDataTypes(SimStruct *S)
{
} /* mdlSetDefaultPortDataTypes */
#endif /* MDL_SET_DEFAULT_PORT_DATA_TYPES */
#define MDL_SET_INPUT_PORT_COMPLEX_SIGNAL /* #undef移除*/
#if defined(MDL_SET_INPUT_PORT_COMPLEX_SIGNAL) && defined(MATLAB_MEX_FILE)
/* 函数: mdlSetInputPortComplexSignal ====================================
* 摘要:
* 这种方法在设置信号设置属性为COMPLEX_INHERITED复数性(COMPLEX_YES or COMPLEX_NO)。
* 如果这种类型可以接受,则由ssSetInputPortComplexSignal设置.
* 否则ssSetErrorStatus将报错。任何由已知端口复数性定义的端口可由
* ssSetInputPortComplexSignal or ssSetOutputPortComplexSignal强行设置。
*
* 查看matlabroot/simulink/src/sfun_cplx.c。
*/
static void mdlSetInputPortComplexSignal(SimStruct *S,
int portIndex,
CSignal_T cSignalSetting)
{
} /* mdlSetInputPortComplexSignal */
#endif /* MDL_SET_INPUT_PORT_COMPLEX_SIGNAL */
#define MDL_SET_OUTPUT_PORT_COMPLEX_SIGNAL /* Change to #undef to remove */
#if defined(MDL_SET_OUTPUT_PORT_COMPLEX_SIGNAL) && defined(MATLAB_MEX_FILE)
/* 函数: mdlSetOutputPortComplexSignal ===================================
* 摘要:
* 这种方法在设置信号设置属性为COMPLEX_INHERITED复数性(COMPLEX_YES or COMPLEX_NO)。
* 如果这种类型可以接受,则由ssSetInputPortComplexSignal设置.
* 否则ssSetErrorStatus将报错。任何由已知端口复数性定义的端口可由
* ssSetInputPortComplexSignal or ssSetOutputPortComplexSignal强行设置。
*
* 查看matlabroot/simulink/src/sfun_cplx.c。
*/
static void mdlSetOutputPortComplexSignal(SimStruct *S,
int portIndex,
CSignal_T cSignalSetting)
{
} /* mdlSetOutputPortComplexSignal */
#endif /* MDL_SET_OUTPUT_PORT_COMPLEX_SIGNAL */
#define MDL_SET_DEFAULT_PORT_COMPLEX_SIGNALS /* #undef 去掉函数*/
#if defined(MDL_SET_DEFAULT_PORT_COMPLEX_SIGNALS) && defined(MATLAB_MEX_FILE)
/* Function: mdlSetDefaultPortComplexSignals ================================
* Abstract:
* 如果没有足够的信息提供给每个信号的复数类型(COMPLEX_NO, COMPLEX_YES)这种方法被调用
* 当这种情况下Simulink的complex signal propagation engine 调用该方法请求
* 设置S-function各个输入和输出端口的信号复数属性为COMPLEX_INHERITED。
*
* 如果没有提供该方法,并且有 COMPLEX_INHERITED端口没有足够的信息传递给S-function,则
* 如果有一个S-function端口被设置为COMPLEX_YES,Simulink将这个端口复数性将被设置为COMPLEX_YES,
* 如果没有COMPLEX_YES的端口,其他端口将被设置为COMPLEX_NO
*
* 查看matlabroot/simulink/src/sfun_cplx.c .
*/
static void mdlSetDefaultPortComplexSignals(SimStruct *S)
{
} /* mdlSetDefaultPortComplexSignals */
#endif /* MDL_SET_DEFAULT_PORT_COMPLEX_SIGNALS */
#define MDL_SET_WORK_WIDTHS /* #undef去掉函数 */
#if defined(MDL_SET_WORK_WIDTHS) && defined(MATLAB_MEX_FILE)
/* 函数: mdlSetWorkWidths ===============================================
* 摘要:
* 可选的方法,在输入端口和输出端口的宽度和S-function采样时间设置后,mdlSetWorkWidths
* 被调用用来设置输入,输出,采样时间函数的状态和工作向量大小。这个方法
* 用宏定义 ssSetNumRunTimeParams, ssSetRunTimeParamInfo, and related methods.用来定义
* 非零工作向量宽度。
*
* Run-time参数被这个方法通过ssSetNumRunTimeParams,ssSetRunTimeParamInfo和相关方法,记录。
*
* 如果使用mdlSetWorkWidths则工作向量在mdlInitializeSizes被S-function设置为
* DYNAMICALLY_SIZED即使精确的值被确知 。被S-function使用的实际上的尺寸在mdlSetWorkWidths中定义。
*/
static void mdlSetWorkWidths(SimStruct *S)
{
}
#endif /* MDL_SET_WORK_WIDTHS */
#define MDL_INITIALIZE_CONDITIONS /*#undef去掉函数 */
#if defined(MDL_INITIALIZE_CONDITIONS)
/* 函数: mdlInitializeConditions ========================================
* 摘要:
* 在这个函数体内,用来初始连续和离散的状态。这些初始状态被放置在state向量
* ssGetContStates(S)和ssGetDiscStates(S)中。当然可以进行其他的任何
* S-function需要的初始化动作。在仿真开始和使能子系统被重置开始时会调用。
*
* 可以使用宏定义ssIsFirstInitCond(S)确定mdlInitializeConditions是不是第一
* 被调用。
*/
static void mdlInitializeConditions(SimStruct *S)
{
}
#endif /* MDL_INITIALIZE_CONDITIONS */
#define MDL_START /* #undef去掉函数体 */
#if defined(MDL_START)
/* 函数: mdlStart =======================================================
* 摘要:
* 在仿真执行开始时执行一次,如果有状态初始化一次,这个地方用来执行。
*/
static void mdlStart(SimStruct *S)
{
}
#endif /* MDL_START */
#define MDL_GET_TIME_OF_NEXT_VAR_HIT /* #undef去掉函数体 */
#if defined(MDL_GET_TIME_OF_NEXT_VAR_HIT) && (defined(MATLAB_MEX_FILE) || \
defined(NRT))
/* 函数: mdlGetTimeOfNextVarHit =========================================
* 摘要:
* 这个函数用来获取下一个采样点。这个函数在每个主要step时间被调用一次。
* 下一个采样点被ssSetTNext返回。获得时间他通过ssGetT(S)。
*
* 注意,下一个采样时间点可以是输入信号的一个函数。
*/
static void mdlGetTimeOfNextVarHit(SimStruct *S)
{
time_T timeOfNextHit = ssGetT(S) /* + offset */ ;
ssSetTNext(S, timeOfNextHit);
}
#endif /* MDL_GET_TIME_OF_NEXT_VAR_HIT */
#define MDL_ZERO_CROSSINGS /* #undef去掉函数体 */
#if defined(MDL_ZERO_CROSSINGS) && (defined(MATLAB_MEX_FILE) || defined(NRT))
/* 函数: mdlZeroCrossings ===============================================
* 摘要:
* 如果 S-function 有记录CONTINUOUS_SAMPLE_TIME并且输入S-function的信号
* 或者内部产生的信号有不连续的,可以使用该方法来定位不连续。当这个方法调用
* 后,方法必须更新ssGetNonsampleZCs(S) vector.
*/
static void mdlZeroCrossings(SimStruct *S)
{
}
#endif /* MDL_ZERO_CROSSINGS */
/* 函数: mdlOutputs =======================================================
* 摘要:
* 函数用来计算S-function模块的输出。一般来讲,输出到输出向量中output vector(s)
* ssGetOutputPortSignal。
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
} /* 结束 mdlOutputs */
#define MDL_UPDATE /* #undef去掉函数体 */
#if defined(MDL_UPDATE)
/* 函数: mdlUpdate ======================================================
* 摘要:
* 这个函数在每次主要的综合时间都会被调用一次。离散的状态一般在这里被更新,
* 但是,这个函数如果执行每次综合时间都要执行一次的任务是很有用的。
*/
static void mdlUpdate(SimStruct *S, int_T tid)
{
}
#endif /* MDL_UPDATE */
#define MDL_DERIVATIVES /* #undef去掉函数体 */
#if defined(MDL_DERIVATIVES)
/* 函数: mdlDerivatives =================================================
* 摘要:
* 在这个函数体中,计算S-function 模块的导数。导数放在导数向量ssGetdX(S)中。
*/
static void mdlDerivatives(SimStruct *S)
{
}
#endif /* MDL_DERIVATIVES */
/* 函数: mdlTerminate =====================================================
* 摘要:
* 在这个函数体内,执行任何在仿真的结束阶段必要的步骤。
* 例如在mdlStart中分配内存,在这里释放它.
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -