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

📄 processwbs.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	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 + -