📄 sc1801.cpp
字号:
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 + -