📄 mbmaster_dlg.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 + -