指定C MEX S函数的输入,输出,状态,参数和其他特征
是的
C,C ++
#define mdl_initial_sizesvoid mdlinitializizes(Simstruct *s)
s
代表S功能块的SIMSTRUCT。
这是Simulink的第一个S功能回调方法万博1manbetx®引擎电话。此方法执行以下任务:
指定此S函数支持的参数数量万博1manbetxsssetnumsfcnparams
。
利用ssetsetfcnparamtunable(s,paramidx,0)
当参数在模拟过程中无法更改时Paramidx
开始于0
。当将参数指定为不可调节时,引擎在模拟过程中发出错误(或在使用外部模式时万博1manbetxSimulink Coder™产品)如果尝试更改参数。
指定此功能具有的状态数量sssetnumcontstates
和sssetnumdiscstates
。
配置块的输入端口,包括:
指定此S函数具有的输入端口的数量sssetNumInputports
。
指定输入端口的尺寸。
看sssetInputportDimensionInfo
了解更多信息。
对于每个输入端口,指定它是否具有直接进料,使用sssetInputportDirectFeedThrough
。
如果在mdlOutputs
或者mdlgetTimeofnextvarhit
功能。每个输入端口的直接进料标志都可以设置为1 =是
或者0 =否
。如果输入,应将其设置为1你
,在mdlOutputs
或者mdlgetTimeofnextvarhit
常规。将直接进料标记设置为0告诉Simulink引擎万博1manbetx你
在这两个S功能例程中均未使用。违反这会导致不可预测的结果。
配置块的输出端口,包括:
指定块具有的输出端口数sssetNumoutputports
。
指定输出端口的尺寸。
看mdlsetOutputpotportDimensionInfo
了解更多信息。
如果您的s功能输出是离散的(例如,输出仅采用特定值,例如0、1和2),则指定SS_OPTION_DISCRETE_VALUED_OUTPUT
。
设置块运行的样品时间(即样品速率)的数量。
有两种指定样本时间的方法:
基于端口的样本时间
基于块的样本时间
看指定S功能样本时间有关样本时间问题的完整讨论。
对于多条S函数,设置样品时间的建议方法是通过基于端口的样本时间方法。当您创建多次S功能时,您必须注意确认,当较慢的任务被抢占较慢时,您的S功能可以正确管理数据,以避免种族条件。当指定基于端口的样本时间时,该块不能继承inf
在任何港口。
使用块的工作向量的大小,使用SSSETNUMRWORK
,,,,SSSETNUMIWORK
,,,,sssetnumpwork
,,,,sssetNummodes
,,,,Sssetnumnonsmpledzcs
。
设置该块实施的仿真选项,使用Ssetoptions
。
所有选项都有表格ss_option_ <名称>
。看配置C/C ++ S功能功能有关每个选项的信息。使用位或者
操作员设置多个选项,如
sssetoptions(s,(ss_option_)name1|ss_option_name2))
笔记
如果你有万博1manbetxSimulink编码器,当生成包含此方法的非线s函数的代码时,请确保该方法未包装在一个#如果定义(matlab_mex_file)
陈述。例如:
#if定义(matlab_mex_file)static void mdlinitializizes(simStruct * s){ / *在此处 *添加mdlinitializes code *} #endif
这定义
声明使得mdlinitialsizes
仅可用于MATLAB的方法®MEX文件。如果未嵌入s功能,万博1manbetxSimulink编码器产品无法使用此方法,从而导致链接或运行时错误。
您可以设置参数numcontstates
,,,,numdiscstates
,,,,numInputs
,,,,numOutputs
,,,,数字
,,,,数字
,,,,数字
,,,,nummodes
, 和numnonsmpledzcs
到固定的非负整数或告诉Simulink引擎动态尺寸:万博1manbetx
动态式尺寸
- 设置状态的长度,工作向量等,以从驾驶块继承的值。根据标量扩展规则,它将宽度设置为实际输入宽度,除非您使用mdlsetworkwidths
设置宽度。
0
或正数 - 将长度(或宽度)设置为指定值。默认值为0
。
2级MATLAB S功能设置
方法执行与C MEX S功能几乎相同的任务mdlinitialsizes
方法。
静态void mdlinitializizes(simstruct *s){int_t ninputports = 1;/ *输入端口的数量 */ int_t noutputports = 1;/ *输出端口的数量 */ int_t需求输入= 1;/ *直接馈电 */ int_t inputportIdx = 0;int_t outputportIdx = 0;sssetnumsfcnparams(s,0);/ *预期参数的数量 * /if(ssgetNumsfcnParams(s)!= ssgetSfcnParamscount(s)){ / * *如果预期输入参数的数量不等于 *对话框中输入的参数数量,则返回。Simu万博1manbetxlink引擎会生成一个 *错误,表明存在Aparameter不匹配。*/ 返回;} else {mdlCheckParameters(s); if (ssGetErrorStatus(S) != NULL) return; } ssSetNumContStates( S, 0); ssSetNumDiscStates( S, 0); /* * Configure the input ports. First set the number of input * ports. */ if (!ssSetNumInputPorts(S, nInputPorts)) return; /* * Set input port dimensions for each input port index * starting at 0. */ if(!ssSetInputPortDimensionInfo(S, inputPortIdx, DYNAMIC_DIMENSION)) return; /* * Set direct feedthrough flag (1=yes, 0=no). */ ssSetInputPortDirectFeedThrough(S, inputPortIdx, needsInput); /* * Configure the output ports. First set the number of * output ports. */ if (!ssSetNumOutputPorts(S, nOutputPorts)) return; /* * Set output port dimensions for each output port index * starting at 0. */ if(!ssSetOutputPortDimensionInfo(S,outputPortIdx, DYNAMIC_DIMENSION)) return; /* * Set the number of sample times. */ ssSetNumSampleTimes(S, 1); /* * Set size of the work vectors. */ ssSetNumRWork(S, 0); /* real vector */ ssSetNumIWork(S, 0); /* integer vector */ ssSetNumPWork(S, 0); /* pointer vector */ ssSetNumModes(S, 0); /* mode vector */ ssSetNumNonsampledZCs(S, 0); /* zero crossings */ ssSetOptions(S, 0); } /* end mdlInitializeSizes */