Разработка системы отображения информации с элементами виртуальной реальности для выполнения посадки неманевренного самолета, страница 30

    S=180;

    ba=5.3;

    l=37.5;

    Ix=1.6e6;

    Iy=5.7e6;

    Iz=6.1e6;

     Cyalf=6.3;

     Czbeta=-1.25;

       mzwz=-1.17;

       mzfi=-0.74;

       mzCy=-0.1;

     mxbeta=-0.24;

       mxwx=-0.66;

       mxwy0=-0.18;

       zita=0.75;

       mxwy=mxwy0+(zita^2)*(alf^2);

    mxdelel=-0.08;

     mxdeln=-0.025;

     mybeta=-0.2;

       mywy=-0.38;

       mywx0=-0.04;

       FI0=0.9;

       mywx=mywx0+(FI0^2)*(alf^2);

     mydeln= -0.09;

    mydelel=0;

q=(ro.*(Vk.^2))./2;  

D=(Iy-Ix)/Iz; B=(Ix-Iz)/Iy; C=(Iz-Iy)/Ix;

wxT=((mxbeta.*beta+mxdelel.*delel+mxdeln.*deln+mxwx.*wx+mxwy.*wy)...

    .*q.*S.*l./Ix)-C.*wy.*wz;

wyT=((mybeta.*beta+mydelel.*delel+mydeln.*deln+mywx.*wx+mywy.*wy)...

    .*q.*S*l./Iy)-B.*wx.*wz;

wzT=((mzCy.*Cyalf.*alf+mzfi.*fi+mzwz.*wz)...

    .*q.*S*ba./Iz)-D.*wx.*wy;

y=[wxT wyT wzT];

28.2  Программа расчета Vk,q,y

function y=force_tu154(alf,beta,gammaA,tetaM,Vk,teta,psi,P,ro)

    macc=94000;

    S=180;

    g=9.8;

Cyalf=6.3;

Czbeta=-1.25;

q=(ro.*(Vk.^2))./2;

Ya=Cyalf.*alf.*q.*S;

Za=(Czbeta.*beta).*q.*S;

Cx0=0.022;

A=0.048;

Cx=Cx0+A*(Cyalf.*alf)^2;

Xa=Cx.*q.*S;

sinalf=sin(alf);

cosalf=cos(alf);

sinbeta=sin(beta);

cosbeta=cos(beta);

singammaA=sin(gammaA);

cosgammaA=cos(gammaA);

Fx=P.*cosalf.*cosbeta-Xa-macc.*g.*sin(teta);

Fy=P.*(sinalf.*cosgammaA+cosalf.*sinbeta.*...

   singammaA)+Ya.*cosgammaA-Za.*singammaA-macc.*g.*cos(teta);

Fz=P.*(sinalf.*singammaA-cosalf.*sinbeta.*...

   cosgammaA)+Ya.*singammaA-Za.*cosgammaA;

dVk=Fx./macc;

dteta=Fy./(macc.*Vk);

dpsi=-Fz./(macc.*Vk.*cos(teta));

y=[dVk;dteta;dpsi];

28.3  Программа расчета Х,Y,Z

function y=traekt(Vk,teta,psi)

dx=Vk.*cos(teta).*cos(psi);

dy=Vk*sin(teta);

dz=-Vk.*cos(teta)*sin(psi);

y=[dx;dy;dz];

28.4  Программа расчета a,b,gа

function y=ugol_ckorost(tetaM,gamma,psiM,teta,psi)

beta=asin(sin(tetaM).*sin(gamma).*cos(psi-psiM)...

    -cos(gamma).*sin(psi-psiM).*cos(teta)-sin(teta).*cos(tetaM).*sin(gamma));

alf=asin((sin(tetaM).*cos(gamma).*cos(psi-psiM)...

    +sin(gamma).*sin(psi-psiM).*cos(teta)-sin(teta).*cos(tetaM).*cos(gamma))./cos(beta));

gammaA=asin((cos(alf).*sin(beta).*sin(tetaM)-cos(tetaM).*(sin(alf).*sin(beta).*cos(gamma)-cos(beta).*sin(gamma)))./cos(teta));

y=[alf beta gammaA];

29.  Приложение 2

29.1  Программа синхронизации времени можделирования

#define S_FUNCTION_NAME  synchronizer

#define S_FUNCTION_LEVEL 2

#include "simstruc.h"

#include "matlab.h"

#include <time.h>

#include <windows.h>

//=====================================================

static clock_t StartTime;

#define DISCRETE_STEP 0.1

#define SYNCHR_R_IDX 0

#define SYNCHR_R_PARAM(S) ssGetSFcnParam(S,SYNCHR_R_IDX)

//=====================================================

//Проверка правильности задания параметров блока S-function

//Должен быть указан 1 параметр - положительное число

static void mdlCheckParameters(SimStruct *S)

{ const mxArray *para = (const mxArray *) SYNCHR_R_PARAM(S);

  real_T *N= mxGetPr(para);

  if ((mxGetM(SYNCHR_R_PARAM(S)) > 1) ||

     (mxGetN(SYNCHR_R_PARAM(S)) > 1)) {

        ssSetErrorStatus(S,"Parameter to S-function must be a scalar.");

       return;

  }

  if (N[0]<=0){ ssSetErrorStatus(S,"Parameter to S-function must be positive!");  return;

  }

}

//=====================================================

//Инициализация блока S-function

static void mdlInitializeSizes(SimStruct *S)

{ ssSetNumSFcnParams(S, 1); 

#if defined(MATLAB_MEX_FILE)

  if (ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S)) {

     mdlCheckParameters(S);

     if (ssGetErrorStatus(S) != NULL) return;

  } else  return;

#endif

  ssSetNumContStates( S, 0);

  ssSetNumDiscStates( S, 0);

  if (!ssSetNumInputPorts(S, 0)) return;

  if (!ssSetNumOutputPorts(S, 0)) return;

  ssSetNumSampleTimes( S, 1);