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

📄 mbmaster_dlg.cpp

📁 《WinCE.NET嵌入式工业用控制器及自动控制系统设计》的源代码
💻 CPP
字号:
//---------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include  <stdio.h>
#include <stdlib.h>
#include <process.h>
#include  <string.h>
#include  <memory.h>
#include  <fcntl.h>
#include  <sys\types.h>
#include  <sys\stat.h>
#include  <share.h>
#include  <io.h>

#include "WinCONSYS.h"   // common variable define
#include "MBMaster_Dlg.h"
#include "MBTool.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
TMBMasterDlg *MBMasterDlg;
//---------------------------------------------------------------------
__fastcall TMBMasterDlg::TMBMasterDlg(TComponent* AOwner)
	: TForm(AOwner)
{
}
//---------------------------------------------------------------------
int __fastcall TMBMasterDlg::Execute(void)
{
  int i, rc;
  char buff[80];

  display_RS_Para();  // RS232 para display

  ComboBox7->Clear();
  for(i=0; i<MODBUS_MASTER_UNIT_MAX; i++)
  {
    sprintf(buff, "Unit-%d", i+1);
    ComboBox7->Items->Add(buff);
  }
  Current_Unit= 0;
  display_Unit(0);
  ExitFlag= 0;

  rc= ShowModal();        // display Form
  if(rc==mrOk)
   {
    return(0);
   }
  return(-1);
}
//---------------------------------------------------------------------
void __fastcall TMBMasterDlg::display_RS_Para(void)
{
  int idx;
  ComboBox1->ItemIndex= MB_PORT.portno -1;

  if(MB_PORT.baud==1200) idx=0;
  else if(MB_PORT.baud==2400) idx=1;
  else if(MB_PORT.baud==4800) idx=2;
  else if(MB_PORT.baud==9600) idx=3;
  else if(MB_PORT.baud==19200) idx=4;
  else if(MB_PORT.baud==38400) idx=5;
  else if(MB_PORT.baud==57600) idx=6;
  else if(MB_PORT.baud==115200) idx=7;
  else idx=0;
  ComboBox2->ItemIndex= idx;

  if(MB_PORT.parity==iPARITY_NONE) idx=0;
  else if(MB_PORT.parity==iPARITY_ODD) idx=1;
  else if(MB_PORT.parity==iPARITY_EVEN) idx=2;
  else idx=0;
  ComboBox3->ItemIndex= idx;

  if(MB_PORT.data_bit==7) idx=0;
  else if(MB_PORT.data_bit==8) idx=1;
  else idx=0;
  ComboBox4->ItemIndex= idx;

  if(MB_PORT.stop_bit==1) idx=0;
  else if(MB_PORT.stop_bit==2) idx=1;
  else idx=0;
  ComboBox5->ItemIndex= idx;

  if(MB_PORT.timeout==500) idx=0;
  else if(MB_PORT.timeout==1000) idx=1;
  else if(MB_PORT.timeout==1500) idx=2;
  else if(MB_PORT.timeout==2000) idx=3;
  else if(MB_PORT.timeout==2500) idx=4;
  else if(MB_PORT.timeout==3000) idx=5;
  else if(MB_PORT.timeout==3500) idx=6;
  else if(MB_PORT.timeout==4000) idx=7;
  else if(MB_PORT.timeout==4500) idx=8;
  else if(MB_PORT.timeout==5000) idx=9;
  else idx=0;
  ComboBox6->ItemIndex= idx;
}
//---------------------------------------------------------------------
void __fastcall TMBMasterDlg::display_Unit(int no)
{
  int idx;
  char buff[80];

  ComboBox7->ItemIndex= no;
  ComboBox8->ItemIndex= MB_UNIT[no].active;

  if(MB_UNIT[no].fun==1) idx=0;
  else if(MB_UNIT[no].fun==2) idx=1;
  else if(MB_UNIT[no].fun==3) idx=2;
  else if(MB_UNIT[no].fun==4) idx=3;
  else if(MB_UNIT[no].fun==5) idx=4;
  else if(MB_UNIT[no].fun==6) idx=5;
  else if(MB_UNIT[no].fun==15) idx=6;
  else if(MB_UNIT[no].fun==16) idx=7;
  else idx=0;
  ComboBox9->ItemIndex= idx;

  sprintf(buff, "%-d", MB_UNIT[no].station);
  MaskEdit1->Text= buff;
  sprintf(buff, "%-d", MB_UNIT[no].req_addr);
  MaskEdit2->Text= buff;
  sprintf(buff, "%-d", MB_UNIT[no].words);
  MaskEdit3->Text= buff;
  sprintf(buff, "%-d", MB_UNIT[no].save_addr);
  MaskEdit4->Text= buff;

}
//---------------------------------------------------------------------
void __fastcall TMBMasterDlg::get_RS_data(void)
{
  int idx;

  MB_PORT.portno= ComboBox1->ItemIndex +1;
  idx= ComboBox2->ItemIndex;
  if(idx==0) MB_PORT.baud= 1200;
  else if(idx==1) MB_PORT.baud= 2400;
  else if(idx==2) MB_PORT.baud= 4800;
  else if(idx==3) MB_PORT.baud= 9600;
  else if(idx==4) MB_PORT.baud= 19200;
  else if(idx==5) MB_PORT.baud= 38400;
  else if(idx==6) MB_PORT.baud= 57600;
  else if(idx==7) MB_PORT.baud= 115200;
  else MB_PORT.baud= 9600;

  idx= ComboBox3->ItemIndex;
  if(idx==0) MB_PORT.parity= iPARITY_NONE;
  else if(idx==1) MB_PORT.parity= iPARITY_ODD;
  else if(idx==2) MB_PORT.parity= iPARITY_EVEN;
  else MB_PORT.parity= iPARITY_NONE;

  idx= ComboBox4->ItemIndex;
  if(idx==0) MB_PORT.data_bit= 7;
  else if(idx==1) MB_PORT.data_bit= 8;
  else MB_PORT.data_bit= 8;

  idx= ComboBox5->ItemIndex;
  if(idx==0) MB_PORT.stop_bit= 1;
  else if(idx==1) MB_PORT.stop_bit= 2;
  else MB_PORT.stop_bit= 1;

  idx= ComboBox6->ItemIndex;
  if(idx==0) MB_PORT.timeout= 500;
  else if(idx==1) MB_PORT.timeout= 1000;
  else if(idx==2) MB_PORT.timeout= 1500;
  else if(idx==3) MB_PORT.timeout= 2000;
  else if(idx==4) MB_PORT.timeout= 2500;
  else if(idx==5) MB_PORT.timeout= 3000;
  else if(idx==6) MB_PORT.timeout= 3500;
  else if(idx==7) MB_PORT.timeout= 4000;
  else if(idx==8) MB_PORT.timeout= 4500;
  else if(idx==9) MB_PORT.timeout= 5000;
  else MB_PORT.timeout= 1000;

}
//---------------------------------------------------------------------
void __fastcall TMBMasterDlg::get_Unit_data(int no)
{
  int idx;

  MB_UNIT[no].active= ComboBox8->ItemIndex;
  idx= ComboBox9->ItemIndex;
  if(idx==0) MB_UNIT[no].fun= 1;
  else if(idx==1) MB_UNIT[no].fun= 2;
  else if(idx==2) MB_UNIT[no].fun= 3;
  else if(idx==3) MB_UNIT[no].fun= 4;
  else if(idx==4) MB_UNIT[no].fun= 5;
  else if(idx==5) MB_UNIT[no].fun= 6;
  else if(idx==6) MB_UNIT[no].fun= 15;
  else if(idx==7) MB_UNIT[no].fun= 16;
  else MB_UNIT[no].fun= 1;

  MB_UNIT[no].station= atoi(MaskEdit1->Text.c_str());
  MB_UNIT[no].req_addr= atoi(MaskEdit2->Text.c_str());
  MB_UNIT[no].words= atoi(MaskEdit3->Text.c_str());
  MB_UNIT[no].save_addr= atoi(MaskEdit4->Text.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TMBMasterDlg::ComboBox7Change(TObject *Sender)
{
// change Unit No.
   int idx;

   get_Unit_data(Current_Unit);
   idx= ComboBox7->ItemIndex;
   display_Unit(idx);
   Current_Unit= idx;
}
//---------------------------------------------------------------------
void __fastcall TMBMasterDlg::OKBtnClick(TObject *Sender)
{
// OK save File
   int no, pos, fd;

   ExitFlag=0;
   MaskEdit1Exit(Sender);
   MaskEdit2Exit(Sender);
   MaskEdit3Exit(Sender);
   MaskEdit4Exit(Sender);
   if(ExitFlag== 1) return;
   
   get_RS_data();
   no= ComboBox7->ItemIndex;
   get_Unit_data(no);

   fd= sopen(DEMO_SYS_TBL, O_RDWR | O_BINARY, SH_DENYNO);
   pos= sizeof(Reg_Def) + sizeof(Coil_Def);
   lseek(fd, pos, SEEK_SET);
   write(fd, (char *)&MB_PORT, sizeof(MB_PORT));
   write(fd, (char *)MB_UNIT, sizeof(MB_UNIT));
   close(fd);
}
//---------------------------------------------------------------------------
void __fastcall TMBMasterDlg::CancelBtnClick(TObject *Sender)
{
// cancel
   int fd, pos;
   
   fd= sopen(DEMO_SYS_TBL, O_RDWR | O_BINARY, SH_DENYNO);
   pos= sizeof(Reg_Def) + sizeof(Coil_Def);
   lseek(fd, pos, SEEK_SET);
   read(fd, (char *)&MB_PORT, sizeof(MB_PORT));
   read(fd, (char *)MB_UNIT, sizeof(MB_UNIT));
   close(fd);

}
//---------------------------------------------------------------------------
void __fastcall TMBMasterDlg::MaskEdit1Exit(TObject *Sender)
{
// check station no.
   int no;

   no= atoi(MaskEdit1->Text.c_str());
   if(no<=0 || no>247)
   {
      MessageBox(NULL, "The Modbus Address(ID No.) must be 1 - 247", WinCON8000, MB_OK);
      MaskEdit1->SetFocus();
      ExitFlag= 1;
   }
}
//---------------------------------------------------------------------------
void __fastcall TMBMasterDlg::MaskEdit2Exit(TObject *Sender)
{
// check modbus request addr.
   int no, idx;

   no= atoi(MaskEdit2->Text.c_str());
   if(no<=0 || no>65535)
   {
      MessageBox(NULL, "The Relay/Register must be 1 - 65535", WinCON8000, MB_OK);
      MaskEdit2->SetFocus();
      ExitFlag= 1;
   }
}
//---------------------------------------------------------------------------
void __fastcall TMBMasterDlg::MaskEdit3Exit(TObject *Sender)
{
// check comm. words
   int no, idx;

   idx= ComboBox9->ItemIndex;
   no= atoi(MaskEdit3->Text.c_str());
   switch(idx)
   {
     case 0:  // read output coil
     case 1:  // read input coil
     case 6:  // write output coil multi-point
       if(no<0 || no>120)
       {
         MessageBox(NULL, "The bits of Relay must be less 120 points ", WinCON8000, MB_OK);
         MaskEdit3->SetFocus();
         ExitFlag= 1;
       }
       break;
     case 2:  // read holding register
     case 3:  // read input register
     case 7:  // write holding register multi-point
       if(no<0 || no>60)
       {
         MessageBox(NULL, "The words of Register must be less 60 points ", WinCON8000, MB_OK);
         MaskEdit3->SetFocus();
         ExitFlag= 1;
       }
       break;
     case 4:  // write output coil one point
     case 5:  // write holding register one point
       if(no!=1 )
       {
         MessageBox(NULL, "The bits/words of Relay/Register must be 1 point ", WinCON8000, MB_OK);
         MaskEdit3->SetFocus();
         ExitFlag= 1;
       }
       break;
   }

}
//---------------------------------------------------------------------------
void __fastcall TMBMasterDlg::MaskEdit4Exit(TObject *Sender)
{
// check soft TAG address
   int no, idx, words;

   idx= ComboBox9->ItemIndex;
   no= atoi(MaskEdit4->Text.c_str());
   words= atoi(MaskEdit3->Text.c_str());
   switch(idx)
   {
     case 0:  // read output coil
     case 1:  // read input coil
     case 6:  // write output coil multi-point
       if(no<0 || (no+words)>(DD_MAX_BIT*2))
       {
         MessageBox(NULL, "The (address+bits) of Soft TAG must be 0 - 1023", WinCON8000, MB_OK);
         MaskEdit3->SetFocus();
         ExitFlag= 1;
       }
       break;
     case 2:  // read holding register
     case 3:  // read input register
     case 7:  // write holding register multi-point
       if(no<0 || (no+words)>(ED_MAX*4))
       {
         MessageBox(NULL, "The (address+words) of Soft TAG must be 0 - 511", WinCON8000, MB_OK);
         MaskEdit3->SetFocus();
         ExitFlag= 1;
       }
       break;
     case 4:  // write output coil one point
       if(no>=(DD_MAX_BIT*2) )
       {
         MessageBox(NULL, "The address of Soft TAG must be 0 - 1023", WinCON8000, MB_OK);
         MaskEdit3->SetFocus();
         ExitFlag= 1;
       }
       break;
     case 5:  // write holding register one point
       if(no>=(ED_MAX*4) )
       {
         MessageBox(NULL, "The address of Soft TAG must be 0 - 511", WinCON8000, MB_OK);
         MaskEdit3->SetFocus();
         ExitFlag= 1;
       }
       break;
   }
}
//---------------------------------------------------------------------------
void __fastcall TMBMasterDlg::FormClose(TObject *Sender,
      TCloseAction &Action)
{
   if(ExitFlag==1) Action=caFree;
   ExitFlag=0;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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