⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 电池容量分选和管理实现上位机与下位机的通讯
💻 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 + -