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

📄 processcdt91rec.cpp

📁 这是一个变电站的监控程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    else if (rtupara->CommandSendFlag[1]==true)//广播
	{
		rtupara->CommandSendFlag[1]=false;
	    for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
	    Sendlen=6;	
		SendBuf[6]=0x21;
		SendBuf[7]=0x9e;
		SendBuf[8]=0x00;
		SendBuf[9]=0x01;
		SendBuf[10]=rtupara->rtuaddr;
		SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
        Sendlen+=6;
        ChanBufWrite(i,SendBuf,Sendlen);
	    DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
	}
    else if (rtupara->CommandSendFlag[2])//召唤子站时钟
	{
		rtupara->CommandSendFlag[2]=false;
	    for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
	    Sendlen=6;	
        SendBuf[6]=0x31;
		SendBuf[7]=0x4c;
		SendBuf[8]=0x00;
		SendBuf[9]=0x01;
		SendBuf[10]=rtupara->rtuaddr;
		SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
        Sendlen+=6;
        ChanBufWrite(i,SendBuf,Sendlen);
	    DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
	}
	else if (rtupara->CommandSendFlag[5])//复归命令
	{
		rtupara->CommandSendFlag[5]=false;
		for (int l=0;l<6;l++) SendBuf[l]= bSynWord[l];
		Sendlen=6;
        SendBuf[6]=0x31;
		SendBuf[7]=0x3d;
		SendBuf[8]=0x00;
		SendBuf[9]=0x01;
		SendBuf[10]=rtupara->rtuaddr;
		SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);
        Sendlen+=6;
        ChanBufWrite(i,SendBuf,Sendlen);
	    DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
	}
    else if (rtupara->CommandSendFlag[7]==true)//设置时钟
	{   
		rtupara->CommandSendFlag[7]=false;
	    for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
	    Sendlen=6;	
        SYSTEMTIME SysTime;
		GetLocalTime(&SysTime);
        SendBuf[6]=0x71;
		SendBuf[7]=0x7a;
		SendBuf[8]=0x02;
		SendBuf[9]=0x01;
		SendBuf[10]=rtupara->rtuaddr;
		SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);

		SendBuf[12]=0xee;
		SendBuf[13]=SysTime.wMilliseconds%256;
		SendBuf[14]=SysTime.wMilliseconds/256 & 0x03;  
		SendBuf[15]=(BYTE)SysTime.wSecond & 0x3f;  
		SendBuf[16]=(BYTE)SysTime.wMinute & 0x3f;
		SendBuf[17]=CDT_CheckCRC(&SendBuf[12]);
		SendBuf[18]=0xef;  
		SendBuf[19]=(BYTE)SysTime.wHour & 0x1f; 
		SendBuf[20]=(BYTE)SysTime.wDay & 0x1f;
		SendBuf[21]=(BYTE)SysTime.wMonth & 0xf;  
		SendBuf[22]=SysTime.wYear%100;
		SendBuf[23]=CDT_CheckCRC(&SendBuf[18]);
		Sendlen+=18;
        ChanBufWrite(i,SendBuf,Sendlen);
	    DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
	}
/*	else
	{
	    for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
	    Sendlen=6;	
        ChanBufWrite(i,SendBuf,Sendlen);
	    DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
	}*/
}

void CDT91Rec_Answer(int i,int iRtuNo,int & NonceInfoWord)
{
    CHANPARA *chanpara = Addr->ChanPara_addr + i;
	RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
	if (rtupara == NULL) return;
	BYTE* RecBuf=&(chanpara->ProcBuffer[0]);
	BYTE *SendBuf = & chanpara->SendBuffer[0];
	switch(RecBuf[NonceInfoWord])
	{
	case 0x80://0x81  SOE
		CDT91_SOE_Event(i,iRtuNo,NonceInfoWord);	
		break;
	case 0x84:
	case 0x85://设置时钟校正值
//		CDT91Rec_ReviseTime(i,iRtuNo,NonceInfoWord);
		break;
	case 0xe1:
	case 0xe5://遥控,升降返校
		CDT91Rec_YK_SJ_Pro(i,iRtuNo,NonceInfoWord);
		break;
	case 0xec://子站状态信息
		{
			int iStatus=3;
			DWORD YxWord=*(DWORD*)&RecBuf[NonceInfoWord+1];
			BYTE State=0;
/*			for (int k=0;k<32;k++)
			{
				State = (YxWord & (1<<k)) ? 1 : 0;
				if (rtupara->YxValue[k] != State)
					rtupara->YxValue[k] = State;

			}*/
			if(RecBuf[NonceInfoWord+1]&0x80)
			{
                for (int l=0;l<6;l++) SendBuf[l] = bSynWord[l];
				int Sendlen=6;	
				SYSTEMTIME SysTime;
				GetLocalTime(&SysTime);
				SendBuf[6]=0x71;
				SendBuf[7]=0x7a;
				SendBuf[8]=0x02;
				SendBuf[9]=0x01;
				SendBuf[10]=rtupara->rtuaddr;
				SendBuf[11]=CDT_CheckCRC(&SendBuf[6]);

				SendBuf[12]=0xee;
				SendBuf[13]=SysTime.wMilliseconds%256;
				SendBuf[14]=SysTime.wMilliseconds/256 & 0x03;  
				SendBuf[15]=(BYTE)SysTime.wSecond & 0x3f;  
				SendBuf[16]=(BYTE)SysTime.wMinute & 0x3f;
				SendBuf[17]=CDT_CheckCRC(&SendBuf[12]);
				SendBuf[18]=0xef;  
				SendBuf[19]=(BYTE)SysTime.wHour & 0x1f; 
				SendBuf[20]=(BYTE)SysTime.wDay & 0x1f;
				SendBuf[21]=(BYTE)SysTime.wMonth & 0xf;  
				SendBuf[22]=SysTime.wYear%100;
				SendBuf[23]=CDT_CheckCRC(&SendBuf[18]);
				Sendlen+=18;
				ChanBufWrite(i,SendBuf,Sendlen);
				DispBufData(i,iRtuNo,0,SendBuf,Sendlen,iStatus);
			}
			break;
        }
	}
}



