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