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

📄 prealarmdlg.cpp

📁 运用神经网络证据理论数据融合等算法实现设备的故障诊断
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	
    CWnd *p1=NULL;
	
    p1=(CWnd *)GetDlgItem(IDC_PIC);      //得到用于显示图像Static text控件的ID
    Mm plothandle=winaxes(p1->m_hWnd);   //将Static text的句柄设置赋给画图句柄
    plt(X,Y);             //调用函数plt()
    exitM();              //结束库函数的调用
}

void CPreAlarmDlg::OnBPRun() 
{
	// TODO: Add your control notification handler code here
	double* temp1;	double* temp2;	double* temp3;
	double* temp4;	double* temp5;	double* temp6;

	P=Svalue;
	temp2=N1=MatrixAdd((temp1=MatrixMul(W1_final,P,s1,r,1)),B1_final,s1,1);  //N1: s1×1
	temp3=A1=f1(N1,s1);
	temp5=N2=MatrixAdd((temp4=MatrixMul(W2_final,A1,s2,s1,1)),B2_final,s2,1);//N2: s2×1
	temp6=A2=f2(N2,s2);

//***A2归一化处理
	double XX;
	XX=A2[0]*A2[0]+A2[1]*A2[1]+A2[2]*A2[2]+A2[3]*A2[3]+A2[4]*A2[4]+A2[5]*A2[5]+A2[6]*A2[6]+A2[7]*A2[7];
	for(int p=0;p<8;p++) {A2[p]=A2[p]*A2[p]/XX;};

//****计算序号
	double Rmax;	
	Rmax=A2[0];
	for(int k=1;k<8;k++)
	{
	if(Rmax>=A2[k]) Rmax=Rmax; 
	if(Rmax<A2[k])  Rmax=A2[k];
	}
	int n=0;  while(Rmax != A2[n]) {n=n+1;};

    CString str;
	switch (n)
	{ case 0 :str="BP诊断故障为:不平衡";        break;
      case 1 :str="BP诊断故障为:不对中";        break;
      case 2 :str="BP诊断故障为:油膜涡动";      break;
	  case 3 :str="BP诊断故障为:基础松动";      break;
	  case 4 :str="BP诊断故障为:转子碰摩";      break;
	  case 5 :str="BP诊断故障为:推力轴承损坏";  break;
	  case 6 :str="BP诊断故障为:轴承座松动";    break;
	  case 7 :str="BP诊断故障为:不等轴承刚度";  break;
	}
	m_result=str;
	UpdateData(FALSE);

//***绘图
	if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1)  {	clf(); clf01=clf02=clf21=clf22=clf31=0;}//清除曲线
	clf21=1;
	initM(MATCOM_VERSION); //初始化matcom库函数

	Mm X,Y;
	X=zeros(1,8);
	Y=zeros(1,8); 
	
	for(int i=0;i<8;i++) {X(1,i+1)=i+1;};
	for(int j=0;j<8;j++) {Y(1,j+1)=A2[j];};
		
    CWnd *p1=NULL;
	
    p1=(CWnd *)GetDlgItem(IDC_PIC);      //得到用于显示图像Static text控件的ID
    Mm plothandle=winaxes(p1->m_hWnd);  //将Static text的句柄设置赋给画图句柄

    bar(X,Y);             //调用函数bar()
 
    exitM();              //结束库函数的调用
}
void CPreAlarmDlg::OnBPSave() 
{
	// TODO: Add your control notification handler code here
	for(int i=0;i<8;i++) {BPnetResult[number][i]=A2[i];};
	number++;
	m_dstotalnum=number;
    UpdateData(FALSE);
}

//***********************************************************
//调用的函数
void CPreAlarmDlg::cretwb()
{  
	W1=MatrixRand(s1,r);  B1=MatrixRand(s1,1);
	W2=MatrixRand(s2,s1); B2=MatrixRand(s2,1);	

	int i,j;
	for(i=0;i<s1;i++) 
	{   B1_init[i]=B1[i];
		for(j=0;j<r;j++) W1_init[i*r+j]=W1[i*r+j];
	}
    for(i=0;i<s2;i++) 
	{   B2_init[i]=B2[i];
		for(j=0;j<s1;j++) W2_init[i*s1+j]=W2[i*s1+j];
	}
	free(W1);free(W2);free(B1);free(B2);
}

void CPreAlarmDlg::initwb()
{   int i,j;
	for(i=0;i<s1;i++) 
	{   B1_final[i]=B1_init[i];
		for(j=0;j<r;j++) W1_final[i*r+j]=W1_init[i*r+j];
	}
    for(i=0;i<s2;i++) 
	{   B2_final[i]=B2_init[i];
		for(j=0;j<s1;j++) W2_final[i*s1+j]=W2_init[i*s1+j];
	}
}

void CPreAlarmDlg::loadwb()
{   int i,j;
    W1=(double*)malloc(s1*r*sizeof(double));
    W2=(double*)malloc(s2*s1*sizeof(double));
	B1=(double*)malloc(s1*1*sizeof(double));
	B2=(double*)malloc(s2*1*sizeof(double));
	for(i=0;i<s1;i++) 
	{   B1[i]=B1_final[i];
		for(j=0;j<r;j++) W1[i*r+j]=W1_final[i*r+j];
	}
    for(i=0;i<s2;i++) 
	{   B2[i]=B2_final[i];
		for(j=0;j<s1;j++) W2[i*s1+j]=W2_final[i*s1+j];
	}
}

void CPreAlarmDlg::savewb()
{   int i,j;
	for(i=0;i<s1;i++) 
	{   B1_final[i]=B1[i];
		for(j=0;j<r;j++) W1_final[i*r+j]=W1[i*r+j];
	}
    for(i=0;i<s2;i++) 
	{   B2_final[i]=B2[i];
		for(j=0;j<s1;j++) W2_final[i*s1+j]=W2[i*s1+j];
	}
}

double*CPreAlarmDlg::f1(double A[],int m)
{   int i;
    double *B=NULL;
	B=(double*)malloc(m*1*sizeof(double));
	for(i=0;i<m;i++)
		B[i]=(double)1/(1+exp(-A[i]));
	return B;
}

double* CPreAlarmDlg::f2(double A[],int m)
{   int i;
    double *B=NULL;
	B=(double*)malloc(m*1*sizeof(double));
	for(i=0;i<m;i++)
		B[i]=A[i];
	return B;
}

double* CPreAlarmDlg::F1(double N[],int m)
{   int i,j;
    double *B=NULL;
	B=(double*)malloc(m*m*sizeof(double));
	for(i=0;i<m;i++)
		for(j=0;j<m;j++)
		   B[i*m+j]=0;
	for(i=0;i<m;i++)
		B[i*m+i]=exp(-N[i])/((1+exp(-N[i]))*(1+exp(-N[i])));
	return B;
}

double* CPreAlarmDlg::F2(double N[],int m)
{   int i,j;
    double *B=NULL;
	B=(double*)malloc(m*m*sizeof(double));
	for(i=0;i<m;i++)
		for(j=0;j<m;j++)
		   B[i*m+j]=0;
	for(i=0;i<m;i++)
		B[i*m+i]=1;
	return B;
}
//*****************************************************
//////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////
//DS 分析基本函数
void CPreAlarmDlg::OnBPResult() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_value09=(float)BPnetResult[m_dsselectnum-1][0];
	m_value10=(float)BPnetResult[m_dsselectnum-1][1];
	m_value11=(float)BPnetResult[m_dsselectnum-1][2];
	m_value12=(float)BPnetResult[m_dsselectnum-1][3];
	m_value13=(float)BPnetResult[m_dsselectnum-1][4];
	m_value14=(float)BPnetResult[m_dsselectnum-1][5];
	m_value15=(float)BPnetResult[m_dsselectnum-1][6];
	m_value16=(float)BPnetResult[m_dsselectnum-1][7];
	UpdateData(FALSE);
}

void CPreAlarmDlg::OnDSBel() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	N_BP=number;
    double R01=0,R02=0;
	for(int i=0;i<8;i++)
	{ R01+=BPnetResult[m_dsselectnum-1][i];}
//参数 计算
    double A[20],B[20];
	A[m_dsselectnum-1]=BPnetResult[m_dsselectnum-1][0];
	for(int t=1;t<8;t++)
	{  
		if(A[m_dsselectnum-1]<BPnetResult[m_dsselectnum-1][t]) 
			A[m_dsselectnum-1]=BPnetResult[m_dsselectnum-1][t];
	}
    B[m_dsselectnum-1]=A[m_dsselectnum-1]/R01;
	R02=N_BP*(1-0.9)*(1-A[m_dsselectnum-1]*B[m_dsselectnum-1]);
//Bel 计算
	for(int j=0;j<8;j++)
	{Bel[m_dsselectnum-1][j]=BPnetResult[m_dsselectnum-1][j]/(R01+R02);}
//不确定性 计算
	 Psl[m_dsselectnum-1]=R02/(R01+R02);
//显示
	m_value09=(float)Bel[m_dsselectnum-1][0];
	m_value10=(float)Bel[m_dsselectnum-1][1];
	m_value11=(float)Bel[m_dsselectnum-1][2];
	m_value12=(float)Bel[m_dsselectnum-1][3];
	m_value13=(float)Bel[m_dsselectnum-1][4];
	m_value14=(float)Bel[m_dsselectnum-1][5];
	m_value15=(float)Bel[m_dsselectnum-1][6];
	m_value16=(float)Bel[m_dsselectnum-1][7];
	UpdateData(FALSE);
}

void CPreAlarmDlg::OnDSFuse() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	N_BP=number;
	double ZZ[9];      //临时存储乘积计算结果
