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

📄 iomodule.~cpp

📁 《Windows CE .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 "IOModule.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
TIOModule_Dlg *IOModule_Dlg;
//---------------------------------------------------------------------
__fastcall TIOModule_Dlg::TIOModule_Dlg(TComponent* AOwner)
	: TForm(AOwner)
{
}
//---------------------------------------------------------------------
int __fastcall TIOModule_Dlg::display_Slot(int idx)
{
  int i;
  char  buff[10];

  i= para[idx].mod_no;  // slot-0 module no.
  sprintf(buff, "%-d", para[idx].addr_do);
  MaskEdit1->Text= buff;
  sprintf(buff, "%-d", para[idx].addr_di);
  MaskEdit2->Text= buff;
  sprintf(buff, "%-d", para[idx].addr_ao);
  MaskEdit3->Text= buff;
  sprintf(buff, "%-d", para[idx].addr_ai);
  MaskEdit4->Text= buff;
  ComboBox2->ItemIndex= i;
  display_Module(i);

  return(0);
}
//---------------------------------------------------------------------
int __fastcall TIOModule_Dlg::check_Slot(int idx)
{
   int i, flag, mod_no, addr_1, addr_2, word_1, word_2;
   int s1, s2, rc;
   char buff[80];

//   if(para[OLD_SLOT].mod_no == 0) return(0);  // empty slot, so no check
   mod_no= ComboBox2->ItemIndex;
   switch(mod_no)
   {
      case I8017H:  // AI
        flag= 1;
        addr_1= atoi(MaskEdit4->Text.c_str());
        word_1= IO_DEF[mod_no -1].in_max;
        break;
      case I8024:   // AO
        flag= 2;
        addr_2= atoi(MaskEdit3->Text.c_str());
        word_2= IO_DEF[mod_no -1].out_max;
        break;
      case I8040:  // DI
      case I8051:
      case I8052:
      case I8053:
      case I8058:
        flag= 3;
        addr_1= atoi(MaskEdit2->Text.c_str());
        word_1= IO_DEF[mod_no -1].in_max;
        break;
      case I8041:  // DO
      case I8056:
      case I8057:
      case I8060:
      case I8064:
      case I8065:
      case I8066:
      case I8068:
      case I8069:
        flag= 4;
        addr_2= atoi(MaskEdit1->Text.c_str());
        word_2= IO_DEF[mod_no -1].out_max;
        break;
      case I8042:  // DI and DO
      case I8054:
      case I8055:
      case I8063:
        flag= 5;
        addr_1= atoi(MaskEdit2->Text.c_str());
        word_1= IO_DEF[mod_no -1].in_max;
        addr_2= atoi(MaskEdit1->Text.c_str());
        word_2= IO_DEF[mod_no -1].out_max;
        break;
   }

   for(i=0; i<SLOT_MAX_CASE; i++)
   {
     if(i == OLD_SLOT) continue;  // the same slot
     if(para[i].mod_no == 0) continue;  // empty slot
     switch(flag)
     {
        case 1: // check AI
          if(para[i].mod_no==I8017H && para[i].addr_ai!=0)
          {
             s1= para[i].addr_ai;
             s2= s1 + word_1;
             if((addr_1>=s1 && addr_1<=s2) || ((addr_1+word_1)>=s1 && (addr_1+word_1)<=s2))
             {
               sprintf(buff, "Input Register address is overlap with slot-%d", i);
               MessageBox(NULL, buff, WinCON8000, MB_OK);
               return(-1);
             }
          }
          break;
        case 2: // check AO
          if(para[i].mod_no==I8024 && para[i].addr_ao!=0)
          {
             s1= para[i].addr_ao;
             s2= s1 + word_2;
             if((addr_2>=s1 && addr_2<=s2) || ((addr_2+word_2)>=s1 && (addr_2+word_2)<=s2))
             {
               sprintf(buff, "Holding Register address is overlap with slot-%d", i);
               MessageBox(NULL, buff, WinCON8000, MB_OK);
               return(-1);
             }
          }
          break;
        case 3: // check DI
          if((para[i].mod_no==I8040 || para[i].mod_no==I8051 || para[i].mod_no==I8052 ||
              para[i].mod_no==I8053 || para[i].mod_no==I8058 || para[i].mod_no==I8042 ||
              para[i].mod_no==I8054 || para[i].mod_no==I8055 || para[i].mod_no==I8063 ) &&
              para[i].addr_di!=0)
          {
             s1= para[i].addr_di;
             s2= s1 + word_1;
             if((addr_1>=s1 && addr_1<=s2) || ((addr_1+word_1)>=s1 && (addr_1+word_1)<=s2))
             {
               sprintf(buff, "Input Coil address is overlap with slot-%d", i);
               MessageBox(NULL, buff, WinCON8000, MB_OK);
               return(-1);
             }
          }
          break;
        case 4: // check DO
          if((para[i].mod_no==I8041 || para[i].mod_no==I8056 || para[i].mod_no==I8057 ||
              para[i].mod_no==I8060 || para[i].mod_no==I8064 || para[i].mod_no==I8065 ||
              para[i].mod_no==I8066 || para[i].mod_no==I8068 || para[i].mod_no==I8069 ||
              para[i].mod_no==I8042 ||
              para[i].mod_no==I8054 || para[i].mod_no==I8055 || para[i].mod_no==I8063 ) &&
              para[i].addr_di!=0)
          {
             s1= para[i].addr_do;
             s2= s1 + word_2;
             if((addr_2>=s1 && addr_2<=s2) || ((addr_2+word_2)>=s1 && (addr_2+word_2)<=s2))
             {
               sprintf(buff, "Input Coil address is overlap with slot-%d", i);
               MessageBox(NULL, buff, WinCON8000, MB_OK);
               return(-1);
             }
          }
          break;
        case 5: // check DI and DO
          if((para[i].mod_no==I8040 || para[i].mod_no==I8051 || para[i].mod_no==I8052 ||
              para[i].mod_no==I8053 || para[i].mod_no==I8058 || para[i].mod_no==I8042 ||
              para[i].mod_no==I8054 || para[i].mod_no==I8055 || para[i].mod_no==I8063 ) &&
              para[i].addr_di!=0)
          {
             s1= para[i].addr_di;
             s2= s1 + word_1;
             if((addr_1>=s1 && addr_1<=s2) || ((addr_1+word_1)>=s1 && (addr_1+word_1)<=s2))
             {
               sprintf(buff, "Input Coil address is overlap with slot-%d", i);
               MessageBox(NULL, buff, WinCON8000, MB_OK);
               return(-1);
             }
          }

          if((para[i].mod_no==I8041 || para[i].mod_no==I8056 || para[i].mod_no==I8057 ||
              para[i].mod_no==I8060 || para[i].mod_no==I8064 || para[i].mod_no==I8065 ||
              para[i].mod_no==I8066 || para[i].mod_no==I8068 || para[i].mod_no==I8069 ||
              para[i].mod_no==I8042 ||
              para[i].mod_no==I8054 || para[i].mod_no==I8055 || para[i].mod_no==I8063 ) &&
              para[i].addr_di!=0)
          {
             s1= para[i].addr_do;
             s2= s1 + word_2;
             if((addr_2>=s1 && addr_2<=s2) || ((addr_2+word_2)>=s1 && (addr_2+word_2)<=s2))
             {
               sprintf(buff, "Input Coil address is overlap with slot-%d", i);
               MessageBox(NULL, buff, WinCON8000, MB_OK);
               return(-1);
             }
          }
          break;
     }
   }

   return(0);
}
//---------------------------------------------------------------------
int __fastcall TIOModule_Dlg::display_Module(int idx)
{
  int i;
    switch(idx)
    {
       case 0:  // empty slot
         Label3->Enabled= false;
         MaskEdit1->Enabled= false;
         Label4->Enabled= false;
         MaskEdit2->Enabled= false;
         Label5->Enabled= false;
         MaskEdit3->Enabled= false;
         Label6->Enabled= false;
         MaskEdit4->Enabled= false;
         break;
       case I8017H:  // AI
         Label3->Enabled= false;
         MaskEdit1->Enabled= false;
         Label4->Enabled= false;
         MaskEdit2->Enabled= false;
         Label5->Enabled= false;
         MaskEdit3->Enabled= false;
         Label6->Enabled= true;
         MaskEdit4->Enabled= true;
         break;
       case I8024:  // AO
         Label3->Enabled= false;
         MaskEdit1->Enabled= false;
         Label4->Enabled= false;
         MaskEdit2->Enabled= false;
         Label5->Enabled= true;
         MaskEdit3->Enabled= true;
         Label6->Enabled= false;
         MaskEdit4->Enabled= false;
         break;
       case I8040:  // DI
       case I8051:
       case I8052:
       case I8053:
       case I8058:
         Label3->Enabled= false;
         MaskEdit1->Enabled= false;
         Label4->Enabled= true;
         MaskEdit2->Enabled= true;
         Label5->Enabled= false;
         MaskEdit3->Enabled= false;
         Label6->Enabled= false;
         MaskEdit4->Enabled= false;
         break;
       case I8041:  // DO
       case I8056:
       case I8057:
       case I8060:
       case I8064:
       case I8065:
       case I8066:
       case I8068:
       case I8069:
         Label3->Enabled= true;
         MaskEdit1->Enabled= true;
         Label4->Enabled= false;
         MaskEdit2->Enabled= false;
         Label5->Enabled= false;
         MaskEdit3->Enabled= false;
         Label6->Enabled= false;
         MaskEdit4->Enabled= false;
         break;
       case I8042:  // DI and DO
       case I8054:
       case I8055:
       case I8063:
         Label3->Enabled= true;
         MaskEdit1->Enabled= true;
         Label4->Enabled= true;
         MaskEdit2->Enabled= true;
         Label5->Enabled= false;
         MaskEdit3->Enabled= false;
         Label6->Enabled= false;
         MaskEdit4->Enabled= false;
         break;
    }

  return(0);
}
//---------------------------------------------------------------------
int __fastcall TIOModule_Dlg::Execute(void)
{
  int i, rc;
  char buff[80];

  memcpy((char *)para, (char *)PARA_IO, sizeof(para));
  for(i=0; i<SLOT_MAX_CASE; i++)
  {
    sprintf(buff, "Slot-%d", i+1);
    ComboBox1->Items->Add(buff);
  }
  ComboBox1->ItemIndex=0;
  i= ComboBox1->ItemIndex;
  display_Slot(i);
  OLD_SLOT= 0;

  rc= ShowModal();        // display Form
  if(rc==mrOk)
   {
    return(0);
   }
  return(-1);
}
//---------------------------------------------------------------------
void __fastcall TIOModule_Dlg::ComboBox1Change(TObject *Sender)
{
   int idx;

   if(check_Slot(OLD_SLOT) != 0)
   {
      ComboBox1->ItemIndex= OLD_SLOT;
      ComboBox1->SetFocus();
      return;
   }
   para[OLD_SLOT].mod_no= ComboBox2->ItemIndex;
   para[OLD_SLOT].addr_do= atoi(MaskEdit1->Text.c_str());
   para[OLD_SLOT].addr_di= atoi(MaskEdit2->Text.c_str());
   para[OLD_SLOT].addr_ao= atoi(MaskEdit3->Text.c_str());
   para[OLD_SLOT].addr_ai= atoi(MaskEdit4->Text.c_str());
   idx= ComboBox1->ItemIndex;
   display_Slot(idx);
   OLD_SLOT= idx;
}
//---------------------------------------------------------------------------
void __fastcall TIOModule_Dlg::ComboBox2Change(TObject *Sender)
{
//
    int idx;

    idx= ComboBox2->ItemIndex;
    display_Module(idx);
}
//---------------------------------------------------------------------------
void __fastcall TIOModule_Dlg::MaskEdit1Exit(TObject *Sender)
{
   int addr;

   addr= atoi(MaskEdit1->Text.c_str());
   if(addr<0 || addr>DD_MAX_BIT)
   {
      MessageBox(NULL, "DO: Output Coil address must be 1 to 512", WinCON8000, MB_OK);
      MaskEdit1->SetFocus();
   }
}
//---------------------------------------------------------------------------
void __fastcall TIOModule_Dlg::MaskEdit2Exit(TObject *Sender)
{
   int addr;

   addr= atoi(MaskEdit2->Text.c_str());
   if(addr<0 || addr>DD_MAX_BIT)
   {
      MessageBox(NULL, "DI: Input Coil address must be 1 to 512", WinCON8000, MB_OK);
      MaskEdit2->SetFocus();
   }
}
//---------------------------------------------------------------------------
void __fastcall TIOModule_Dlg::MaskEdit3Exit(TObject *Sender)
{
   int addr;

   addr= atoi(MaskEdit3->Text.c_str());
   if(addr<0 || addr>ED_MAX)
   {
      MessageBox(NULL, "AO: Holding Register address must be 1 to 128", WinCON8000, MB_OK);
      MaskEdit3->SetFocus();
   }
}
//---------------------------------------------------------------------------
void __fastcall TIOModule_Dlg::MaskEdit4Exit(TObject *Sender)
{
   int addr;

   addr= atoi(MaskEdit4->Text.c_str());
   if(addr<0 || addr>ED_MAX)
   {
      MessageBox(NULL, "AI: Input Register address must be 1 to 128", WinCON8000, MB_OK);
      MaskEdit4->SetFocus();
   }
}
//---------------------------------------------------------------------------
void __fastcall TIOModule_Dlg::OKBtnClick(TObject *Sender)
{
// OK
   int i, pos, fd, mod_no;

   if(check_Slot(OLD_SLOT) != 0)  return;
   para[OLD_SLOT].mod_no= ComboBox2->ItemIndex;
   para[OLD_SLOT].addr_do= atoi(MaskEdit1->Text.c_str());
   para[OLD_SLOT].addr_di= atoi(MaskEdit2->Text.c_str());
   para[OLD_SLOT].addr_ao= atoi(MaskEdit3->Text.c_str());
   para[OLD_SLOT].addr_ai= atoi(MaskEdit4->Text.c_str());
   memcpy((char *)PARA_IO, (char *)para, sizeof(PARA_IO));
   for(i=0; i<SLOT_MAX_CASE; i++)
   {
     mod_no= PARA_IO[i].mod_no;
     if(mod_no == 0)
     {  // empty slot
       PARA_IO[i].addr_do= 0;
       PARA_IO[i].addr_di= 0;
       PARA_IO[i].addr_ao= 0;
       PARA_IO[i].addr_ai= 0;
     }
     else if(mod_no == I8017H)
     {  // AI
       PARA_IO[i].addr_do= 0;
       PARA_IO[i].addr_di= 0;
       PARA_IO[i].addr_ao= 0;
     }
     else if(mod_no == I8024)
     {  // AO
       PARA_IO[i].addr_do= 0;
       PARA_IO[i].addr_di= 0;
       PARA_IO[i].addr_ai= 0;
     }
     else if(mod_no==I8040 || mod_no==I8051 || mod_no==I8052 || mod_no==I8053
          || mod_no==I8058 )
     {  // DI
       PARA_IO[i].addr_do= 0;
       PARA_IO[i].addr_ao= 0;
       PARA_IO[i].addr_ai= 0;
     }
     else if(mod_no==I8041 || mod_no==I8056 || mod_no==I8057 || mod_no==I8060
          || mod_no==I8064 || mod_no==I8065 || mod_no==I8066 || mod_no==I8068
          || mod_no==I8069  )
     {  // DO
       PARA_IO[i].addr_di= 0;
       PARA_IO[i].addr_ao= 0;
       PARA_IO[i].addr_ai= 0;
     }
     else if(mod_no==I8042 || mod_no==I8054 || mod_no==I8055 || mod_no==I8063)
     {  // DI and DO
       PARA_IO[i].addr_ao= 0;
       PARA_IO[i].addr_ai= 0;
     }
   }
   fd= sopen(DEMO_SYS_TBL, O_RDWR | O_BINARY, SH_DENYNO);
   pos= sizeof(Reg_Def) + sizeof(Coil_Def) + sizeof(MB_PORT) + sizeof(MB_UNIT);
   lseek(fd, pos, SEEK_SET);
   write(fd, (char *)PARA_IO, sizeof(PARA_IO));
   close(fd);

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

⌨️ 快捷键说明

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