📄 unit1.cpp
字号:
int i,Head;
char *CmdStr;
unsigned char tmp1,tmp2,tmp3;
AnsiString cmd1,cmd2;
if(CurrentCommand.CommandCode == 0 || CurrentCommand.CommandCode == 1)
{
Head = FindFrame(RBuf, RBufNum, char(0x7B)); //寻找包头
}
else
{ //电量
Head = FindFrame(RBuf, RBufNum, char(0x68)); //寻找包头
}
if (Head == -1)
{ //未找到包头
RBufNum = 0;
RBuf[0] = char(0);
FIsRecvError = true;
DisplayData("======采集命令校验异常1======");
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("======采集命令校验异常2======");
return false;
}
else //检查数据返回包的是否正常
{
//检查数据返回包的是否正常
tmp1 = Char(RBuf[Head+CurrentCommand.AnswerLen-2]);
tmp2 = Char(CheckSum1(&RBuf[Head],CurrentCommand.AnswerLen-2));
tmp3 = Char(CheckSum(&RBuf[Head],CurrentCommand.AnswerLen-2));
if(CurrentCommand.CommandCode == 0||CurrentCommand.CommandCode == 1)
{
cmd1 = IntToHex(RBuf[Head+4],2)+ IntToHex(RBuf[Head+5],2);
}
else if(CurrentCommand.CommandCode ==15)
{
cmd1 = ArrayCMD[CurrentCommand.CommandCode];
}
else
{
cmd1 = IntToHex(RBuf[Head+10],2)+ IntToHex(RBuf[Head+11],2);
}
cmd2 = ArrayCMD[CurrentCommand.CommandCode];
if (((tmp1 == tmp2)||(tmp1 == tmp3)) && (cmd1 == cmd2))
{
try
{
DataRefresh(&RBuf[Head]);
}catch(Exception &E)
{
FIsRecvError = true;
DisplayData("=====数据解析异常======");
return false;
}
}
else
{
FIsRecvError = true;
DisplayData("======采集命令校验异常4======");
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;
return strDetail;
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SBAddressSet(void) //地址设置命令
{
PADSLCommand CommandNode;
int Index;
try
{
for (Index = 0 ; Index<=PCommandList->Count - 1 ;++Index)
{
delete(PCommandList->Items[Index]);
}
PCommandList->Clear();
CommandNode = new TADSLCommand;
CommandNode->CommandCode =15; //命令代号
CommandNode->AnswerLen = 12; //命令返回字节数
//增加命令
PCommandList->Add(CommandNode);
IsTransmit = true;
FIsClearBuf = true;
//ShowMessage("操作命令提交!");
}
catch(Exception & E)
{
//ShowMessage("请输入整数!!!");
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::YbCommDevice1CommNotify(TObject *Sender,
int NotifyType)
{
ShowPortSetInfo(); //显示端口配置信息
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::ShowPortSetInfo(void)
{
StatusBar1->Panels->Items[1]->Text = "当前连接方式:串口"
+IntToStr(YbCommDevice1->PortNo)+"COM"
+" 波特率:"+ArrayBound[YbCommDevice1->Baud];
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::N2Click(TObject *Sender)
{
Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::N4Click(TObject *Sender)
{
SBStartTask->Click();
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::CB_SaveClick(TObject *Sender)
{
if (CB_Save->Checked) // 若需要保存通讯记录
{
FLogComFileName = FLogPath + "\\Com" +FormatDateTime("yyyymmddhhnnss",Now()) + ".txt";
FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
AnsiString strdata = "****************START LOGING********************\n";
fputs(strdata.c_str(),LogFile); //写入通讯数据
fclose(LogFile);
}
else
{
FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
AnsiString strdata = "****************END LOGING********************\n";
fputs(strdata.c_str(),LogFile); //写入通讯数据
fclose(LogFile);
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::L1Click(TObject *Sender) //打开日志文件
{
if (!FLogComFileName.IsEmpty())
{
WinExec(AnsiString("explorer "+FLogComFileName).c_str(),SW_SHOWNORMAL);
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::P2Click(TObject *Sender)
{
SBStopTask->Click();
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::CreateLogDir(void) //创建log目录
{
if(!DirectoryExists(FLogPath))
{
if(!CreateDir(FLogPath))
{
ShowMessage("创建日志log目录失败!!!");
}
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::FormClose(TObject *Sender,
TCloseAction &Action)
{
if (PortIsOpen)
{
YbCommDevice1->Free();
}
if (ClientSocket1->Active)
{
ClientSocket1->Active= false;
}
//清除命令
for (int Index = 0 ; Index<=PCommandList->Count - 1 ;++Index)
{
delete(PCommandList->Items[Index]);
}
PCommandList->Clear();
}
//---------------------------------------------------------------------------
__fastcall TFrmADSLmain::TFrmADSLmain(TComponent* Owner)
: TForm(Owner)
{
PortIsOpen = false; //初始化系统变量
IsTransmit = false;
DevAdd =StrToInt("0x"+CBAddress->Text); //获取设备号
FLogPath = ExtractFileDir(Application->ExeName); //存储目录初始化
FLogPath = FLogPath + "\\log";
CreateLogDir(); //创建日志log目录
Timer1->Interval = 800; //时钟参数初始化,默认800ms
ComboBoxTimer->ItemIndex = 4;
for (int Index = 0 ;Index<2; ++Index) //模拟量存储阀值数组初始化
{
FValve_V[Index] = 0;
}
CircleIndex = 0 ; //命令代码轮寻初始化
FIsClearBuf = false; //设置清空缓存标志
FIsRecvError = false; //接收数据解析与校验正常
//统计信息初始化
FStatistics.SendCount = 0;
FStatistics.RecvCount = 0;
FStatistics.SendByteCount = 0;
FStatistics.RecvByteCount = 0;
FStatistics.RecvCountTimeOut = 0;
FStatistics.RecvCountError = 0;
N1->Enabled = true; //系统初始化时为串口连接方式
SBPortSet->Enabled = true;
EditTCP->Enabled = false;
TCP1->Enabled = false;
PortIsOpen = true; //串口打开标志置位
ShowPortSetInfo(); //显示端口配置信息
try
{
YbCommDevice1->Active = true;
AddressBCD = ComboBox1->Text; //WBZ设备地址
AddressBCD.Delete(3,1);
AddressBCD.Delete(5,1);
AddressBCD.Delete(7,1);
AddressBCD.Delete(9,1);
AddressBCD.Delete(11,1);
}
catch(Exception &e)
{
ShowMessage("YbCommDevice1: "+e.Message);
if(!YbCommDevice1->SettingsDialog(this,true))
Application->Terminate();
}
YbCommDevice1->PackageSize = 4096; //最大可发送 4096 个字节的数据包
YbCommDevice1->PackageType = cptFrameTimeout; //用判断超时的方法接收数据包
YbCommDevice1->UsePackage = true; //启动数据包 (可以随时启动和停止, 与 Active 属性无关)
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SBAddrSETClick(TObject *Sender)
{
SBAddressSet();//设置地址
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::EditTCPChange(TObject *Sender) //TCP连接
{
try
{
ClientSocket1->Active = false;
AnsiString StrIP = EditTCP->Text.Trim();
ClientSocket1->Address = StrIP.SubString(1,StrIP.Pos(":")-1); //IP
ClientSocket1->Port = StrToInt((StrIP.SubString(StrIP.Pos(":")+1,StrIP.Length())).Trim()); //端口号
ClientSocket1->Active = true;
PortIsOpen = false;
EditTCP->Enabled = true;
TCP1->Enabled = true;
N1->Enabled = false;
SBPortSet->Enabled = false;
StatusBar1->Panels->Items[1]->Text = "当前连接方式:TCP "+StrIP;
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::ClearShow(void)
{
try
{
switch (CurrentCommand.CommandCode)
{
case 0:
Label48VXH->Caption = "00.00℃";
break;
case 1:
Shape220VXH->Brush->Color = clSilver;
Shape1->Brush->Color = clSilver;
Shape2->Brush->Color = clSilver;
Shape3->Brush->Color = clSilver;
Shape4->Brush->Color = clSilver;
Shape5->Brush->Color = clSilver;
Shape6->Brush->Color = clSilver;
Shape7->Brush->Color = clSilver;
break;
case 2:
Edit1->Text = "0000";
break;
case 3:
Edit2->Text = "0000";
break;
case 4:
Edit3->Text = "0000";
break;
case 5:
Edit4->Text = "00.00";
break;
case 6:
Edit5->Text = "00.00";
break;
case 7:
Edit6->Text = "00.00";
break;
case 8:
Edit7->Text = "00.00";
break;
case 9:
Edit8->Text = "00.00";
break;
case 10:
Edit9->Text = "00.00";
break;
case 11:
Edit10->Text = "00.00";
break;
case 12:
Edit11->Text = "00.00";
break;
case 13:
Edit12->Text = "00.00";
break;
case 14:
Edit13->Text = "00.00";
break;
}
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::ComboBox1Change(TObject *Sender)
{
AddressBCD = ComboBox1->Text; //WBZ设备地址
AddressBCD.Delete(3,1);
AddressBCD.Delete(5,1);
AddressBCD.Delete(7,1);
AddressBCD.Delete(9,1);
AddressBCD.Delete(11,1);
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::SpeedButton3Click(TObject *Sender)
{
PADSLCommand CommandNode;
int Index;
try
{
for (Index = 0 ; Index<=PCommandList->Count - 1 ;++Index)
{
delete(PCommandList->Items[Index]);
}
PCommandList->Clear();
CommandNode = new TADSLCommand;
CommandNode->CommandCode =16; //命令代号
CommandNode->AnswerLen = 12; //命令返回字节数
//增加命令
PCommandList->Add(CommandNode);
IsTransmit = true;
FIsClearBuf = true;
//ShowMessage("操作命令提交!");
}
catch(Exception & E)
{
//ShowMessage("请输入整数!!!");
}
}
//---------------------------------------------------------------------------
void __fastcall TFrmADSLmain::CBAddressChange(TObject *Sender)
{
try
{
//DevAdd =StrToInt("0x"+CBAddress->Items->Strings[CBAddress->ItemIndex]); //获取设备号
DevAdd =StrToInt("0x"+CBAddress->Text); //获取设备号
}
catch(Exception &E)
{
ShowMessage("请输入有效数据!!!");
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -