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

📄 processdcf.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		SYSTEMTIME SysTime;
		GetLocalTime(&SysTime);
		BYTE *TXBuf= &(Rtus[RtuNo].TXBuf[Rtus[RtuNo].TXBufPtr]);
		for (int l=0;l<6;l++) TXBuf[l] = Rtus[RtuNo].SynWord[l+1];
		TXBuf[6] = 0x70;	TXBuf[7] = 0xd9;
		TXBuf[8] = 1;		TXBuf[9] = 0x01;
		TXBuf[10] = Rtus[RtuNo].Addr;
		TXBuf[11] = DCF_CheckCRC(TXBuf+6);

		TXBuf[12]=SysTime.wHour / 10 * 16 + SysTime.wHour % 10;  
		TXBuf[13]=SysTime.wMinute / 10 * 16 + SysTime.wMinute % 10;   
		TXBuf[14]=SysTime.wSecond / 10 * 16 + SysTime.wSecond % 10;  
		TXBuf[15]=(SysTime.wMilliseconds / 256) / 10 * 16 + (SysTime.wMilliseconds / 256) % 10;  
		TXBuf[16]=(SysTime.wMilliseconds % 256) / 10 * 16 + (SysTime.wMilliseconds % 256) % 10;
		TXBuf[17] =DCF_CheckCRC(TXBuf+12);
		Rtus[RtuNo].TXBufPtr+=18;

		Channels[ChNo].ReviseTimeFlag &= 0xfb;
	}
// 设定命令
/*	if (Channels[ChNo].WorkType == 5)//通道测试
	{
		if ((Rtus[RtuNo].TXBufPtr<6) && (Channels[ChNo].ReviseTimeFlag & 1))
		{
			BYTE *TXBuf= (BYTE*)&Rtus[RtuNo].TXBuf[Rtus[RtuNo].TXBufPtr];
			for (int l=0;l<6;l++) TXBuf[l] = Rtus[RtuNo].SynWord[l+1];
			Rtus[RtuNo].TXBufPtr +=6;
			Channels[ChNo].ReviseTimeFlag &= 0xfe;
		}
	}*/
	if (Rtus[RtuNo].TXBufPtr)
	{
		if (Channels[ChNo].WorkType == 1)
		{
			Rtus[RtuNo].TXBufPtr = 0;
			return;
		}
		Rtus[RtuNo].TXLen=Rtus[RtuNo].TXBufPtr;
		Rtus[RtuNo].bSendCanDisp=TRUE;
		MoxaBufWrite(ChNo,(char*)&Rtus[RtuNo].TXBuf[0],Rtus[RtuNo].TXBufPtr);
		Rtus[RtuNo].TXBufPtr=0;
	}

}

BYTE DCF_CheckCRC(BYTE *pInfoWord)
{
	return CDT_CheckCRC(pInfoWord);
}

void DCF_Answer(int ChNo,int RtuNo,int &NonceInfoWord)
{
	int i = ChNo;
	switch(Rtus[RtuNo].RecBuf[NonceInfoWord])
	{
	case 0x0://子站时钟
		DCF_ReviseTime(i,RtuNo,NonceInfoWord);
		break;
	case 0xe0://遥控返校
	case 0xe1:
	case 0xe2:
	case 0xe9://升降返校
	case 0xea:
	case 0xeb:
		DCF_YK_SJ_Pro(i,RtuNo,NonceInfoWord);
		break;
	case 0xdf://子站状态信息,向后台发送RTU STATUS

		break;
	}
}

void DCF_SOE_Event(int RtuNo,int &NonceInfoWord)
{
	WORD MilliSeconds;
	FERTEVENT Event;
	FERTEVENT *CurEventP;
	SYSTEMTIME CurTime;
	BYTE *RecBuf = &Rtus[RtuNo].RecBuf[NonceInfoWord];
	BYTE *SOEInfo = Rtus[RtuNo].CDT_SOEInfo;
	GetLocalTime(&CurTime);

	if (RecBuf[11] != CDT_CheckCRC(RecBuf + 6))
	{
		NonceInfoWord +=6;
		return;
	}
	if ((RecBuf[1] == SOEInfo[0]) && (RecBuf[9] == SOEInfo[1]) && (RecBuf[10] == SOEInfo[2]) 
		&& (RecBuf[7] == SOEInfo[3]) && (RecBuf[8] == SOEInfo[4]) && (RecBuf[4] == SOEInfo[5]))
	{
		NonceInfoWord += 6;
		return;
	}
	if((Events.EventNum+1)==Events.EventSendNum)
	{
		Beep(1200,500);
		NonceInfoWord += 6;
		return;
	}
	MilliSeconds=((RecBuf[7] & 0xf) %10) * 100 + ((RecBuf[8]>>4)%10)*10 + (RecBuf[8]&0xf)%10;
	
	if (Rtus[RtuNo].TimeForbit == 1)
	{
		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;
	}else
	{
		Event.ms = MilliSeconds % 100;
		Event.hundms = MilliSeconds / 100;
		Event.seconds = ((RecBuf[4]>>4) % 6) * 10 + (RecBuf[4] & 0xf)%10;
		Event.minute = ((RecBuf[3]>>4) % 6) * 10 + (RecBuf[3] & 0xf)%10;
		Event.hour = ((RecBuf[2]>>4) % 3) * 10 + (RecBuf[2] & 0xf)%10;
	}
	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;
	if (RecBuf[9]==0xff) Event.yxno = RecBuf[10];
	else Event.yxno = RecBuf[9] + RecBuf[10] * 256;
	Event.cause = 1;
	Event.type = 1;
	Event.state = (RecBuf[1] == 0xcc) ? 1 : 0;
	NonceInfoWord += 6;
	SOEInfo[0] = RecBuf[1];
	SOEInfo[1] = RecBuf[9];
	SOEInfo[2] = RecBuf[10];
	SOEInfo[3] = RecBuf[7];
	SOEInfo[4] = RecBuf[8];
	SOEInfo[5] = RecBuf[4];


	CurEventP = Events.EventBuf + Events.EventNum;
	memcpy(CurEventP,&Event,sizeof(FERTEVENT));
	if(++Events.EventNum>=MAX_EVENT_NUM)
		Events.EventNum=0;
}

void DCF_YK_SJ_Pro(int i,int RtuNo,int &NonceInfoWord)
{
	BYTE *RecBuf = Rtus[RtuNo].RecBuf;
	if (RtuNo != *((WORD*)(YKReserved+1))) return;
	
	int iFjYkNo1 = RecBuf[NonceInfoWord + 3] / 16 * 10 + RecBuf[NonceInfoWord + 3] % 16 
		+ (RecBuf[NonceInfoWord + 4] / 16 * 10 + RecBuf[NonceInfoWord + 4] % 16) * 100; 
	int iFjYkNo2 = RecBuf[NonceInfoWord + 3 + 6] / 16 * 10 + RecBuf[NonceInfoWord + 3 + 6] % 16 
		+ (RecBuf[NonceInfoWord + 4 + 6] / 16 * 10 + RecBuf[NonceInfoWord + 4 + 6] % 16) * 100; 
	int iFjYkNo3 = RecBuf[NonceInfoWord + 3 + 12] / 16 * 10 + RecBuf[NonceInfoWord + 3 + 12] % 16 
		+ (RecBuf[NonceInfoWord + 4 + 12] / 16 * 10 + RecBuf[NonceInfoWord + 4 + 12] % 16) * 100; 
	int iYkNo = YKReserved[4] * 256 + YKReserved[3];
	
	if ((RecBuf[NonceInfoWord + 1]==YKReserved[7] || RecBuf[NonceInfoWord + 7]==YKReserved[7] || RecBuf[NonceInfoWord + 13]==YKReserved[7]) 
		&& (iFjYkNo1 == iYkNo || iFjYkNo2 == iYkNo || iFjYkNo3 == iYkNo))
		YKEcho[RtuNo][1] = YKReserved[7];
	else 
	{
		YKEcho[RtuNo][1] = 0xff;
		YKReserved[4] = iFjYkNo1 / 256;
		YKReserved[3] = iFjYkNo1 % 256;
	}
	YKEchoFlag[RtuNo]=1;
	NonceInfoWord +=12;
}

void DCF_SetRtuTime(int i,int RtuNo)
{
	SYSTEMTIME SysTime;
	BYTE SetTimeFrame[18];
	BYTE *SetTimeFrameSyn = (BYTE *)SetTimeFrame;
	GetLocalTime(&SysTime);

	for (int l=0;l<6;l++) SetTimeFrame[l] = Rtus[RtuNo].SynWord[l+1];
	SetTimeFrame[6]=0x70;  
	SetTimeFrame[7]=0xD9;  
	SetTimeFrame[8]=0x01;
	SetTimeFrame[9]=0x01;
	SetTimeFrame[10]=Rtus[RtuNo].Addr;
	SetTimeFrame[11] =DCF_CheckCRC(&SetTimeFrame[6]);

	SetTimeFrame[12]=SysTime.wHour / 10 * 16 + SysTime.wHour % 10;  
	SetTimeFrame[13]=SysTime.wMinute / 10 * 16 + SysTime.wMinute % 10;   
	SetTimeFrame[14]=SysTime.wSecond / 10 * 16 + SysTime.wSecond % 10;  
	SetTimeFrame[15]=(SysTime.wMilliseconds / 256) / 10 * 16 + (SysTime.wMilliseconds / 256) % 10;  
	SetTimeFrame[16]=(SysTime.wMilliseconds % 256) / 10 * 16 + (SysTime.wMilliseconds % 256) % 10;
	SetTimeFrame[17] =DCF_CheckCRC(&SetTimeFrame[12]);

	if (Channels[i].WorkType != 1) 
	{
		MoxaBufWrite(i,(char*)SetTimeFrame,18);
	}
}

void DCF_ReviseTime(int i,int RtuNo,int  NonceInfoWord)//设置时钟校正值
{
	BYTE *RecBuf = &Rtus[RtuNo].RecBuf[NonceInfoWord];
	if(Rtus[RtuNo].RecBuf[NonceInfoWord] == 0x84)//子站时钟反送 
	{
		GetLocalTime(&Rtus[RtuNo].CDT_CurTime);
		Rtus[RtuNo].CDT_ChildTime = RecBuf[1] + RecBuf[2]*256 + RecBuf[3]*1000 + RecBuf[4]*60000;//收到召唤命令的子站时间	
	}else
	{
		BYTE ReviseTimeFrame[18];
		WORD ReviseTimeWord;
		DWORD ChildWaitTime = RecBuf[1] + RecBuf[2]*256	+ RecBuf[3]*1000 + RecBuf[4]*60000;//子站等待时间	
		DWORD CurTime = Rtus[RtuNo].CDT_CurTime.wMilliseconds + Rtus[RtuNo].CDT_CurTime.wSecond * 1000//当前时间 
			+ Rtus[RtuNo].CDT_CurTime.wMinute * 6000;
		DWORD CallUpTime = Rtus[RtuNo].CDT_CallUpSysTime.wMilliseconds + Rtus[RtuNo].CDT_CallUpSysTime.wSecond * 1000
			+ Rtus[RtuNo].CDT_CallUpSysTime.wMinute * 6000;//召唤时钟的主站时间
		int ReviseTime = (CallUpTime+CurTime-ChildWaitTime)/2 - Rtus[RtuNo].CDT_ChildTime;

		for (int l=0;l<6;l++) ReviseTimeFrame[l] = Rtus[RtuNo].SynWord[l+1];
		if (ReviseTime<0)
		{
			ReviseTimeWord = (-ReviseTime) % 32512;// &0x7fff;
			ReviseTimeWord ^= 0x7fff;
			ReviseTimeWord ++;
			ReviseTimeWord |= 0x8000;
		}else
			ReviseTimeWord = ReviseTime % 32512;// &0X7fff
		*((DWORD*)&ReviseTimeFrame[6]) = 0x010b70;
		ReviseTimeFrame[10] = Rtus[RtuNo].Addr;
		ReviseTimeFrame[11] = DCF_CheckCRC(&ReviseTimeFrame[6]);

		ReviseTimeFrame[12] = 0xed;
		*((WORD*)&ReviseTimeFrame[13]) = ReviseTimeWord;
		*((WORD*)&ReviseTimeFrame[15]) = ReviseTimeWord;
		ReviseTimeFrame[17] = DCF_CheckCRC(&ReviseTimeFrame[12]);
		if (Channels[i].WorkType != 1)
		{
			MoxaBufWrite(i,(char *)ReviseTimeFrame,18);
		}
	}
}

⌨️ 快捷键说明

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