指定C MEX s函数操作的采样速率
是的
C, c++
#定义MDL_INITIALIZE_SAMPLE_TIMES空白mdlInitializeSampleTimes (SimStruct *年代)
年代
表示s -功能块的SimStruct。
这个方法应该指定s函数通过下面配对的宏来操作的每个采样速率的采样时间和偏移时间
sssetffsettime (S, offsetTimeIndex, offset_time) / /采样时间
在哪里sampleTimeIndex
从0
小于中规定的采样次数1mdlInitializeSizes
通过ssSetNumSampleTimes
。
如果s函数在一个或多个采样速率下工作,该方法可以指定给定采样时间下的任意采样时间和偏移值:
(CONTINUOUS_SAMPLE_TIME, 0.0)
[CONTINUOUS_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]
(discrete_sample_period,抵消)
(VARIABLE_SAMPLE_TIME, 0.0)
中定义的大写值是宏sl_sample_time_defs.h
。
如果s函数以一个速率运行,该方法可以选择将采样时间设置为下列采样/偏移时间对之一。
(INHERITED_SAMPLE_TIME, 0.0)
[INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]
如果采样次数为0,则Simulink金宝app®引擎假设s函数从它所连接的块继承了它的样本时间,即样本时间为
(INHERITED_SAMPLE_TIME, 0.0)
因此,该方法可以不做任何操作而返回。
当指定样本时间时,请使用以下指导原则。
在较小的集成步骤中发生更改的连续函数应该将示例时间设置为
(CONTINUOUS_SAMPLE_TIME, 0.0)
在较小的集成步骤中不发生更改的连续函数应该将示例时间设置为
[CONTINUOUS_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]
以指定速率变化的离散函数应将采样时间设置为
(discrete_sample_period,抵消)
在哪里
discrete_sample_period > 0.0
和
0.0 <= offset <离散采样周期
以可变速率变化的离散函数应将采样时间设置为
(VARIABLE_SAMPLE_TIME, 0.0)
Simu金宝applink引擎调用mdlGetTimeOfNextVarHit
函数获取变量步长离散任务的下一个样本命中的时间。
请注意,VARIABLE_SAMPLE_TIME
需要一个变步长求解器。
为了在触发子系统或周期系统中正确地运行,离散s函数应该是正确的
指定单个示例时间
(INHERITED_SAMPLE_TIME, 0.0)
使用ssSetOptions
设置SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME
模拟选项mdlInitializeSizes
验证它被分配了一个离散或触发的样本时间mdlSetWorkWidths
:
如果(ssGetSampleTime(S, 0) == CONTINUOUS_SAMPLE_TIME) {ssSetErrorStatus(S, "This block cannot be assigned a continuous sample time");}
在整个框图中传播样本时间之后,引擎分配样本时间
[INHERITED_SAMPLE_TIME, INHERITED_SAMPLE_TIME]
离散块驻留在被触发的子系统中。
如果这个函数没有内在的采样时间,它应该按照以下准则将其采样时间设置为继承:
如果函数的输入发生变化(即使是在很小的集成步骤中),那么它应该将其示例时间设置为
(INHERITED_SAMPLE_TIME, 0.0)
如果函数随着输入的变化而变化,但在小的积分步骤中没有变化(即在小步骤中保持),则该函数应该将其采样时间设置为
[INHERITED_SAMPLE_TIME, FIXED_IN_MINOR_STEP_OFFSET]
s函数应该使用ssIsSampleHit
或ssIsContinuousTask
宏在执行期间检查样本命中(在mdlOutputs
或mdlUpdate
).例如,如果块的第一个样本时间是连续的,函数可以使用下面的代码片段来检查样本命中情况。
if (siscontinuoustask (S,tid)) {}
请注意
如果使用,函数将收到不正确的结果ssIsSampleHit(年代,0,tid)
。
如果函数想确定第三个(离散的)任务是否命中,它可以使用以下代码片段。
if (sissamplehit (S,2,tid) {}
请注意
如果你有金宝app仿真软件编码器™,当为包含此方法的非线性s -函数生成代码时,请确保该方法没有封装在#如果定义(MATLAB_MEX_FILE)
声明。例如:
#if define (MATLAB_MEX_FILE) static void mdlInitializeSampleTimes(SimStruct *S) {/* Add mdlInitializeSampleTimes code here *} #endif . php . php . php . php
的定义
声明中使mdlInitializeSampleTimes
方法仅对MATLAB可用®墨西哥人文件。如果s函数没有内联,则金宝app仿真软件编码器产品无法使用此方法,导致链接或运行时错误。