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

📄 processdjkqdirect.cpp

📁 这是一个变电站的监控程序
💻 CPP
字号:
#include "stdafx.h"
#include "fert2000.h"
#include "process.h"

extern bool bStopFlag;
extern RecSendThread RecSendThread1;
extern  CFert2000App theApp;
extern ADDR *Addr;
int YxNo;
WORD Direct_Check(BYTE *buf,int iLen)
{
	DWORD dwSum = 0;
	WORD  wSum =0;
	for (int i = 0;i < iLen;i++)
	{
		dwSum += buf[i];
	}
    wSum=dwSum%0xffff;     
	return wSum;
}

void HandleYx(int RtuNo,int Num,BYTE * RecBuf)
{
    BYTE i=0,State=0,YxVal=0;
	RTUPARA * rtupara=GetRtuParaPt(Addr,RtuNo);
	switch(Num)
	{
		case 14:
		case 10:
			{
				YxVal=RecBuf[Num];
				for(i=0;i<5;i++)
				{
					State=(YxVal&(1<<i))?1:0;
					rtupara->YxValue[YxNo++]=State;       
				}
				break;
			}
		case 11:
		case 15:
			{
				YxVal=RecBuf[Num];
				for(i=0;i<8;i++)
				{
					State=(YxVal&(1<<i))?1:0;
					rtupara->YxValue[YxNo++]=State;
				}
				break;
			}
		case 13:
			{
				YxVal=RecBuf[Num];
				State=(YxVal&0x02)?1:0;
				rtupara->YxValue[YxNo++]=State;
				break;
			}
		case 17:
			{
				YxVal=RecBuf[Num];
				for(i=1;i<4;i++)
				{
					State=(YxVal&(1<<i))?1:0;
					rtupara->YxValue[YxNo++]=State;
				}
				break;
			}
		case 18:
		case 19:
			{
				YxVal=RecBuf[Num];
				for(i=0;i<4;i++)
				{
					State=(YxVal&(1<<i))?1:0;
					rtupara->YxValue[YxNo++]=State;
				}
				break;
			}
		case 23:
			{
				YxVal=RecBuf[Num];
				for(i=0;i<8;i++)
				{
					if(i==2)  continue;
					State=(YxVal&(1<<i))?1:0;
					rtupara->YxValue[YxNo++]=State;
				}
				break;
			}
		case 24:
			{
				YxVal=RecBuf[Num];
				for(i=0;i<7;i++)
				{
					if(i==2)  continue;
					State=(YxVal&(1<<i))?1:0;
					rtupara->YxValue[YxNo++]=State;
				}
				break;
			}
	}
}

