📄 processdjkqdirect.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 + -