📄 unit1.cpp
字号:
num = ClientSocket1->Socket->ReceiveBuf(RBuf1,BufSize);
}
if (num == -1)
{
return;
}
//累计接收到数据字节数
if ((num == -1) || (num == 0)) //如果没有收到则退出
{
FStatistics.RecvByteCount = FStatistics.RecvByteCount;
}
else
{
FStatistics.RecvByteCount = FStatistics.RecvByteCount + num;
}
//显示数据
str = "";
for (i= 0 ; i<=num - 1;++i)
{
str = str + IntToHex(int(RBuf1[i]),2);
strtmp = strtmp + IntToHex(int(RBuf1[i]),2) + " ";
}
if(!str.IsEmpty())
{
timestr = TimeToStr(LastGetDataTime) + " 接收:"; //显示时间与标题
// DisplayData("");
DisplayData(timestr);
DisplayData(strtmp);
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
fputs(timestr.c_str(),LogFile); //写入时间与标题
fputs(strCmd.c_str(),LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
}//end IsEmpty
if (RBufNum + num < 2000) //如果收到的字节数不溢出,则写入接收缓冲区
{
for(i = 0 ; i<=num - 1;++i)
RBuf[RBufNum+i] = RBuf1[i];
RBufNum = RBufNum + num;
RBuf[RBufNum] = char(0);
}
else
{
RBufNum = 0;
RBuf[0] = char(0);
}
//ReceiveOk 并且 接收数据解析与校验正常
if(!str.IsEmpty())
{
FLGRecvOK=ReceiveOk();
}
if ((!str.IsEmpty())&&FLGRecvOK&& (!FIsRecvError))
{
++FStatistics.RecvCount; //累计接收正常次数
FIsRecvError = false;
IsTransmit = True;
}
//not ReceiveOk 并且 接收数据解析与校验不正常
else if ((!str.IsEmpty())&&(!FLGRecvOK) && FIsRecvError)
{
//累计接收错误次数
++FStatistics.RecvCountError;
ClearShow(); //显示清零
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
fputs(timestr.c_str(),LogFile); //写入时间与标题
fputs("接收数据校验或解析错误!!!",LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
FIsRecvError = false;
IsTransmit = True;
}
//接收数据超时
else if (TimeOut())
{
//日志记录超时时间
//时间与标题
timestr = TimeToStr(LastGetDataTime) + " 接收:";
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
fputs(timestr.c_str(),LogFile); //写入时间与标题
fputs("接收超时!!!",LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
//累计接收超时次数
++FStatistics.RecvCountTimeOut;
ClearShow(); //显示清零
DisplayData("======接收超时======");
IsTransmit = True;
}
}
}
catch(Exception &E)
{
IsTransmit = True;
}
}
//---------------------------------------------------------------------------
char __fastcall TFrmADSLmain::BCDToChar(AnsiString StrBCD ,int Count) //BCD转换函数
{
Byte tmp1,tmp2;
Byte tmp = 0;
int i;
char * CmdStr;
CmdStr = StrBCD.c_str();
if (Count*2-2>StrBCD.Length())
{
return char(0);
}
for (i=Count*2-2;i<Count*2-1;++i)
{
tmp1 = CmdStr[i]-'0';
if(i+2 > StrBCD.Length())
{
tmp2 =0;
}
else
tmp2 = CmdStr[++i]-'0';
tmp = tmp1*16+tmp2;
}
return char(tmp);
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain:: DataRefresh(char * Buf) //数据解析
{
float D[16]; //采集模拟量存储
int DS[8]; //采集数字量存储
int tmpSign;
int Index;
FILE *LogFile;
AnsiString strdata;
switch (CurrentCommand.CommandCode)
{
case 0: //返回全部数据采集
try
{
D[0] = (Byte(Buf[6])*256+Byte(Buf[7]))/100.0; //48V直流电压
DS[0] = Byte(Buf[8]); //220V交流电压数字量
}
catch (Exception & E)
{
D[0] = 0;
DS[0] = 0;
DisplayData("=====全部数据采集异常=====");
}
//----------------------------界面显示数据-----------------------------//
LMDLEDLab48V->Caption = FormatFloat("00.00",D[0]); // 48V直流电压
if(LMDLEDLab48V->Caption != "00.00")
{
if((FAuto48VSet == false)&&(SpeedButton1->Enabled == false))
{
FAuto48VSet = true; //设置自动调整电压系数标志
SB48VOrderXH();//登陆命令设置
}
}
if (DS[0]==1) //220v数字量为1
{
Shape220VXH->Brush->Color = clRed ;
Label220VXH->Caption = "有电";
}
else
{
Shape220VXH->Brush->Color = clSilver ;
Label220VXH->Caption = "无电";
}
//-------------------------数据存储------------------------------------//
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
strdata = "";
strdata = TimeToStr(Now())+"解析:";
strdata += "48V直流电压="+FormatFloat("0.00",D[0])+"V";
strdata +=" ";
strdata += "220V交流电压模拟量="+IntToStr(DS[0]);
fputs(strdata.c_str(),LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
if(FAuto48VSet) //如果需要自动调试
{
A48VCollect(); //48V电压系数查询命令
}
break;
case 3: //48V直流电压系数采集命令
try
{
DS[0] = Byte(Buf[6])*256+Byte(Buf[7]); //48V直流电压系数
D[0] = DS[0]/100.0;
}
catch (Exception & E)
{
D[0] = 0;
DS[0] = 0;
DisplayData("=====直流电压系数采集异常=====");
}
//----------------------------------界面显示数据--------------------//
LB48VShow->Caption = IntToStr(DS[0]); // 48V直流电压系数
//-------------------------数据存储------------------------------------//
if (CB_Save->Checked) // 若需要保存通讯记录
{
LogFile = fopen(FLogComFileName.c_str(),"a+");
strdata = "";
strdata = TimeToStr(Now())+"解析:";
strdata += "48V直流电压系数="+FormatFloat("0.00",D[0]);
fputs(strdata.c_str(),LogFile); //写入通讯数据
fputs("\n",LogFile);
fclose(LogFile);
}
if(FAuto48VSet) //如果需要自动调试
{
SB48VOrderXH();//登陆命令设置
}
break;
case 2:
if(Byte(Buf[6])==1)
{
DisplayData("=====电压系数设置成功=====");
if(FAuto48VSet) //如果需要自动调试
{
AllCollect(); //全部采集命令
}
}
else if(Byte(Buf[6])==0)
{
DisplayData("=====电压系数设置失败=====");
}
break;
case 4:
if(Byte(Buf[6])==1)
{
DisplayData("=====登陆命令成功=====");
SB48VPSetOrder(); //登陆成功,则开始设置电压系数命令
}
else if(Byte(Buf[6])==0) //不会调用此分支条件,登陆不成功,则不返回数据包,接收超时
{
DisplayData("=====登陆命令失败=====");
SpeedButton2->Click();//结束自动调试按钮
}
break;
case 5:
if(Byte(Buf[6])==1)
{
DisplayData("=====撤消登陆命令成功=====");
}
else if(Byte(Buf[6])==0)
{
DisplayData("=====撤消登陆命令失败=====");
}
break;
case 6:
if(Byte(Buf[6])==1)
{
DisplayData("=====硬件地址设置成功=====");
}
else if(Byte(Buf[6])==0)
{
DisplayData("=====硬件地址设置失败=====");
}
break;
} //end switch
}
//---------------------------------------------------------------------------
int __fastcall TFrmADSLmain::FindFrame(char *FrameStr, int FrameLen, char HeadChr)//寻找特征字符
{
int i;
for( i= 0 ;i<=FrameLen-1;++i)
{
if (FrameStr[i] == HeadChr)
{
return i;
}
}
return -1;
}
//---------------------------------------------------------------------------
bool __fastcall TFrmADSLmain::ReceiveOk(void) //接收确认
{
int i,Head;
char *CmdStr;
unsigned char tmp1,tmp3;
AnsiString cmd1,cmd2;
Head = FindFrame(RBuf, RBufNum, char(0x7C)); //寻找包头
if (Head == -1)
{ //未找到包头
RBufNum = 0;
RBuf[0] = char(0);
FIsRecvError = true;
DisplayData("======采集命令校验异常======");
return false;
}
else if ((RBufNum - Head ) < CurrentCommand.AnswerLen) //返回数据不完整
//如果找到头,把缓冲区前移
{
for (i = 0 ;i<= RBufNum - Head - 1;++i)
{
RBuf[i] = RBuf[i + Head];
}
RBuf[RBufNum - Head] = char(0);
RBufNum = RBufNum - Head;
FIsRecvError = true;
DisplayData("======采集命令校验异常======");
return false;
}
else //检查数据返回包的是否正常
{
//检查数据返回包的是否正常
tmp1 = Char(RBuf[Head+CurrentCommand.AnswerLen-2]);
tmp3 = Char(CheckSum(&RBuf[Head],CurrentCommand.AnswerLen-2));
cmd1 = IntToHex(RBuf[Head+4],2)+ IntToHex(RBuf[Head+5],2);
cmd2 = ArrayCMD[CurrentCommand.CommandCode];
if ((tmp1 == tmp3) && (cmd1 == cmd2))
{
try
{
DataRefresh(&RBuf[Head]);
}catch(Exception &E)
{
FIsRecvError = true;
DisplayData("=====数据解析异常======");
return false;
}
}
else
{
FIsRecvError = true;
DisplayData("======采集命令校验异常======");
return false;
}
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TFrmADSLmain::TimeOut(void)//超时处理
{
if ((double(Now()-LastGetDataTime)) > (5 / 24 / 60 /60))
{
return true;
}
else
{
return false;
}
}
//---------------------------------------------------------------------------
AnsiString __fastcall TFrmADSLmain:: ShowDetail(void) //显示统计信息
{
AnsiString strDetail =""
+ Format("累计发送命令次数 = %d",ARRAYOFCONST((FStatistics.SendCount)))+"\n"
//+ Format("累计发送数据字节 = %d",ARRAYOFCONST((FStatistics.SendByteCount)))+"\n"
+ Format("累计接收正常次数 = %d",ARRAYOFCONST((FStatistics.RecvCount)))+"\n"
//+ Format("累计接收数据字节 = %d",ARRAYOFCONST((FStatistics.RecvByteCount)))+"\n"
+ Format("累计接收超时次数 = %d",ARRAYOFCONST((FStatistics.RecvCountTimeOut)))+"\n"
+ Format("累计接收错误次数 = %d",ARRAYOFCONST((FStatistics.RecvCountError)));
if (CB_Save->Checked) // 若需要保存通讯记录
{
FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
AnsiString strdata = "****************累计信息统计********************\n";
fputs(strdata.c_str(),LogFile); //写入通讯数据
fputs(strDetail.c_str(),LogFile); //写入通讯数据
fclose(LogFile);
}
//统计信息清零
FStatistics.SendCount = 0;
FStatistics.RecvCount = 0;
FStatistics.SendByteCount = 0;
FStatistics.RecvByteCount = 0;
FStatistics.RecvCountTimeOut = 0;
FStatistics.RecvCountError = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -