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

📄 prealarmdlg.cpp

📁 运用神经网络证据理论数据融合等算法实现设备的故障诊断
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    SetTimer(3,1000,NULL);
}

void CPreAlarmDlg::OnSaveData() 
{
	// TODO: Add your control notification handler code here
	m_Tw3x.DeleteAllItems();
	m_Tw3y.DeleteAllItems();
	m_Tw4x.DeleteAllItems();
	m_Tw4y.DeleteAllItems();
    k=0;
	App_AddTag("W3X.Value",&m_ReadID_w3x,&m_DataType_w3x);
	App_AddTag("W3Y.Value",&m_ReadID_w3y,&m_DataType_w3y);
	App_AddTag("W4X.Value",&m_ReadID_w4x,&m_DataType_w4x);
	App_AddTag("W4Y.Value",&m_ReadID_w4y,&m_DataType_w4y);

    SetTimer(4,1000,NULL);
}

void CPreAlarmDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	BOOL bVal;
	long lVal;
	float fVal1,fVal2,fVal3,fVal4,fVal5,fVal6,fVal7,fVal8;
	char sVal[255];

	if(nIDEvent==3)
	{
	App_ReadTag(m_ReadID_w3x,&bVal,&lVal,&fVal1,sVal);
	App_ReadTag(m_ReadID_w3y,&bVal,&lVal,&fVal2,sVal);
	App_ReadTag(m_ReadID_w4x,&bVal,&lVal,&fVal3,sVal);
	App_ReadTag(m_ReadID_w4y,&bVal,&lVal,&fVal4,sVal);

    m_Ew3x=fVal1;
	m_Ew3y=fVal2;
    m_Ew4x=fVal3;
	m_Ew4y=fVal4;
	UpdateData(FALSE);
	}

    if(nIDEvent==4)
	{
	if(m_Tw3x.GetCount()>10)//存12个点,k=12
	{	
    	KillTimer(4);
	}	
	App_ReadTag(m_ReadID_w3x,&bVal,&lVal,&fVal5,sVal);
	App_ReadTag(m_ReadID_w3y,&bVal,&lVal,&fVal6,sVal);
	App_ReadTag(m_ReadID_w4x,&bVal,&lVal,&fVal7,sVal);
	App_ReadTag(m_ReadID_w4y,&bVal,&lVal,&fVal8,sVal);
	W3X[k]=fVal5;
    W3Y[k]=fVal6;
	W4X[k]=fVal7;
	W4Y[k++]=fVal8;
	CString SS1,SS2,SS3,SS4;
	SS1.Format("%f",fVal5);
    SS2.Format("%f",fVal6);
	SS3.Format("%f",fVal7);
	SS4.Format("%f",fVal8);
    m_Tw3x.InsertItem(SS1,TVI_ROOT,TVI_LAST );
	m_Tw3y.InsertItem(SS2,TVI_ROOT,TVI_LAST );
	m_Tw4x.InsertItem(SS3,TVI_ROOT,TVI_LAST );
	m_Tw4y.InsertItem(SS4,TVI_ROOT,TVI_LAST );
	}
    if(nIDEvent==5)
	{
	OnFdataCurve();
	if(k>11)//存12个点
	{
		diagnose();
    	KillTimer(5);
		for(int j=0;j<1024;j++)
		{ 
			W3X[j]=0;
			W3Y[j]=0;
			W4X[j]=0;
			W3Y[j]=0;
		}
	}
	}
	 if(nIDEvent==10)
	{
		OnSaveData();
        SetTimer(5,1000,NULL);
	}
	CDialog::OnTimer(nIDEvent);
}
////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////
//信号分析基本函数
void CPreAlarmDlg::OnTdataCurve() 
{
	// TODO: Add your control notification handler code here
	if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1)  {	clf(); clf01=clf02=clf21=clf22=clf31=0;}  //清除曲线
	clf01=1;
//***参数设定
	N=1024;
	fs=500;//风机转速1000rpm =〉基频f=1000/60=>采样频率100/6*10*3=500HZ 
//***选择测点
	UpdateData(TRUE);
	p=1;
	CString str;
	if(m_select.GetCurSel()!=CB_ERR)
	{
		m_select.GetLBText(m_select.GetCurSel(),str);
	    p=atoi(str.GetBuffer(0));
	}
//***计算与绘图
	initM(MATCOM_VERSION); //初始化matcom库函数
	Mm X,Y;
	X=zeros(1,N);	Y=zeros(1,N); 		
	for(int i=0;i<N;i++) {X(1,i+1)=i;};
	int j;
	switch (p)
	{ 
	case 1 : for(j=0;j<N;j++) {Y(1,j+1)=W3X[j];}; break;
	case 2 : for(j=0;j<N;j++) {Y(1,j+1)=W3Y[j];}; break;
	case 3 : for(j=0;j<N;j++) {Y(1,j+1)=W4X[j];}; break;
	case 4 : for(j=0;j<N;j++) {Y(1,j+1)=W4Y[j];}; break;
	}	 	
	CWnd *p1=NULL;	
    p1=(CWnd *)GetDlgItem(IDC_PIC);      //得到用于显示图像Static text控件的ID
    Mm plothandle=winaxes(p1->m_hWnd);     //将Static text的句柄设置赋给画图句柄
	plt(X,Y);                //plot(CL(Y));
    exitM();                 //结束库函数的调用
}

void CPreAlarmDlg::OnFdataCurve() 
{
	// TODO: Add your control notification handler code here
	if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1)  {	clf(); clf01=clf02=clf21=clf22=clf31=0;}//清除曲线
	clf02=1;
//***参数设定
	UpdateData(TRUE);
	N=1024;
	Nfft=1024;
	fs=500;
//***选择测点
	UpdateData(TRUE);
	p=1;//为了循环显示
	CString str;
	if(m_select.GetCurSel()!=CB_ERR)
	{
		m_select.GetLBText(m_select.GetCurSel(),str);
	    p=atoi(str.GetBuffer(0));
	}
//***计算与绘图
	initM(MATCOM_VERSION); //初始化matcom库函数
	Mm X,Y,NN,R,RX,RY;
	X=zeros(1,N);	Y=zeros(1,N);
	NN=zeros(1,1);
	R=zeros(1,Nfft);
	RX=zeros(1,Nfft/2);   RY=zeros(1,Nfft/2);		
    int j;
	switch (p)
	{ 
	case 1 : for(j=0;j<N;j++) {Y(1,j+1)=W3X[j];}; break;
	case 2 : for(j=0;j<N;j++) {Y(1,j+1)=W3Y[j];}; break;
	case 3 : for(j=0;j<N;j++) {Y(1,j+1)=W4X[j];}; break;
	case 4 : for(j=0;j<N;j++) {Y(1,j+1)=W4Y[j];}; break;
	}
	NN(1,1)=Nfft;	
    CWnd *p1=NULL;	
    p1=(CWnd *)GetDlgItem(IDC_PIC);      //得到用于显示图像Static text控件的ID
    Mm plothandle=winaxes(p1->m_hWnd);     //将Static text的句柄设置赋给画图句柄
    R=real(fft(Y,NN));
	for(int k0=0;k0<Nfft/2;k0++) {RY(1,k0+1)=R(1,k0+1);};
	for(int k1=0;k1<Nfft/2;k1++) {RX(1,k1+1)=k1*fs/Nfft;};
	plt(RX,abs(RY));         //plot(CL(abs(RY)));
    exitM();                 //结束库函数的调用
}