void CDT91_SOE_Event(int i,int iRtuNo,int &NonceInfoWord)
{
	 STATION * station = Addr->Station_addr;
	 CHANPARA *chanpara = Addr->ChanPara_addr + i;
	 RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
	 if (rtupara == NULL) return;
	 BYTE* RecBuf=&(chanpara->ProcBuffer[NonceInfoWord]);
     NonceInfoWord  += 30;
	 if (RecBuf[11] == CDT_CheckCRC(RecBuf + 6))
	{
		WORD MilliSeconds;
		FERTEVENT Event;
		SYSTEMTIME CurTime;
		GetLocalTime(&CurTime);
        MilliSeconds=RecBuf[1] + (RecBuf[2] & 0x03)*256;
		Event.ms = MilliSeconds % 100;
		Event.hundms = MilliSeconds / 100;
		Event.seconds = RecBuf[3] & 0x3f;
		Event.minute = RecBuf[4] & 0x3f;
		Event.hour = RecBuf[7] & 0x1f;
		Event.day = RecBuf[8] & 0x1f;
		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 = iRtuNo;
		Event.yxno = RecBuf[9] + (RecBuf[10] & 0xf)*256;
		Event.cause = 1;
		Event.type = 1;
		Event.state = (RecBuf[10] & 0x80) ? 1 : 0;

        GenRtuEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,&Event);//产生SOE报警

		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 == iRtuNo && yxpara->yxno == Event.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)
			{
				chanpara->SoeEvent[chanpara->SoePtr].YxNo = k;
				chanpara->SoeEvent[chanpara->SoePtr].YxState = (Event.state & 0x1);
				chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wYear = Event.year ;
				chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wMonth = Event.month ;
				chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wDay = Event.day ;
				chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wHour = Event.hour ;
				chanpara->SoeEvent[chanpara->SoePtr].SoeTime.wMinute = Event.minute ;
				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;
				chanpara->bSoe = true;
			}
		}
	}
}


void CDT91Rec_YK_SJ_Pro(int i,int iRtuNo,int & NonceInfoWord)
{    
	STATION * station = Addr->Station_addr;
	CHANPARA *chanpara = Addr->ChanPara_addr + i;
	RTUPARA *rtupara = GetRtuParaPt(Addr,iRtuNo);
	if (rtupara == NULL) return;
	BYTE* RecBuf=&(chanpara->ProcBuffer[0]);
	if ((RecBuf[NonceInfoWord+1]==RecBuf[NonceInfoWord+3]) && (RecBuf[NonceInfoWord+1]==rtupara->SetCommand[4])
		 && (RecBuf[NonceInfoWord+1]!=0xff))
	{   
        rtupara->SetCommand[5] = 1;//成功返回
        if (rtupara->SetCommand[1] == YK)
		    GenYkEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,0x44,
		               rtupara->SetCommand[4],rtupara->SetCommand[7]+rtupara->SetCommand[8]*256,rtupara->SetCommand[0]);//fj 
		else if (rtupara->SetCommand[1] == YT)
			GenYtEvent(Addr,RecSendThread1.g_hSCADAToMMIEvent,0x44,
			  		   rtupara->SetCommand[4],rtupara->SetCommand[7]+rtupara->SetCommand[8]*256,rtupara->SetCommand[0]);//fj 
	    if (rtupara->SetCommand[0] == 0)
		{
		    //yk/yt fj right flag set chanpara bykflag to 0xcc/0x33
		    for (int k = 0;k < station->channum ;k++)
			{
			     CHANPARA *para = Addr->ChanPara_addr + k;
			     if (para->useflag && para->openflag && para->updown == 0)
				{
					if (Addr->YkReserved_addr[3*k] == iRtuNo)
					{
					    Addr->YkReturn_addr[3*k] = iRtuNo;//SCADA 给 Mmview 发消息用
						para->bYkfj = true;
					}
				}
			}
		}
	}
	else//FF 出错 
        rtupara->SetCommand[5]=0;
	rtupara->SetCommand[1] = 255;
}





⌨️ 快捷键说明

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