⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_function_ch.c

📁 matlab中simulink中用C语言编写S函数模板的翻译版本
💻 C
📖 第 1 页 / 共 4 页
字号:
 *    如果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 + -