📄 prealarmdlg.cpp
字号:
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 + -