matlab中s-function模块局部变量的应用

最近在项目中,涉及到了matlab中s-function函数的应用。需要在输出信号上加一个受地面站控制的3211激励信号。实现的过程中,遇到了s-function函数内部局部变量每次进入都会初始化置0的问题,网上查阅资料并结合模型实例,最后通过isempty函数来实现。具体的matlab实现代码如下:

//
function y = fcn(act_sign, act)
persistent t2

if isempty(t2)
    t2=0;
end
b=0;
if (act_sign > 0.5)
    t2=t2+1;
    if (t2<=300)
        b=1;
    elseif (t2>300&&t2<=500)
        b =-1;
    elseif (t2>500&&t2<=600)
        b = 1;
    elseif (t2>600&&t2<=700)
        b =-1;
    elseif (t2>700)
        b =0;
    end
else  
    b=0;
    t2=0;
end

y = act*b;

转换后的c语言代码如下:

/*
 * Output and update for atomic system:
 *    '/激励信号'
 *    '/激励信号'
 *    '/激励信号'
 */
void PID_Code_u(real_T rtu_act_sign, real_T rtu_act, B_u_PID_Code_T *localB,
                DW_u_PID_Code_T *localDW)
{
  int32_T b;

  /* MATLAB Function '控制/控制律/滚转控制/侧向/激励信号': ':1' */
  /* ':1:4' if isempty(t2) */
  /* ':1:7' b=0; */
  b = 0;

  /* ':1:8' if (act_sign > 0.5) */
  if (rtu_act_sign > 0.5) {
    /* ':1:9' t2=t2+1; */
    localDW->t2++;

    /* ':1:10' if (t2<=300) */
    if (localDW->t2 <= 300.0) {
      /* ':1:11' b=1; */
      b = 1;
    } else if ((localDW->t2 > 300.0) && (localDW->t2 <= 500.0)) {
      /* ':1:12' elseif (t2>300&&t2<=500) */
      /* ':1:13' b =-1; */
      b = -1;
    } else if ((localDW->t2 > 500.0) && (localDW->t2 <= 600.0)) {
      /* ':1:14' elseif (t2>500&&t2<=600) */
      /* ':1:15' b = 1; */
      b = 1;
    } else if ((localDW->t2 > 600.0) && (localDW->t2 <= 700.0)) {
      /* ':1:16' elseif (t2>600&&t2<=700) */
      /* ':1:17' b =-1; */
      b = -1;
    }
  } else {
    /* ':1:21' else */
    /* ':1:22' b=0; */
    /* ':1:23' t2=0; */
    localDW->t2 = 0.0;
  }

  /* ':1:26' y = act*b; */
  localB->y = rtu_act * (real_T)b;
}

matlab实际执行转换过程中,函数内部用到的t2变量,只初始化一次,这样即实现了应用t2来计时的目的。

你可能感兴趣的:(matlab)