📄 main.cpp
字号:
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 + -