📄 processwbs.cpp
字号:
}
return true;
}
bool HandleRtuEvent(int iChNo,int iRtuNo,BYTE *buf,int iLen)
{
CHANPARA *chanpara = Addr->ChanPara_addr + iChNo;
RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
STATION *station = Addr->Station_addr;
if (!rtupara) return false;
if (rtupara->rtuaddr == 31)//中央信号单元的事件
return true;
WORD wSum = Check_Add(buf,iLen-3);
if ((wSum % 256) == buf[iLen-3] && (wSum / 256) == buf[iLen-2])//check right
{
int y = buf[2] + buf[3] * 256;
int m = buf[4];
int d = buf[5];
int h = buf[6];
int min = buf[7];
int sec = buf[8];
int ms = buf[9] + buf[10] * 256;
int code = buf[11];
int t = buf[12];
if (station->havecenterunit & 0x1)
{
/* for (int i = 0;i < station->rtunum;i++)
{
RTUPARA *rtupara = Addr->RtuPara_addr + i;
if (rtupara->rtuaddr == 31 && rtupara->rtutype == 3)
rtupara->CommandSendFlag [19] = 1;
}*/
}
return true;
}
else
return false;
}
void ChannelEvent(BYTE RtuNo,char Flag)
{//通道事项 Flag: (0 未用 1 故障 2 恢复正常 -1 保持正常)
FERTEVENT Event;
SYSTEMTIME CurTime;
GetLocalTime(&CurTime);
CTime Systime = CTime::GetCurrentTime();
Event.ms = CurTime.wMilliseconds % 100;
Event.hundms = CurTime.wMilliseconds / 100;
Event.seconds = (BYTE)CurTime.wSecond;
Event.minute = (BYTE)CurTime.wMinute;
Event.hour = (BYTE)CurTime.wHour;
Event.day = (BYTE)CurTime.wDay;
Event.month = (BYTE)CurTime.wMonth;
Event.year = CurTime.wYear;
Event.Recms = CurTime.wMilliseconds % 100;
Event.Rechundms = CurTime.wMilliseconds/100;
Event.Recseconds = (BYTE)CurTime.wSecond;
Event.Recminute = (BYTE)CurTime.wMinute;
Event.Rechour = (BYTE)CurTime.wHour;
Event.Recday = (BYTE)CurTime.wDay;
Event.rtuno = RtuNo;
RTUPARA *rtupara = GetRtuParaPt(Addr,RtuNo);
if (!rtupara) return;
Event.yxno = rtupara->channo;
Event.cause = 2;
if (Flag == 0)
Event.state = 0;
else if (Flag == 1)
Event.state = 1;
else if (Flag == 2)
Event.state = 2;
else if (Flag == -1)
Event.state = 255;
GenRtuEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,&Event);
}
void YxEvent(int RtuNo,int YxNo,BYTE State)//生成变位遥信Event
{
FERTEVENT Event;
SYSTEMTIME CurTime;
GetLocalTime(&CurTime);
Event.ms = CurTime.wMilliseconds % 100;
Event.hundms = CurTime.wMilliseconds / 100;
Event.seconds = (BYTE)CurTime.wSecond;
Event.minute = (BYTE)CurTime.wMinute;
Event.hour = (BYTE)CurTime.wHour;
Event.day = (BYTE)CurTime.wDay;
Event.month = (BYTE)CurTime.wMonth;
Event.year = CurTime.wYear;
Event.Recms = CurTime.wMilliseconds % 100;
Event.Rechundms = CurTime.wMilliseconds/100;
Event.Recseconds = (BYTE)CurTime.wSecond;
Event.Recminute = (BYTE)CurTime.wMinute;
Event.Rechour = (BYTE)CurTime.wHour;
Event.Recday = (BYTE)CurTime.wDay;
Event.rtuno = RtuNo;
Event.yxno = YxNo;
Event.cause = 1;
Event.type = 0;
Event.state = State;
GenRtuEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,&Event);
RTUPARA *rtupara = Addr->RtuPara_addr + RtuNo;
if (rtupara == NULL) return;
if (rtupara->protocolno != 2 && rtupara->protocolno != 8)//非东方直流系统,则产生soe事件
{
Event.ms = (CurTime.wMilliseconds % 100) % rand();
Event.hundms = (CurTime.wMilliseconds / 100) % rand();
Event.seconds = (BYTE)(CurTime.wSecond - 1) % 60;
Event.cause = 1;
Event.type = 1;
Event.state = State;
GenRtuEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,&Event);
}
STATION *station = Addr->Station_addr;
for (int k = 0;k < station->yxnum;k++)
{
YXPARA *yxpara = Addr->YxPara_addr + k;
if (!yxpara->validf)
continue;
if (yxpara->rtuno == RtuNo && yxpara->yxno == YxNo)
break;
}
if (k == station->yxnum)
return;
int iRealYxNo = k;
for (k = 0;k < station->zyxnum;k++)
{
ZFYXPARA *zfyxpara = Addr->ZfYxPara_addr + k;
if (!zfyxpara->validf)
continue;
CString str1 = zfyxpara->yxname;
WORD tYxNo = (WORD)atoi(str1.Right(5));
if (tYxNo == iRealYxNo)
break;
}
if (k == station->zyxnum)
return;
for (int j = 0;j < station->channum ;j++)
{
CHANPARA *chanpara = Addr->ChanPara_addr + j;
if (chanpara->useflag && chanpara->openflag && chanpara->updown == 0)
{
if (rtupara->protocolno != 2 && rtupara->protocolno != 8)//非东方直流系统和WBS2000-1,则产生soe事件
{
chanpara->bSoe = true;
chanpara->SoeEvent[chanpara->SoePtr].YxNo = k;
chanpara->SoeEvent[chanpara->SoePtr].YxState = (State & 0x1);
GetLocalTime(&chanpara->SoeEvent[chanpara->SoePtr].SoeTime);
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wSecond = Event.seconds;
chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wMilliseconds = Event.hundms * 100 + Event.ms;
chanpara->SoePtr = (chanpara->SoePtr+1) % 100;
}
chanpara->bYxChange = true;
chanpara->bYxwChange[k/32] = true;
}
}
}
//************************************************************************
void HandleRealZf(void *addr)
{
ADDR *Addr = (ADDR *)addr;
ZFYCPARA *zfycpara = Addr->ZfYcPara_addr ;
ZFYXPARA *zfyxpara = Addr->ZfYxPara_addr ;
ZFKWHPARA *zfkwhpara = Addr->ZfKwhPara_addr ;
STATION *station = Addr->Station_addr ;
DWORD yxw[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for (int i = 0;i < station->zyxnum;i++)
{
if (zfyxpara->validf )
{
BYTE state = 0;
WORD num = 0;
GetAYx(Addr,zfyxpara->yxname,1,num,state);//GetAYx()
zfyxpara->value = (state & 0x1);
}
else
zfyxpara->value = 0;
yxw[i/32] |= ((zfyxpara->value & 0x1) << (i%32));//yxw[] DWORD
zfyxpara++;
}
for (int j = 0;j < station->channum ;j++)//给通道遥信字赋值
{
CHANPARA *chanpara = Addr->ChanPara_addr + j;
if (chanpara->useflag && chanpara->openflag && chanpara->updown == 0)
for (int k = 0;k < (station->zyxnum + 31) / 32;k++)
chanpara->yxw[k] = yxw[k];
}
for (i = 0;i < station->zycnum;i++)
{
if (zfycpara->validf )
{
zfycpara->value = 0;
float val = 0;
BYTE state = 0;
//modify by yzw 2002.5.17
YCPARA *ycpara = GetYcParaPt(Addr,zfycpara->ycname );
// RTUPARA *rtupara = Addr->RtuPara_addr + ycpara->rtuno;//取RTU参数地址
// int rtuycdata = rtupara->YcValue[ycpara->ycno];
GetAYc(Addr,zfycpara->ycname,0 ,val,state);
// zfycpara->value = rtuycdata;//(int)(val * 10 + 0.5);
if (ycpara->physicaldownlimit > 1)
zfycpara->value = (int)(val * 2048 / ycpara->physicaldownlimit + 0.5);
}
else
zfycpara->value = 0;
zfycpara++;
}
for (i = 0;i < station->zkwhnum;i++)
{
if (zfkwhpara->validf )
{
zfkwhpara->value = 0;
double val = 0;
BYTE state = 0;
GetAKwh(Addr,zfkwhpara->kwhname,0,val,state);
zfkwhpara->value = (long)(val+0.5);//四舍五入
}
else
zfkwhpara->value = 0;
zfkwhpara++;
}
}
//******************************************************
// 处理RTU传来的遥测数据和计算量
void HandleRealYc(void *addr,HANDLE g_hSCADAToMMIEvent)
{
ADDR *Addr = (ADDR *)addr;
RTUPARA far *rtupara;
YCPARA far *ycpara;
int rtuycdata;
YCDATA far *ycdata;
int value = 0;
float v1= 0,v2=0;
CString str1;
WORD no;
float ycoldvalue = 0;
STATION *station = GetStationPt(Addr,0);
if (!station)
return;
for (BYTE l=0; l<station->ycnum; l++ )
{
WORD i = l;
char ycname[10];
sprintf(ycname,"yc%05d",i);
ycpara=GetYcParaPt(Addr,ycname);//Addr->YcPara_addr + i;
if (!ycpara)
continue;
ycdata=GetYcDataPt(Addr,ycname);//Addr->YcData_addr + i;
if (!ycdata)
continue;
if (!ycpara->validf ) continue;
ycoldvalue = ycdata->value;
if (i < station->ycnum )
{
if ( (!ycpara->setinf) && ycpara->validf )
{
LINEPARA *linepara = GetLineParaPt(Addr,ycpara->linename );//得到遥测关联线路
if (linepara)
{
if (linepara->haveplflag && linepara->pltdflag )//有旁路,旁路替代标志
{
LINEPARA *linepara1 = GetLineParaPt(Addr,linepara->pllinename );//得到旁路线路
if (linepara1)
{
for (WORD j = 0;j < station->ycnum;j++)
{
char ycname1[10];
sprintf(ycname1,"yc%05d",j);
YCPARA *ycpara1 = GetYcParaPt(Addr,ycname1);//Addr->YcPara_addr + station->ycstart + j;
if (ycpara1)
{
if ((strcmp(ycpara1->linename,linepara1->name ) == 0) && ycpara->type == ycpara1->type )
{//遥测相关线路名称和旁路线路名称一致,遥测类型和YCPARA一致
ycpara->pltdflag = 1;
strcpy(ycpara->pltdycname ,ycpara1->name );//得到旁路替代遥测名称
}
}
}
}
}
else
{
ycpara->pltdflag = 0;
ycpara->pltdycname [0] = 0;
}
}
if (!ycpara->calcf)//非计算量
{
rtupara = GetRtuParaPt(Addr,ycpara->rtuno );//Addr->RtuPara_addr + ycpara->rtuno;
if (rtupara)
{
if ( rtupara->useflag && (ycpara->ycno < rtupara->ycnum) )//本RTU有效
{
rtuycdata = rtupara->YcValue[ycpara->ycno];
if (!ycpara->pltdflag )//没有旁路
{
if (rtuycdata == 0)
ycdata->value = 0;
else
//Modify by yzw 2001.12.24
// ycdata->value = (ycpara->physicaluplimit - ycpara->physicaldownlimit )
// / (ycpara->ycupval - ycpara->ycdownval )
// * (rtuycdata - ycpara->ycdownval ) + ycpara->physicaldownlimit ;
ycdata->value = ycpara->physicaluplimit * rtuycdata;// + ycpara->physicaldownlimit;
//系数乘以RTUYCDATA 本程序中ycpara->physicaldownlimit将作为满量程使用
}
else//有旁路
{
str1 = ycpara->pltdycname ;
no = atoi(str1.Right (str1.GetLength () -2));
if (no < Addr->SysPara_addr->allycmaxnum )
{
YCPARA* ycpara1 = Addr->YcPara_addr + no;
YCDATA* ycdata1 = Addr->YcData_addr + no;
ycdata->value = ycdata1->value;
}
}
}
else
ycdata->value = 0;
}
else
ycdata->value = 0;
}
else//计算量
{
CString str = ycpara->formula ;
ycdata->value = (float)MyCalc(Addr,str);
}
if ( ycpara->notflag ) //取反
ycdata->value *= -1;
if(ycpara->lpflag )//关联遥信点,零漂处理
{
str1 = ycpara->lpdiname ;
no = atoi(str1.Right (5));
if (no < Addr->SysPara_addr->allyxmaxnum )
{
YXDATA *yxdata = Addr->YxData_addr + no;//得到零漂关联遥信点
if (!(yxdata->value & 0x1) || fabs(ycdata->value) < ycpara->lpvalve )//遥信为合
ycdata->value = 0.0;
}
}
}
}
//合理值处理
if (ycdata->value > ycpara->acceptuplimit || ycdata->value < ycpara->acceptdownlimit )
ycdata->value = ycoldvalue;//保持原值
if ( ycdata->value >= 0.0 ) v1 = ycdata->value;
else v1 = -1*(ycdata->value);
// 判最大值及时间
if ( ycdata->maxvalue >= 0.0 ) v2 = ycdata->maxvalue;
else v2 = -1*ycdata->maxvalue;
if ( v1 >= v2 )
{
ycdata->maxvalue = ycdata->value;
ycdata->maxvtime[0] = (BYTE)Addr->RUN->Today.wHour;//??
ycdata->maxvtime[1] = (BYTE)Addr->RUN->Today.wMinute;
ycdata->maxvtime[2] = (BYTE)Addr->RUN->Today.wSecond;
}
// 判最小值及时间
if ( ycdata->minvalue >= 0.0 ) v2 = ycdata->minvalue;
else v2 = -1*ycdata->minvalue;
if ( v1 <= v2 ) //&&(value != 0)
{
ycdata->minvalue = ycdata->value;
ycdata->minvtime[0] = (BYTE)Addr->RUN->Today.wHour;
ycdata->minvtime[1] = (BYTE)Addr->RUN->Today.wMinute;
ycdata->minvtime[2] = (BYTE)Addr->RUN->Today.wSecond;
}
ycdata->collnum ++;
//求平均值
if (ycdata->collnum != 0)//??
ycdata->avervalue = ycdata->avervalue / ycdata->collnum * (ycdata->collnum - 1)
+ ycdata->value / ycdata->collnum ;
//求合格率
if (ycdata->value > ycpara->hgldownlimit && ycdata->value < ycpara->hgluplimit )//此遥测合格
ycdata->hgnum ++;
if (ycdata->collnum != 0)
ycdata->hgl = (float)ycdata->hgnum / ((float)ycdata->collnum);//合格率
if (ycdata->maxvalue != 0)//???
ycdata->fhl = ycdata->avervalue / ycdata->maxvalue ;
if (!ycdata->conflag )
{
ycdata->concount = 0;
for (int i = 0;i < 14;i++)
ycdata->remvalue [i] = ycdata->remvalue [i + 1];
ycdata->remvalue [14] = ycdata->value ;
}
// 判上越限
if ( ycdata->value > ycpara->alarmuplimit )
{
if (!ycpara->overuplimitf)
{
if (ycpara->overuplimitcount++ > 65534)
ycpara->overuplimitcount = 0;
ycpara->overuplimitf = 1;
GenYcEvent(Addr,g_hSCADAToMMIEvent,ycpara->name ,ycdata->value);//遥测越上限报警
}
}
else if ( ycdata->value < ycpara->alarmdownlimit ) // 判越限
{
if (!ycpara->overdownlimitf)
{
if (ycpara->overuplimitcount++ > 65534)//??
ycpara->overuplimitcount = 0;
ycpara->overdownlimitf = 1;
GenYcEvent(Addr,g_hSCADAToMMIEvent,ycpara->name ,ycdata->value);//遥测越下限报警
}
}
else
{
if (ycpara->overdownlimitf || ycpara->overuplimitf)
{
ycpara->overdownlimitf = 0;
ycpara->overuplimitf = 0;
GenYcEvent(Addr,g_hSCADAToMMIEvent,ycpara->name ,ycdata->value);
}
}
}
}
//************************************************************************
void HandleRealYx(void *addr)
{
ADDR *Addr = (ADDR *)addr;
YXPARA far *yxpara;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -