📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ChartIDblClick(TObject *Sender)
{//电流曲线最大化
ChartType=2;
MaxMin=!MaxMin;
RefreshChart();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ChartVDblClick(TObject *Sender)
{//电压曲线最大化
ChartType=1;
MaxMin=!MaxMin;
RefreshChart();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ChartCDblClick(TObject *Sender)
{//容量曲线最大化
ChartType=3;
MaxMin=!MaxMin;
RefreshChart();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Image2DblClick(TObject *Sender)
{//容量曲线最大化
ChartType=3;
MaxMin=true;
ChartC->Visible=true;
ChartC->Width=frmMain->Width;ChartV->Height=frmMain->Height-100;
ChartV->Visible=false;
ChartI->Visible=false;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::RefreshChart()
{//刷新曲线数据
AnsiString strT;
if(MaxMin)
{
switch(ChartType)
{
case 1:
ChartV->Width=frmMain->Width;ChartV->Height=frmMain->Height-100;
ChartI->Visible=false;
ChartC->Visible=false;
break;
case 2:
ChartI->Width=frmMain->Width;ChartI->Height=frmMain->Height-100;
ChartV->Visible=false;
ChartC->Visible=false;
break;
case 3:
ChartC->Width=frmMain->Width;ChartC->Height=frmMain->Height-100;
ChartV->Visible=false;
ChartI->Visible=false;
break;
}
}
else
{ ChartV->Width=frmMain->Width/2;ChartV->Height=frmMain->Height/2-30;
ChartI->Width=frmMain->Width/2;ChartI->Height=frmMain->Height/2-30;
ChartC->Visible=false;
ChartV->Visible=true;
ChartI->Visible=true;
}
strT=IntToStr(cmbBlock->ItemIndex+1)+ "-" +IntToStr(cmbPoint->ItemIndex+1);
//iTimeType=1;
//ChartType=1;
ChartV->BottomAxis->Title->Caption="时间/Hour:Minute";
ChartI->BottomAxis->Title->Caption="时间/Hour:Minute";
ChartC->BottomAxis->Title->Caption="时间/Hour:Minute";
ChartV->Title->Text->Clear();
ChartV->Title->Text->Add(strT+"号电池电压曲线");
ChartI->Title->Text->Clear();
ChartI->Title->Text->Add(strT+"号电池电流曲线");
ChartC->Title->Text->Clear();
ChartC->Title->Text->Add(strT+"号电池容量曲线");
}
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{//初始化
int i;
for(i=1;i<=32;i++)
cmbBlock->Items->Add(String(i));
cmbBlock->ItemIndex=0;
for(i=1;i<=8;i++)
cmbPoint->Items->Add(String(i));
cmbPoint->ItemIndex=0;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TfrmMain::CalTime(double t)
{//计算时间
int h,m;
h=t/60;
m=t-h*60;
return String(h)+ ":" + String(m);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ReadData(int BatNum)
{//读电池数据
int i,j,z,DataU,DataI;
double p=0;
FILE *fp;
int handle;
AnsiString strTime;
int MaxU,MaxI,MinI;
MaxU=5.5;MaxI=1500;MinI=-1500;
z=0;
Series1->Clear();Series3->Clear();Series4->Clear();Series5->Clear();Series6->Clear();
FastLineSeries1->Clear();FastLineSeries2->Clear();
if((handle=sopen(strFilePath.c_str(),O_BINARY | O_RDONLY ,SH_DENYNO))!=-1)
{ if(eof(handle)!=1)read(handle,&j,sizeof(j));//站号
while(eof(handle)!=1)
{
for(int i=0;i<=255;i++)
{
read(handle,&DataU,sizeof(DataU));
read(handle,&DataI,sizeof(DataI));
strTime=CalTime(p);
if(i==BatNum)//SelFocBat-1)
{
Series1->AddXY(p,DataU*0.0001,strTime,clRed);
Series3->AddXY(p,z,strTime,clWhite ); //0
Series4->AddXY(p,MaxU,strTime,clWhite);
FastLineSeries1->AddXY(p,DataI*0.1,strTime,clRed);
FastLineSeries2->AddXY(p,z,strTime,clWhite );
Series5->AddXY(p,MaxI,strTime,clWhite);
Series6->AddXY(p,MinI,strTime,clWhite);
p++;
}
}
}
}
close(handle);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ReadC(int BatNum)//读电池容量
{//显示电池容量(每182个字节为一组)
double p=0;
FILE *fp;
int handle;
AnsiString strTime,FilePath;
int StartPos,DataC;
short TempC;
char* szA = new char[StrLen(strFilePath.c_str())];
int ChargeC;
*szA = 0;
FilePath=strFilePath;
StrLCat(szA, FilePath.c_str(), StrLen(FilePath.c_str())-8);
StrCat(szA, "c.bin");
FilePath=szA;
delete [] szA;
BarSeries1->Clear();
Series2->Clear();
if(!FileExists(FilePath.c_str())){fp=fopen(FilePath.c_str(),"rb"); fclose(fp);}
if((handle=sopen(FilePath.c_str(),O_BINARY | O_RDONLY ,SH_DENYNO))!=-1)
for(int i=0;i<=255;i++)
{ read(handle,&StartPos,sizeof(StartPos));
for(int j=0;j<=43;j++)
{ read(handle,&DataC,sizeof(DataC));
if(BatNum==i)//显示焦点电池数据
{ if(DataC>0)//充电值累加
{
ChargeC=DataC;//ChargeC+DataC;
}
else if(DataC<0)//放电
{ BarSeries1->AddXY(p,ChargeC*0.1,IntToStr((int)p+1),clRed);
Series2->AddXY(p,abs(DataC*0.1),IntToStr((int)p+1),clGreen);
ChargeC=0;
p++;
}
else if (DataC==0 && ChargeC>0 && j<40)//最后一次充电
{ BarSeries1->AddXY(p,ChargeC*0.1,IntToStr((int)p+1),clRed);
ChargeC=0;
goto ErrEnd;
}
}
ErrEnd:
}
read(handle,&TempC,sizeof(TempC));
}
close(handle);
}
//---------------------------------------------------------------------------
bool __fastcall TfrmMain::InStr(AnsiString str1,AnsiString str2)
{//判断是否包含指定字符串
char *ptr;
ptr=strstr(str1.c_str(),str2.c_str());
if(ptr!=NULL)
return true;
else
return false;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ToolButton1Click(TObject *Sender)
{//打开电池数据文件
AnsiString strT;
OpenFile->InitialDir=GetCurrentDir();
OpenFile->Filter = "电池数据文件(*.bin)|*.bin";
OpenFile->Title = "打开电池数据文件";
if(OpenFile->Execute())
{ strFilePath=OpenFile->FileName;
if(!InStr(strFilePath,".bin"))strFilePath=strFilePath+".bin";
strFilePath=OpenFile->FileName;
}
strT="锂电分容系统数据分析器1.0";
strT=strT + "("+ strFilePath + ")";
frmMain->Caption =strT;
RefreshChart();
Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::Refresh()
{//刷新
int Bat;
Bat= cmbBlock->ItemIndex*8+cmbPoint->ItemIndex;
RefreshChart();
ReadData(Bat);
ReadC(Bat);
}
void __fastcall TfrmMain::ToolButton2Click(TObject *Sender)
{//前一节
cmbPoint->ItemIndex--;
if (cmbPoint->ItemIndex<0) cmbPoint->ItemIndex=0;
Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ToolButton3Click(TObject *Sender)
{//后一节
cmbPoint->ItemIndex++;
if (cmbPoint->ItemIndex>7) cmbPoint->ItemIndex=7;
Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::ToolButton4Click(TObject *Sender)
{//退出
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::cmbBlockClick(TObject *Sender)
{//模块选择
Refresh();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::cmbPointClick(TObject *Sender)
{//电池点选择
Refresh();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -