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

📄 zdjcform.~cpp

📁 织带机监测系统的上位机软件。RS-485总线
💻 ~CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ZDJCForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Trayicon"
#pragma link "Lcd99"
#pragma resource "*.dfm"

TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
     iBaud = 9600;

     bAddress = 0xFF;

     iTerCount = 0;

     iTryTimes = 0;

     Comm.SetWnd (this->Handle);

     bSeekStatus = false;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
     if (MessageBoxEx(this->Handle, "确认要退出本系统吗?",
                      "询问", MB_YESNO|MB_ICONQUESTION, 0) == IDYES)
         CanClose = true;
     else
         CanClose = false;
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::PopMenuExitClick(TObject *Sender)
{
     MenuExitSysClick(Sender);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::MenuExitSysClick(TObject *Sender)
{
      Close ();      
}
//---------------------------------------------------------------------------



void __fastcall TMainForm::TBExitClick(TObject *Sender)
{
     MenuExitSysClick(Sender);   
}
//---------------------------------------------------------------------------




void __fastcall TMainForm::PopMenuMinClick(TObject *Sender)
{
     PopMenuMin->Enabled = false;
     TrayIcon->Minimize ();
     PopMenuRestore->Enabled = true;
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::PopMenuRestoreClick(TObject *Sender)
{
     PopMenuRestore->Enabled = false;
     TrayIcon->Restore ();
     PopMenuMin->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrayIconRestore(TObject *Sender)
{
     PopMenuMin->Enabled = true;
     PopMenuRestore->Enabled = false;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TrayIconMinimize(TObject *Sender)
{
     PopMenuMin->Enabled = false;
     PopMenuRestore->Enabled = true;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::MenuItemComOptionClick(TObject *Sender)
{
     ComOptionDlg->ComboBoxBaud->ItemIndex =iItemIndex;
     ComOptionDlg->UpDown->Position = iPosition;
     if (ComOptionDlg->ShowModal () ==  mrOk)
     {
         switch (ComOptionDlg->ComboBoxBaud->ItemIndex)
         {
         case 0:
              iBaud = 1200;
              break;
         case 1:
              iBaud = 2400;
              break;
         case 2:
              iBaud = 4800;
              break;
         case 3:
              iBaud = 9600;
              break;
         case 4:
              iBaud = 19200;
              break;
         }
         ADOTableComOpt->Active = true;
         ADOTableComOpt->Edit();
         ADOTableComOpt->FieldValues["BaudIndex"] = ComOptionDlg->ComboBoxBaud->ItemIndex;
         ADOTableComOpt->FieldValues["Delay"] = ComOptionDlg->EditDelay->Text;
         iItemIndex = ComOptionDlg->ComboBoxBaud->ItemIndex;
         iPosition = ComOptionDlg->UpDown->Position;
         ADOTableComOpt->Post();
         ADOTableComOpt->Active = false;
     }

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



void __fastcall TMainForm::TBComOptionClick(TObject *Sender)
{
     MenuItemComOptionClick(Sender);   
}
//---------------------------------------------------------------------------


void TMainForm::ComBrowse()
{
        HANDLE hComHandle;
        AnsiString ComPort;
        TTreeNode *ComNode;
        COMMPROP ComProperties;
        //搜索当前机器上的所有串口
        for (int i=0; i<256; i++)
        {
             ComPort = "COM" + IntToStr(i);
             hComHandle = CreateFile(ComPort.c_str(),
                                     GENERIC_READ | GENERIC_WRITE,
                                     0,    // must be opened with exclusive-access
                                     NULL, // no security attributes
                                     OPEN_EXISTING, // must use OPEN_EXISTING
                                     0,    // not overlapped I/O
                                      NULL // hTemplate must be NULL for comm devices
                                    );

             //根结点增加一个COM结点
             if (hComHandle != INVALID_HANDLE_VALUE)
             {
                 GetCommProperties (hComHandle, &ComProperties);
                 if (ComProperties.dwProvSubType == PST_RS232)   //是否是标准COM口
                 {
                     ComNode = TreeView->Items->AddChild(TreeView->TopItem, ComPort);
                     ComNode->ImageIndex = 2;
                     ComNode->SelectedIndex = 2;
                 }
             }
             CloseHandle (hComHandle);
        }
        TreeView->TopItem->Expanded = true;
}
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
     ADOTableComOpt->Active = true;
     iItemIndex = ADOTableComOpt->Fields->Fields[0]->AsInteger;
     iPosition = ADOTableComOpt->Fields->Fields[1]->AsInteger;
     iPosBeg = ADOTableComOpt->Fields->Fields[2]->AsInteger;
     iPosEnd = ADOTableComOpt->Fields->Fields[3]->AsInteger;
     iPosTimes = ADOTableComOpt->Fields->Fields[4]->AsInteger;
     ADOTableComOpt->Active = false;

      switch (iItemIndex)
         {
         case 0:
              iBaud = 1200;
              break;
         case 1:
              iBaud = 2400;
              break;
         case 2:
              iBaud = 4800;
              break;
         case 3:
              iBaud = 9600;
              break;
         case 4:
              iBaud = 19200;
              break;
         }

     ComBrowse ();
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::MenuItemSeekOptionClick(TObject *Sender)
{
     SeekTermDlg->UpDownBeg->Position = iPosBeg;
     SeekTermDlg->UpDownEnd->Position = iPosEnd;
     SeekTermDlg->UpDownTimes->Position = iPosTimes;

     if (SeekTermDlg->ShowModal () == mrOk)
     {
         ADOTableComOpt->Active = true;
         ADOTableComOpt->Edit();
         ADOTableComOpt->FieldValues["SeekBegin"] = SeekTermDlg->UpDownBeg->Position;
         ADOTableComOpt->FieldValues["SeekEnd"] = SeekTermDlg->UpDownEnd->Position;
         ADOTableComOpt->FieldValues["SeekTimes"] = SeekTermDlg->UpDownTimes->Position;
         iPosBeg = SeekTermDlg->UpDownBeg->Position;
         iPosEnd = SeekTermDlg->UpDownEnd->Position;
         iPosTimes = SeekTermDlg->UpDownTimes->Position;
         ADOTableComOpt->Post();
         ADOTableComOpt->Active = false;
     }
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::TBSeekOptionClick(TObject *Sender)
{
     MenuItemSeekOptionClick (Sender);
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::TreeViewMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
     THitTests HT;
     HT = TreeView->GetHitTestInfoAt(X, Y);

     if (HT.Contains(htOnItem))
     {
         if (TreeView->Selected->Level == 1)   //如果是串口层
         {
             SelComNode = TreeView->Selected;

             iTerCount = 0;

             bSeekStatus = true;

             TimerQuery->Enabled = false;

             TimerSeek->Enabled = !TimerSeek->Enabled;

             if (TimerSeek->Enabled)
             {
                 SelComNode->DeleteChildren ();

                 if(Comm.IsOpen())     //关闭串口
                    Comm.Close();

	         if (Comm.Open(TreeView->Selected->Index+1, iBaud)) //打开串口
	         {
                     StatusBar->Panels->Items[0]->Text = SelComNode->Text + "已经打开!";
                     StatusBar->Panels->Items[3]->Text = "开始搜索" + SelComNode->Text + "上的设备!";
                     //搜索起始地址
                     bAddress = iPosBeg;
                     TimerSeek->Interval = iPosition;
	         }
                 else
                 {
                     ShowMessage ("Fail");
                 }
             }
             else
             {
                  if (Comm.IsOpen ())
                  {
                      Comm.Close ();
                      StatusBar->Panels->Items[0]->Text = SelComNode->Text + "已经关闭!";
                      StatusBar->Panels->Items[1]->Text = "";
                      StatusBar->Panels->Items[3]->Text = "停止搜索" + SelComNode->Text + "上的设备!";
                  }
             }
         }

         if (TreeView->Selected->Level == 2)   //如果是设备层
         {
             TimerSeek->Enabled = false;
             bSeekStatus = false;
             TimerQuery->Enabled = !TimerQuery->Enabled;
             if (TimerQuery->Enabled)
             {
                 if(Comm.IsOpen())     //关闭串口
                    Comm.Close();

	         if (Comm.Open(SelComNode->Index+1, iBaud)) //打开串口
	         {
                     ComStatus = COM_84;
                     bAddress = TreeView->Selected->Text.ToInt();
                     TimerQuery->Interval = iPosition;
                     StatusBar->Panels->Items[0]->Text = SelComNode->Text + "已经打开!";
                     StatusBar->Panels->Items[3]->Text = "开始与" + TreeView->Selected->Text + "号设备通信!";
                 }
             }
         }
         SelComNode->Expanded = true;
     }
}
//---------------------------------------------------------------------------

WORD TMainForm::CRC16 (Byte *auchMsg, int usDataLen)
{
     WORD wCRC = 0xFFFF;
     const WORD wFirBit = 0x0001;
     const WORD wParam = 0xA001;
     WORD wFirByte;
     WORD wVal;

     for (int i=0; i<usDataLen; i++)
     {
          wVal = *(auchMsg + i);
          wCRC = wCRC ^ wVal;
          for (int j=0; j<8; j++)
          {
               wFirByte = wCRC & wFirBit;
               wCRC = wCRC >> 1;

               if (0x0001 == wFirByte)
                   wCRC = wCRC ^ wParam;
          }
     }
     return wCRC;
}

void  TMainForm::On_Receive(TMessage& Message)
{
      Byte Buffer[35];
      WORDTYPE CRCValue;
      TTreeNode *TerNode;
      AnsiString CountString;
      AnsiString AddressString;

      int iBufLength = Comm.Read (Buffer, 35, 20);
      if (bSeekStatus)
      {
          if (iBufLength == 11)
          {
              CRCValue.w = CRC16(Buffer, 9);
              if (CRCValue.b[0] == Buffer[9] &&
                  CRCValue.b[1] == Buffer[10])  //校验码判断
              {
                  //增加结点
                  iTerCount ++;
                  bAddress ++;
                  iTryTimes = 0;
                  TerNode = TreeView->Items->AddChild(SelComNode, Buffer[0]);
                  TerNode->ImageIndex = 3;
                  TerNode->SelectedIndex = 4;
                  CountString = iTerCount;
                  StatusBar->Panels->Items[2]->Text = "已搜索到" + CountString + "个设备!";
                  SelComNode->Expanded = true;
              }
              else
              {
                  StatusBar->Panels->Items[2]->Text = "CRC校验错!";
              }
          }
      }
      else
      {
           if (iBufLength == 35)
           {
               CRCValue.w = CRC16 (Buffer, 33);
               if (CRCValue.b[0] == Buffer[33] &&
                   CRCValue.b[1] == Buffer[34])  //校验码判断
               {
                   if (Buffer[1] == 0x84)    //判断功能码
                   {
                       ReadZDClassInfo (Buffer);
                       ComStatus = COM_82;
                   }
                   //AddressString = Buffer[0];
                   //StatusBar->Panels->Items[2]->Text = "收到" + AddressString + "号设备正确应答!";
               }
               else
               {
                   StatusBar->Panels->Items[2]->Text = "CRC校验错!";
                   AnsiString Hex, Debug;
                   for (int i=0; i<iBufLength; i++)
                   {
                        Hex.printf ("%.2X ", Buffer[i]);
                        Debug += Hex;
                   }

                   Hex.printf ("%.2X ", CRCValue.b[0]);
                   Debug += Hex;
                   Hex.printf ("%.2X ", CRCValue.b[1]);
                   Debug += Hex;
                   Debug += "\n";
                   ErrorMessage (Debug.c_str());
               }
           }

           if (iBufLength == 22)
           {
               CRCValue.w = CRC16 (Buffer, 20);
               if (CRCValue.b[0] == Buffer[20] &&
                   CRCValue.b[1] == Buffer[21])  //校验码判断
               {
                   switch (Buffer[1])
                   {
                   case 0x80:
                        ReadGroupInfo (Buffer);
                        GroupBoxGroup->Enabled = true;
                        ComStatus = COM_85;
                        break;
                   case 0x82:
                        ReadTermInfo (Buffer);
                        PanelTermInfo->Enabled = true;
                        ComStatus = COM_80;
                        break;
                   }

                   AddressString = Buffer[0];
                   StatusBar->Panels->Items[2]->Text = "收到" + AddressString + "号设备正确应答!";
               }
               else
               {
                   StatusBar->Panels->Items[2]->Text = "CRC校验错!";
                   AnsiString Hex, Debug;
                   for (int i=0; i<iBufLength; i++)
                   {
                        Hex.printf ("%.2X ", Buffer[i]);
                        Debug += Hex;
                   }

                   Hex.printf ("%.2X ", CRCValue.b[0]);
                   Debug += Hex;
                   Hex.printf ("%.2X ", CRCValue.b[1]);
                   Debug += Hex;
                   Debug += "\n";
                   ErrorMessage (Debug.c_str());
               }
           }

           if (iBufLength == 11)
           {
               CRCValue.w = CRC16 (Buffer, 9);
               if (CRCValue.b[0] == Buffer[9] &&
                   CRCValue.b[1] == Buffer[10])  //校验码判断
               {
                   if (Buffer[1] == 0x85)
                   {
                        ReadTimeInfo (Buffer);
                        ComStatus = COM_84;
                        GroupBoxTime->Enabled = true;
                   }
                   AddressString = Buffer[0];
                   StatusBar->Panels->Items[2]->Text = "收到" + AddressString + "号设备正确应答!";
               }
               else
               {
                   StatusBar->Panels->Items[2]->Text = "CRC校验错!";
                   AnsiString Hex, Debug;
                   for (int i=0; i<iBufLength; i++)
                   {
                        Hex.printf ("%.2X ", Buffer[i]);

⌨️ 快捷键说明

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