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

📄 sc1801.cpp

📁 这是一个在正实际应用当中运行的电力监控系统软件源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	if (!FLAG->SDBB){wrp=CallData(txb,wrp,SDB);
					 FLAG->Poll=0;
					 return wrp;
					 }
	switch (PPoll)
		{    
			case	4:case	7:case	10:case	13:case	16:case	19:case 22:
				if (FLAG->RANDOM2==0xa)
					{
                    	wrp=CallData(txb,wrp,XRF);
					}
                else  FLAG->PollOver=lpStaP->ProcCount*2;
				break;
			case	5:case	8:case	11:case	14:case	17:case	20:case 23:
				if (FLAG->RANDOM2==0xa && (lpStaP->RTUSTATUS&0x1c) && FLAG->TIME==0)
					{             
//                    	wrp=CallData(txb,wrp,RST);
						FLAG->TIME=1;
					}
                else  FLAG->PollOver=lpStaP->ProcCount*2;
				break;
			case	6:case	9:case	12:case	15:case	18:case	21:case 24:
				if (FLAG->RANDOM2==0xa && FLAG->TIME==1)
					{    
                    	wrp=CallData(txb,wrp,SOE);
					}
                else  FLAG->PollOver=lpStaP->ProcCount*2;
                break;
            case	1:
				if (FLAG->RANDOM2==0xa && FLAG->PAFFLAG==0)
					{
                        if (KwhCount[lpChP->StaNo]>KWHCOUNT)
                            {
								wrp=CallData(txb,wrp,PAF);
								KwhCount[lpChP->StaNo]=0;
							}
						else FLAG->PAFFLAG=0;
					}
                else  FLAG->PollOver=lpStaP->ProcCount*2;

                break;
			case	2:
				if (FLAG->RANDOM2==0xa && FLAG->PAFFLAG==1)
					{
                    	wrp=CallData(txb,wrp,PAR);
					}
                else  FLAG->PollOver=lpStaP->ProcCount*2;
                break;
            case	3:
				if (FLAG->RANDOM2==0xa && FLAG->PAFFLAG==2)
					{
						wrp=CallData(txb,wrp,PAT);
						FLAG->PAFFLAG=0;
					}
				else  FLAG->PollOver=lpStaP->ProcCount*2;
                break;
			case      25:
				if (FLAG->DRFTIME++==0xff)
					{
						wrp=CallData(txb,wrp,DRF);
					}
					  break;
            default	:
                        FLAG->PollOver=lpStaP->ProcCount*2;
				break;
		}
 return wrp;
}