//计算正交和
	for(int i=1;i<N_BP;i++)
	{
		ZZ[0]=Psl[0]*Psl[i];
		for(int j=0;j<8;j++)
		{
			ZZ[j+1]=Bel[0][j]*Bel[i][j];
		}
		Psl[0]=ZZ[0]/(ZZ[0]+ZZ[1]+ZZ[2]+ZZ[3]+ZZ[4]+ZZ[5]+ZZ[6]+ZZ[7]+ZZ[8]);
		for(int k=0;k<8;k++)
		{
        Bel[0][k]=ZZ[k+1]/(ZZ[0]+ZZ[1]+ZZ[2]+ZZ[3]+ZZ[4]+ZZ[5]+ZZ[6]+ZZ[7]+ZZ[8]);
		}
	}
//绘制柱形图
	if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1)  {	clf(); clf01=clf02=clf21=clf22=clf31=0;}
	clf31=1;
	initM(MATCOM_VERSION); //初始化matcom库函数

	Mm X,Y;
	X=zeros(1,8);
	Y=zeros(1,8); 
	for(i=0;i<8;i++) {X(1,i+1)=i+1;};
	for(i=0;i<8;i++) {Y(1,i+1)=Bel[0][i];};
		
    CWnd *p1=NULL;	
    p1=(CWnd *)GetDlgItem(IDC_PIC);      //得到用于显示图像Static text控件的ID
    Mm plothandle=winaxes(p1->m_hWnd);     //将Static text的句柄设置赋给画图句柄
    bar(X,Y);             //调用函数bar()
 
    exitM();              //结束库函数的调用
//显示
	m_value09=(float)Bel[0][0];
	m_value10=(float)Bel[0][1];
	m_value11=(float)Bel[0][2];
	m_value12=(float)Bel[0][3];
	m_value13=(float)Bel[0][4];
	m_value14=(float)Bel[0][5];
	m_value15=(float)Bel[0][6];
	m_value16=(float)Bel[0][7];
	UpdateData(FALSE);
}

void CPreAlarmDlg::OnDSDiagnose() 
{
	// TODO: Add your control notification handler code here
	BOOL bVal;
	long lVal;
	float fVal;
	char *sVal;
	char *buf;

	UpdateData(TRUE);
	double R1=0,R2=0;
//计算R1,R2
    R1=Bel[0][0]; //最大值
	for(int i=1;i<8;i++)
	{
       if(R1<Bel[0][i]) R1=Bel[0][i];
	}
	int k=1;
	while(R1!=Bel[0][k-1]){k++;};

	Bel[0][k-1]=0;
	R2=Bel[0][0]; //次大值
    for(int j=1;j<8;j++)
	{
       if(R2<Bel[0][j]) R2=Bel[0][j];
	}
    Bel[0][k-1]=R1;
//决策判断
	CString str;
    if((R1-R2>m_e1)&&(Psl[0]<m_e2))
	{
	switch (k)
	{ case 1 :str="DS融合分析 故障为:不平衡";       sVal="不平衡";       break;
      case 2 :str="DS融合分析 故障为:不对中";       sVal="不对中";       break;
      case 3 :str="DS融合分析 故障为:油膜涡动";     sVal="油膜涡动";     break;
	  case 4 :str="DS融合分析 故障为:基础松动";     sVal="基础松动";     break;
	  case 5 :str="DS融合分析 故障为:转子碰摩";     sVal="转子碰摩";     break;
	  case 6 :str="DS融合分析 故障为:推力轴承损坏"; sVal="推力轴承损坏"; break;
	  case 7 :str="DS融合分析 故障为:轴承座松动";   sVal="轴承座松动";   break;
	  case 8 :str="DS融合分析 故障为:不等轴承刚度"; sVal="不等轴承刚度"; break;
	}
	}
	else
	{str="DS融合分析 设备正常";sVal="设备正常";}
//显示
	m_result=str;
    UpdateData(FALSE);
//返回组态王
    buf="设备状态.Value";
	App_AddTag(buf,&m_ReadID_zt,&m_DataType_zt);
	App_WriteTag(m_ReadID_zt,bVal,lVal,fVal,sVal);
    
}
////////////////////////////////////////////////////////////////////////////////////////

void CPreAlarmDlg::OnAutoRun() 
{
	// TODO: Add your control notification handler code here
  SetTimer(10,30000,NULL); 
}
void delay_3000ms()
{
   DWORD dwStart,dwEnd;
   dwStart=GetTickCount();
   dwEnd=dwStart;
   do{dwEnd=GetTickCount()-dwStart;}while(dwEnd>3000);
}

void  CPreAlarmDlg::diagnose()
{
//step 1: 参数计算(特征峰值/隶属度值/BP分析/BP保存)
   for(p=1;p<5;p++)
   {
   OnCpeakValue();
   OnSubjection();
   OnBPRun();
   OnBPSave();
   }
//step 2: DS分析(融合/诊断)
   m_dsselectnum=1; 
   OnDSBel();
   m_dsselectnum=2; 
   OnDSBel();
   m_dsselectnum=3; 
   OnDSBel();
   m_dsselectnum=4; 
   OnDSBel();

   OnDSDiagnose();
   OnDSFuse();
   number=0;
}
////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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