📄 zfsc1801.cpp
字号:
evercd.data[0]=evercd.Status;
if (
((lpStaP+lpChP->StaNo)->Soe[0].ORDER!=yxord)||
((lpStaP+lpChP->StaNo)->Soe[0].TIME!=evercd.Hour)||
((lpStaP+lpChP->StaNo)->Soe[0].MINUTE!=evercd.Min)||
((lpStaP+lpChP->StaNo)->Soe[0].SECOND!=evercd.Sec)||
((lpStaP+lpChP->StaNo)->Soe[0].MSH!=evercd.Ms/100)||
((lpStaP+lpChP->StaNo)->Soe[0].MSL!=evercd.Ms%100)||
((lpStaP+lpChP->StaNo)->Soe[0].STATUS!=evercd.Status)
)
{
(lpStaP+lpChP->StaNo)->Soe[0].ORDER=yxord;
(lpStaP+lpChP->StaNo)->Soe[0].TIME=evercd.Hour;
(lpStaP+lpChP->StaNo)->Soe[0].MINUTE=evercd.Min;
(lpStaP+lpChP->StaNo)->Soe[0].SECOND=evercd.Sec;
(lpStaP+lpChP->StaNo)->Soe[0].MSH=evercd.Ms/100;
(lpStaP+lpChP->StaNo)->Soe[0].MSL=evercd.Ms%100;
(lpStaP+lpChP->StaNo)->Soe[0].STATUS=evercd.Status;
WriteAEvent(EVENTDB, &evercd);
}
}
ret=12;
}
else ret=6;
}
else ret=6;
return ret;
}
//-----------------------------------------------------------------------------
WORD iTime(WORD wrp)
{
struct date Date;
struct time Time;
BYTE bchdata[6]={0x71, 0x7a, 2, 1, 0, 0};
BYTE FAR *txb = lpChP->SendBuff;
bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
bchdata[5] = CDT_BCH(bchdata);
for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
getdate (&Date);
gettime (&Time);
bchdata[0]=0xee;
bchdata[1]=50;
bchdata[2]=0;
bchdata[3]=Time.ti_sec;
bchdata[4]=Time.ti_min;
bchdata[5] = CDT_BCH(bchdata);
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
bchdata[0]=0xef;
bchdata[1]=Time.ti_hour;
bchdata[2]=Date.da_day;
bchdata[3]=Date.da_mon;
bchdata[4]=Date.da_year%256;
bchdata[5] = CDT_BCH(bchdata);
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
return wrp;
}
WORD msYk(WORD wrp)
{
BYTE bchdata[6]={0x71, 0x61, 3, 1, 0, 0};
BYTE FAR *txb = lpChP->SendBuff;
BYTE yktype = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0];
if (yktype==DCMDYK0) bchdata[1] = 0x61;
else if (yktype==DCMDYK1) bchdata[1] = 0xc2;
else bchdata[1] = 0xb3;
bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
bchdata[5] = CDT_BCH(bchdata);
for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
if (yktype==DCMDYK0)
{
bchdata[0] = 0xe0;
bchdata[1]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
}
else if (yktype==DCMDYK1) { bchdata[0] = 0xe2; bchdata[1] = 0xaa; }
else { bchdata[0] = 0xe3; bchdata[1] = 0x55; }
bchdata[2]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
bchdata[3]=bchdata[1];
bchdata[4]=bchdata[2];
bchdata[5] = CDT_BCH(bchdata);
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
//tzc
for (i=0; i<6; i++) lpChP->yktemp[i]=bchdata[i];
//tzc
return wrp;
}
WORD msSj(WORD wrp)
{
BYTE bchdata[6]={0x71, 0xf4, 3, 1, 0, 0};
BYTE FAR *txb = lpChP->SendBuff;
BYTE sjtype = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0];
if (sjtype==DCMDSJ0) bchdata[1] = 0xf4;
else if (sjtype==DCMDSJ1) bchdata[1] = 0x85;
else bchdata[1] = 0x26;
bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
bchdata[5] = CDT_BCH(bchdata);
for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
if (sjtype==DCMDSJ0)
{
bchdata[0] = 0xe4;
bchdata[1]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[5];
}
else if (sjtype==DCMDSJ1) { bchdata[0] = 0xe6; bchdata[1] = 0xaa; }
else { bchdata[0] = 0xe7; bchdata[1] = 0x55; }
bchdata[2]=lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[3];
bchdata[3]=bchdata[1];
bchdata[4]=bchdata[2];
bchdata[5] = CDT_BCH(bchdata);
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
for (i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
//tzc
for (i=0; i<6; i++) lpChP->yktemp[i]=bchdata[i];
//tzc
return wrp;
}
WORD msGb(WORD wrp)
{
BYTE bchdata[6]={0x21, 0x9e, 0, 1, 0xff, 0};
BYTE FAR *txb = lpChP->SendBuff;
// bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
bchdata[5] = CDT_BCH(bchdata);
for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
return wrp;
}
WORD msFg(WORD wrp)
{
BYTE bchdata[6]={0x31, 0x3d, 0, 1, 0, 0};
BYTE FAR *txb = lpChP->SendBuff;
bchdata[4] = lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[1];
bchdata[5] = CDT_BCH(bchdata);
for (int i=0; i<6; i++) *(txb+(wrp+i)%txbuflen) = bchdata[i];
wrp = (wrp+6)%txbuflen;
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)
{
Flag *FLAG=(Flag *)(lpChP->Reserved+80);
lpStaP->RTUSTATUS=*(rxb+(rdp+4)%rxbuflen);
FLAG->Retry=0;
FLAG->RANDOM1=*(rxb+(rdp+1)%rxbuflen)&0x3f;
return (Len+4);
}
//转发配置
WORD ZfProcRRC(BYTE FAR *txb,WORD wrp)
{
Flag *FLAG=(Flag *)(lpChP->Reserved+80);
FLAG->RANDOM2=0;
*(txb+wrp)=lpStaP->STATIONNO;
*(txb+(wrp+1)%txbuflen)=RRC|0x40;
*(txb+(wrp+2)%txbuflen)=0;
*(txb+(wrp+3)%txbuflen)=18;
*(txb+(wrp+4)%txbuflen)=0;
BYTE YcNum=GetRcdNum(YCDB,lpChP->StaNo);
BYTE KwhNum=GetRcdNum(KWHDB,lpChP->StaNo);
BYTE YxNum=GetRcdNum(YXDB,lpChP->StaNo);
YxNum=(YxNum+23)/24;
KwhNum=(KwhNum+7)/8;
YcNum=(YcNum+11)/12;
// lpStaP->YXB[0]=0;
// lpStaP->YCB[0]=YxNum;
// lpStaP->KWHB[0]=YxNum+KwhNum;
YxNum=lpStaP->KWHB[0]-lpStaP->YXB[0];
KwhNum=lpStaP->YCB[0]-lpStaP->KWHB[0];
YcNum=16-lpStaP->KWHB[0];
int i;
for (i=0;i<YxNum;i++)
{
*(txb+(wrp+5+i)%txbuflen)=0x11;
}
for (i=0;i<KwhNum;i++)
{
*(txb+(wrp+5+i+YxNum)%txbuflen)=0x3b;
}
for (i=0;i<YcNum;i++)
{
*(txb+(wrp+5+i+KwhNum+YxNum)%txbuflen)=0x32;
}
*(txb+(wrp+21)%txbuflen)=CallLPC(txb,wrp,22,txbuflen);
wrp+=23;
return wrp;
}
//转发全数据
WORD ZfProcDRF(BYTE FAR *txb,WORD wrp)
{
BYTE LEN,len,i;
*(txb+wrp)=lpStaP->STATIONNO;
*(txb+(wrp+1)%txbuflen)=DRF|0x40;
*(txb+(wrp+2)%txbuflen)=0;
len=GetRcdNum(YXDB,lpChP->StaNo);
len=(len+5)/6;
for (i=0;i<len;i++)
{
BYTE yxv,YXV=0;
for (int j=0;j<6;j++)
{
yxv=GetValue(YXDB,lpChP->StaNo,i*6+j);
YXV<<=1;
if (yxv&1) YXV |=1;
}
YXV |=0x80;
*(txb+(wrp+5+i)%txbuflen)=YXV;
}
LEN=GetRcdNum(YCDB,lpChP->StaNo)&0xff;
*(txb+(wrp+4)%txbuflen)=0;
for (i=0;i<LEN;i++)
{
WORD YcValue=GetValue(YCDB,lpChP->StaNo,i)&0xfff;
if (YcValue&0x8000)
{
YcValue &=0x7ff;
int ycvalue= YcValue*(-1);
YcValue=ycvalue;
YcValue&=0x7ff;
}
else YcValue |=0x800;
YcValue=YcValue&0xfff|0x4000;
*(txb+(wrp+5+i*2+len)%txbuflen)=HIBYTE (YcValue);
*(txb+(wrp+6+i*2+len)%txbuflen)=LOBYTE (YcValue);
}
*(txb+(wrp+2)%txbuflen)=HIBYTE (LEN*2+len+2);
*(txb+(wrp+3)%txbuflen)=LOBYTE (LEN*2+len+2);
*(txb+(wrp+LEN*2+len+5)%txbuflen)=0;
*(txb+(wrp+LEN*2+len+6)%txbuflen)=CallLPC(txb,wrp,LEN*2+len+5,txbuflen);
wrp+=LEN*2+len+7;
return wrp;
}
//转发异常变化数据
//暂时不包括YX
WORD ZfProcXRF(BYTE FAR *txb,WORD wrp)
{
Flag *FLAG=(Flag *)(lpChP->Reserved+80);
BYTE Item,LEN,i,temp,LPC;
WORD YcValue,YcNum,YxNum;
Item=(FLAG->RANDOM2++)%6;
YcNum=GetRcdNum(YCDB,lpChP->StaNo);
*(txb+(wrp+4)%txbuflen)=0;
DWORD yxa = GetAttr(YXDB,0,0);
// if (yxa&YXCHANGE)
// *(txb+(wrp+4)%txbuflen)=0x1c;
*(txb+wrp)=lpStaP->STATIONNO;
*(txb+(wrp+1)%txbuflen)=XRF|0x40;
*(txb+(wrp+2)%txbuflen)=0;
// *(txb+(wrp+3)%txbuflen)=12*3+1;
for (i=0;i<12;i++)
{
if (Item*12+i>YcNum) break;
YcValue=GetValue(YCDB,lpChP->StaNo,Item*12+i);
if (YcValue&0x8000)
{
YcValue &=0x7ff;
int ycvalue= YcValue*(-1);
YcValue=ycvalue;
YcValue &=0x7ff;
}
else YcValue |=0x800;
YcValue=YcValue&0xfff|0x4000;
temp=(Item+lpStaP->YCB[0])*16;
temp+=i&0xf;
*(txb+(wrp+5+i*3)%txbuflen)=temp;
*(txb+(wrp+6+i*3)%txbuflen)=HIBYTE (YcValue);
*(txb+(wrp+7+i*3)%txbuflen)=LOBYTE (YcValue);
}
*(txb+(wrp+3)%txbuflen)=i*3+1;
*(txb+(wrp+5+i*3)%txbuflen)=CallLPC(txb,wrp,5+i*3,txbuflen);
wrp+=i*3+6;
return wrp;
}
//无效命令回答
WORD ZfProcNAK(BYTE Command,BYTE FAR *txb,WORD wrp)
{
*(txb+wrp)=lpStaP->STATIONNO;
*(txb+(wrp+1)%txbuflen)=NAK|0x40;
*(txb+(wrp+2)%txbuflen)=0;
*(txb+(wrp+3)%txbuflen)=3;
*(txb+(wrp+4)%txbuflen)=0;
*(txb+(wrp+5)%txbuflen)=Command;
*(txb+(wrp+6)%txbuflen)=0xff;
*(txb+(wrp+7)%txbuflen)=CallLPC(txb,wrp,7,txbuflen);
wrp+=8;
return wrp;
}
//转发电度
WORD ZfProcPAR(BYTE FAR *txb,WORD wrp)
{
WORD KwhNum,i,Value;
KwhNum=GetRcdNum(KWHDB,lpChP->StaNo);
*(txb+wrp)=lpStaP->STATIONNO;
*(txb+(wrp+1)%txbuflen)=PAR|0x40;
*(txb+(wrp+2)%txbuflen)=HIBYTE(KwhNum*2+1);
*(txb+(wrp+3)%txbuflen)=LOBYTE(KwhNum*2+1);
*(txb+(wrp+4)%txbuflen)=0;
for (i=0;i<KwhNum;i++)
{
Value=GetValue(KWHDB,lpChP->StaNo,i);
*(txb+(wrp+5+i*2)%txbuflen)=HIBYTE (Value);
*(txb+(wrp+6+i*2)%txbuflen)=LOBYTE (Value);
}
*(txb+(wrp+5+KwhNum*2)%txbuflen)=CallLPC(txb,wrp,5+KwhNum*2,txbuflen);
wrp+=KwhNum*2+6;
return wrp;
}
WORD ZfProcSOE(BYTE FAR *txb,WORD wrp)
{
*(txb+(wrp+0)%txbuflen)=lpStaP->STATIONNO;
*(txb+(wrp+1)%txbuflen)=SOE|0x40;
return wrp;
}
DWORD calsec(struct date Date,struct time Time)
{
DWORD total=0,temp=0;
DWORD year,month,day,hour,min,sec,i;
DWORD Days;
year=Date.da_year;
month=Date.da_mon;
day=Date.da_day;
hour=Time.ti_hour;
min=Time.ti_min;
sec=Time.ti_sec;
if (year<2000)
{
for (i=1997;i<year;i++)
{
Days=DayPeYear(i);
temp+=(DWORD)Days*(DWORD)86400;
}
for (i=1;i<month;i++)
{
Days=DayPeMonth(year,i);
temp+=(DWORD)Days*(DWORD)86400;
}
temp+=(DWORD)(day-1)*(DWORD)86400;
temp+=(DWORD)hour*(DWORD)3600;
temp+=(DWORD)min*(DWORD)60;
temp+=sec;
total=94608000-temp;
//total=946684800-temp;
return total;
}
else
{
if (year!=2000)
for (i=2000;i<year;i++)
{
Days=DayPeYear(i);
temp+=Days*86400;
}
if (month!=1)
for (i=1;i<month;i++)
{
Days=DayPeMonth(year,i);
temp+=Days*86400;
}
temp+=(DWORD)(day-1)*(DWORD)86400;
temp+=(DWORD)hour*(DWORD)3600;
temp+=(DWORD)min*(DWORD)60;
temp+=sec;
total=temp;
return total;
}
}
DWORD DayPeYear(DWORD year)
{
if (year%4!=0 || (year%4==0 && year%100==0)) return 365;
if (year%4==0) return 366;
}
DWORD DayPeMonth(DWORD year,DWORD month)
{
if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
return 31;
if (month==4 || month==6 || month==9 || month==11)
return 30;
if (month==2 && (year%4!=0 || (year%4==0 && year%100==0))) return 28;
if (year%4==0 && month==2) return 29;
}
Group Current(DWORD seconds)
{
DWORD month=1,day,hour,min,sec,flag;
Group total;
DWORD Ddays,Secs,i,j,year;
struct date D;
getdate (&D);
if (D.da_year<2000)
{
seconds=94608000-seconds;
//seconds=946686800-seconds;
Ddays=seconds/86400;
Secs=seconds%86400;
hour=Secs/3600;
min=(Secs%3600)/60;
sec=Secs%60;
year=1997+Ddays/365;
Ddays=Ddays%365;
for (j=1;j<13;j++)
{
if ((Ddays<DayPeMonth(year,j)))
{
day=Ddays+1;
break;
}
else
{
Ddays-=DayPeMonth(year,j);
}
month=j+1;
}
if (day==0) day=1;
total.year=year;
total.month=month;
total.day=day;
total.hour=hour;
total.min=min;
total.sec=sec;
return total;
}
else
{
Ddays=seconds/86400;
Secs=seconds%86400;
hour=Secs/3600;
min=(Secs%3600)/60;
sec=Secs%60;
for (year=2000;year<3000;year++)
{
if (Ddays>DayPeYear(year))
{
Ddays-=DayPeYear(year);
}
else break;
}
//Ddays=Ddays%365;
for (j=1;j<13;j++)
{
if ((Ddays<DayPeMonth(year,j)))
{
day=Ddays+1;
break;
}
else
{
Ddays-=DayPeMonth(year,j);
}
month=j+1;
}
if (day==0) day=1;
total.year=year;
total.month=month;
total.day=day;
total.hour=hour;
total.min=min;
total.sec=sec;
return total;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -