📄 iomodule.~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 + -