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

📄 processwbs.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				goto exit_c5;
			}
			else if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
				&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x28)//value
			{
				//gen event fu gui ok
				if (rtupara->SetCommand[1] == RESET)
				{
					FERTEVENT event;
					event.cause = 6;
					event.type = rtupara->SetCommand[0];
					event.state = 2;
					event.rtuno = rtupara->rtuno;
					GenCommonEvent(&event);
				}
				iRet = ChanBufRead(iChNo,&RecBuf[7],1);
				if (iRet == 1)
				{
					RecLen += 1;
					int iLen =RecBuf[7]-2+3;
//					Sleep(10);
					iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
					RecLen += iRet;
					if (iRet == iLen) 
					{
						if (HandleRtuValue(iRtuNo,&RecBuf[6],iRet+2) == true)
							iStatus = 0;
						else
							iStatus = 1;
					}
					else
						iStatus = 1;
				}
				goto exit_c5;
			}
			else
				iStatus = 1;
		}
		//gen event fu gui error
		if (rtupara->SetCommand[1] == RESET)
		{
			FERTEVENT event;
			event.cause = 6;
			event.type = rtupara->SetCommand[0];
			event.state = 1;
			event.rtuno = rtupara->rtuno;
			GenCommonEvent(&event);
		}
exit_c5:
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
		rtupara->SetCommand[1] = 255;
	}
	else if (rtupara->CommandSendFlag[3] == true)//取定值
	{
//		if (rtupara->AskTimers >= 3) return;
		rtupara->CommandSendFlag[3] = false;
		if (rtupara->SetCommand[1] == GETPROT)
		{
			FERTEVENT event;
			event.cause = 8;
			event.type = rtupara->SetCommand[0];
			event.state = 0;
			event.rtuno = rtupara->rtuno;
			GenCommonEvent(&event);
		}
		SendBuf[6] = 0x53;
		ChanBufRead(iChNo,RecBuf,1024);
		iRet = ChanBufWrite(iChNo,SendBuf,7);
		SendLen = 7;
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);
		if (iRet == 7) 
		{
			Sleep(1000);//
			iRet = ChanBufRead(iChNo,RecBuf,8);

			RecLen = iRet;
			if (iRet == 8)
			{
				if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
					&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x53)
				{
					int iLen =RecBuf[7]-2+3;
					iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
//					Sleep(100);//
					RecLen += iLen;
					if (iRet == iLen) 
					{
						WORD wSum = Check_Add(&RecBuf[6],RecBuf[7]);
						if ((wSum % 256) == RecBuf[6+RecBuf[7]] && (wSum / 256) == RecBuf[6+RecBuf[7]+1])//check right
						{
							for (int j = 0;j < (RecBuf[7] - 2) / 3;j++)
							{
								int index = RecBuf[8 + j * 3] % 52;
								WORD  wProV = RecBuf[8 + j * 3 + 1] + RecBuf[8 + j * 3 + 2] * 256;
								rtupara->ProValue [j] = (float)wProV * (float)rtupara->ProXiaoShu[j];
							}
							//gen event protect value success
							if (rtupara->SetCommand[1] == GETPROT)
							{
								FERTEVENT event;
								event.cause = 8;
								event.type = rtupara->SetCommand[0];
								event.state = 2;
								event.rtuno = rtupara->rtuno;
								GenCommonEvent(&event);
							}
							iStatus = 0;
							goto exit_c3;
						}
						else
							iStatus = 1;
					}
					else
						iStatus = 1;
				}
				else
					iStatus = 1;
			}
			else
				iStatus = 1;
		}
		//gen event protect value no success
		if (rtupara->SetCommand[1] == GETPROT)
		{
			FERTEVENT event;
			event.cause = 8;
			event.type = rtupara->SetCommand[0];
			event.state = 1;
			event.rtuno = rtupara->rtuno;
			GenCommonEvent(&event);
		}
exit_c3:
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
		rtupara->SetCommand[1] = 255;
	}
	else if(rtupara->CommandSendFlag[2] == true)//取事件
	{
		if (rtupara->AskTimers >= 3) return;
		rtupara->CommandSendFlag[2] = false;
		SendBuf[6] = 0x40;
		ChanBufRead(iChNo,RecBuf,1024);
		iRet = ChanBufWrite(iChNo,SendBuf,7);
		SendLen = 7;
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);

		if (iRet != 7) return;
		Sleep(100);
		iRet = ChanBufRead(iChNo,RecBuf,8);
 
		RecLen = iRet;
		if (iRet == 8)
		{
			if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
				&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x40)//event
			{
				int iLen =RecBuf[7]-2+3;
//				Sleep(40);
				iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);

				RecLen += iRet;
				if (iRet == iLen) 
				{
					if (HandleRtuEvent(iChNo,iRtuNo,&RecBuf[6],RecBuf[7]+3) == true)
						iStatus = 0;
					else
						iStatus = 1;
				}
			}
			else 
				iStatus = 1;
			SendBuf[6] = 0x06;
			ChanBufWrite(iChNo,SendBuf,7);
			DispBufData(iChNo,iRtuNo,0,SendBuf,7,0);
		}	
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
	}
	else if(rtupara->CommandSendFlag[1] == true)//查询
	{
		SendBuf[6] = 0x48;
		ChanBufRead(iChNo,RecBuf,1024);
//		Sleep(100);
		iRet = ChanBufWrite(iChNo,SendBuf,7);
		SendLen = 7;
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);

//		if (iRet != 7) return;

		Sleep(100);//
		iRet = ChanBufRead(iChNo,RecBuf,7);
		RecLen = iRet;
		if (iRet == 7) 
		{
			if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
				&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x06)//ack
			{
				rtupara->CommandSendFlag[1] = false;
				if (rtupara->bWorking == false)
					ChannelEvent(iRtuNo,2);
				rtupara->bWorking = true;
				rtupara->bFault = false;
				rtupara->AskTimers = 0;
				iStatus = 0;
			}
			else if(RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
				&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x40)//evnet
			{
				rtupara->CommandSendFlag[1] = false;
				iRet = ChanBufRead(iChNo,&RecBuf[7],1);
				if (iRet == 1)
				{
					RecLen += 1;
					int iLen =RecBuf[7]-2+3;

					iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
//                    Sleep(100);//
					RecLen += iRet;
					if (iRet == iLen) 
					{
						if (HandleRtuEvent(iChNo,iRtuNo,&RecBuf[6],RecBuf[7]+3) == true)
							iStatus = 0;
						else
							iStatus = 1;
					}
					else
						iStatus = 1;
				}
				SendBuf[6] = 0x06;
				ChanBufWrite(iChNo,SendBuf,7);
				DispBufData(iChNo,iRtuNo,0,SendBuf,7,0);
				if (rtupara->bWorking == false)
				{
					ChannelEvent(iRtuNo,2);
					rtupara->CommandSendFlag[5] = true;
					rtupara->CommandSendFlag[7] = true;
					rtupara->CommandSendFlag[3] = true;
					rtupara->CommandSendFlag[4] = true;
				}
				rtupara->bWorking = true;
				rtupara->bFault = false;
				rtupara->AskTimers = 0;
			}
			else if(RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
				&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x28)//value
			{
				rtupara->CommandSendFlag[1] = false;
				iRet = ChanBufRead(iChNo,&RecBuf[7],1);
				if (iRet == 1)
				{
					RecLen += 1;
					int iLen =RecBuf[7]-2+3;
//					Sleep(10);
					iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
//					Sleep(100);//
					RecLen += iRet;
					if (iRet == iLen) 
					{
						if (HandleRtuValue(iRtuNo,&RecBuf[6],iRet+2) == true)
							iStatus = 0;
						else
							iStatus = 1;
					}
					else
						iStatus = 1;
				}
				if (rtupara->bWorking == false)
					ChannelEvent(iRtuNo,2);
				rtupara->bWorking = true;
				rtupara->bFault = false;
				rtupara->AskTimers = 0;
			}
			else
			{
				iStatus = 1;
				rtupara->AskTimers++;
			}
		}
		else
			rtupara->AskTimers++;
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
		if (rtupara->AskTimers > 100)// > 10 chan err
		{
			if (rtupara->bFault == false)
			{
				ChannelEvent(iRtuNo,1);
				rtupara->bFault = true;
			}
			rtupara->bWorking = false;
			rtupara->state = 1;
			//置节点通讯异常
			if (rtupara->AskTimers > 250)
			{
				rtupara->CommandSendFlag[5] = true;
				rtupara->AskTimers = 100;
			}
		}
		else
		{
			rtupara->bWorking = true;
			rtupara->state = 2;
		}
	}
	else if(rtupara->CommandSendFlag[4] == true)//取测量值
	{
		if (rtupara->AskTimers >= 3) return;
		rtupara->CommandSendFlag[1] = true;
		SendBuf[6] = 0x4d;
		ChanBufRead(iChNo,RecBuf,1024);
		iRet = ChanBufWrite(iChNo,SendBuf,7);
		SendLen = 7;
		DispBufData(iChNo,iRtuNo,0,SendBuf,SendLen,0);

		if (iRet != 7) return;
		Sleep(100);
		iRet = ChanBufRead(iChNo,RecBuf,8);
//		Sleep(100);
		RecLen = iRet;
		if (iRet == 8)
		{
			if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
				&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x28)//测量值
			{
				int iLen =RecBuf[7]-2+3;
				iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
//		        Sleep(200);
				RecLen += iRet;
				if (iRet == iLen) 
				{
					if (HandleRtuValue(iRtuNo,&RecBuf[6],iRet+2) == true)
						iStatus = 0;
					else
						iStatus = 1;
					rtupara->CommandSendFlag[1] = false;
				}
				else
					iStatus = 1;
			}
			else if (RecBuf[0]==0xeb && RecBuf[1]==0x90 && RecBuf[2]==0xeb && RecBuf[3]==0x90 
				&& RecBuf[4]==0x02 && RecBuf[5]==rtupara->rtuaddr && RecBuf[6] == 0x40)//事件
			{
				int iLen =RecBuf[7]-2+3;
				iRet = ChanBufRead(iChNo,&RecBuf[8],iLen);
//		        Sleep(100);
				RecLen += iRet;
				if (iRet == iLen) 
				{
					if (HandleRtuEvent(iChNo,iRtuNo,&RecBuf[6],RecBuf[7]+3) == true)
						iStatus = 0;
					else
						iStatus = 1;
					rtupara->CommandSendFlag[1] = false;
				}
				else
					iStatus = 1;
				SendBuf[6] = 0x06;
				ChanBufWrite(iChNo,SendBuf,7);
				DispBufData(iChNo,iRtuNo,0,SendBuf,7,0);
			}
			else
				iStatus = 1;
		}	
		DispBufData(iChNo,iRtuNo,1,RecBuf,RecLen,iStatus);
	}
	else//如果没有下发命令,则查询
	{
		rtupara->CommandSendFlag[5] = true;
		rtupara->CommandSendFlag[1] = true;
		rtupara->CommandSendFlag[7] = true;
		rtupara->CommandSendFlag[3] = true;
		rtupara->CommandSendFlag[4] = true;
	}
}

bool HandleRtuValue(int iRtuNo,BYTE *buf,int iLen)
{
	RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
	STATION *station = Addr->Station_addr;
	if (!rtupara) return false;
	if (rtupara->rtuaddr == 31)//中央信号单元
	{
		WORD yxvalue = buf[2] + buf[3] * 256;
		if (rtupara->RecFullYx == 255)
			rtupara->RecFullYx = 0;
		else if (rtupara->RecFullYx == 0)
			rtupara->RecFullYx = 1;
		for (int i =0 ;i < 16;i++)
		{
			BYTE iTemp = ((yxvalue & (1<<i)) >> i);
			rtupara->YxValue[i] = iTemp;
		}
		for (i = 0;i < ((iLen - 4 - 3) / 2);i++)
			rtupara->YcValue[i] = buf[2*i+4] + buf[2*i+5] * 256;
	}
	else
	{
		WORD wSum = Check_Add(buf,iLen-3);
		if (((wSum % 256) == buf[iLen-3] && (wSum / 256) == buf[iLen-2])
			|| (buf[iLen-3]==0x03 && buf[iLen-2]==0x00 && buf[iLen-1]==0xaa)
			|| (buf[iLen-3]==0x03 && buf[iLen-2]==0x01 && buf[iLen-1]==0xaa)
			|| (buf[iLen-3]==0x03 && buf[iLen-2]==0x02 && buf[iLen-1]==0xaa)
			|| (buf[iLen-3]==0x03 && buf[iLen-2]==0x03 && buf[iLen-1]==0xaa))//check right
		{
			WORD yxvalue = buf[2] + buf[3] * 256;
			if (rtupara->RecFullYx == 255)
				rtupara->RecFullYx = 0;
			else if (rtupara->RecFullYx == 0)
				rtupara->RecFullYx = 1;
			for (int i =0 ;i < 16;i++)
			{
				BYTE iTemp = ((yxvalue & (1<<i)) >> i);
/*				bool bFind = false;
				if (i == 10)//第10个遥信
				{
					if (rtupara->rtutype == 6 && iTemp == 1)
						//如果本单元为线路保护单元,则判断其小电流接地是否动作,
						//第10号遥信(在线路保护单元中)表示接地,目前的判断方式为,如果本单元箱接地动作,
						//则需要判断是否在这之前还有线路保护单元箱的接地已经动作,有则本单元箱的动作忽略.
					{
						for (int k = 0;k < station->rtunum;k++)
						{
							RTUPARA *para = Addr->RtuPara_addr + k;
							if (para->rtutype == 6)//线路保护单元箱
							{
								if (para->YxValue [10] == 1)
								{
									bFind = true;
									break;
								}
							}
						}
					}
				}
				if (bFind)
					rtupara->YxValue[i] = 0;
				else  */
					rtupara->YxValue[i] = iTemp;
					if (i == 10) rtupara->YxValue [i] = 0;
			}
			for (i = 0;i < ((iLen - 4 - 3) / 2);i++)
			{
				rtupara->YcValue[i] = buf[2*i+4] + buf[2*i+5] * 256;
			}
		}
		else
			return false;

⌨️ 快捷键说明

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