BYTE CallLPC(BYTE FAR *xb,WORD rp,WORD Len,WORD Mode)
{
BYTE result=0;
	for (int i=0;i<Len;i++)
		{
			 result^=*(xb+(rp+i)%Mode);
        }
	return ~result;
}
//分站数据处理
WORD PollRecProc(BYTE FAR *rxb,WORD rdp,WORD Len)
{       
	lpChP->CHStatus &= ~(SyncR + CtrlW + InforW+ OnlySyncFlag +NoSyncFlag);
	lpStaP->RTUSTATUS=*(rxb+(rdp+4)%rxbuflen);//RTU状态字
    Flag *FLAG=(Flag *)(lpChP->Reserved+80);
	FLAG->Retry=0;
	if (*(rxb+(rdp+1)%rxbuflen)&0x40)//判断RTU->主站
    {
		switch(*(rxb+(rdp+1)%rxbuflen)&0x3f) //判断命令码
		{
    	 case COA://jgx 98.8
			ProcCOA(rxb,rdp);
			break;
		 case NAK:
            if (*(rxb+(rdp+5)%rxbuflen)!=SST)
            {
			FLAG->Poll--;
			FLAG->Retry=1;
            FLAG->RepTimes++;
			if (FLAG->RepTimes>=lpStaP->RepeatTimes)
				{
					FLAG->RANDOM0=FLAG->RANDOM1=FLAG->RANDOM2=0;
					FLAG->RepTimes=FLAG->Retry=0;
				}
            }
			break;
		 case RRC:
			ProcRRC(rxb,rdp);
			break;
		 case DRF:
			ProcDRF(rxb,rdp);
            break;
		 case XRF:
			ProcXRF(rxb,rdp);
            break;
		 case SOE:
			ProcSOE(rxb,rdp);
			break;
		 case PAR:
			ProcPAR(rxb,rdp);
            break;
		 case PAZ:
		 case PAF:
            ProcPAF(rxb,rdp);
              break;
		 case PAT:
            ProcPAT(rxb,rdp);
              break;
		 case SDB:
            ProcSDB(rxb,rdp);
              break;
		 case SST:
			break;
		 case RST:
			ProcRST(rxb,rdp);
            break;
//jgx		 case COA:
//			ProcCOA(rxb,rdp);
//            break;
         case COE:
            break;
         default:
            break;
		}
    }
    return (Len+5);
}
//RRC处理(读取RTU配置)
void ProcRRC(BYTE FAR * rxb,WORD rdp)
{ BYTE constartboardnum=0;//jgx 98.8

  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
	lpStaP->YCNUM=0;
	lpStaP->YXNUM=0;
	lpStaP->KWHNUM=0;
	for (BYTE i=0;i<16;i++)
		{
/*
			if (*(rxb+(rdp+i+5)%rxbuflen)==0x11){lpStaP->SLOT[i]=1;lpStaP->YXB[lpStaP->YXNUM]=i;lpStaP->YXNUM++;}
			else if(*(rxb+(rdp+i+5)%rxbuflen)==0x32){lpStaP->SLOT[i]=2;lpStaP->YCB[lpStaP->YCNUM]=i;lpStaP->YCNUM++;}
			else if(*(rxb+(rdp+i+5)%rxbuflen)==0x3b){lpStaP->SLOT[i]=3;lpStaP->KWHB[lpStaP->KWHNUM]=i;lpStaP->KWHNUM++;}
			else if(*(rxb+(rdp+i+5)%rxbuflen)==0x05){lpStaP->SLOT[i]=4;lpStaP->ConStartBoard=i;}
*/
			if (*(rxb+(rdp+i+5)%rxbuflen)==0x11)
			     {if (lpStaP->YXNUM==0)
					 {lpStaP->YXB[lpStaP->YXNUM]=i;
					  lpStaP->YXNUM++;
					 }
				 }
			else if(*(rxb+(rdp+i+5)%rxbuflen)==0x32)
				   {if (lpStaP->YCNUM==0)
					   {lpStaP->YCB[lpStaP->YCNUM]=i;
						lpStaP->YCNUM++;
						}
				   }
			else if(*(rxb+(rdp+i+5)%rxbuflen)==0x3b)
				   {if (lpStaP->KWHNUM==0)
					   {lpStaP->KWHB[lpStaP->KWHNUM]=i;
					   lpStaP->KWHNUM++;
					   }
				   }
			else if(*(rxb+(rdp+i+5)%rxbuflen)==0x05)
				   {
					lpStaP->ConStartBoard=i;
					constartboardnum++;    //jgx 98.8
				   }
		}
		lpStaP->ConStartBoard=lpStaP->ConStartBoard-constartboardnum+1;//jgx 98.8
	    FLAG->RANDOM0=0xcc;FLAG->RANDOM1=0xc6;FLAG->RANDOM2=0;
}
//DRF处理(全数据)
void ProcDRF(BYTE FAR * rxb,WORD rdp)
{
	WORD yc=0,yx=0;
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
	WORD Len=(WORD)(*(rxb+(rdp+2)%rxbuflen)*256)+*(rxb+(rdp+3)%rxbuflen);
	for (int i=5;i<Len-4;i++)
		{
			if (*(rxb+(rdp+i)%rxbuflen)&0x40)
			   	{
				  WORD YcValue=(WORD)((*(rxb+(rdp+i)%rxbuflen)&0xf)*(WORD)256)+(WORD)(*(rxb+(rdp+i+1)%rxbuflen));
                  if ((YcValue&0x800)) YcValue &=0x7ff;
                  else {YcValue=~(YcValue&0x7ff)+1;YcValue=(YcValue&0x7ff)|0x8000;}
               
					SetValue(YCDB, lpChP->StaNo, yc, YcValue);
					yc++;
					i++;
			   	}
			else if (*(rxb+(rdp+i)%rxbuflen)&0x80)
				{
                    BYTE YXV=*(rxb+(rdp+i)%rxbuflen)&0x3f;
//					yx=*(rxb+(rdp+i)%rxbuflen);
//					yx=(yx&0x3f)*24+((yx/16)&3)*16;

                    BYTE flag = lpStaP->RotateFlag;
                    if (flag) {YXV = ByteRotate(YXV);YXV>>=2;}
					for (BYTE j=0;j<6;j++,YXV>>=1,yx++)
					   {
					   WORD yxv=0;
					   if (YXV&1) yxv=1;
					   SetValue(YXDB, lpChP->StaNo, yx, yxv);
					   }
				}
        }
	FLAG->RANDOM2=0xa;//全数据接收完以后设置一标志
}
//XRF处理(异常数据处理)
void ProcXRF(BYTE FAR * rxb,WORD rdp)
{
    BYTE YXV,temp1,temp2,YXv;
	WORD yc=0,yx=0,yxv;
	WORD Len=(WORD)(*(rxb+(rdp+2)%rxbuflen)*256)+*(rxb+(rdp+3)%rxbuflen);
    if (Len)
    { 
	for (int i=5;i<Len+4;i+=3)
		{
			if (*(rxb+(rdp+i+1)%rxbuflen)&0x40)
				{
				  yc=(WORD)(((*(rxb+(rdp+i)%rxbuflen)>>4)-lpStaP->YCB[0])*12)+(WORD)(*(rxb+(rdp+i)%rxbuflen)&0xf);
				  WORD YcValue=(WORD)((*(rxb+(rdp+i+1)%rxbuflen)&0xf)*(WORD)256)+(WORD)(*(rxb+(rdp+i+2)%rxbuflen));
                  if ((YcValue&0x800)) YcValue &=0x7ff;
				  else {YcValue=~(YcValue&0x7ff)+1;
						YcValue=(YcValue&0x7ff)|0x8000;
						}
				  SetValue(YCDB, lpChP->StaNo, yc, YcValue);
				}
			else if (*(rxb+(rdp+i+1)%rxbuflen)&0x80)
				{
                  yx=(*(rxb+(rdp+i)%rxbuflen)&0xf-lpStaP->YXB[0])*24+((*(rxb+(rdp+i)%rxbuflen)/16)&0x3)*6;
				  YXV=*(rxb+(rdp+i+1)%rxbuflen)&0x3f;
				  YXv=*(rxb+(rdp+i+2)%rxbuflen)&0x3f;
                  BYTE flag = lpStaP->RotateFlag;
				  if (flag)
				     {YXV = ByteRotate(YXV);
					  YXv = ByteRotate(YXv);
					  YXv>>=2;
					  YXV>>=2;
					 }
				  for (int i=0;i<6;i++)
					{
                        if (YXv&1)
                        {
						yxv=0;
						if (YXV&1) yxv=1;
//                        CreateSoeForSCI(lpChP->StaNo,yx+i,yxv);
						SetValue(YXDB,lpChP->StaNo,yx+i,yxv);
                        }
                        YXV>>=1;YXv>>=1;
                    }
				  lpStaP->RTUSTATUS=0x1c;
				}

        }
    }
}
//读取分站时间
void ProcRST(BYTE FAR *rxb,WORD rdp)
{
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
/*
  lpStaP->TIMES=*(rxb+(rdp+5)%rxbuflen)*256*65536+*(rxb+(rdp+6)%rxbuflen)*65536+
				*(rxb+(rdp+7)%rxbuflen)*256+*(rxb+(rdp+8)%rxbuflen);
  lpStaP->TIMEM=(*(rxb+(rdp+7)%rxbuflen)*256+*(rxb+(rdp+8)%rxbuflen))*10;
  DWORD times= *(rxb+(rdp+5)%rxbuflen)*(DWORD)(65536*65536*256)+
               *(rxb+(rdp+6)%rxbuflen)*(DWORD)(65536*65536)+
               *(rxb+(rdp+7)%rxbuflen)*(DWORD)(65536*256)+
               *(rxb+(rdp+8)%rxbuflen)*(DWORD)65536+
               *(rxb+(rdp+9)%rxbuflen)*(DWORD)256+
               *(rxb+(rdp+10)%rxbuflen);
  int          year;
  BYTE         month,day,hour,min,sec;
  Group T=Current(times);
  year=T.year;
  month=T.month;
  day=T.day;
  hour=T.hour;
  min=T.min;
  sec=T.sec;
*/
  FLAG->TIME=1;
}
//SOE处理
void ProcSOE(BYTE FAR * rxb,WORD rdp)
{
  Flag *FLAG=(Flag *)(lpChP->Reserved+80);
	struct time Time;
	gettime (&Time);
	WORD yx;
	WORD Len=(WORD)(*(rxb+(rdp+2)%rxbuflen)*256)+*(rxb+(rdp+3)%rxbuflen);
	for (int i=5;i<Len-1;i+=9)// jgx 10
		{
			if (*(rxb+(rdp+i+7)%rxbuflen)&0x3f)//6点DI变化标志
				{
					DWORD Sec=(DWORD)(*(rxb+(rdp+i)%rxbuflen)*(DWORD)256*(DWORD)65536+*(rxb+(rdp+i+1)%rxbuflen)*(DWORD)65536+
						*(rxb+(rdp+i+2)%rxbuflen)*(DWORD)256+*(rxb+(rdp+i+3)%rxbuflen));
					Sec=0xffffffff-Sec; //转化成至2020年1月1日00:00所剩秒数
					WORD Ms=(WORD)(*(rxb+(rdp+i+4)%rxbuflen)/0x10)*100
							+(WORD)(*(rxb+(rdp+i+4)%rxbuflen)%0x10)*10
							+(WORD)*(rxb+(rdp+i+5)%rxbuflen)/0x10;
					Group T=Current(Sec);

					BYTE YXV=*(rxb+(rdp+i+8)%rxbuflen);//6点DI状态值
					BYTE CYXV=*(rxb+(rdp+i+7)%rxbuflen);//6点DI变化标志
                    BYTE flag = lpStaP->RotateFlag;// jgx 98.8
				    if (flag)                      //---
				       {CYXV = ByteRotate(CYXV);   //---
					    YXV = ByteRotate(YXV);     //---
					    CYXV>>=2;                  //---
						YXV>>=2;                   //---
					   }                           // jgx 98.8


					BYTE yxtemp=*(rxb+(rdp+i+6)%rxbuflen);//组号与槽号
//					yx=(yxtemp&0x3f-lpStaP->YXB[0])*24+((yxtemp/16)&3)*16;
					yx=(yxtemp&0xf-lpStaP->YXB[0])*24+((yxtemp/16)&0x3)*6;//jgx 98.8

					for (BYTE j=0;j<6;j++,YXV>>=1,CYXV>>=1,yx++)// jgx 98.8 >>
					   {
						if (CYXV&1)
							{
								DWORD yxattr = GetAttr(YXDB, lpChP->StaNo, yx);//jgx 98.8
								BYTE STATUS;//合-》分
								if (YXV&1) STATUS=0xcc;//分-》合
								   else(STATUS=0x33);
								if (yxattr&YXXOR) STATUS ^= 0xff;//jgx 98.8
								EVENT eve;
								eve.data[0]=STATUS;
								eve.EventType =1;
								eve.Station = lpChP->StaNo;
					            eve.Order = yx;
			 					eve.Hour=T.hour;
			 					eve.Min=T.min;
			 					eve.Sec=T.sec;
			 					eve.Ms=Ms;
                                BYTE yxtype = GetType(YXDB,eve.Station,yx);
								if (GetTimerValue(RTUDB, eve.Station))
                                   {
                                    if (STATUS==0x33)
                                       {
                                        if ((yxtype==YXSWITCH) || (yxtype==YXLINKER))
                                           eve.EventAttr |= SGFLAG;
					                   }
                                    else if (yxtype==YXPROTECT)  eve.EventAttr |= SGFLAG;
                                   }
								if ( // jgx 98.8
								(lpStaP->Soe[0].ORDER!=yx)||
								(lpStaP->Soe[0].TIME!=eve.Hour)||
								(lpStaP->Soe[0].MINUTE!=eve.Min)||
								(lpStaP->Soe[0].SECOND!=eve.Sec)||
								(lpStaP->Soe[0].MSH!=eve.Ms/100)||
								(lpStaP->Soe[0].MSL!=eve.Ms%100)||
								(lpStaP->Soe[0].STATUS!=eve.data[0])
				  					)
								{   // jgx 98.8
									lpStaP->Soe[0].ORDER=yx;
									lpStaP->Soe[0].TIME=eve.Hour;
									lpStaP->Soe[0].MINUTE=eve.Min;
									lpStaP->Soe[0].SECOND=eve.Sec;
									lpStaP->Soe[0].MSH=eve.Ms/100;
									lpStaP->Soe[0].MSL=eve.Ms%100;
									lpStaP->Soe[0].STATUS=eve.data[0];
//jgx 98.8					DWORD yxattr = GetAttr(YXDB, lpChP->StaNo, yx);
					if ((yxattr&YXCREATESOE) && (yxattr&RECRTUSOE))
									WriteAEvent(EVENTDB, &eve);
								}
							}
					   }
				}
		}
FLAG->SSTFlag=0xff;
FLAG->TIME=0;
}
void ProcPAT(BYTE FAR * rxb,WORD rdp)
{

}
//电度冻结
void ProcPAF(BYTE FAR * rxb,WORD rdp)

⌨️ 快捷键说明

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