void DJKQ_Direct(int i,int RtuNo)
{
	YCPARA far *ycpara;
	int iStatus = 2;
	int SendLen = 0,RecLen = 0;
	int iRet = 0;
	DWORD num = 0;
	STATION *station = Addr->Station_addr;
	CHANPARA *chanpara = Addr->ChanPara_addr + i;
	RTUPARA *rtupara = GetRtuParaPt(Addr,RtuNo);
	if (!rtupara) return;
	BYTE *SendBuf = &chanpara->SendBuffer[0];
	BYTE *RecBuf = &chanpara->RecBuffer[0];

	if(rtupara->CommandSendFlag[1]==true)
	{
		rtupara->CommandSendFlag[1]=false;
        SendBuf[0] = 0x05;
        SendBuf[1] = rtupara->rtuaddr;//目标站址
		SendBuf[2] = 0x10;//源站址
		SendBuf[3] = 0x30;
		SendBuf[4] = Direct_Check(&SendBuf[0],4) % 256;
		SendBuf[5] = Direct_Check(&SendBuf[0],4) / 256;
        SendLen = 6;
		ChanBufRead(i,RecBuf,1024);
		ChanBufWrite(i,SendBuf,SendLen);
		Sleep(50);
		DispBufData(i,RtuNo,0,SendBuf,SendLen,0);

		iRet = ChanBufRead(i,RecBuf,117);
		Sleep(500);
		RecLen = iRet;
		iStatus = 2;
		float fCoef = 0;
		if (iRet == 117) 
		{
			if (RecBuf[0]==0x74 && RecBuf[1]==0x10 && RecBuf[2]==rtupara->rtuaddr 
				&& RecBuf[3]==0x30 && RecBuf[115]==Direct_Check(&RecBuf[0],115)%256  
				&& RecBuf[116]==Direct_Check(&RecBuf[0],115)/256)
			{
				iStatus=0;
				int YcNo=0;
				int FracNo=0;
				for(int j=10;j<112;j=j+3)
				{
					WORD YcValue;
//					YcValue = RecBuf[j] + (RecBuf[j+1] & 0x7f)*256;
					YcValue = RecBuf[j] + RecBuf[j+1]*256;
					WORD YcSign = 0x8000;//遥测符号位:15
                    if (YcValue & YcSign)//遥测为负数 
					{
						rtupara->YcValue[YcNo++]=-(YcValue & 0x7fff);//-YcValue;
					}
					else
						rtupara->YcValue[YcNo++]=YcValue;
                    if(RecBuf[j+2]==0x00||RecBuf[j+2]==0x02)
						fCoef = 0.1;//Fraction[FracNo++]=0.1;
					else
						fCoef = 0.01;//Fraction[FracNo++]=0.01;
					for (BYTE l=0; l<station->ycnum; l++ )
					{
						char ycname[10];
						sprintf(ycname,"yc%05d",l);
						ycpara=GetYcParaPt(Addr,ycname);//Addr->YcPara_addr + i;
						if (!ycpara)
							continue;
						if(ycpara->rtuno==rtupara->rtuno && ycpara->ycno == YcNo)
						{
							ycpara->physicaluplimit = fCoef;//Fraction[S++];
							ycpara->physicaldownlimit=0;
							break;
						}
					}
                   if(YcNo>34||FracNo>34)
						break;
				}
			}
            else
                 iStatus=1;
		}
		else
		{
			if(iRet!=0)
				iStatus=1;
		}
		DispBufData(i,RtuNo,1,RecBuf,RecLen,iStatus);	
	}
	else if(rtupara->CommandSendFlag[2]==true)
	{
		rtupara->CommandSendFlag[2]=false;
        SendBuf[0] = 0x05;
        SendBuf[1] = rtupara->rtuaddr;//目标站址
		SendBuf[2] = 0x10;//源站址
		SendBuf[3] = 0x31;
		SendBuf[4] = Direct_Check(&SendBuf[0],4) % 256;
		SendBuf[5] = Direct_Check(&SendBuf[0],4) / 256;
        SendLen = 6;
        ChanBufWrite(i,SendBuf,SendLen);
		Sleep(50);
		DispBufData(i,RtuNo,0,SendBuf,SendLen,0);

		iRet = ChanBufRead(i,RecBuf,4);
		Sleep(20);
		RecLen = iRet;
	    iStatus = 2;
		if (iRet == 4) 
		{
			int iLen=0;
			if (RecBuf[1]==0x10 && RecBuf[2]==rtupara->rtuaddr && RecBuf[3]==0x31 )
			{
			    iLen=RecBuf[0]-3;
				iRet=ChanBufRead(i,&RecBuf[4],iLen);
				Sleep(200);
				RecLen+=iRet;
				if(iRet==iLen)
				{
					if(RecBuf[iLen+3-1]==Direct_Check(&RecBuf[0],iLen+3-1)%256
						&&RecBuf[iLen+3]==Direct_Check(&RecBuf[0],iLen+3-1)/256)
					{
                       iStatus=0;
					   YxNo=0;
                       for(int j=10;j<25;j++)
					   {
						   switch (j)
						   {
							   case 12:
							   case 16:
							   case 20:
							   case 21:
							   case 22:
								   break;
							   default:
								   HandleYx(RtuNo,j,RecBuf);
								   break;
						   }
					   }
					YxNo=0;
					}
					else 
						iStatus=1;
				}
			}
			else
				iStatus=1;
		}
		else
		{
			if(iRet!=0)
				iStatus=1;
		}
		DispBufData(i,RtuNo,1,RecBuf,RecLen,iStatus);
	}
	else if(rtupara->CommandSendFlag[3]==true)
	{
		static int k=0;
		int Num;//取绝缘监测仪编号
		Num=k+1;
		rtupara->CommandSendFlag[3]=false;
        SendBuf[0] = 0x06;
        SendBuf[1] = rtupara->rtuaddr;//目标站址
		SendBuf[2] = 0x10;//源站址
		SendBuf[3] = 0x39;
		SendBuf[4] = Num;
		SendBuf[5] = Direct_Check(&SendBuf[0],5) % 256;
		SendBuf[6] = Direct_Check(&SendBuf[0],5) / 256;
        SendLen = 7;
        ChanBufWrite(i,SendBuf,SendLen);
		Sleep(50);
		DispBufData(i,RtuNo,0,SendBuf,SendLen,0);
        
		iRet = ChanBufRead(i,RecBuf,5);
		Sleep(50);
		RecLen = iRet;
		iStatus = 2;
		if (iRet == 5) 
		{
			int iLen=0;
			if (RecBuf[1]==0x10 && RecBuf[2]==rtupara->rtuaddr && RecBuf[3]==0x39
				&& RecBuf[4]==Num)

			{
			    iLen=RecBuf[0]-4;
				iRet=ChanBufRead(i,&RecBuf[5],iLen);
				Sleep(200);
				RecLen+=iRet;
				if(iRet==iLen)
				{
					if(RecBuf[iLen+4-1]==Direct_Check(&RecBuf[0],iLen+4-1)%256
						&&RecBuf[iLen+4]==Direct_Check(&RecBuf[0],iLen+4-1)/256)
					{
                       iStatus=0;
					   BYTE YxVal;
					   YxVal=RecBuf[5];
					   BYTE State=0;
					   BYTE YcNo=0;
					   for(int j=0;j<8;j++)
					   {
						   State=(YxVal & (1<<j))?1:0;
						   rtupara->YxValue[51+k*8+j]=State;
					   }
                       for(j=8;j<28;j++)
					   {
						   switch (j)
						   {
							   case 8:
							   case 10:
							   case 18:
							   case 20:
								   {
									   rtupara->YcValue[34+k*8+YcNo++]=RecBuf[j]+RecBuf[j+1]*256;
								       break;
								   }
							   case 13:
							   case 15:
							   case 23:
							   case 26:
								   {
									   rtupara->YcValue[34+k*8+YcNo++]=RecBuf[j]+RecBuf[j+1]*256+RecBuf[j+2]*65535;
								       break;
								   }
						   }
					   }

					}
					else
						iStatus=1;
				}
				else 
					iStatus=1;
			}
			else
				iStatus=1;
		}
		else 
		{
			if(iRet!=0)
				iStatus=1;
		}
        k++;
	    if(k>7) k=0;
		DispBufData(i,RtuNo,1,RecBuf,RecLen,iStatus);
	}
    else 
	{
		rtupara->CommandSendFlag[1]=true;
		rtupara->CommandSendFlag[2]=true;
		rtupara->CommandSendFlag[3]=true;
	}

	if (RecBuf[3] == 0x31)//收到遥信报文
	{
		if (rtupara->RecFullYx == 255)
			rtupara->RecFullYx = 0;
		else if (rtupara->RecFullYx == 0)
			rtupara->RecFullYx = 1;
	}
}

⌨️ 快捷键说明

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