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

📄 main.cpp

📁 《WinCE.NET嵌入式工业用控制器及自动控制系统设计》的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   setup_poll_unit(6);
   Timer2->Enabled= true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::OutputRegisterSoft1Click(TObject *Sender)
{
   set_menu_enabled(7);
   Label1->Caption= "Output Register Soft";
   display_listview_title(ListView1, 7);
   display_listview_fix_item(ListView1, 7);
   display_listview_data(ListView1, 7);
   setup_poll_unit(7);
   Timer2->Enabled= true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TimerTable1Click(TObject *Sender)
{
   set_menu_enabled(8);
   Label1->Caption= "Timer Table";
   display_listview_title(ListView1, 8);
   display_listview_fix_item(ListView1, 8);
   display_listview_data(ListView1, 8);
   setup_poll_unit(8);
   Timer2->Enabled= true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CounterTable1Click(TObject *Sender)
{
   set_menu_enabled(9);
   Label1->Caption= "Counter Table";
   display_listview_title(ListView1, 9);
   display_listview_fix_item(ListView1, 9);
   display_listview_data(ListView1, 9);
   setup_poll_unit(9);
   Timer2->Enabled= true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MixDisplay1Click(TObject *Sender)
{
// Mix Display
   Timer2->Enabled= false;
   MixDispDlg->Execute();
   set_menu_enabled(10);
   Label1->Caption= "Mix Display";
   display_listview_title(ListView1, 10);
   display_listview_fix_item(ListView1, 10);
   display_listview_data(ListView1, 10);
   setup_poll_unit(10);
   Timer2->Enabled= true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
// Polling TAG
   int idx, id, addr, fun, rc, words, bytes, bitno;
   int i, m, n, k;
   unsigned char  coil[256], *cptr;
   short reg[256], *iptr, *iptr_1;
   AnsiString  s;
   char buff[80];

   idx= POLL_CURR;
   if(POLL_UNIT[idx].flag==0) return;
   CURR_UNIT= POLL_UNIT[idx];
   id= CURR_UNIT.id;
   addr= CURR_UNIT.start_addr;
   words= CURR_UNIT.words;
   fun= CURR_UNIT.fun;
   if(fun==1 || fun==2)
     rc= MBTCP_R_Coils(SockNo, id, addr, words, coil, fun);
   else  // fun=3, 4
     rc= MBTCP_R_Registers(SockNo, id, addr, words, reg, fun);

   if(rc==MB_RTC_OK)
   {
     addr= addr -1;
     switch(fun)
     {
       case 1:
         cptr= Coil.DO_BARE;
         for(i=0; i<words; i++)
         {
           m= i/8;
           n= i%8;
           k= Coil_Bit_Read(&coil[m], n);
           bytes= (addr+i)/8;
           bitno= (addr+i)%8;
           if(k==0)
             Coil_Bit_Write((cptr+bytes), bitno, 0);
           else
             Coil_Bit_Write((cptr+bytes), bitno, 1);
         }
         break;
       case 2:
         cptr= Coil.DI_BARE;
         for(i=0; i<words; i++)
         {
           m= i/8;
           n= i%8;
           k= Coil_Bit_Read(&coil[m], n);
           bytes= (addr+i)/8;
           bitno= (addr+i)%8;
           if(k==0)
             Coil_Bit_Write((cptr+bytes), bitno, 0);
           else
             Coil_Bit_Write((cptr+bytes), bitno, 1);
         }
         break;
       case 3:
         iptr= (short *)Reg.AO_BARE;
         iptr_1= (short *)Reg.TM_PSET;
         for(i=0; i<words; i++)
          {
            if((addr+i)<TM_PSET_PTR)  // it is float
            {
               m= (addr+i);
              *(iptr+m)= reg[i];
            }
           else  // it is timer or counter
            {
              m= (addr+i) - TM_PSET_PTR;
              *(iptr_1+m)= reg[i];
            }
          }
         break;
       case 4:
         iptr= (short *)Reg.AI_BARE;
         for(i=0; i<words; i++)
          {
              m= (addr+i);
             *(iptr+m)= reg[i];
          }
         break;
     }
     POLL_CURR++;
     if(POLL_CURR>= POLL_TOTAL) POLL_CURR=0;
     if(POLL_CURR>= POLL_MAX_CASE) POLL_CURR=0;
     if(POLL_UNIT[POLL_CURR].flag==0) POLL_CURR=0;
     sprintf(buff, "Modbus TCP connect unit=%d", POLL_CURR);
     s= buff;
     display_status_message(s);
   }
   else
   {
     sprintf(buff, "Modbus TCP error rc=%d, unit=%d", rc, POLL_CURR);
     s= buff;
     display_status_message(s);
     POLL_CURR++;
     if(POLL_CURR>= POLL_TOTAL) POLL_CURR=0;
     if(POLL_CURR>= POLL_MAX_CASE) POLL_CURR=0;
     if(POLL_UNIT[POLL_CURR].flag==0) POLL_CURR=0;
   }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1DblClick(TObject *Sender)
{
// set data
   int i, idx, dsp, no, type, addr;

  for(i=0, idx=-1; i<ListView1->Items->Count; i++)
  {
     if(ListView1->Items->Item[i]->Selected == false) continue;
     idx= i;
     break;
  }
  if(idx == -1) return;  // no selected

  for(i=0, dsp=-1; i<12; i++)
  {
    if(DISP_FLAG[i]==1)
     { dsp= i; break; }
  }

  if(dsp==-1) return;   // no TAG display
  Timer2->Enabled= false;  // stop polling
  switch(dsp)
  {
    case 0:  // Input Coil
      DIDODlg->Execute(dsp, idx);
      break;
    case 1:  // Output Coil
      DIDODlg->Execute(dsp, idx);
      break;
    case 2:  // Input Register
      AIAODlg->Execute(dsp, idx);
      break;
    case 3:  // Holding Register
      AIAODlg->Execute(dsp, idx);
      break;
    case 4:  // Input Coil Soft
      DIDODlg->Execute(dsp, idx);
      break;
    case 5:  // Output Coil Soft
      DIDODlg->Execute(dsp, idx);
      break;
    case 6:  // Input Register Soft
      AIAODlg->Execute(dsp, idx);
      break;
    case 7:  // Output Register Soft
      AIAODlg->Execute(dsp, idx);
      break;
    case 8:  // Timer Table
      TMCNDlg->Execute(dsp, idx);
      break;
    case 9:  // Counter Table
      TMCNDlg->Execute(dsp, idx);
      break;
    case 10:  // Mix Display
      no= atoi(ListView1->Items->Item[idx]->Caption.c_str()) -1;
      type= MIX_UNIT[no].spare1;
      addr= 0;
      for(i=0; i<no; i++)
      {
         if(MIX_UNIT[i].spare1==0) continue;
         addr= addr + MIX_UNIT[i].words;
      }
      idx= idx - addr + MIX_UNIT[no].req_addr;
      if(type==1) DIDODlg->Execute(0, idx);
      else if(type==2) DIDODlg->Execute(1, idx);
      else if(type==3) AIAODlg->Execute(2, idx);
      else if(type==4) AIAODlg->Execute(3, idx);
      else if(type==5) DIDODlg->Execute(4, idx);
      else if(type==6) DIDODlg->Execute(5, idx);
      else if(type==7) AIAODlg->Execute(6, idx);
      else if(type==8) AIAODlg->Execute(7, idx);
      else if(type==9) TMCNDlg->Execute(8, idx);
      else if(type==10) TMCNDlg->Execute(9, idx);
      break;
  }
  Timer2->Enabled= true;  // start polling again
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TAGDefine1Click(TObject *Sender)
{
// TAG Define
  Form2->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ModbusMasterUnit1Click(TObject *Sender)
{
// Modbus Master Unit
  MBMasterDlg->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ParallelIOModule1Click(TObject *Sender)
{
// Parallel I/O Module define
  IOModule_Dlg->Execute();
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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