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

📄 processwbs.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	RTUPARA	far	*rtupara;
	YXDATA	far	*yxdata;
	BYTE    rtuyxdata;
	
	static CTime tBack = CTime::GetCurrentTime ();
	STATION *station = GetStationPt(Addr,0);
	if (!station)
		return;
	for (BYTE l = 0; l<station->yxnum ; l++ )
	{
		{
			WORD i = l;
			char yxname[10];
			sprintf(yxname,"yx%05d",i);
			yxpara = GetYxParaPt(Addr,yxname);//Addr->YxPara_addr + i;
			if (!yxpara)  continue;
			yxdata = GetYxDataPt(Addr,yxname);//Addr->YxData_addr + i;
			if (!yxdata) continue;

			if (yxpara->validf && !yxpara->setinf )
			{
				LINEPARA *linepara = GetLineParaPt(Addr,yxpara->linename );
				if (linepara)
				{
					if (yxpara->xljxflag != linepara->xljxflag )
					{
						yxpara->xljxflag = linepara->xljxflag ;
						yxpara->modified = 1;
					}
					if (linepara->haveplflag && linepara->pltdflag )
					{
						LINEPARA *linepara1 = GetLineParaPt(Addr,linepara->pllinename );//得到旁路线路
						if (linepara1)
						{
							for (WORD j = 0;j < station->yxnum;j++)
							{
								char yxname1[10];
								sprintf(yxname1,"yx%05d",j);
								YXPARA *yxpara1 = GetYxParaPt(Addr,yxname1);//Addr->YxPara_addr + station->yxstart + j;
								if (yxpara1)
								{//比较遥信和旁路对应的线路名称是否相等,相等置遥信相关旁路标志
									if ((strcmp(yxpara1->linename,linepara1->name ) == 0) && yxpara->type == yxpara1->type )
									{
										yxpara->pltdflag = 1;
										strcpy(yxpara->pltdyxname ,yxpara1->name );
									}
								}
							}
						}
					}
					else//否则不置标志
					{
						yxpara->pltdflag = 0;
						yxpara->pltdyxname [0] = 0;
					}
				}
				if(!yxpara->calcflag)//是否计算量
				{
					  if (yxpara->rtuno > Addr->SysPara_addr->rtumaxnum)
						  continue;
					  rtupara = GetRtuParaPt(Addr,yxpara->rtuno );//Addr->RtuPara_addr + yxpara->rtuno ;
					  if (rtupara)
					  {
						  if ( rtupara->useflag && (yxpara->yxno < rtupara->yxnum))//遥信没有超过该节点所对应的遥信数
						  {
							  rtuyxdata = rtupara->YxValue[yxpara->yxno] ;
							  if (!yxpara->pltdflag )//没有旁路线路
							  {
									BYTE t = 0;
									if (yxpara->notflag )//遥信取反
										t = !(rtuyxdata & 0x1);
									else
										t = (rtuyxdata & 0x1);
									if ((yxdata->value & 0x1) != (t & 0x1))//遥信对应的数值和RTU对应的不一致
									{
										BYTE temp = 0;
										temp = (yxdata->value & 0x1) * 2;
										yxdata->value = 0;
										yxdata->value = (t & 0x1) + temp;
										if (rtupara->RecFullYx == 1 ) //产生遥信和SOE报警
										{
											//gen local yx change event and soe event
											YxEvent(yxpara->rtuno,yxpara->yxno,(t & 0x1));
											Alarm_DiOrLing(yxpara);
										}
									}
							  }
							  else//有旁路线路
							  {
								  CString str1 = yxpara->pltdyxname ;
								  WORD yxno = atoi(str1.Right (str1.GetLength () - 2));
								  if (yxno < Addr->SysPara_addr->allyxmaxnum )
								  {
									  YXPARA *yxpara1 = Addr->YxPara_addr + yxno;
									  YXDATA *yxdata1 = Addr->YxData_addr + yxno;
									  yxdata->value = yxdata1->value;
								  }
							  }
						  }
						  else//没有使用该节点或超过节点定义的遥信数目
						  {
							  yxdata->value = 0;
						  }
					  }
					  else//的到的RTU指针为空
						  yxdata->value = 0;
				}
				else//遥信为计算量
				{
					CString str = yxpara->formula ;//char formula[10]
					BYTE val = MyLogic(Addr,yxpara->formula);//???得到公式的值
					if (yxpara->notflag )//遥信取反
						val = !(val & 0x1);
					if ((yxdata->value & 0x1) != (val & 0x1))//确定YXDATA的值
					{
						BYTE temp = 0;
						temp = (yxdata->value & 0x1) * 2;
						yxdata->value = 0;
						yxdata->value = (val & 0x1) + temp;
						if (rtupara->RecFullYx == 1 )//产生遥信变位报警和SOE事项 
						{
							//gen local yx change event and soe event
							YxEvent(yxpara->rtuno,yxpara->yxno,(val & 0x1));
							Alarm_DiOrLing(yxpara);
						}
					}
				}

				if (yxpara->glflag && (yxpara->type == BREAK || yxpara->type == SWITCH) )//关联有效,遥信为开关,刀闸
				{
					YCPARA  *ycpara1 = GetYcParaPt(Addr,yxpara->glycname );//Addr->YcPara_addr + ycno;
					YCDATA  *ycdata1 = GetYcDataPt(Addr,yxpara->glycname );//Addr->YcData_addr + ycno;
					if (ycpara1 && ycdata1)
					{
						if (!(yxdata->value & 0x1))//如果YXDATA的值为0
						{
							if (ycpara1->lpflag == 1)//YCPARA零漂有效
							{
								if (fabs(ycdata1->value) > fabs(ycpara1->lpvalve) )
								{
									yxdata->value = 0x3;
								}
							}
							else
							{
								if (fabs(ycdata1->value) > 0.5 )
								{
									yxdata->value = 0x3;
								}
							}
						}
					}
				}

			}
		}
	}
	BACKAUTORUNPARA *para = Addr->BackAutoRunPara_addr;
	if (para->validf)
	{
		YXPARA *yxpara = GetYxParaPt(Addr,para->break0);
		YXDATA *yxdata = GetYxDataPt(Addr,para->break0);
		YXPARA *yxpara1 = GetYxParaPt(Addr,para->break1);
		YXDATA *yxdata1 = GetYxDataPt(Addr,para->break1);
		YXPARA *yxpara2 = GetYxParaPt(Addr,para->break2);
		YXDATA *yxdata2 = GetYxDataPt(Addr,para->break2);
		YCPARA *ycpara1 = GetYcParaPt(Addr,para->v1);
		YCDATA *ycdata1 = GetYcDataPt(Addr,para->v1);
		YCPARA *ycpara2 = GetYcParaPt(Addr,para->v2);
		YCDATA *ycdata2 = GetYcDataPt(Addr,para->v2);

		if (yxpara != NULL || yxpara1 != NULL || yxpara2 != NULL || ycpara1 != NULL || ycpara2 != NULL)
		{
			CTime t1 = CTime::GetCurrentTime ();
			time_t lTBack = tBack.GetTime();
			time_t lT1 = t1.GetTime();
			if ((lT1 - lTBack ) > para->delaytime)
			{
				if ((yxdata->value & 0x01) == 0)//分段开关分开
				{
					if ((((yxdata1->value & 0x01) == 0) && (ycdata1->value < 1)) || (((yxdata2->value & 0x01) == 0) && (ycdata2->value < 1)))
					{
						int iNodeNo = yxpara->rtuno;
						RTUPARA *rtupara = Addr->RtuPara_addr + iNodeNo;
						rtupara->SetCommand[0] = 1;//local
						rtupara->SetCommand[1] = YK;
						rtupara->SetCommand[2] = 0x22;
						rtupara->SetCommand[3] = iNodeNo;
						rtupara->SetCommand[4] = 0xcc;//close
						rtupara->SetCommand[5] = 255;
						rtupara->CommandSendFlag[8] = true;
					}
				}
				else if ((yxdata->value & 0x01) == 1)//分段开关合上
				{
					if ((((yxdata1->value & 0x01) == 1) && (ycdata1->value > 1)) && (((yxdata2->value & 0x01) == 1) && (ycdata2->value > 1)))
					{
						int iNodeNo = yxpara->rtuno;
						RTUPARA *rtupara = Addr->RtuPara_addr + iNodeNo;
						rtupara->SetCommand[0] = 1;//local
						rtupara->SetCommand[1] = YK;
						rtupara->SetCommand[2] = 0x22;
						rtupara->SetCommand[3] = iNodeNo;
						rtupara->SetCommand[4] = 0x33;//open
						rtupara->SetCommand[5] = 255;
						rtupara->CommandSendFlag[8] = true;
					}
				}
				tBack = CTime::GetCurrentTime ();
			}
		}
		else
			tBack = CTime::GetCurrentTime ();
	}
	else
		tBack = CTime::GetCurrentTime ();
}
//************************************************************************
void HandleRealKwh(void *addr)
{
	ADDR	*Addr = (ADDR *)addr;
	BYTE	sec;
	if ( Addr->RUN->lastsec <= Addr->RUN->Today.wSecond )
		sec = Addr->RUN->Today.wSecond - Addr->RUN->lastsec;
	else	
		sec = Addr->RUN->Today.wSecond + 60 - Addr->RUN->lastsec;

	Addr->RUN->lastsec = (BYTE)Addr->RUN->Today.wSecond;

	KWHDATA		*kwhdata = Addr->KwhData_addr;
	KWHPARA		*kwhpara = Addr->KwhPara_addr;

	double		value = 0;
	BYTE		state = 0;
	STATION *station = GetStationPt(Addr,0);
	if (!station)
		return;
	for ( BYTE l=0; l < station->kwhnum ; l++ )
	{                              // 处理电度
		value = 0;
		WORD i = l;
		char kwhname[10];
		sprintf(kwhname,"kwh%05d",i);
		kwhpara = GetKwhParaPt(Addr,kwhname);
		if (!kwhpara) continue;
		kwhdata = GetKwhDataPt(Addr,kwhname);
		if (!kwhdata) continue;
		if (!kwhpara->validf) 
			continue;
		if (!kwhpara->jfkwhflag && !kwhpara->calcf)//非计算量和积分电度量
		{
			RTUPARA *rtupara = GetRtuParaPt(Addr,kwhpara->rtuno );
			if (rtupara)
			{
				if ( (rtupara->useflag) && (kwhpara->kwhno < rtupara->kwhnum))//
				{
					long rtukwhdata = rtupara->KwhValue[kwhpara->kwhno];
					if (!kwhpara->pltdflag)//没有旁路
					{
						 kwhdata->value = ( kwhpara->coef * rtukwhdata + kwhpara->base );//乘以系数加上基值
					}
					else//有旁路
					{
						KWHDATA *kwhdata1 = GetKwhDataPt(Addr,kwhpara->pltdkwhname );
						if (kwhdata1)
							kwhdata->value = kwhdata1->value;//赋旁路遥测
						else
							kwhdata->value = 0;
					}
				}
				else
					kwhdata->value = 0;
			}
			else
				kwhdata->value = 0;	
			value =  kwhdata->value - kwhdata->temp;// double value  
			kwhdata->temp = kwhdata->value;//??
		}
		else if (kwhpara->calcf )
		{
			CString str = kwhpara->formula ;
			kwhdata->value = MyCalc(Addr,str);
			value = float(kwhdata->value - kwhdata->temp );
			kwhdata->temp = kwhdata->value ;//??
		}
		else
		{
			CString  str1 = kwhpara->jfycname;
			float fTemp = 0;
			int iRet = GetAYc(Addr,kwhpara->jfycname,0,fTemp,state);
			if (iRet == 0)
			{
				value = fTemp * (float)(sec/(float)3600) * kwhpara->coef;
				kwhdata->value += value;//
			}
		}
		SYSTEMTIME st;
		GetLocalTime(&st);
		kwhdata->hourvalue[st.wHour] = kwhdata->value; //+= value;  modified by yl 2002.4.28
		kwhdata->dayvalue += value;
		kwhdata->monthvalue += value;
		kwhdata->yearvalue += value;
		kwhdata->totalvalue += value;
		switch (Addr->SysPara_addr->GetTimeType(st.wHour,st.wMinute ))
		{
			case 0://toptop
				kwhdata->toptopvalue += value;
				break;
			case 1:
				kwhdata->topvalue += value;	
				break;
			case 2:
				kwhdata->normalvalue += value;
				break;
			case 3:
				kwhdata->bottomvalue += value;
			default:
				break;
		}
	}
}

//iType -- 0-请求遥控;1-发送全遥信;iNodeNo-节点号
bool SendDataToWf (int iNodeNo,int iType)
{
	COPYDATASTRUCT cp;
	STATION *station = Addr->Station_addr;
	int iYxNum = station->yxnum;
	cp.dwData = 1;
	BYTE SendData[20] ;//= (BYTE *)pData->lpData;
	SendData[0] = 0x90;
	SendData[1] = 0xeb;
	SendData[2] = 0x90;
	SendData[3] = 0xeb;
	SendData[4] = 0x90;
	SendData[5] = 0xeb;
	if (iType == 0)
	{
		for (int i = 0;i < iYxNum;i++)
		{
			YXPARA *yxpara = Addr->YxPara_addr + i;
			if ((yxpara->rtuno == iNodeNo) && (yxpara->type == BREAK))
				break;
		}
		if (i == iYxNum)
			return false;
		YXDATA *yxdata = Addr->YxData_addr + i;

		cp.cbData = 20;
		SendData[6] = 0x0c;
		SendData[7] = 0x00;
		SendData[8] = 0x00;
		SendData[9] = 0x00;
		SendData[10] = 0x00;
		SendData[11] = 0x02;
		SendData[12] = 0x00;
		SendData[13] = 0x00;
		SendData[14] = 0x03;
		SendData[15] = 0x00;
		SendData[16] = i % 256;
		SendData[17] = i / 256;
//		SendData[18] = yxdata->value;
		if (yxdata->value == 0)
			SendData[18] = 1;
		else
			SendData[18] = 0;
		long sum = 0;
		for (i = 0;i < 19;i++)
			sum += SendData[i];

		SendData[19] = sum % 256;
	}
	else if (iType == 1)
	{
		cp.cbData = 19;
		SendData[6] = 10;
		SendData[7] = 0;
		SendData[8] = 0x00;
		SendData[9] = 0x00;
		SendData[10] = 0x00;
		SendData[11] = 0x01;
		SendData[12] = 0x00;
		SendData[13] = 0x00;
		SendData[14] = 2;
		SendData[15] = 0;
		for (int j = 0;j < 2;j++)
		{
			SendData[16+j] = 0;
		}
		for (j = 0;j < 2;j++)
		{
			for (int k = 0;k < 8;k++)
			{
				YXDATA *yxdata = Addr->YxData_addr + j * 8 + k;
				SendData[16+j] |= ((yxdata->value & 0x1) << k);
			}
		}
		long sum = 0;
		for (int i = 0;i < 18;i++)
			sum += SendData[i];

		SendData[18] = sum % 256;
	}
	cp.lpData = SendData;
	CString title;
	title = "WCOM";
	HWND hPre = ::FindWindow(NULL,title);//如果有五防系统运行
	HWND hMe = (HWND)AfxGetMainWnd();
	if ( hPre )
	{
		::SendMessage(hPre,WM_COPYDATA,(WPARAM)hMe,(LPARAM)(&cp));
	}
	return true;
}

void Alarm_DiOrLing(YXPARA *yxpara)
{
	STATION *station = Addr->Station_addr;
	if (station->havecenterunit & 0x1)
	{
		if (yxpara->deviceflag == 1)//鸣笛事件
		{
			for (int l = 0;l < station->rtunum;l++)
			{
				RTUPARA *para = Addr->RtuPara_addr + l;
				if (para->rtuaddr == 31 && para->rtutype == 3)
					para->CommandSendFlag [18] = 1;
			}
		}
		else if (yxpara->deviceflag == 2)//鸣铃事件
		{
			for (int l = 0;l < station->rtunum;l++)
			{
				RTUPARA *para = Addr->RtuPara_addr + l;
				if (para->rtuaddr == 31 && para->rtutype == 3)
					para->CommandSendFlag [19] = 1;
			}
		}
	}
}

⌨️ 快捷键说明

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