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

📄 process.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	GpsSendBuf[3] = 0x0a;
	if (MoxaBufWrite(ChNo,(char*)&TxBuf[0],2))
	{
		int iCount = 0;
		while (MoxaBufIqueue(ChNo) < 19 && iCount < 10)
		{
			iCount++;
			Sleep(20);
		}
		if (iCount == 10) return;
		for (int i = 0;i < 24;i++)
			RxBuf[i] = 0;
		if (MoxaBufRead(ChNo,RxBuf,19))
		{		
			if ( RxBuf[0]=='D' && RxBuf[10] == 'F')
			{
				::GetLocalTime(&stlocal);
				int year = (((RxBuf[6] >> 4) * 10 + (RxBuf[6] & 0x0f)) * 100 
					+ ((RxBuf[7] >> 4) * 10 + (RxBuf[7] & 0x0f)));
				stgps.wYear  = year%9999;
				stgps.wMonth = ((RxBuf[8]>>4)*10+(RxBuf[8]&0x0f))%13;
				stgps.wDay   = ((RxBuf[9]>>4)*10+(RxBuf[9]&0x0f))%32;
				stgps.wHour  = ((RxBuf[1]>>4)*10+(RxBuf[1]&0x0f))%25;
				stgps.wMinute= ((RxBuf[2]>>4)*10+(RxBuf[2]&0x0f))%61;
				stgps.wSecond= (((RxBuf[3]>>4)*10+(RxBuf[3]&0x0f)) + 1)%61;
				stgps.wMilliseconds = ((RxBuf[4]>>4)*100+(RxBuf[4]&0x0f)*10+(RxBuf[5]>>4))%1000;
				stgps.wDayOfWeek =stlocal.wDayOfWeek;
				if (stgps.wYear >= 2040 || stgps.wYear < 2000 || stgps.wMonth > 12 || stgps.wDay > 31 || stgps.wHour > 24
					|| stgps.wMinute > 60 || stgps.wSecond > 60 || stgps.wMilliseconds > 1000)
					return;
				//Add 2000.1.26.13:52
				CTime LocalTime(stlocal);
				CTime GpsTime(stgps);
				long Temp = LocalTime.GetTime() - GpsTime.GetTime();
				
				//Add 2000.1.26.13:52 当读到的GPS时间与本机时间差过3秒时认为时间不对
				if (Start)//第一次不判断即写入
				{
					if (SetLocalTime(&stgps) == 0)
						SetLocalTime(&stgps);
					Start = false;
				}
				else if (abs(Temp) < 3)
				{
					if (SetLocalTime(&stgps) == 0)
						SetLocalTime(&stgps);
					Sleep(50);
					GetLocalTime(&stlocal);
					CTime t1(stlocal);
					CTime t2(stgps);
					int ttt = t1.GetTime() - t2.GetTime();
					if (abs(ttt) > 10)
					{
						if (SetLocalTime(&stgps) == 0)
							SetLocalTime(&stgps);
					}
					Beep(100,500);
				}
				freq =  (float)((RxBuf[11]>>4)*10+(RxBuf[11]&0x0f)+
						(RxBuf[12]>>4)*0.1+(RxBuf[12]&0x0f)*0.01+(RxBuf[13]>>4)*0.001);
				for (int i=0;i<SystemCount.RtuNum;i++)
					Rtus[i].Freq[0] = freq ;
			}
			GpsRecBuf[0] = 1;
			GpsRecBuf[1] = 19;
			for (int i = 0;i < 19;i++)
				GpsRecBuf[i + 2] = RxBuf[i];
		}
	}
	return;
}

