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

📄 convert.cpp

📁 一个用C++写的电力系统故障录波数据管理系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    (dvew+i)->w[1].x--;
    (dvew+i)->w[2].x--;
    (dvew+i)->w[3].x--;
    if((j<20)&&(feof(fp)))break;
    if((dvew+i)->w[0].w||(dvew+i)->w[1].w||(dvew+i)->w[2].w||(dvew+i)->w[3].w)
      if((dvew+i)->p > page)
	  page=(dvew+i)->p;
   }
 fclose(fp);
 for(;i<dvewl;i++)
    {
     for(k=0;k<4;k++)(dvew+i)->w[k].w=0;
    }
 return(page);
}*/

    //第p页数据合法性检查,并作相应转换
    //dvew 中为READA.DAT中的数据
    //dvewl=160
    //dvvp 为 int dvvp[30]
    //p=要显示的当前页
   // condvvp(dvew, dvewl, dvvp, p);
int CConvert::condvvp(struct disr far *dvew,int dvewl,int *dvvp,int p)
{
 int i,j,k,i1,i2,i3,i4;
 struct disr far *d;
 char sss[30];
 double fwww;
 long li;

 *dvvp=i3=0;

 for(i4=0;i4<dvewl;i4++)   // 0--160
    {
  for(i=0;i<dvewl;i++)  // 0--160
	{
	 d=dvew+i;
	 if(d->p != p+1)  //寻找第p页
	    continue;
	 if(!(d->w[0].w | d->w[1].w | d->w[2].w | d->w[3].w))
	   continue;//跳过所有dvew->w[i].w=0的项,即不是从reada.dat文件中读出的项
		    //和无信号的通道
	 for(k=0; k<4; k++) //四组
	    {
	     if(!d->w[k].w)
	       continue;   //寻找d->w[k].w!=0的项
	     i1 = d->w[k].x;   //通道号
			       //对有无功和频率为线路号
	     switch(d->w[k].w)
	      {
	       case 1: // 电压
	       case 2: // 电流
		    if(!cpubn[i1/12]) //如果通道号所对应的CPU没有故障数据
		      { i3=1; d->w[k].w=0; }
		    break;
	       case 3: //开关量
		    i2=i1%24;//开关量通道号         //old is i1%24,?? why??
		    if( (!cpubn[i1/24]) || (i2>18) ) //old is i1/24,?? why??
		      //如果通道号所对应的CPU没有故障数据,或开关量通道号大于18
		      { i3=1; d->w[k].w=0; }
		    break;
	       case 6: //有功
	       case 7: //无功
		    for(j=1;j<4;j++)
		     {
		      dingzhi(2000l*(i1+1)+j,&i2,&fwww, sss);
		      if((i2<0)||(i2>1000))
			{ i3=1; d->w[k].w=0; break;}
		      if(!(cpubn[i2/12]))
			{ i3=1; d->w[k].w=0; }
		     }
		    for(j=5;j<8;j++)
		     {
		      dingzhi(2000l*(i1+1)+j,&i2,&fwww,sss);
		      if((i2<0)||(i2>1000))
			{ i3=1; d->w[k].w=0; break;}
		      if(!(cpubn[i2/12]))
			{ i3=1; d->w[k].w=0;}
		     }
		    break;
	       case 9:
		    i2=dingzhi1(i1+2000,&li);
		    if(!(cpubn[i1/12])&&i2)
		      { i3=1; d->w[k].w=0; }
		    break;
	       default:
		    i3=1;
		    d->w[k].w=0;
		    break;
	      }//switch
	    } //for(k=0;k<4;k++)
	 for(j=0;j<4;j++)
	   {
	    if(!(d->w[j].w))
	    {
	     for(k=j;k<3;k++)
	      {
	       d->w[k].w=d->w[k+1].w;
	       d->w[k].x=d->w[k+1].x;
	       d->w[k].c=d->w[k+1].c;
	      }
	    }
	   }
	 (*dvvp)++;
	 *(dvvp+(*dvvp))=i;
	}//for(i=0;;)
     if(*dvvp)break;
     for(i=0;i<dvewl;i++)
       if((dvew+i)->p==p+1)break;
     d=dvew+i;
     for(j=0;j<4;j++)
	{
	 d->w[j].w=(dvew+i4)->w[j].w;
	 d->w[j].x=(dvew+i4)->w[j].x;
	 d->w[j].c=(dvew+i4)->w[j].c;
	}
    } //for(i4=0;;)
 if(!(*dvvp))
  { AfxMessageBox("找不到文件:" + m_ReadaFileName, MB_OK); return(-1);}    
 return 1;
}

 // dvew 为READA.DAT 中的数据
 // dvvp 为与页数的数据[8,0,1,2,3,4,5,6,7]
 // int dvvn[100]
 // initdat(dvew, dvvp, dvvn);

