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

📄 unit1.~cpp

📁 网吧电量采集、温湿度采集串口通信实例程序
💻 ~CPP
📖 第 1 页 / 共 4 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "YbCommDevice"
#pragma resource "*.dfm"
TFrmADSLmain *FrmADSLmain;

//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::SBPortSetClick(TObject *Sender)    //打开端口配置界面
{
  YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::N1Click(TObject *Sender)         //打开端口配置界面
{
  YbCommDevice1->SettingsDialog(this,true);
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::ComboBoxTimerChange(TObject *Sender)   //设置系统采集时钟
{
 Timer1->Interval = StrToInt(ComboBoxTimer->Items->Strings[ComboBoxTimer->ItemIndex]);
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::E1Click(TObject *Sender)  //关闭主程序界面
{
 FrmADSLmain->Close();
}
//---------------------------------------------------------------------------



void __fastcall TFrmADSLmain::N5Click(TObject *Sender)  //打开版本号界面
{
  FormVersion->Show();        
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::ComboBoxCOMChange(TObject *Sender)
{
  if (ComboBoxCOM->ItemIndex == 0)
  {   //串口连接


    N1->Enabled = true;
    SBPortSet->Enabled = true;
    EditTCP->Enabled = false;
    TCP1->Enabled = false;
    PortIsOpen = true;
   ShowPortSetInfo();         //显示端口配置信息

  }
  else
  {     //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()); //端口号

    //ShowMessage(ClientSocket1->Address+ClientSocket1->Port);
    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::DisplayData(AnsiString strDisplay)
{
  Memo1->Lines->Add(strDisplay);
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::SBStartTaskClick(TObject *Sender)     //开始采集命令
{

  DisplayData("");
  DisplayData("|++++++开始采集参数++++++|");
  SBStartTask->Enabled = false;
  SBStopTask->Enabled = true;
  Timer1->Enabled = true;      //开始时钟
  IsTransmit = true;
  EditTCP->Enabled = false; 
  if (CB_Save->Checked)     //  若需要保存通讯记录
   {
      FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");
      AnsiString strdata = "****************开始采集参数********************\n";
      fputs(strdata.c_str(),LogFile);   //写入通讯数据
      fclose(LogFile);
   }
}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::SBStopTaskClick(TObject *Sender)
{
  DisplayData("");
  DisplayData("|++++++停止采集参数++++++|");
  SBStartTask->Enabled = true;
  SBStopTask->Enabled = false;
  Timer1->Enabled = false;     //停止时钟
  IsTransmit = false;
  FIsClearBuf = true;
  ShowMessage(ShowDetail());
  EditTCP->Enabled = true; 
  if (CB_Save->Checked)     //  若需要保存通讯记录
   {
      FILE *LogFile = fopen(FLogComFileName.c_str(),"a+");

      AnsiString strdata = "\n****************停止采集参数********************\n";
      fputs(strdata.c_str(),LogFile);   //写入通讯数据
      fclose(LogFile);
   }

}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::BuildCommand(void)
{
 PADSLCommand CommandNode;

 switch (CircleIndex)
 {
   case  0:                                 //全部采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 0;   //命令代号
          CommandNode->AnswerLen   = 94;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          ++CircleIndex;
          break;
   case  1:                                 //数字量采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 1;   //命令代号
          CommandNode->AnswerLen   = 10;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
   case  2:                                 //A相电压采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 2;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
   case  3:                                 //B相电压采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 3;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
   case  4:                                 //C相电压采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 4;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
   case  5:                                 //A相电流采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 5;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
    case  6:                                 //B相电流采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 6;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  7:                                 //C相电流采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 7;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  8:                                 //A相功率采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 8;   //命令代号
          CommandNode->AnswerLen   = 17;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  9:                                 //B相功率采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 9;   //命令代号
          CommandNode->AnswerLen   = 17;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  10:                                 //C相功率采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 10;   //命令代号
          CommandNode->AnswerLen   = 17;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  11:                                 //A相功率因数采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 11;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  12:                                 //B相功率因数采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 12;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  13:                                 //C相功率因数采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 13;   //命令代号
          CommandNode->AnswerLen   = 16;  //命令返回字节数
          PCommandList->Add(CommandNode);
          ++CircleIndex;
          break;
     case  14:                                 //电度采集命令
          CommandNode = new TADSLCommand;
          CommandNode->CommandCode = 14;   //命令代号
          CommandNode->AnswerLen   = 18;  //命令返回字节数
          PCommandList->Add(CommandNode);
          CircleIndex = 0;
          break;

   default:
          CircleIndex = 0;
          break;

 }

}
//---------------------------------------------------------------------------

void __fastcall TFrmADSLmain::BuildCmd(void)     //建立命令列表
{
  int Index;
  PADSLCommand tmpCmd;

  if (PCommandList->Count == 0)
  {
    BuildCommand();
  }
  tmpCmd = (struct TADSLCommand *)PCommandList->Items[0];
  CurrentCommand = * tmpCmd;
  PCommandList->Delete(0);
  delete tmpCmd;
  CmdNum = MakeCommand();
  strCmd ="";
  for (Index =0 ; Index<=CmdNum -1 ;++Index)
  {
     strCmd = strCmd +IntToHex(Byte(WBuf[Index]),2);
  }
   SendCmd();
}
//---------------------------------------------------------------------------

char __fastcall TFrmADSLmain::CheckSum(char *P ,int PCount)     //数据校验
{
  int Index;
  Byte Crc;
  Crc =0;
  for (Index = 3 ; Index <= PCount -1 ;++Index)
  {
    Crc =Crc + Byte(P[Index]);
  }

  return Char(Crc);
}



//---------------------------------------------------------------------------

char __fastcall TFrmADSLmain::CheckSum2(char *P ,int PCount)     //数据校验
{
  int Index;
  Byte Crc;
  Crc =0;
  for (Index = 1 ; Index <= PCount -1 ;++Index)
  {
    Crc =Crc + Byte(P[Index]);
  }

  return Char(Crc);
}



//---------------------------------------------------------------------------

unsigned char __fastcall TFrmADSLmain::CheckSum1(unsigned char *P ,int PCount)     //数据校验1
{
  int Index;
  Byte Crc;
  Crc =0;
  AnsiString tmp = "";
  for (Index = 0 ; Index <= PCount -1 ;++Index)
  {
    Crc =Crc +  Byte(P[Index]);
    tmp = tmp + IntToHex( P[Index],2);
  }
  //ShowMessage(tmp);
  return Char(Crc);
}
//---------------------------------------------------------------------------
 int  __fastcall TFrmADSLmain::MakeCommand(void)     //具体命令建立
{
  int ADD1,ADD2;

  WBuf[0] = char(0x7B);           //包头

  //设备地址
  ADD1  = DevAdd & 0x0F;       //低四位
  ADD2 = (DevAdd >> 4);       //高四位

  WBuf[1] = char(0x30+ADD2);     //设备地址高四位
  WBuf[2] = char(0x30+ADD1);      //设备地址低四位

  switch(CurrentCommand.CommandCode)
  {
    case 0 :  //全部采集命令:特征码:0302
    /*     序号	1	2	3	4	5	6
        字节数	1	2	1       2	1	1
         格式	7BH	ADDR	02H	0302H	CRC	0DH
    */

      WBuf[3] = char(0x02);              //数据长度
      WBuf[4] = char(0x03);              //命令代码
      WBuf[5] = char(0x06);
      WBuf[6] = CheckSum(WBuf,6);       //校验
      WBuf[7] = char(0x0D);              //包尾

      return 8;

   case 1 :  //数字量采集命令:特征码:0303
    /*   序号	  1	2	3	4      	5	6       7
         字节数	  1	2	1	2      	2	1       1
          格式	 7CH	ADDR	04H	0303H	X	CRC     0DH
          X系数  电压系数(高位在前,低位在后)
    */

      WBuf[3] = char(0x02);              //数据长度
      WBuf[4] = char(0x03);              //命令代码
      WBuf[5] = char(0x03);
      WBuf[6] = CheckSum(WBuf,6);       //校验
      WBuf[7] = char(0x0D);              //包尾

      return 8;


    case 2 :  //A相电压采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    44E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x44);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);              //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;


    case 3 :  //B相电压采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    45E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x45);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;


   case 4 :  //C相电压采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    46E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x46);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;


    case 5 :  //A相电流采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    54E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //
      WBuf[5] = BCDToChar(AddressBCD,4);           //地址
      WBuf[6] = BCDToChar(AddressBCD,5);           //
      WBuf[7] = BCDToChar(AddressBCD,6);           //
      WBuf[8] = char(0x68);
      WBuf[9] = char(0x01);
      WBuf[10] = char(0x02);
      WBuf[11] = char(0x54);
      WBuf[12] = char(0xE9);

      WBuf[13] = CheckSum2(WBuf,13);       //校验
      WBuf[14] = char(0x16);              //包尾

      return 15;


   case 6 :  //B相电流采集命令:

    /*     序号	1	2	3	4	5	6     7       8
         字节数	1	6	1       1	1	2      1      1
          格式	68H	ADDR	68H	01H	02H    55E9H    CRC    16H
    */
      WBuf[0] = char(0xFE);           //前导符
      WBuf[1] = char(0x68);           //包头
      WBuf[2] = BCDToChar(AddressBCD,1);           //地址
      WBuf[3] = BCDToChar(AddressBCD,2);           //
      WBuf[4] = BCDToChar(AddressBCD,3);           //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -