シングル トラック モデルをモデル化する AC コード内の関数を呼び出す単純な S-Function を作成しました。質量、ヨー慣性モーメント、ステアリング比などを保存するために定数変数を使用しています。これらの変数を調整可能にする方法を知りたいと思っていました。S-Function からサブシステムを作成し、リアルタイム ワークショップ -> S-Function の生成を使用して、リストから調整可能なパラメーターを選択したいと考えています。しかし、今のところ、調整可能なパラメーターを何も指定していないため、調整可能なパラメーターを見つけることができません
これは私の S-Function コードです
#define S_FUNCTION_NAME single_track
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
#include "single_track_func.c"
#define MDL_START /* Change to #undef to remove function */
#if defined(MDL_START)
static void mdlStart(SimStruct *S)
{
initialization();
}
#endif
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, 0);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return; /* Parameter mismatch will be reported by Simulink */
}
if (!ssSetNumInputPorts(S, 2)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortDirectFeedThrough(S, 0, 1);
ssSetInputPortWidth(S, 1, 1);
ssSetInputPortDirectFeedThrough(S, 1, 1);
if (!ssSetNumOutputPorts(S,3)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetOutputPortWidth(S, 1, 1);
ssSetOutputPortWidth(S, 2, 1);
ssSetNumSampleTimes(S, 1);
ssSetSimStateCompliance(S, USE_DEFAULT_SIM_STATE);
ssSetOptions(S,
SS_OPTION_WORKS_WITH_CODE_REUSE |
SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR);
}
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
ssSetModelReferenceSampleTimeDefaultInheritance(S);
}
static void mdlOutputs(SimStruct *S, int_T tid)
{
retvale obj_b;
InputRealPtrsType v_1 = ssGetInputPortRealSignalPtrs(S,0); //velocity
InputRealPtrsType delta_1 = ssGetInputPortRealSignalPtrs(S,1); //steering angle
real_T *a_y_1 = ssGetOutputPortRealSignal(S,0); //lateral acceleration
real_T *psi_dot_1 = ssGetOutputPortRealSignal(S,1); //yaw velocity
real_T *beta_1 = ssGetOutputPortRealSignal(S,2); //attitude angle
obj_b=singletrack((double)*(*v_1),(double)*(*delta_1));
*a_y_1 = obj_b.a_y; //lateral acceleration
*psi_dot_1 =obj_b.psi_dot; //yaw velocity
*beta_1 =obj_b.beta;
}
static void mdlTerminate(SimStruct *S)
{
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif
これは関数 singletrack() を持つロジックファイルです
#include "single_track_func.h"
float a_1_1,a_1_2,a_2_1,a_2_2,b_1_1,b_2_1,psi_dot_prev,beta_prev;
int count;
const int cv=75000; //cornering stiffness front
const int ch=150000; //cornering stiffness rear axle
const int m=1550; //mass of the vehicle kg
const int lv=1.344; //distance from center of gravity to front wheel
const int lh=1.456; //distance from center of gravity to rear wheel
const int theta=2800; //yaw moment of inertia
const int I_s=16; //overall steering ratio
const float dt=0.001;
retvale singletrack(double a,double b)
{
retvale my_obj;
static float beta_dot=0;
static float psi_double_dot=0;
static float beta_previous=0;
static float psi_dot_previous=0;
beta_previous = beta_prev;
psi_dot_previous = psi_dot_prev;
a_1_1 = ((-cv-ch)/((m)*(a)));
a_1_2 = ((m*(a)*(a))-((ch*lh)-(cv*lv)))/(m*(a)*(a));
a_2_1 = (-(ch*lh)+(cv*lv))/theta;
a_2_2 = ((-ch*lh*lh)-(cv*lv*lv))/(theta*(a));
b_1_1 = -cv/(m*(a));
b_2_1 = (cv*lv)/(theta);
beta_dot = a_1_1 * beta_previous + a_1_2 * psi_dot_previous - b_1_1*((b)/I_s);
psi_double_dot = a_2_1 * beta_previous + a_2_2 * psi_dot_previous + b_2_1*((b)/I_s);
my_obj.beta = beta_dot * dt + beta_previous;
my_obj.psi_dot = psi_double_dot * dt + psi_dot_previous;
my_obj.a_y = (a*((my_obj.psi_dot)-(beta_dot)));
beta_prev=my_obj.beta;
psi_dot_prev=my_obj.psi_dot;
return my_obj;
}
void initialization()
{
psi_dot_prev=0;
beta_prev=0;
}
および対応する .h ファイル
#ifndef _SINGLE_TRACK_FUNC_
#define _SINGLE_TRACK_FUNC_
typedef struct retvale
{
double a_y;
double psi_dot;
double beta;
} retvale;
extern struct retvale singletrack(double a,double b);
extern void initialization();
#endif
ssSetSFcnParamTunable() を使用する必要があることはわかっていますが、例を見た後でも、その方法がわかりません!!
アップデート:
変数をグローバル real_T real_T *m_s,*cv_s,*ch_s,*lv_s,*lh_s,*theta_s,*I_s_s,*dt_s; として宣言しました。
これらのコード行を mdlInitializeSizes() に追加しました。私はそれをmexし、すべてが順調です。しかし、s-function ブロックを使用して、s-function の名前を mex ファイルに変更すると、matlab がクラッシュします。また、これらの引数を single_track () 関数へのポインターとして渡します
ssSetNumSFcnParams(S, 8);
m_s=mxGetPr(ssGetSFcnParam(S,0));
cv_s=mxGetPr(ssGetSFcnParam(S,1));
ch_s=mxGetPr(ssGetSFcnParam(S,2));
lv_s=mxGetPr(ssGetSFcnParam(S,3));
lh_s=mxGetPr(ssGetSFcnParam(S,4));
theta_s=mxGetPr(ssGetSFcnParam(S,5));
I_s_s=mxGetPr(ssGetSFcnParam(S,6));
dt_s=mxGetPr(ssGetSFcnParam(S,7));
ssSetSFcnParamTunable(S,0,SS_PRM_SIM_ONLY_TUNABLE);
ssSetSFcnParamTunable(S,1,SS_PRM_SIM_ONLY_TUNABLE);
ssSetSFcnParamTunable(S,2,SS_PRM_SIM_ONLY_TUNABLE);
ssSetSFcnParamTunable(S,3,SS_PRM_SIM_ONLY_TUNABLE);
ssSetSFcnParamTunable(S,4,SS_PRM_SIM_ONLY_TUNABLE);
ssSetSFcnParamTunable(S,5,SS_PRM_SIM_ONLY_TUNABLE);
ssSetSFcnParamTunable(S,6,SS_PRM_SIM_ONLY_TUNABLE);
ssSetSFcnParamTunable(S,7,SS_PRM_SIM_ONLY_TUNABLE);
なぜクラッシュがあるのですか?