void ChannelSwitch(int ChNo)
{
	BYTE node;
	static bool Success = false;
	BYTE Temp[1024];
	BYTE TxBuf[7],RxBuf[7];
	if (NetProcess1.ThisNodeId=='A')
		node=0xaa;
	else
		node=0xbb;
	TxBuf[0]=0xeb;
	TxBuf[1]=0x90;
	TxBuf[2]=0xeb;
	TxBuf[3]=0x90;
	TxBuf[4]=0xeb;
	TxBuf[5]=0x90;		//同步码
	if (NetProcess1.mainfertid==NetProcess1.ThisNodeId)
	{
		if (Success)
			TxBuf[6]=0xcc;
		else
			TxBuf[6]=node;
		SwitchSendBuf[0] = 1;
		SwitchSendBuf[1] = 7;
		for (int i = 0;i < 7;i++)
			SwitchSendBuf[i + 2] = TxBuf[i];
		MoxaBufRead(ChNo,Temp,1024);
		if (MoxaBufWrite(ChNo,(char *)&TxBuf[0],7))
		{
			int iCount = 0;
			while (MoxaBufIqueue(ChNo) < 7 && iCount < 10)
			{
				iCount++;
				Sleep(20);
			}
			if (iCount == 10) return;
			if (MoxaBufRead(ChNo,RxBuf,7) == 7)
			{
				if ((RxBuf[0]==0xeb) && (RxBuf[1]==0x90) &&
						(RxBuf[2]==0xeb) && (RxBuf[3]==0x90) &&
						(RxBuf[4]==0xeb) && (RxBuf[5]==0x90) && (RxBuf[6]==node))
					Success=true;
				else
					Success=false;
			}
		}
		SwitchRecBuf[0] = 1;
		SwitchRecBuf[1] = 7;
		for (i = 0;i < 7;i++)
			SwitchRecBuf[i + 2] = RxBuf[i];
	}
	return;
}

void MnRtuProc()//生成SOE EVENT
{
	while(1)
	{
		Sleep(200);
		if (bStopFlag)
		{
			SetEvent(RecSendThread1.g_hEndEventMnRtuProc);
			return;
		}
		for (int i = 0;i < SystemCount.RtuNum ;i++)
		{
			if (Rtus[i].Flag && (Rtus[i].Protocol == 4 || Rtus[i].Protocol == 5))//zf rtu
			{
				if (Rtus[i].Protocol == 5)//sczf-1801
				{
					int DiNum = 0;
					for (int j = 0;j < 16 ;j++)//16个槽
					{
						if (Rtus[i].RRC [j] != 0x11) continue;
						DiNum++;
						for (int k = 0;k < 4;k++)//每槽分4组
						{
							BYTE YxValue = 0;
							BYTE ChangeFlag = 0;
							for (int m = 0;m < 6;m++)//每组6个点
							{
								int iDian = (DiNum - 1) * 24 + 6 * k + m;
								if (Rtus[i].YxValue [iDian] != Rtus[i].YxValueOld [iDian])//有变位
								{
									YxValue |= ((Rtus[i].YxValue [iDian] & 0x1) << m);
									ChangeFlag |= (1 << m);
									Rtus[i].YxValueOld [iDian] = Rtus[i].YxValue [iDian];
									Rtus[i].YxChangeFlag [iDian] = 1;//通知有异常遥信数据
								}
							}
							if (ChangeFlag)//有SOE
							{
								SYSTEMTIME st;
								GetLocalTime(&st);
								Rtus[i].SoeEvent[Rtus[i].SoePtr].SoeTime = st;
								Rtus[i].SoeEvent[Rtus[i].SoePtr].YxValue = YxValue;
								Rtus[i].SoeEvent[Rtus[i].SoePtr].ChangeFlag = ChangeFlag;
								Rtus[i].SoeEvent[Rtus[i].SoePtr].ZuNo = k;
								Rtus[i].SoeEvent[Rtus[i].SoePtr].CaoNo = j;
								if (Rtus[i].SoePtr++ == 64) Rtus[i].SoePtr = 0;
							}
						}
					}
				}
				else//CDTZF
				{
					for (int j =0;j < Rtus[i].YxNum ;j++)
					{
						if (Rtus[i].YxValue [j] != Rtus[i].YxValueOld [j])//有变位
						{
							Rtus[i].YxValueOld [j] = Rtus[i].YxValue [j];
							Rtus[i].YxChangeFlag [j] = 1;//通知有异常遥信数据
							SYSTEMTIME st;
							GetLocalTime(&st);
							Rtus[i].SoeEvent[Rtus[i].SoePtr].SoeTime = st;
							Rtus[i].SoeEvent[Rtus[i].SoePtr].YxState = Rtus[i].YxValue [j];
							Rtus[i].SoeEvent[Rtus[i].SoePtr].YxNo = j;
							if (Rtus[i].SoePtr++ == 64) Rtus[i].SoePtr = 0;
						}
					}
				}
				for (int j = 0;j < Rtus[i].YcNum ;j++)
				{
					if (fabs(Rtus[i].YcValue [j] - Rtus[i].YcValueOld [j]) 
						< fabs(Rtus[i].YcValue [j] * (Rtus[i].DeadArea / 100.0)))
						continue;
					Rtus[i].YcValueOld [j] = Rtus[i].YcValue [j];
					Rtus[i].YcChangeFlag [j] = 1;
				}
			}
		}
	}
}

void MoxaReadProc()
{
	BYTE ReadBuffer[REC_BUF_LEN];
	int ReadLen,i,j;
	while(1)
	{
		Sleep(100);
		if (bStopFlag)
		{
			SetEvent(RecSendThread1.g_hEndEventMoxaReadProc);
			return;
		}
		for (i=0;i<SystemCount.ChNum; i++)
		{
			int iComNo = i + 1;
			if (!Channels[i].Flag) continue;
			if (!sio_iqueue(iComNo)) continue;
			int iBufLen = (Channels[i].MoxaStart - Channels[i].MoxaEnd + REC_BUF_LEN -1)%REC_BUF_LEN;
			if (iBufLen == 0)
			{
				iBufLen = REC_BUF_LEN;
				Channels[i].MoxaStart = 0;
				Channels[i].MoxaEnd = 0;
			}
			ReadLen = sio_read(iComNo,(char *)&ReadBuffer[0],iBufLen);
			if (ReadLen > 0)
			{
				BYTE * MoxaRecBuf = &Channels[i].MoxaReadBuffer[0];
				WORD MoxaEnd = Channels[i].MoxaEnd;
				for (j=0;j<ReadLen;j++)
				{
					MoxaRecBuf[MoxaEnd++] = ReadBuffer[j];
					if (MoxaEnd >= REC_BUF_LEN) MoxaEnd = 0;
				}
				Channels[i].MoxaEnd = MoxaEnd;
			}
		}
	}
}

int MoxaBufRead(int port, BYTE *buf, int len)
{
	int ChNo = port;
	int MoxaStart = Channels[ChNo].MoxaStart;
	int DataLen = (Channels[ChNo].MoxaEnd - Channels[ChNo].MoxaStart + REC_BUF_LEN)%REC_BUF_LEN;
	BYTE *MoxaBuf = &Channels[ChNo].MoxaReadBuffer[0]; 
	if (DataLen > len) DataLen = len;
	for (int i=0;i<DataLen;i++)
	{
		buf[i] = MoxaBuf[MoxaStart++];
		if (MoxaStart >= REC_BUF_LEN) MoxaStart = 0;
	}
	Channels[ChNo].MoxaStart = MoxaStart;
	return DataLen;
}

int MoxaBufWrite(int port,char *buf,int len)
{
	DWORD num = 0;
	int iComNo = port + 1;
	int iRet = 0;
	iRet = sio_write(iComNo,buf,len);
	return iRet;
}
int MoxaBufIqueue(int port) 
{
	return ((Channels[port].MoxaEnd - Channels[port].MoxaStart + REC_BUF_LEN)%REC_BUF_LEN);
}

void ChannelTest(int port)
{
	static int iTestCount = 0;
	int RtuNo = Channels[port].ChRtuNo[0];
	Rtus[RtuNo].bWorking=TRUE;
	Channels[port].bWorking=true;
	Rtus[RtuNo].bFault = false;
	if (iTestCount++ > 10)
	{
		BYTE *TXBuf= (BYTE*)&Rtus[RtuNo].TXBuf[0];
		for (int l=0;l<6;l++) TXBuf[l] = Rtus[RtuNo].SynWord[l+1];
		Rtus[RtuNo].TXBufPtr +=6;
		Rtus[RtuNo].TXLen=Rtus[RtuNo].TXBufPtr;
		Rtus[RtuNo].bSendCanDisp=TRUE;
		MoxaBufWrite(port,(char*)&Rtus[RtuNo].TXBuf[0],Rtus[RtuNo].TXBufPtr);
		Rtus[RtuNo].TXBufPtr=0;
		iTestCount = 0;
	}
	else
	{
		int iLen = MoxaBufIqueue(port);
		if (iLen < 6)
			return;
		iTestCount = 11;
		Rtus[RtuNo].RecFrameSum += 6;
		MoxaBufRead(port,&Rtus[RtuNo].RecBuf[0],iLen);
		Rtus[RtuNo].RecBufPtr=iLen;
		Rtus[RtuNo].RecLen=iLen;
		Rtus[RtuNo].bReceiveCanDisp = TRUE;	
		for (int i = 0;i < iLen;i++)
		{
			if (Rtus[RtuNo].RecBuf[i] != Rtus[RtuNo].TXBuf[i])
				Rtus[RtuNo].ErrFrameSum += 1;
		}
	}

}

⌨️ 快捷键说明

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