📄 s_function_ch.c
字号:
* 如果S-function在mdlStart中分配了几块内存在mdlStart,并且保存在PWork。下面的代码段
* 将释放这些内存。
* {
* int i;
* for (i = 0; i<ssGetNumPWork(S); i++) {
* if (ssGetPWorkValue(S,i) != NULL) {
* free(ssGetPWorkValue(S,i));
* }
* }
* }
*/
static void mdlTerminate(SimStruct *S)
{
}
#define MDL_RTW /* #undef去掉函数体 */
#if defined(MDL_RTW) && defined(MATLAB_MEX_FILE)
/* 函数: mdlRTW =========================================================
* 摘要:
*
* 这个函数用来Real-Time Workshop产生model.rtw文件。在这个方法下,可以调用
* 以下函数来添加域到model.rtw文件。
*
* 1) 下面创建S-functions的参数记录,nParams是可调S-function参数的个数
*
* if ( !ssWriteRTWParameters(S, nParams,
*
* SSWRITE_VALUE_[type],paramName,stringInfo,
* [type在下面具体定义]
*
* ) ) {
* return; (错误将被SL处理)
* }
*
* 其中SSWRITE_VALUE_[type]应该是以下几中组形式之一:
* (并且有"nParams"这些组件):
*
* SSWRITE_VALUE_VECT,
* const char_T *paramName,
* const char_T *stringInfo,
* const real_T *valueVect,
* int_T vectLen
*
* SSWRITE_VALUE_2DMAT,
* const char_T *paramName,
* const char_T *stringInfo,
* const real_T *valueMat,
* int_T nRows,
* int_T nCols
*
* SSWRITE_VALUE_DTYPE_VECT,
* const char_T *paramName,
* const char_T *stringInfo,
* const void *valueVect,
* int_T vectLen,
* int_T dtInfo
*
* SSWRITE_VALUE_DTYPE_2DMAT,
* const char_T *paramName,
* const char_T *stringInfo,
* const void *valueMat,
* int_T nRows,
* int_T nCols,
* int_T dtInfo
*
* SSWRITE_VALUE_DTYPE_ML_VECT,
* const char_T *paramName,
* const char_T *stringInfo,
* const void *rValueVect,
* const void *iValueVect,
* int_T vectLen,
* int_T dtInfo
*
* SSWRITE_VALUE_DTYPE_ML_2DMAT,
* const char_T *paramName,
* const char_T *stringInfo,
* const void *rValueMat,
* const void *iValueMat,
* int_T nRows,
* int_T nCols,
* int_T dtInfo
*
* 注意:
* 1. nParams是一个整数并且stringInfo是个描述关于参数类似与它们如何被导出等大致信息的字符串。
* 2. 这个函数体最好的参数 dtInfo,从宏DTINFO中获取,如
* dtInfo = DTINFO(dataTypeId, isComplexSignal);
* 其中dataTypeId是数据类型id,isComplexSignal二进制值来定义是否是复数。
*
* 查看simulink/include/simulink.c 中定义(应用),
* simulink/src/sfun_multiport.c 示例。
*
* 2) 以下创建SFcnParameterSetting S-functions的记录
* (这些由不可变S-function的参数引出)。
*
* if ( !ssWriteRTWParamSettings(S, nParamSettings,
*
* SSWRITE_VALUE_[whatever], settingName,
* [type specific arguments below]
*
* ) ) {
* return; (错误将由SL处理)
* }
*
* 其中SSWRITE_VALUE_[type] 可以是以下其中之一
* (并且"nParamSettings" 是这些组):
* Also, the examples in the right hand column below show how the
* ParamSetting appears in the .rtw file
*
* SSWRITE_VALUE_STR, - 用来写引用或者未引用字符串
* const char_T *settingName, 例如:
* const char_T *value, Country USA
*
* SSWRITE_VALUE_QSTR, - 用来写引用的字符串:
* const char_T *settingName, 例如:
* const char_T *value, Country "U.S.A"
*
* SSWRITE_VALUE_VECT_STR, - 写字符串向量
* const char_T *settingName, 例如:
* const char_T *value, Countries ["USA", "Mexico"]
* int_T nItemsInVect
*
* SSWRITE_VALUE_NUM, - 写数字
* const char_T *settingName, 例如:
* const real_T value NumCountries 2
*
*
* SSWRITE_VALUE_VECT, - 写数值向量
* const char_T *settingName, 例如:
* const real_T *settingValue, PopInMil [300, 100]
* int_T vectLen
*
* SSWRITE_VALUE_2DMAT, - 写2D矩阵
* const char_T *settingName, 例如:
* const real_T *settingValue, PopInMilBySex Matrix(2,2)
* int_T nRows, [[170, 130],[60, 40]]
* int_T nCols
*
* SSWRITE_VALUE_DTYPE_NUM, - 写数值向量
* const char_T *settingName, 例如: int8 Num 3+4i
* const void *settingValue, written as: [3+4i]
* int_T dtInfo
*
*
* SSWRITE_VALUE_DTYPE_VECT, -用来写特定数据类型向量
* const char_T *settingName, 例如: int8 CArray [1+2i 3+4i]
* const void *settingValue, written as:
* int_T vectLen CArray [1+2i, 3+4i]
* int_T dtInfo
*
*
* SSWRITE_VALUE_DTYPE_2DMAT, - 用来写特定数据类型2D。
* const char_T *settingName
* const void *settingValue, 例如:
* int_T nRow , int8 CMatrix [1+2i 3+4i; 5 6]
* int_T nCols, written as:
* int_T dtInfo CMatrix Matrix(2,2)
* [[1+2i, 3+4i]; [5+0i, 6+0i]]
*
*
* SSWRITE_VALUE_DTYPE_ML_VECT, - 写定义复数matlab类型的向量
* const char_T *settingName, 例如:
* const void *settingRValue, 例如: int8 CArray [1+2i 3+4i]
* const void *settingIValue, settingRValue: [1 3]
* int_T vectLen settingIValue: [2 4]
* int_T dtInfo
* written as:
* CArray [1+2i, 3+4i]
*
* SSWRITE_VALUE_DTYPE_ML_2DMAT, - 写定义复数matlab类型的矩阵
* const char_T *settingName,
* const void *settingRValue, 例如:
* const void *settingIValue, int8 CMatrix [1+2i 3+4i; 5 6]
* int_T nRows settingRValue: [1 5 3 6]
* int_T nCols, settingIValue: [2 0 4 0]
* int_T dtInfo
* written as:
* CMatrix Matrix(2,2)
* [[1+2i, 3+4i]; [5+0i, 6+0i]]
*
* 注意, 上述所述例子说明如何将ParamSetting 写出到.rtw file
*
* 使用时查看simulink/include/simulink.c
* simulink/src/sfun_multiport.c示例解释如何使用该函数。
*
* 3) 以下是S-functions 的work vector记录。
*
* if (!ssWriteRTWWorkVect(S, vectName, nNames,
*
* name, size, (必须有这些成对的nNames)
* :
* ) ) {
* return; (错误必须被SL报告)
* }
*
* 注意:
* a) vectName 是三者 "RWork", "IWork" 或 "PWork"之一
* b) nNames是int_T (integer), name是const char_T* (const
* char pointer) and size是int_T, 有nNames个[name, size]
* 对传递给函数。.
* b) intSize1+intSize2+ ... +intSizeN = ssGetNum<vectName>(S)
* 设置ssSetNum<vectName>(S) 在一个初始化initialization functions
* 函数(mdlInitializeSizes或mdlSetWorkVectorWidths).
*
* 查看 simulink/include/simulink.c 的定义
*
* 4) 最好以下函数/宏将使你可以将任意字符串以及
* [name, value]对直接写入.rtw文件
*
* if (!ssWriteRTWStr(S, const_char_*_string)) {
* return;
* }
*
* if (!ssWriteRTWStrParam(S, const_char_*_name, const_char_*_value)) {
* return;
* }
*
* if (!ssWriteRTWScalarParam(S, const_char_*_name,
* const_void_*_value,
* DTypeId_dtypeId)) {
* return;
* }
*
* if (!ssWriteRTWStrVectParam(S, const_char_*_name,
* const_char_*_value,
* int_num_items)) {
* return;
* }
*
* if (!ssWriteRTWVectParam(S, const_char_*_name, const_void_*_value,
* int_data_type_of_value, int_vect_len)){
* return;
* }
*
* if (!ssWriteRTW2dMatParam(S, const_char_*_name, const_void_*_value,
* int_data_type_of_value, int_nrows, int_ncols)){
* return;
* }
*
* ‘data_type_of_value' 是上述两个宏的的输入参数,可以通过下述方式获得
* DTINFO(dTypeId, isComplex),
* 其中
* dTypeId: 可以是以下内嵌类型枚举字之一
* (SS_DOUBLE, SS_SINGLE, SS_INT8, SS_UINT8, SS_INT16,
* SS_UINT16, SS_INT32, SS_UINT32, SS_BOOLEAN在simstuc_types.h中定义)
* isComplex: 0和1, 类似于 ssWriteRTWParametersNote-2的解释
*
* 例如 DTINFO(SS_INT32,0) 是一个32-bit有符号实整数。
*
* 如果isComplex==1,则认为 'const_void_*_value'数组有实虚部交错存放(或者说 Simulink格式)
*
* 如果你更喜欢实部和虚部分开存放在不同的数组中,使用下述宏。
*
* if (!ssWriteRTWMxVectParam(S, const_char_*_name,
* const_void_*_rvalue, const_void_*_ivalue,
* int_data_type_of_value, int_vect_len)){
* return;
* }
*
* if (!ssWriteRTWMx2dMatParam(S, const_char_*_name,
* const_void_*_rvalue, const_void_*_ivalue,
* int_data_type_of_value,
* int_nrows, int_ncols)){
* return;
* }
*
* 使用时 查看 simulink/include/simulink.c 和 simstruc.h。有示例
* simulink/src/ml2rtw.c。
*
*/
static void mdlRTW(SimStruct *S)
{
}
#endif /* MDL_RTW */
/*=============================*
* Required S-function trailer *
*=============================*/
#ifdef MATLAB_MEX_FILE /* 这个文件将被编译为 MEX-file? */
#include "simulink.c" /* MEX-file接口机制 */
#else
#include "cg_sfun.h" /* 代码产生注册函数*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -