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

📄 dph.c

📁 动平衡相关算法 本程序介绍了一些与旋转机械动平衡相关方面的算法
💻 C
字号:
#include <windows.h>
#include <math.h>
#define PI 3.141592654

struct sucoeff{
	double ug0;
	double ut0;
	} ;	
struct sucoeff	usinbal	;//定义结构体usinbal为由单面平衡所得的系统的影响系数(复数),用模ug0 与 幅角ut0(rad)表示
struct sucoeff  gm;		//定义结构体gm为平衡面上的原始不平衡量,幅角单位为度。
struct sucoeff  gi;		//定义结构体gi为平衡面上由试重(不可拆)产生的新增不平衡量,幅角单位为度。
struct sucoeff  phres;	//定义结构体phres为平衡面上应加配重的大小与相位,相位单位为度。

struct strsb {
	double g0;
	double t0;
	struct sucoeff	usinbal;
} ;	
struct strsb sinbal; //定义结构体sinbal为由单面平衡所得的不平衡量的大小(g)和相位(角度)以及影响系数。

struct ducoeff{
	double du11;
	double dthe11;
	double du12;
	double dthe12;
	double du21;
	double dthe21;
	double du22;
	double dthe22;
};
struct ducoeff udoubal;	//定义结构体udoubal为由双面平衡所得的系统的影响系数(4个复数),
						//	用模du11 与 幅角dth11(rad)等表示;

struct strdb{
	double g10;
	double g20;
	double t10;
	double t20;
	struct ducoeff udoubal;
};
struct strdb doubal;	//定义结构体doubal为由双面平衡所得的不平衡量的大小(g)和相位(角度)


struct strcalf{
	double a;
	double b;
} ;
struct strcalf aphase;	//DFT算法的结果(复数),代表振动值,是全局变量。

//////////////////////////////////////////////////////////////////////////////////////


struct strcalf FAR PASCAL calf(double ab[]);

struct strsb FAR PASCAL sb(double sa0[],double sa1[],double g,double bata);
struct strsb FAR PASCAL sonly(double sa[],struct sucoeff usinbal);

struct strdb FAR PASCAL db(double da10[],double da20[],double da11[],double da12[],double da21[],double da22[],
		 double g1,double bata1,double g2,double bata2);
struct strdb FAR PASCAL donly(double da10[],double da20[],struct ducoeff udoubal);
void FAR PASCAL fft(double pr[],double pi[],int n,int k,double fr[],double fi[]);
struct sucoeff FAR PASCAL ph(struct sucoeff gm,struct sucoeff gi);
//////////////////////////////////////////////////////////////////////////////////////
int FAR PASCAL LibMain(HANDLE hInst,WORD wData,WORD wHeap,LPSTR lpCmd)
{
	if(wHeap) UnlockData(0);
	return 1;
} 

int FAR PASCAL WEP(int nSysExt)
{
	return 1;
}
////////////////////////////////////////////////////////////



//单面平衡算法:采用加一次配重方法,求系统的原始不平衡量,
//				同时获取所测系统的影响系数。

struct strsb FAR PASCAL sb(double sa0[32],double sa1[32],double g,double bata)
{
	double a0,afa0,a1,afa1;
	double fz,fm,u,b,c;
	double g0,t0;

	calf(sa0);
	a0=aphase.a;
	afa0=aphase.b;
	calf(sa1);
	a1=aphase.a;
	afa1=aphase.b;

	fz=a1*sin(afa1)-a0*sin(afa0);
	fm=a1*cos(afa1)-a0*cos(afa0);
	u=sqrt(fm*fm+fz*fz);
	u=u/g;
	
	b=atan(fz/fm);
	if (fm<0.0)
		b=b+PI;
	if (b<0.0)
		b=b+2.0*PI;
	c=b-bata*PI/180.0;
	if (c<0.0)
		c=c+2.0*PI;
	if (c>2.0*PI)
		c=c-2.0*PI;

	sinbal.usinbal.ug0=u;
	sinbal.usinbal.ut0=c;

	g0=a0/u;
	t0=afa0-c;
	t0=t0*180.0/PI;
	if (t0<0.0)
		t0=t0+360.0;
	if (t0>360.0)
		t0=t0-360.0;

	sinbal.g0=g0;
	sinbal.t0=t0;

	return sinbal;
}

//单面平衡算法:用于实时监测系统的残余不平衡量。
//说明:已知系统的影响系数 usinbal,振动幅值 sa[32] 已测得,该函数可计算出
//		系统的残余不平衡量,存放于结构体 sinbal 中。
struct strsb FAR PASCAL sonly(double sa[32],struct sucoeff	usinbal)
{
	double a0,afa0,bug0,but0;
	double g0,t0;

	calf(sa);
	a0=aphase.a;
	afa0=aphase.b;
	bug0=usinbal.ug0;
	but0=usinbal.ut0;
	g0=a0/bug0;
	t0=afa0-but0;
	t0=t0*180.0/PI;
	if (t0<0.0)
		t0=t0+360.0;
	if (t0>360.0)
		t0=t0-360.0;
	sinbal.g0=g0;
	sinbal.t0=t0;
	return sinbal;
}

//////////////////////////////////////////////////////////////////////
//双面平衡算法:采用加两次配重法,求系统的原始不平衡量,
//				同时获取所测系统的影响系数。


struct strdb FAR PASCAL db(double da10[32],double da20[32],double da11[32],double da12[32],double da21[32],
		 double da22[32],double g1,double bata1,double g2,double bata2)
{
	double a10,t10,a20,t20,a11,t11,a12,t12,a21,t21,a22,t22;
	double u11,the11,u12,the12,u21,the21,u22,the22;
	double ca11,ca12,ca13,ca14;
	double ca21,ca22,ca23,ca24;
	double ca31,ca32,ca33,ca34;
	double ca41,ca42,ca43,ca44;
	double c11,c12,c13;
	double c21,c22,c23;
	double c31,c32,c33;
	double d1,d2,d3,b1,b2,b3,b4,e11,e12,e21,e22,f1,f2;
	double x1,x2,x3,x4;
	double ur11,ui11,ur12,ui12,ur21,ui21,ur22,ui22;

	calf(da10);
	a10=aphase.a;
	t10=aphase.b;
	calf(da20);
	a20=aphase.a;
	t20=aphase.b;
	calf(da11);
	a11=aphase.a;
	t11=aphase.b;
	calf(da12);
	a12=aphase.a;
	t12=aphase.b;
	calf(da21);
	a21=aphase.a;
	t21=aphase.b;
	calf(da22);
	a22=aphase.a;
	t22=aphase.b;

	u11=sqrt(pow((a11*cos(t11)-a10*cos(t10)),2)+pow((a11*sin(t11)-a10*sin(t10)),2));
	u11=u11/g1;
	u12=sqrt(pow((a12*cos(t12)-a11*cos(t11)),2)+pow((a12*sin(t12)-a11*sin(t11)),2));
	u12=u12/g2;
	u21=sqrt(pow((a21*cos(t21)-a20*cos(t20)),2)+pow((a21*sin(t21)-a20*sin(t20)),2));
	u21=u21/g1;
	u22=sqrt(pow((a22*cos(t22)-a21*cos(t21)),2)+pow((a22*sin(t22)-a21*sin(t21)),2));
	u22=u22/g2;

	doubal.udoubal.du11=u11;
	doubal.udoubal.du12=u12;
	doubal.udoubal.du21=u21;
	doubal.udoubal.du22=u22;


	the11=atan((a11*sin(t11)-a10*sin(t10))/(a11*cos(t11)-a10*cos(t10)));
	the12=atan((a12*sin(t12)-a11*sin(t11))/(a12*cos(t12)-a11*cos(t11)));
	the21=atan((a21*sin(t21)-a20*sin(t20))/(a21*cos(t21)-a20*cos(t20)));
	the22=atan((a22*sin(t22)-a21*sin(t21))/(a22*cos(t22)-a21*cos(t21)));
	if ((a11*cos(t11)-a10*cos(t10))<0.0)
		the11=the11+PI;
	if ((a12*cos(t12)-a11*cos(t11))<0.0)
		the12=the12+PI;
	if ((a21*cos(t21)-a20*cos(t20))<0.0)
		the21=the21+PI;
	if ((a22*cos(t22)-a21*cos(t21))<0.0)
		the22=the22+PI;
	if (the11<0.0)
		the11=the11+2.0*PI;
	if (the12<0.0)
		the12=the12+2.0*PI;
	if (the21<0.0)
		the21=the21+2.0*PI;
	if (the22<0.0)
		the22=the22+2.0*PI;
	the11=the11-bata1*PI/180.0;
	the21=the21-bata1*PI/180.0;
	the12=the12-bata2*PI/180.0;
	the22=the22-bata2*PI/180.0;

	
	doubal.udoubal.dthe11=the11;
	doubal.udoubal.dthe21=the21;
	doubal.udoubal.dthe12=the12;
	doubal.udoubal.dthe22=the22;
	

	ur11=u11*cos(the11);
	ui11=u11*sin(the11);
	ur12=u12*cos(the12);
	ui12=u12*sin(the12);
	ur21=u21*cos(the21);
	ui21=u21*sin(the21);
	ur22=u22*cos(the22);
	ui22=u22*sin(the22);
	ca11=ur11;
	ca12=-ui11;
	ca13=ur12;
	ca14=-ui12;
	ca21=ui11;
	ca22=ur11;
	ca23=ui12;
	ca24=ur12;
	ca31=ur21;
	ca32=-ui21;
	ca33=ur22;
	ca34=-ui22;
	ca41=ui21;
	ca42=ur21;
	ca43=ui22;
	ca44=ur22;
	b1=a10*cos(t10);
	b2=a10*sin(t10);
	b3=a20*cos(t20);
	b4=a20*sin(t20);
	c11=ca21*ca12-ca11*ca22;
	c12=ca21*ca13-ca11*ca23;
	c13=ca21*ca14-ca11*ca24;
	c21=ca31*ca12-ca11*ca32;
	c22=ca31*ca13-ca11*ca33;
	c23=ca31*ca14-ca11*ca34;
	c31=ca41*ca12-ca11*ca42;
	c32=ca41*ca13-ca11*ca43;
	c33=ca41*ca14-ca11*ca44;
	d1=ca21*b1-ca11*b2;
	d2=ca31*b1-ca11*b3;
	d3=ca41*b1-ca11*b4;
	e11=c21*c12-c11*c22;
	e12=c21*c13-c11*c23;
	e21=c31*c12-c11*c32;
	e22=c31*c13-c11*c33;
	f1=c21*d1-c11*d2;
	f2=c31*d1-c11*d3;
	x4=(e21*f1-e11*f2)/(e21*e12-e11*e22);
	x3=(f1-e12*x4)/e11;
	x2=(d1-c12*x3-c13*x4)/c11;
	x1=(b1-ca12*x2-ca13*x3-ca14*x4)/ca11;

	a10=sqrt(x1*x1+x2*x2);
	a20=sqrt(x3*x3+x4*x4);
	t10=atan(x2/x1);
	t20=atan(x4/x3);
	if (x1<0.0)
		t10=t10+PI;
	if (x3<0.0)
		t20=t20+PI;
	t10=t10*180.0/PI;
	t20=t20*180.0/PI;
	if (t10<0.0)
		t10=t10+360.0;
	if (t10>360.0)
		t10=t10-360.0;
	if (t20<0.0)
		t20=t20+360.0;
	if (t20>360.0)
		t20=t20-360.0;
	
	doubal.g10=a10;
	doubal.g20=a20;
	doubal.t10=t10;
	doubal.t20=t20;
	
	return doubal;
}

//双面平衡算法:用于实时监测系统的残余不平衡量。
//说明:已知系统的影响系数 udoubal,第一支承处和第二支承处的振动幅值 da10[32] ,da20[32]已测得,
//		该函数可计算出系统第一平衡面和第二平衡面上的残余不平衡量,结果存放于结构体 doubal 中。

struct strdb FAR PASCAL donly(double da10[32],double da20[32],struct ducoeff udoubal)
{
	double a10,t10,a20,t20;
	double u11,the11,u12,the12,u21,the21,u22,the22;
	double ca11,ca12,ca13,ca14;
	double ca21,ca22,ca23,ca24;
	double ca31,ca32,ca33,ca34;
	double ca41,ca42,ca43,ca44;
	double c11,c12,c13;
	double c21,c22,c23;
	double c31,c32,c33;
	double d1,d2,d3,b1,b2,b3,b4,e11,e12,e21,e22,f1,f2;
	double x1,x2,x3,x4;
	double ur11,ui11,ur12,ui12,ur21,ui21,ur22,ui22;

	u11=udoubal.du11;
	u12=udoubal.du12;
	u21=udoubal.du21;
	u22=udoubal.du22;
	the11=udoubal.dthe11;
	the21=udoubal.dthe21;
	the12=udoubal.dthe12;
	the22=udoubal.dthe22;

	calf(da10);
	a10=aphase.a;
	t10=aphase.b;
	calf(da20);
	a20=aphase.a;
	t20=aphase.b;

	ur11=u11*cos(the11);
	ui11=u11*sin(the11);
	ur12=u12*cos(the12);
	ui12=u12*sin(the12);
	ur21=u21*cos(the21);
	ui21=u21*sin(the21);
	ur22=u22*cos(the22);
	ui22=u22*sin(the22);
	ca11=ur11;
	ca12=-ui11;
	ca13=ur12;
	ca14=-ui12;
	ca21=ui11;
	ca22=ur11;
	ca23=ui12;
	ca24=ur12;
	ca31=ur21;
	ca32=-ui21;
	ca33=ur22;
	ca34=-ui22;
	ca41=ui21;
	ca42=ur21;
	ca43=ui22;
	ca44=ur22;

	b1=a10*cos(t10);
	b2=a10*sin(t10);
	b3=a20*cos(t20);
	b4=a20*sin(t20);
	c11=ca21*ca12-ca11*ca22;
	c12=ca21*ca13-ca11*ca23;
	c13=ca21*ca14-ca11*ca24;
	c21=ca31*ca12-ca11*ca32;
	c22=ca31*ca13-ca11*ca33;
	c23=ca31*ca14-ca11*ca34;
	c31=ca41*ca12-ca11*ca42;
	c32=ca41*ca13-ca11*ca43;
	c33=ca41*ca14-ca11*ca44;
	d1=ca21*b1-ca11*b2;
	d2=ca31*b1-ca11*b3;
	d3=ca41*b1-ca11*b4;
	e11=c21*c12-c11*c22;
	e12=c21*c13-c11*c23;
	e21=c31*c12-c11*c32;
	e22=c31*c13-c11*c33;
	f1=c21*d1-c11*d2;
	f2=c31*d1-c11*d3;
	x4=(e21*f1-e11*f2)/(e21*e12-e11*e22);
	x3=(f1-e12*x4)/e11;
	x2=(d1-c12*x3-c13*x4)/c11;
	x1=(b1-ca12*x2-ca13*x3-ca14*x4)/ca11;

	a10=sqrt(x1*x1+x2*x2);
	a20=sqrt(x3*x3+x4*x4);
	t10=atan(x2/x1);
	t20=atan(x4/x3);
	if (x1<0.0)
		t10=t10+PI;
	if (x3<0.0)
		t20=t20+PI;
	t10=t10*180.0/PI;
	t20=t20*180.0/PI;
	if (t10<0.0)
		t10=t10+360.0;
	if (t10>360.0)
		t10=t10-360.0;
	if (t20<0.0)
		t20=t20+360.0;
	if (t20>360.0)
		t20=t20-360.0;
	
	doubal.g10=a10;
	doubal.g20=a20;
	doubal.t10=t10;
	doubal.t20=t20;
	
	return doubal;

}

//////////////////////////////////////////////////////////
//DFT算法:

struct strcalf FAR PASCAL calf(double ab[32])
{
	double a1,b1,a,b;
	int i;

	a1=0.0;
	b1=0.0;
	for (i=0;i<32;i=i+1) {
		a1=a1+ab[i]*cos(i*PI/16.0);
		b1=b1-ab[i]*sin(i*PI/16.0);
	};
	a=sqrt(a1*a1+b1*b1)/16.0;
	b=atan(b1/a1);
	if (a1<0.0)
		b=b+PI;
	aphase.a=a;
	aphase.b=b;
	return aphase;
}

//////////////////////////////////////////////////////////////
//FFT算法
//注:数组pr[],pi[](令pi[]=0)为时域采样信号值,n为采样点数,K=lg(n);
//	FFT结果有两种表现形式:数组pr[],pi[]以模与幅角(单位度)的形式存放FFT结果;
//						数组fr[],fi[]以实部与虚部的形式存放FFT结果;

void FAR PASCAL fft(double pr[],double pi[],int n,int k,double fr[],double fi[])
  { int it,m,is,i,j,nv,l0;
    double p,q,s,vr,vi,poddr,poddi;
    for (it=0; it<=n-1; it++)
      { m=it; is=0;
        for (i=0; i<=k-1; i++)
          { j=m/2; is=2*is+(m-2*j); m=j;}
        fr[it]=pr[is]; fi[it]=pi[is];
      }
    pr[0]=1.0; pi[0]=0.0;
    p=6.283185306/(1.0*n);
    pr[1]=cos(p); pi[1]=-sin(p);
    for (i=2; i<=n-1; i++)
      { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
        s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
        pr[i]=p-q; pi[i]=s-p-q;
      }
    for (it=0; it<=n-2; it=it+2)
      { vr=fr[it]; vi=fi[it];
        fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
        fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
      }
    m=n/2; nv=2;
    for (l0=k-2; l0>=0; l0--)
      { m=m/2; nv=2*nv;
        for (it=0; it<=(m-1)*nv; it=it+nv)
          for (j=0; j<=(nv/2)-1; j++)
            { p=pr[m*j]*fr[it+j+nv/2];
              q=pi[m*j]*fi[it+j+nv/2];
              s=pr[m*j]+pi[m*j];
              s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
              poddr=p-q; poddi=s-p-q;
              fr[it+j+nv/2]=fr[it+j]-poddr;
              fi[it+j+nv/2]=fi[it+j]-poddi;
              fr[it+j]=fr[it+j]+poddr;
              fi[it+j]=fi[it+j]+poddi;
            }
      }
    for (i=0; i<=n-1; i++)
        { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
          if (fabs(fr[i])<0.000001*fabs(fi[i]))
            { if ((fi[i]*fr[i])>0) pi[i]=90.0;
              else pi[i]=-90.0;
            }
          else
            pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
        }
    return;
  }

//////////////////////////////////////////////////////////////
//配重算法ph:考虑到试重不可拆,ph函数解决平衡面上实际应加配重的大小与相位(单位:度);
//注:	定义结构体gm为平衡面上的原始不平衡量,幅角单位为度。
//		定义结构体gi为平衡面上由试重(不可拆)产生的新增不平衡量,幅角单位为度。
//		定义结构体phres为平衡面上应加配重的大小与相位,相位单位为度。


struct sucoeff FAR PASCAL ph(struct sucoeff gm,struct sucoeff gi)
{
	struct sucoeff phres;
	double gx,gy,tp;
	double g,t,g1,bata1;
	
	g=gm.ug0;
	t=gm.ut0*PI/180.0;
	g1=gi.ug0;
	bata1=gi.ut0*PI/180.0;
	gx=g*cos(t)+g1*cos(bata1);
	gy=g*sin(t)+g1*sin(bata1);
	phres.ug0=sqrt(gx*gx+gy*gy);
	if(fabs(gx)<0.000001*fabs(gy))
	{
		if((gx*gy)>0)
				tp=90.0;
		else
				tp=-90.0;
	}else
		tp=atan(gy/gx)*360.0/6.283185306;
	if(gx<0)
		tp=tp+180.0;
	if(tp<180.0)
	{
		tp=tp+180.0;
	}else 
		tp=tp-180.0;
	phres.ut0=tp;  
	return phres;
}
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -