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