void CPreAlarmDlg::OnCpeakValue() 
{
	// TODO: Add your control notification handler code here
//***参数设定	
	N=1024;
	Nfft=1024;
	F0=50/3;
	fs=500;
//***选择测点
	UpdateData(TRUE);
	CString str;
	if(m_select.GetCurSel()!=CB_ERR)
	{
		m_select.GetLBText(m_select.GetCurSel(),str);
	    p=atoi(str.GetBuffer(0));
	}
//***频段参数
	double f11,f12,f21,f22,f30,f41,f42,f50,f60,f71,f72,f81,f82;
	int     n11,n12,n21,n22,n30,n41,n42,n50,n60,n71,n72,n81,n82;
	f11=0.01*F0;	n11=(int)(f11*Nfft/fs+1);
	f12=0.39*F0;    n12=(int)(f12*Nfft/fs+1);
	f21=0.40*F0;    n21=(int)(f21*Nfft/fs+1);	
	f22=0.48*F0;    n22=(int)(f22*Nfft/fs+1);
	f30=0.50*F0;    n30=(int)(f30*Nfft/fs+1);
	f41=0.51*F0;    n41=(int)(f41*Nfft/fs+1);	
	f42=0.99*F0;    n42=(int)(f42*Nfft/fs+1);
	f50=F0;         n50=(int)(f50*Nfft/fs+1);
	f60=2*F0;       n60=(int)(f60*Nfft/fs+1);
	f71=3*F0;       n71=(int)(f71*Nfft/fs+1);  	
	f72=5*F0;       n72=(int)(f72*Nfft/fs+1);
	f81=f72;        n81=(int)(f81*Nfft/fs+1);  	
	f82=fs/2;       n82=(int)(f82*Nfft/fs);

//***峰值计算
	initM(MATCOM_VERSION); //初始化matcom库函数
	Mm X,Y,NN,R,RX,RY;
	X=zeros(1,N);	Y=zeros(1,N);
	NN=zeros(1,1);
	R=zeros(1,Nfft);
	RX=zeros(1,Nfft/2);   RY=zeros(1,Nfft/2);
	
    int j;
	switch (p)
	{ 
	case 1 : for(j=0;j<N;j++) {Y(1,j+1)=W3X[j];}; break;
	case 2 : for(j=0;j<N;j++) {Y(1,j+1)=W3Y[j];}; break;
	case 3 : for(j=0;j<N;j++) {Y(1,j+1)=W4X[j];}; break;
	case 4 : for(j=0;j<N;j++) {Y(1,j+1)=W4Y[j];}; break;
	}
	NN(1,1)=Nfft;	
    R=real(fft(Y,NN));
	for(int k0=0;k0<Nfft/2;k0++)  {RY(1,k0+1)=R(1,k0+1);};
	for(int k1=0;k1<Nfft/2;k1++)  {RX(1,k1+1)=k1*fs/Nfft;}; 
    
	Mm RY1,RY2,RY3,RY4,RY5,RY6,RY7,RY8; //存储每个频段值 
	RY1=zeros(1,n12-n11+1);	for(int p1=0;p1<n12-n11+1;p1++) {RY1(1,p1+1)=RY(1,n11+p1);};
	RY2=zeros(1,n22-n21+1);	for(int p2=0;p2<n22-n21+1;p2++) {RY2(1,p2+1)=RY(1,n21+p2);};
	RY3=zeros(1,n30-n30+1); RY3(1,1)=RY(n30);
	RY4=zeros(1,n42-n41+1); for(int p4=0;p4<n42-n41+1;p4++) {RY4(1,p4+1)=RY(1,n41+p4);};
	RY5=zeros(1,n50-n50+1); RY5(1,1)=RY(n50);
	RY6=zeros(1,n60-n60+1); RY6(1,1)=RY(n60);
	RY7=zeros(1,n72-n71+1); for(int p7=0;p7<n72-n71+1;p7++) {RY7(1,p7+1)=RY(1,n71+p7);};
	RY8=zeros(1,n82-n81+1); for(int p8=0;p8<n82-n81+1;p8++) {RY8(1,p8+1)=RY(1,n81+p8);};
  
//***峰值输出
	Pvalue[0]=max(abs(RY1)).r(1,1);m_value01=(float)Pvalue[0];
    Pvalue[1]=max(abs(RY2)).r(1,1);m_value02=(float)Pvalue[1];
	Pvalue[2]=abs(RY3).r(1,1);     m_value03=(float)Pvalue[2];
	Pvalue[3]=max(abs(RY4)).r(1,1);m_value04=(float)Pvalue[3];
	Pvalue[4]=abs(RY5).r(1,1);     m_value05=(float)Pvalue[4];
	Pvalue[5]=abs(RY6).r(1,1);     m_value06=(float)Pvalue[5];
	Pvalue[6]=max(abs(RY7)).r(1,1);m_value07=(float)Pvalue[6];
	Pvalue[7]=max(abs(RY8)).r(1,1);m_value08=(float)Pvalue[7];
	UpdateData(FALSE);
    exitM();                 //结束库函数的调用
}

void CPreAlarmDlg::OnSubjection() 
{
	// TODO: Add your control notification handler code here

//***隶属度计算
    double X,K,P[8];

	X=Pvalue[0]+Pvalue[1]+Pvalue[2]+Pvalue[3]+Pvalue[4]+Pvalue[5]+Pvalue[6]+Pvalue[7];
	K=1/((X*X/64));
	for(int i=0;i<8;i++)
	{
		P[i]=K*Pvalue[i]*Pvalue[i];
		Svalue[i]=P[i]/(1+P[i]);
	}
//***隶属度输出
	m_value01=(float)Svalue[0];
    m_value02=(float)Svalue[1];
	m_value03=(float)Svalue[2];
	m_value04=(float)Svalue[3];
	m_value05=(float)Svalue[4];
	m_value06=(float)Svalue[5];
	m_value07=(float)Svalue[6];
	m_value08=(float)Svalue[7];
	UpdateData(FALSE);
}