int CConvert::initdat(struct disr far *dvew,int *dvvp,int *dvvn)
{
 int i,j,k,m,n;
 for(j=m=0;m<*dvvp;m++)
    {
     i=*(dvvp+m+1); //i = 页数
     for(n=0;n<4;n++)
	{
	 if(!(dvew+i)->w[n].w)
	    continue;
	 for(k=0;k<j;k++)
	    {
	     if(((dvew+i)->w[n].w==*(dvvn+1+2*k))&&((dvew+i)->w[n].x==*(dvvn+2+2*k)))
		break;
	    }
	 if(k==j)
	   {
	    *(dvvn+1+2*j)=(dvew+i)->w[n].w;
	    *(dvvn+2+2*j)=(dvew+i)->w[n].x;
	    j++;
	   }
	}
    }
 *dvvn=j;
 return 0;
}


int CConvert::dingzhi(unsigned long int d1,int *d3, double *d4, char *d5)
{
 int i,j,k;

 for( i=0; i<sys_l1r; i+=2 )
   if(((sysr+i)->x) == d1)break;
 if(i==sys_l1r)return (0); //无错误值返回0
 switch((sysr+i)->trait)
  {
   case 2: //通道号
	for(j=0;j<10;j++)
	  if((dig[2*j]==*((sysr+i+1)->caps)) &&
	     (dig[2*j+1]==*((sysr+i+1)->caps+1)))
	   break;
	for(k=0;k<10;k++)
	  if((dig[2*k]==*((sysr+i+1)->caps+2))&&
	     (dig[2*k+1]==*((sysr+i+1)->caps+3)))
	   break;
	if(k>9)
	  {
	   if(j>9) { *d3 = 10000;  return (0);}
	   k=j;  j=0;
	  }
	if(j>9)j=0;
	if(k>9)k=0;
	*d3=10*j+k-1;
	break;
   case 5: //电压等级
	for((*d3)=0;(*d3)<10;(*d3)++)
	   { 
	    if((dig[2*(*d3)]==*((sysr+i+1)->caps+0)) && (dig[2*(*d3)+1]==*((sysr+i+1)->caps+1)))
	       break;
	   }
	for(j=0;j<10;j++)
	   {
	     if((dig[2*j]==*((sysr+i+1)->caps+2)) && (dig[2*j+1]==*((sysr+i+1)->caps+3)))
	        break;
	    }
	for(k=0;k<10;k++)
	   {
	     if((dig[2*k]==*((sysr+i+1)->caps+4)) && (dig[2*k+1]==*((sysr+i+1)->caps+5)))
	         break;
	   }
	if((*d3) >9 && j>9 && k>9){*d3=10000; return (0);} //错误
	if(k>9)
	  { k=j; j = (*d3); (*d3)=0; }
	(*d3) = (*d3)*100+j*10+k;  //*d3为电压等级:*d3为千位数据,j为十位数据,K为个位数
	break;
   case 201: //定值
	sscanf((char *)((sysr+i+1)->caps)," %lf",d4);
	break;

   default:
	strncpy(d5, (char *)((sysr+i+1)->caps), 20);
	break;
  }
 return(i+1);
}

int CConvert::dingzhi1(int d2,long int *d3)
{
 int i,j,k,jj;

 d2++;
 k=d2/1000;
 for(i=0;i<sys_l1r;i+=2)
    {
     if((sysr+i)->trait != 2)continue; //找sysr->trait = 2 的项(通道名称)
     
     for(j=0;j<10;j++)
	    {
         if((dig[2*j]== *((sysr+i+1)->caps)) &&  (dig[2*j+1]==*((sysr+i+1)->caps+1)))
	       break; // 0,1,2,3,4,5,6,7,8,9
        }

     for(jj=0;jj<10;jj++)
	if((dig[2*jj]==*((sysr+i+1)->caps+2))&& (dig[2*jj+1]==*((sysr+i+1)->caps+3)))
	   break;
     if(jj>9)
       {
	if(j>9)continue;
	jj=j;
	j=0;
       }
     if(j>9)j=0;
     if((j*10+jj)!=d2%1000)continue;
     j=(sysr+i)->x%2000;//求线路号
     if(!k)
       {
	if((j<1)||(j>8)) continue; //1,2,3,4,5,6,7
	*d3=(sysr+i)->x;  //200X
	if(j>4) return 2; //
	else return 1;    //电流、电压和开关量
       }
     else if(k==2)
       {
	if((j!=19)&&(j!=20))continue;
	*d3=(sysr+i)->x;
	return (i);
       }
     else if(k==1)
       {
	if(j<9)continue;
	*d3=(sysr+i)->x;
	return (i);
       }
    }
 return(0);
}

int CConvert::dingzhi2(int ith, double *f)
{
 int i,j,k,m;
 long int li;
 char s1[10];

 dingzhi1(ith,&li);   //li = sysr->x
 j=li%2000;           //j=线路名称
 if(j>4)
   {
    i=ith/12;
    k=dingzhi(i+4,&m,f,s1);
    if(!k) dingzhi(2,&m,f,s1);  //f为装置公用电流比例系数 0.12
    }
 else if(j==4)
   {
    k=dingzhi(3,&m,f,s1);
    if(!k)dingzhi(1,&m,f,s1);  //f为装置零序电压比例系数 0.1524
   }
 else
   k=dingzhi(1,&m,f,s1);      //f为装置的相电压比例系数 0.88
 return 0;
}


//////////////////////////////// washp /////////////////////////////
int CConvert::washp(struct disr far *dvew,int *dvvp,int page)
{
 long int lon;
 int dvvn[100];
 struct disview far *waew;
 struct datd dat[120];
 
 int i,s=3,gepa=*dvvp,j,a,b,c,m,n,ai,bi;
 
 long int unxl[30];
 
  waew=(struct disview far *)malloc(20*sizeof(struct disview));
 if(waew == NULL)
  { AfxMessageBox("内存不够" , MB_OK); return(-1);}    
 
 //dvew 为READA.DAT 中的数据
 //dvvp 为与页数有关的数据[8,0,1,2,3,4,5,6,7], int dvvn[100]
 
 initdat(dvew, dvvp, dvvn); //dvvn中为w,x对

 lon = (seg2+seg1*10+10)*sizeof(double);
 for(j=0;j<15;j++)
    {
     if(*dvvn <= 0)
        {free(waew); return(-1);}
     for(a=b=c=i=0;i<*dvvn;i++)
	    {
	      m=*(dvvn+1+2*i); n=*(dvvn+2+2*i)+1;
	      if((m==6)&&(n==j))      //有功
	        { a=j; ai=i; }
	      else if((m==7)&&(n==j)) //无功
	        { b=j; bi=i; }
	      else if((m==8)&&(n==j)) //频率
	          c=j;
	      else continue;
	      dat[i].c=(double far *)malloc(lon);
          if(dat[i].c == NULL)
            { AfxMessageBox("内存不够" , MB_OK); return(-1);}    
	    }
    if(a||b||c)
      readdatpqf(dat[ai].c,dat[bi].c,a,b,c);
   }
 if(*dvvn <= 0)
   {free(waew); return(-1);}
 for(i=0; i<*dvvn; i++)
    {
     if((*(dvvn+1+2*i)==6)||(*(dvvn+1+2*i)==7)||(*(dvvn+1+2*i)==8))
	    continue; //有功无功和频率
     dat[i].c=(double far *)malloc(lon);
     if(dat[i].c == NULL)
      { AfxMessageBox("内存不够" , MB_OK); return(-1);}    
     memset(dat[i].c, 0x00, lon);
     readdatew(dat[i].c, *(dvvn+1+2*i), *(dvvn+2+2*i), s);
    }
 initwaew(dvew,dvvp,dvvn,dat,waew,unxl);

 for(i=0; i<*dvvn; i++)
    {
     if((waew+i)->w[0].w == 0)continue;
     if((waew+i)->w[0].w == 3)(waew+i)->w[0].x += 48;
     if(m_ChannelsData[(waew+i)->w[0].x].Flag==1)continue;
     m_ChannelsData[(waew+i)->w[0].x].Flag=1;
     m_ChannelsData[(waew+i)->w[0].x].w = (waew+i)->w[0].w ; 
     m_ChannelsData[(waew+i)->w[0].x].x = (waew+i)->w[0].x+1 ; 
     m_ChannelsData[(waew+i)->w[0].x].c = (double far *)malloc(lon);
     if(m_ChannelsData[(waew+i)->w[0].x].c == NULL)
       { AfxMessageBox("内存不够" , MB_OK); return(-1);}    
     memcpy(m_ChannelsData[(waew+i)->w[0].x].c, (waew+i)->w[0].d.c, lon);
   }

 for(j=0;j<*dvvn;j++)
   free((double far *)dat[j].c);
 free(waew);
 return(1);
}

//////////////////////  readdatew  ///////////////////////
//
int CConvert::readdatew(double far *c,int w,int x,int s)
{
 int i,kk,g,g1,segnum=0, xx=0;
 long j,k,l;
 double far *rui,far *hua,f,max,min, wyymax, wyymin, nextbegin, absmax, absmin;

 if((w==1) || (w==2) || (w==3) || (w==9))
  { //电压、电流、开关量和???
  i=0; j=0; k=0;
  do{
     rui=c+k;
     *(rui+1)=(seguik+i)->t;     //起始时间
     *(rui+2)=(seguik+i)->dt;    //间距
     *(rui+3)=(seguik+i)->c;     //分段标志
     g=(seguik+i)->l;            //本段长度(曲线点数)
     switch((seguik+i)->c)
       {
	    case 1: //AB
	         g=(seguik+i)->l-s;    break;
	    case 2: //C
	         g=(seguik+i)->l-2;    break;
	    case 3: //D
	    case 4: //E
             g=(seguik+i)->l/4;    break;
       }
     if(((UINT)(i+1) != seg1)&&(g>0))
       {
        g1=(int)(((seguik+i+1)->t-*(rui+1))/(*(rui+2))+.0005);
        if(g>g1)g=g1;
       }
     if(g<=1)
      {
        k=j;   
        rui=c+k;
        g=(int)(*(rui+0)-j-10);
        if((UINT)(i+1) != seg1)
	      {
	        g1=(int) (((seguik+i+1)->t-*(rui+1))/(*(rui+2))+.0005);
	        if(g>g1)g=g1;
	      }
      }
     else
       readdat(rui+10,x,i,s,w);
     j=k;
     k+=g+10;
     *(rui+0)=k;
     *(rui+g+10)=0;
     *(rui+4)=(g-1)**(rui+2)+*(rui+1);
     *(rui+g+11)=*(rui+4)+*(rui+2);
     i++;
    }while((UINT)i<seg1);
  } //if(w==1.w==2.w==3.w==9)
 k=j=0;
 while(*(c+j))
    {
     rui=c+j;
     hua=c+k;
     kk= (int)(*(c+j)-j+1.5);
     g=  (int)((*(rui+kk)-*(rui+1))/(*(rui+2))+.5);
     g1= (int)((*(rui+4)-*(rui+1))/(*(rui+2))+.5);
     if((g>g1) && (j==k) )
       {
	     f=*(c+k+4);
	     j=(long int)(*rui+.5);k=(long int)(*hua+.5);
	     continue;
       }
     if(g1+1>g)kk=g;
     else kk=g1+1;
     l=(long int)(*rui+.5);
     *(hua+1)=*(rui+1);
     *(hua+2)=*(rui+2);
     *(hua+3)=*(rui+3);
     *(hua+4)=(kk-1)**(hua+2)+*(hua+1);
     if(j!=k)for(i=10;i<kk+10;i++)*(hua+i)=*(rui+i);
     f=*(c+k+4);
     k+=kk+10;
     *hua=k;j=l;
     continue;
    }
 *(c+k)=0;
 *(c+k+1)=f;
 k=0;
 j= (int)(*c+.5);
 while(*(c+j))
   {
    segnum++;
    rui=c+j;
    hua=c+k;
    g =  (int)(*(rui+3)+.5);
    g1 = (int)(*(hua+3)+.5);
    f=*(rui+1)-*(hua+4)-*(hua+2);
    l=(long int)(*rui+.5);
    if((g!=g1)||(2*f>*(rui+2))||(-2*f>*(rui+2)))
      {
       k=(long int)(*hua+.5);
       if(j!=k)
	     {
	      kk=(int)(*(c+j)-j+.5);
	      for(i=1;i<kk;i++)
	          *(c+k+i)=*(c+j+i);
	      *(c+k)=k+kk;
	     }
       j=l;
       continue;
      }
    kk= (int)(*(c+j)-j-9.5);
    f=(int)(*(c+j+4));
    g1=(int)(*(c+k)-k+.5);
    for(i=0;i<kk;i++)
      *(hua+g1+i)=*(c+j+i+10);
    *hua=k+kk+g1;*(hua+4)=f;
    j=l;
   }
 *(c+7)=segnum;
 k=(long int)(*(c+k)+.5);
 *(c+k)=0;
 *(c+k+1)=*(c+j+1);
 j = 0;
 while(*(c+j))
   {
    g1=(int)( (*(c+j+4)-*(c+j+1))/(*(c+j+2)));
    if((*(c+j+3)>.5)&&(*(c+j+3)<1.5))
      {  //1
	max=min=*(c+j+10);
	for(i=j+10;i<g1+j+10;i++)
	   {
	    if(max<*(c+i))max=*(c+i);
	    if(min>*(c+i))min=*(c+i);
	   }
      }
    else
      {
       max=*(c+j+10);min=-max;
       for(i=j+10;i<g1+j+10;i++)
	   if(max<*(c+i)){max=*(c+i);min=-max;}
      }
    *(c+j+5)=max;  *(c+j+6)=min;
    j=(long int)(*(c+j)+.5);
   }
  
 //////wyy do modify begin
 j=0;
 absmin = 999999.;
 wyymax = wyymin = (*(c+j+10));
 if(x==21)
   j=0;
 while(*(c+j))
   {
    nextbegin = *(c+j);
    for(i=j+10; i<nextbegin; i++)
	   {
	    if(wyymax < (*(c+i)) ) wyymax = (*(c+i));
	    if(wyymin > (*(c+i)) ) wyymin = (*(c+i));
		if(absmin > fabs((*(c+i))) && fabs(*(c+i)) >= 0.00001 )
		   absmin = fabs((*(c+i)));
	   }
    j=(long int)(*(c+j)+.5);
   }

⌨️ 快捷键说明

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