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

📄 convert.cpp

📁 一个用C++写的电力系统故障录波数据管理系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// Convert.cpp : implementation file
//

#include "stdafx.h"
#include "wgl_32.h"
#include "Convert.h"
#include "mbstring.h"
#include "math.h"

const char ChineseNumber[][3]={"0","1","2","3","4","5","6","7","8","9","  "};
unsigned char dig[22]=   //0,1,2, 3,4,5,6,7,8,9,
	     {0xa3,0xb0,0xa3,0xb1,0xa3,0xb2,0xa3,0xb3,0xa3,0xb4,0xa3,0xb5,
	      0xa3,0xb6,0xa3,0xb7,0xa3,0xb8,0xa3,0xb9,0xa2,0xa1};


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CConvert

IMPLEMENT_DYNCREATE(CConvert, CDocument)

CConvert::CConvert()
{ 
	m_StrTempFileName = "wgl_temp.dat" ;
	memset(dFlag, 0x00, sizeof(dFlag));
};

BOOL CConvert::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;
	m_FaultLineNo = -1;

	return TRUE;
}

CConvert::~CConvert()
{
 
}

BEGIN_MESSAGE_MAP(CConvert, CDocument)
	//{{AFX_MSG_MAP(CConvert)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CConvert diagnostics

#ifdef _DEBUG
void CConvert::AssertValid() const
{
	CDocument::AssertValid();
}

void CConvert::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CConvert serialization

void CConvert::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CConvert commands
   //读故障文件信息
int CConvert::ReadFile(void)
{
 int first=0;
 unsigned int i, j, cpu;
 unsigned long datlong, loni, y=0;
 unsigned char buf[30];
 unsigned long rsegm[100][4];
 struct segsn *rseguik;
 unsigned char c1[24][4]=
             {0x97,0xb7,0xd7,0xf7, 0xa7,0xc7,0xe7,0x07,
			  0x96,0xb6,0xd6,0xf6, 0xa6,0xc6,0xe6,0x06,
			  0x94,0xb4,0xd4,0xf4, 0xa4,0xc4,0xe4,0x04,
			  0x95,0xb5,0xd5,0xf5, 0xa5,0xc5,0xe5,0x05,
			  0x91,0xb1,0xd1,0xf1, 0xa1,0xc1,0xe1,0x01,
			  0x98,0xb8,0xd8,0xf8, 0xa8,0xc8,0xe8,0x08,
			  0x9f,0xbf,0xdf,0xff, 0xaf,0xcf,0xef,0x0f,
			  0x92,0xb2,0xd2,0xf2, 0xa2,0xc2,0xe2,0x02,
			  0x93,0xb3,0xd3,0xf3, 0xa3,0xc3,0xe3,0x03,
			  0x99,0xb9,0xd9,0xf9, 0xa9,0xc9,0xe9,0x09,
			  0x9a,0xba,0xda,0xfa, 0xaa,0xca,0xea,0x0a,
			  0x9b,0xbb,0xdb,0xfb, 0xab,0xcb,0xeb,0x0b };
 seg1=0;
 fpdat=fopen(m_FaultFileName,"rb");
 if(fpdat == NULL)
   { AfxMessageBox("找不到" + m_FaultFileName, MB_OK); return(-1);}
 
 fseek( fpdat, 0L, SEEK_END); 
 datlong = ftell(fpdat);
 loni=datlong/28;
 fseek( fpdat, 0L, SEEK_SET); 

 rseguik=(segsn *)calloc(100,sizeof(struct segsn));
 if(rseguik == NULL)
   { AfxMessageBox("内存不够" , MB_OK); return(-1);}
 m_DataBuffer = (unsigned char *)malloc(loni*28L);
 if(m_DataBuffer == NULL)
   { AfxMessageBox("内存不够" , MB_OK); return(-1);}
 fseek(fpdat,0l,SEEK_SET);
 
if(fread(m_DataBuffer, sizeof(unsigned char), datlong, fpdat) != datlong)
     { AfxMessageBox("读文件出错" , MB_OK); return(-1);}
 fclose(fpdat);
 y=0;
 cpubn[0]=cpubn[1]=cpubn[2]=cpubn[3]=0;
 memset(rsegm, 0x00, sizeof(rsegm));
 do{    //loni为dat文件长度/28;
    memcpy(buf, m_DataBuffer+y*28L, sizeof(char)*28);
    y++;
	if(y>=loni)break; //读完为止

    for(i=0;i<4;i++)
       {
	if(buf[0]==c1[0][i])
	  {
	   if(!cpubn[i]){ first++; if(first==1)cpu=i; }
	   cpubn[i]++;
	   if(i==cpu)
	     {
	      seg1++;
	      rseguik[seg1-1].t=-.05;
	      rseguik[seg1-1].l=0;
	     }
	   rsegm[cpubn[i]-1][i]=y*28l;
	  }
	else if(buf[0]==c1[2][i])
	       {
		cpubn[i]++;
		if(i==cpu)
		  {
		   seg1++;
		   rseguik[seg1-1].t=(buf[1] + buf[2]*256l + buf[3]*256l*256l)*.001;
		   rseguik[seg1-1].l=0;
		  }
		rsegm[cpubn[i]-1][i]=y*28l;
	       }
	else if((buf[0]==c1[6][i])&&(i==cpu))
	       {
		if(!(rseguik+seg1-1)->l)
		  {
		   (rseguik+seg1-1)->dt=.001;
		   (rseguik+seg1-1)->c=1;
		  }
		(rseguik+seg1-1)->l++;
	       }
	else if((buf[0]==c1[8][i]) && (i==cpu))
	       {
		if(!(rseguik+seg1-1)->l)
		  {
		   (rseguik+seg1-1)->dt=.005;
		   (rseguik+seg1-1)->c=2;
		   (rseguik+seg1-1)->t=((long int)((rseguik+seg1-1)->t/.005+1))*.005;
		  }
		(rseguik+seg1-1)->l++;
	       }
	else if((buf[0]==c1[10][i])&&(i==cpu))
	       {
		if(!(rseguik+seg1-1)->l)
		  {
		   (rseguik+seg1-1)->dt=.005;
		   (rseguik+seg1-1)->c=2;
		   (rseguik+seg1-1)->t=((long int)((rseguik+seg1-1)->t/.005+1))*.005;
		  }
		(rseguik+seg1-1)->l++;
	       }
	else if((buf[0]==c1[14][i])&&(i==cpu))
	       {
		if(!(rseguik+seg1-1)->l)
		  {
		   (rseguik+seg1-1)->dt=.1;
		   (rseguik+seg1-1)->c=3;
		   (rseguik+seg1-1)->t=((long int)((rseguik+seg1-1)->t/.1+1))*.1;
		  }
		(rseguik+seg1-1)->l++;
	       }
	else if((buf[0]==c1[16][i])&&(i==cpu))
	       {
		if(!(rseguik+seg1-1)->l)
		  {
		   (rseguik+seg1-1)->dt = 1;
		   (rseguik+seg1-1)->c = 4;
		   (rseguik+seg1-1)->t=(long int)((rseguik+seg1-1)->t+1);
		  }
		(rseguik+seg1-1)->l++;
	       }
	else if((buf[0]==c1[18][i])&&(i==cpu))
	       {
		if(!(rseguik+seg1-1)->l)
		  {
		   (rseguik+seg1-1)->dt=.1;
		   (rseguik+seg1-1)->c=3;
		   (rseguik+seg1-1)->t=((long int)((rseguik+seg1-1)->t/.1+1))*.1;
		  }
		(rseguik+seg1-1)->l++;
	       }
	else if((buf[0]==c1[20][i])&&(i==cpu))
	       {
		if(!(rseguik+seg1-1)->l)
		  {
		   (rseguik+seg1-1)->dt = 1.;
		   (rseguik+seg1-1)->c = 4;
		   (rseguik+seg1-1)->t=(long int)((rseguik+seg1-1)->t+1);
		  }
		(rseguik+seg1-1)->l++;
	       }
       }
   }while(1);
 seguik=(segsn *)calloc(seg1+1,sizeof(struct segsn));
 for(i=0;i<seg1;i++)
    {
     for(j=0;j<4;j++)segm[i][j]=rsegm[i][j];
     (seguik+i)->l = (rseguik+i)->l;
     (seguik+i)->t = (rseguik+i)->t;
     (seguik+i)->dt= (rseguik+i)->dt;
     (seguik+i)->c = (rseguik+i)->c;
    }
 for(seg2=i=0;i<seg1;i++)
    {
     if((seguik+i)->c==1)j=1;
     if((seguik+i)->c==2)j=1;
     if((seguik+i)->c==3)j=4;
     if((seguik+i)->c==4)j=4;
     seg2+=(seguik+i)->l/j;
    }
 free(rseguik);
 return (1);
}

int CConvert::ChineseToNumber(CString m_StrChinese)
{
 int i,j,k,m=0;
 CString ch;

 i = (lstrlen(m_StrChinese.GetBuffer(10)))/2;
 m_StrChinese.ReleaseBuffer();
 if(i<=0 || i>=3)return(-1);
 for(k=0; k<i; k++)
    {
     *(ch.GetBuffer(2)) = *(m_StrChinese.GetBuffer(10)+k*2);
     *(ch.GetBuffer(2)+1) = *(m_StrChinese.GetBuffer(10)+k*2+1);
     for(j=0; j<10; j++)
        {
         if(lstrcmp(ChineseNumber[j], ch.GetBuffer(2)) == 0) break;
        }
     ch.ReleaseBuffer();
     if(j>=10)return(m);
     m = m*10+j;
    }
 m_StrChinese.ReleaseBuffer();
 return (m);
}


// CConvert::InitSys
int CConvert::InitSys(void)
{
 
 int ii,jj,  temp;
 int LineNo, Flag;

 char wyy[80];
 CString m_StrAName[10]  = {"UA","UB","UC","UO","IA","IB","IC","IO","模高1","模高2"};
 CString m_StrDName[5] = {"A跳","B跳","C跳","三跳","合闸"};

 FILE *fp2,*fp3;

 if((fp2=fopen(m_ConfigFileName1,"rt"))==NULL)
   { AfxMessageBox("找不到" + m_ConfigFileName1, MB_OK); return(-1);}
 if((fp3=fopen(m_ConfigFileName2,"rt"))==NULL)
   { AfxMessageBox("找不到" + m_ConfigFileName2, MB_OK); return(-1);}
   
 ii=0;   jj=0;

 while(!feof(fp2))
   {
    memset(wyy, 0x00, sizeof(wyy));
    if(fscanf(fp2," %*i, %*i, %*i, %*i, %*i, %*i, %*li,%s", wyy)==-1)break;
    if(strlen(wyy)==0)break;
    ii++;
    jj += (strlen(wyy)+1) ;
   }
 fclose(fp2);

 while(!feof(fp3))
   {
    memset(wyy, 0x00, sizeof(wyy));
    if(fscanf(fp3," %*i, %*i, %*i, %*i, %*i, %*i, %*li,%s", wyy) == -1)break;
    if(strlen(wyy)==0)break;
    ii++;
    jj += (strlen(wyy)+1) ;
   }
 fclose(fp3);

 sys_l1r=ii;

   //为sysr分配空间, 其大小为 (sys1.dat和sys2.dat的总行数+1) X letd结构的大小
 sysr=(letd far *)malloc(sys_l1r*sizeof(letd));
   //comm空间为每一行最后一段的字符总数之和
 comm=(BYTE far *)malloc(jj);
 
 if((fp2=fopen(m_ConfigFileName1,"rt"))==NULL)
   { AfxMessageBox("找不到" + m_ConfigFileName1, MB_OK); return(-1);}
 if((fp3=fopen(m_ConfigFileName2,"rt"))==NULL)
   { AfxMessageBox("找不到" + m_ConfigFileName2, MB_OK); return(-1);}
  //为sysr赋值
 
 fseek(fp2,0,SEEK_SET);
 jj=0;
 ii=0;
 while(!feof(fp2))
   {
    (sysr+ii)->caps=comm+jj;
    if(fscanf(fp2, " %i, %i, %*i, %*i, %*i, %*i, %li, %s", &(sysr+ii)->order,&(sysr+ii)->trait,&(sysr+ii)->x,(sysr+ii)->caps)==-1)break;
    (sysr+ii)->order--;
    sprintf(wyy,"%s", (sysr+ii)->caps);
    if(strlen(wyy)==0)break;
    jj += (strlen(wyy) + 1 );
    ii++;
   }
 fclose(fp2);
 
 m_wLineNums = 0;
 BYTE *pTemp;
 fseek(fp3,0,SEEK_SET);
 while(!feof(fp3))
   {
    (sysr+ii)->caps=comm+jj;
    if(fscanf(fp3, " %i, %i, %*i, %*i, %*i, %*i, %li, %s", &(sysr+ii)->order,&(sysr+ii)->trait,&(sysr+ii)->x,(sysr+ii)->caps)==-1)break;
    (sysr+ii)->order--;
    sprintf(wyy,"%s", (sysr+ii)->caps);
    if(strlen(wyy) == 0) break;
    switch((sysr+ii)->trait)
      {
        case 504:  //电站名称
             m_StrStationName = m_StrStationName + _T((sysr+ii)->caps);
             break;

        case 501:  //线路名称
             pTemp = (sysr+ii)->caps;
			 if(pTemp[0]== 163 && pTemp[1] == 176)
			    m_Line[((sysr+ii-1)->x)/2000-1].m_StrLineName = _T(pTemp + 8);//(sysr+ii)->caps);
			 else 
				m_Line[((sysr+ii-1)->x)/2000-1].m_StrLineName = _T(pTemp);    //(sysr+ii)->caps);
             m_wLineNums++;
             break;
        
        case 505: //电压等级
             m_Line[(sysr+ii-1)->x/2000-1].m_StrVLevel = _T((sysr+ii)->caps);
             break;
        
        case 502:
             temp = ChineseToNumber((sysr+ii)->caps) ;  //temp = 通道号
             
             if(temp<=0 || temp >90)break;
			 LineNo = ((sysr+ii-1)->x)/2000 ;          //LineNo = 线路号
			 Flag   = ((sysr+ii-1)->x)%2000 ;          //Flag   = 标志
             if( Flag <= 10) //模拟量
               { 
			     if(Flag <= 4) dFlag[temp-1] = 1;      //1 = 电压
				 else          dFlag[temp-1] = 2;      //2 = 电流
				                                       //通道名称
                 m_StrAChannel[temp-1] = m_Line[LineNo-1].m_StrLineName + m_StrAName[Flag-1]; 
				 m_Line[LineNo-1].No[Flag-1] = temp;
				 m_Line[LineNo-1].Name[Flag-1] = m_Line[LineNo-1].m_StrLineName + m_StrAName[Flag-1];
               }
             else  //开关量
               {
				 if(temp>=19 && temp <=42)temp-=6;
				 else if(temp>=43 && temp <=66)temp-=12;
				 else if(temp>=67 && temp <=90)temp-=18;
				 else temp -=0;
				 dFlag[48+temp-1] = 3; //开关量
                 if( ((sysr+ii-1)->x%2000) >= 51)
                     m_StrDChannel[temp-1] = m_Line[((sysr+ii-1)->x)/2000-1].m_StrLineName + (sysr+ii-1)->caps;
                 else if( ((sysr+ii-1)->x%2000) <= 29 && ((sysr+ii-1)->x%2000) >= 25)
                     m_StrDChannel[temp-1] = m_Line[((sysr+ii-1)->x)/2000-1].m_StrLineName + 
                                           m_StrDName[(sysr+ii-1)->x%2000-25];                     
               }
             break;
      }
    jj += (strlen(wyy) + 1 );
    ii++;
   }
 fclose(fp3);
 return(0);
}

int CConvert::wash1(void)
{
 FILE *wfp;
 struct disr far *dvew;
 int p, page, dvewl=160;
 int dvvp[30];
 
 for(int i=0; i<120;i++)
    memset(&m_ChannelsData[i], 0x00, sizeof(m_ChannelsData[i]));
 
 dvew=(struct disr far *)malloc(dvewl*sizeof(struct disr));
 if( dvew== NULL)
   { AfxMessageBox("内存不够" , MB_OK); return(-1);}   
   
  //从reada.dat文件中读<=160行, 内容存入结构dvew中,
  //dvew->w[i].x--;
  //如果不够160行,则令多余的dvew->w[i].w=0
  //page为最大页数
 page=readfi1(dvew, dvewl);

 if(page<0)
    {
	 free(dvew);
     free(m_DataBuffer);
     free(sysr);
     free(seguik);
     free(comm);
     return(-1);
	}
 wfp = fopen(m_StrTempFileName, "wt");
 
 if(wfp == NULL)
   { AfxMessageBox("不能创建文件系统临时文件,请检查磁盘空间!", MB_OK); return(-1);}   
 fclose(wfp);
 for( p =0 ; p<page; p++)
    //第p页数据合法性检查,并作相应转换
    //dvew 中为READA.DAT中的数据
    //dvewl=160
    //dvvp 为 int dvvp[30]
    //p=要显示的当前页
   {
    condvvp(dvew, dvewl, dvvp, p);
    washp(dvew,dvvp,page);
   }
 free(dvew);
 free(m_DataBuffer);
 free(sysr);
 free(seguik);
 free(comm);
 return (1);
}


int CConvert::readfi1(struct disr far *dvew,int dvewl)
{
	int j=0;
	int ccolor[] = {14, 2, 4, 15};
	for(int i=0; i < 120; i++)
	{
		if(dFlag[i] ==0)
		{
			j++;
			continue;
		}
		(dvew+i-j)->v.left   = 52;
		(dvew+i-j)->v.top    = 0 ;
		(dvew+i-j)->v.right  = 607;
		(dvew+i-j)->v.bottom = 54 ;
		(dvew+i-j)->v.clip   = 1;
		(dvew+i-j)->w[0].w = dFlag[i];
		if(i<48)(dvew+i-j)->w[0].x = i;
		else (dvew+i-j)->w[0].x = i-48;
		(dvew+i-j)->w[0].c = ccolor[((dvew+i-j)->w[0].x)%4];
		for(int k=1; k<=3; k++)
		{
			(dvew+i-j)->w[k].w = 0;
			(dvew+i-j)->w[k].x = (dvew+i-j)->w[0].x;
			(dvew+i-j)->w[k].c = (dvew+i-j)->w[0].c;
		}
		(dvew+i-j)->p = (i-j)/8+1;
		(dvew+i-j)->g = (i-j)%8+1;
		(dvew+i-j)->z = 1;
        (dvew+i-j)->s1 = 1; (dvew+i-j)->s2 = 0.2; (dvew+i-j)->s3 = 0.01; (dvew+i-j)->s4 = 0.001;
	}
	 for(int ii=i-j+1; ii<dvewl; ii++)
    {
     for(int k=0;k<4;k++)(dvew+ii)->w[k].w=0;
    }
	return((i-j)/8 );
}

/*
int CConvert::readfi1(struct disr far *dvew,int dvewl)
{
 FILE *fp;
 int i,j,k,page;
 fp=fopen(m_ReadaFileName, "rt");
 if(fp==NULL) 
  { AfxMessageBox("找不到文件:" + m_ReadaFileName, MB_OK); return(-1);} 
 page = 0;
 for(i=0; i<dvewl; i++)
   {
    j=fscanf(fp," %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %lf %lf %lf %lf",
	     &(dvew+i)->v.left, &(dvew+i)->v.top, &(dvew+i)->v.right, &(dvew+i)->v.bottom,&(dvew+i)->v.clip,
	     &(dvew+i)->w[0].w, &(dvew+i)->w[0].x,&(dvew+i)->w[0].c,
	     &(dvew+i)->w[1].w, &(dvew+i)->w[1].x,&(dvew+i)->w[1].c,
	     &(dvew+i)->w[2].w, &(dvew+i)->w[2].x,&(dvew+i)->w[2].c,
	     &(dvew+i)->w[3].w, &(dvew+i)->w[3].x,&(dvew+i)->w[3].c,
	     &(dvew+i)->p,&(dvew+i)->g,&(dvew+i)->z,
	     &(dvew+i)->s1,&(dvew+i)->s2,&(dvew+i)->s3, &(dvew+i)->s4);
	for( int checki=0; checki<4; checki++)
	   {
	    if( (dvew+i)->w[checki].x > 72 )
		  { fclose(fp); AfxMessageBox("配置文件reada.dat中开关量线路号不能大于72!", MB_OK); return (-1); }
       }
    (dvew+i)->w[0].x--;

⌨️ 快捷键说明

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