void CPreAlarmDlg::OnCurveClear() 
{
	// TODO: Add your control notification handler code here
	if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1)  {	clf(); clf01=clf02=clf21=clf22=clf31=0;}  //清除曲线
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//BP 分析基本函数

void CPreAlarmDlg::OnBPTrain() 
{
	// TODO: Add your control notification handler code here
    Ns=8;
	UpdateData(TRUE);
	N_Err=15000;
    error_accept=m_alloweer;
	learnspeed=m_speed;
	cretwb();

	int i,current=0,loops=0,trainok=0;
    double* temp[15];
	int mark[50];                  //**训练成功标志,最多50个样本 

	for(i=0;i<N_Err;i++) numE[i]=0;  
	for(i=0;i<Ns;i++) mark[i]=0;
    initwb();
	
step2:
	loadwb();                     //**将final赋值给新分配内存空间的W1,W2,B1,B2
	current=loops%(Ns);
	P=P_sample[current];T=T_output[current];
	
    //**计算正向传播信息
    N1=MatrixAdd((temp[0]=MatrixMul(W1,P,s1,r,1)),B1,s1,1);  //N1: s1×1
	A1=f1(N1,s1);
	N2=MatrixAdd((temp[1]=MatrixMul(W2,A1,s2,s1,1)),B2,s2,1);//N2: s2×1
	A2=f2(N2,s2);

	//**计算反向传播误差
	E=MatrixSub(T,A2,s2,1);       //T、A2、E为s2×1
	numE[loops]=0;
	for(i=0;i<s2;i++)numE[loops]=numE[loops]+E[i]*E[i];

	//**计算S2、S1
	S2=MatrixMulNum((temp[3]=MatrixMul((temp[2]=F2(N2,s2)),E,s2,s2,1)),s2,1,-2.0);
	S1=MatrixMul(temp[6]=(MatrixMul((temp[4]=F1(N1,s1)),(temp[5]=MatrixInver(W2,s2,s1)),s1,s1,s2)),S2,s1,s2,1);
	
	//**调整输出层神经元的权值和偏置
	dW2=MatrixMul(S2,(temp[7]=MatrixInver(A1,s1,1)),s2,1,s1);  //dW2: s2×s1
	dW2=MatrixMulNum((temp[8]=dW2),s2,s1,-learnspeed);
	W2=MatrixAdd((temp[9]=W2),dW2,s2,s1);
	dB2=MatrixMulNum(S2,s2,1,-learnspeed);
	B2=MatrixAdd((temp[10]=B2),dB2,s2,1);

	//**调整隐层神经元权值和偏置
	dW1=MatrixMul(S1,(temp[11]=MatrixInver(P,r,1)),s1,1,r);     //dW1: s1×r
    dW1=MatrixMulNum((temp[12]=dW1),s1,r,-learnspeed);
	W1=MatrixAdd((temp[13]=W1),dW1,s1,r);
	dB1=MatrixMulNum(S1,s1,1,-learnspeed);
	B1=MatrixAdd((temp[14]=B1),dB1,s1,1);

	savewb();

	//**释放动态分配的内存区
	free(W1);free(B1);free(N1);free(A1);free(dW1);free(dB1);free(S1);
	free(W2);free(B2);free(N2);free(A2);free(dW2);free(dB2);free(S2);
    for(i=0;i<15;i++) free(temp[i]);
     
	//**条件判断
	if(loops>N_Err) goto step3;

	if(numE[loops]>error_accept)           //误差大小判断
	{   mark[current]=0;                   
		++loops;    goto step2;
	}
	else mark[current]=1;                  //误差符合要求,成功一次

	trainok=0;
	for(i=0;i<Ns;i++) trainok+=mark[i];    //循环次数判断

	if(trainok>=Ns){ goto step3;}
	else {  ++loops; goto step2;}

step3:
	learncount=loops-1;
	m_eer=numE[learncount];
	UpdateData(FALSE);
}

void CPreAlarmDlg::OnBPEerPic() 
{
	// TODO: Add your control notification handler code here
	if(clf01==1 || clf02==1 || clf21==1 || clf22==1 ||clf31==1)  {	clf(); clf01=clf02=clf21=clf22=clf31=0;}//清除曲线
	clf22=1;
    initM(MATCOM_VERSION); //初始化matcom库函数

	Mm X,Y;
	X=zeros(1,learncount);
	Y=zeros(1,learncount); 
	
	for(int i=0;i<learncount;i++) {X(1,i+1)=i;};
	for(int j=0;j<learncount;j++) {Y(1,j+1)=numE[j];};

⌨️ 快捷键说明

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