📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "icandllheader.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
ROUTECFG m_cfg;
HANDLE m_hRoute;
DWORD m_baud[2];
void __fastcall TForm1::Selcanbaud()
{
for(int i = 0;i<3;i++)
{
if(m_baud[i] == m_cfg.wCANBaud)
{
ComboBox_Baud->ItemIndex=i;
break;
}
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
m_cfg.iCardType = 5;
m_cfg.iCardInd = 0;
m_cfg.iCANInd = 0;
m_cfg.iMasterCycle = 100;
m_cfg.wCANBaud = 0x1C;
m_cfg.wMasterID = 0;
ComboBox_Devtype->ItemIndex = m_cfg.iCardType - 1;
ComboBox_DevInd->ItemIndex = m_cfg.iCardInd;
ComboBox_CANInd->ItemIndex = m_cfg.iCANInd;
ComboBox_Datatype->ItemIndex=0;
m_baud[0]=0x1c;
m_baud[1]=0x041c;
m_baud[2]=0x311c;
ComboBox_Baud->Items->Add("500K");
ComboBox_Baud->Items->Add("100K");
ComboBox_Baud->Items->Add("10K");
Selcanbaud();
for(int i=0;i<255;i++)
{
ComboBox_MasterID->Items->Add(IntToStr(i));
}
ComboBox_MasterID->ItemIndex=m_cfg.wMasterID;
Edit_MasterCycle->Text = IntToStr(m_cfg.iMasterCycle);
for(int i=0;i<255;i++)
{
ComboBox_Disslave->Items->Add(IntToStr(i));
}
ComboBox_Disslave->ItemIndex=0;
Mgr_AddRoute(m_cfg, &m_hRoute);
SetBtnStatus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetBtnStatus()
{
Button_Connect->Enabled = (Mgr_IsStarted()==1);
Button_Disconnect->Enabled = (Mgr_IsStarted()==1);
Button_SendData->Enabled = (Mgr_IsStarted()==1);
}
void __fastcall TForm1::Button_StartClick(TObject *Sender)
{
ROUTECFG cfg;
if(Mgr_IsStarted() == 1)
{
Timer1->Enabled = FALSE;
Mgr_StopSys();
DelAllFromList(Sender);
}
else
{
int newmasterid = ComboBox_MasterID->ItemIndex;
int icycle = StrToInt(Edit_MasterCycle->Text);
m_cfg.wMasterID = newmasterid;
m_cfg.iMasterCycle = icycle;
m_cfg.iCardType=ComboBox_Devtype->ItemIndex+1;
Route_GetConfig(m_hRoute, &cfg);
int oldmasterid = cfg.wMasterID;
cfg.iCardType = m_cfg.iCardType;
cfg.iCardInd = m_cfg.iCardInd;
cfg.iCANInd = m_cfg.iCANInd;
cfg.wCANBaud = m_cfg.wCANBaud;
cfg.iMasterCycle = (icycle/MASTER_CYCLEUNIT);
cfg.wMasterID = newmasterid;
Route_SetConfig (m_hRoute, cfg);
//当设备型号为CANET时,需要设置以下参数
if(m_cfg.iCardType==VCI_CANETE)
{
DWORD srcport,canetport;
BYTE canetip[4];
srcport=4001;//本地端口,可根据实际情况修改,现假设为4001
canetport=4001;//CANET工作端口,可根据实际情况修改,现假设为4001
canetip[3]=192;//CANET的IP地址,可根据实际情况修改,现假设为192.168.0.178
canetip[2]=168;
canetip[1]=0;
canetip[0]=178;
Route_IOCtl(m_hRoute,IOCTL_ROUTE_SETSRCPORT,(BYTE*)&srcport,4,0,0);
Route_IOCtl(m_hRoute,IOCTL_ROUTE_SETDESIP,(BYTE*)canetip,4,0,0);
Route_IOCtl(m_hRoute,IOCTL_ROUTE_SETDESPORT,(BYTE*)&canetport,4,0,0);
}
if(Mgr_StartSys()!=ICANOK)
{
ShowMessage("启动失败");
SetBtnStatus();
return;
}
SetMaster(oldmasterid, newmasterid,Sender);
SetBtnStatus();
Timer1->Interval = m_cfg.iMasterCycle;
Timer1->Enabled = TRUE;
}
if(Mgr_IsStarted()==1)
Button_Start->Caption="停止";
else
Button_Start->Caption="启动";
SetBtnStatus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DelAllFromList(TObject* Sender)
{
ListView_Data->Clear();
ComboBox_Disslave->Clear();
ComboBox_ConSlave->Clear();
WORD wMasterID = m_cfg.wMasterID;
for(int i= 0;i<wMasterID;i++)
{
ComboBox_Disslave->Items->Add(IntToStr(i));
}
for(int i= wMasterID + 1;i<0xFF;i++)
{
ComboBox_Disslave->Items->Add(IntToStr(i));
}
ComboBox_Disslave->ItemIndex = 0;
}
void __fastcall TForm1::SetMaster(int oldmaster,int newmaster,TObject* Sender)
{
int ifind=ComboBox_Disslave->Items->IndexOf(IntToStr(newmaster));
if(ifind!=-1)
ComboBox_Disslave->Items->Delete(ifind);
if(oldmaster == newmaster)
return;
for(int i = 0;i<ComboBox_Disslave->Items->Count-1;i++)
{
if(StrToInt(ComboBox_Disslave->Items->Strings[i+1])==oldmaster)
return;
else if(StrToInt(ComboBox_Disslave->Items->Strings[i]) > oldmaster)
{
ifind=i;
break;
}
else if(StrToInt(ComboBox_Disslave->Items->Strings[i+1]) > oldmaster)
{
ifind = i + 1;
break;
}
}
ComboBox_Disslave->Items->Insert(ifind,IntToStr(oldmaster));
}
void __fastcall TForm1::Button_ConnectClick(TObject *Sender)
{
int isel = ComboBox_Disslave->ItemIndex;
int slaveid = StrToInt(ComboBox_Disslave->Items->Strings[isel]);
HANDLE hslave;
int ret = Route_AddSlave(m_hRoute, slaveid, &hslave);
if((ret == ICANOK)||(ret == ICANERR_ITEMEXIST))
{
Route_GetSlavebyID(m_hRoute, slaveid, &hslave);
if(Slave_Connect(hslave)==ICANOK)
{
ComboBox_Disslave->Items->Delete(isel);
AddConnectedItem(hslave);
}
else
ShowMessage("连接从站失败");
}
else
ShowMessage("添加从站失败");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AddConnectedItem(HANDLE hslave)
{
AddItemToCombo(ComboBox_ConSlave, Slave_GetID(hslave));
AddItemToList (hslave);
}
void __fastcall TForm1::AddItemToCombo(TComboBox* box, int slaveid)
{
int sz = box->Items->Count;
for(int i = 0;i<sz;i++)
{
if(StrToInt(box->Items->Strings[i]) > slaveid)
{
box->Items->Insert(i,IntToStr(slaveid));
return;
}
else if(StrToInt(box->Items->Strings[i]) == slaveid)
return;
}
box->Items->Insert(sz,IntToStr(slaveid));
}
void __fastcall TForm1::AddItemToList(HANDLE hslave)
{
AnsiString str1 = IntToStr(Slave_GetID(hslave));
TListItem* itemx= ListView_Data->Items->Add();
itemx->Caption=str1;
itemx->Data=hslave;
itemx->SubItems->Add("设备信息");
itemx->SubItems->Add("00:00:00");
DWORD iolen[4];
Slave_GetIODataLen(hslave, &iolen[0], &iolen[1], &iolen[2], &iolen[3]);
str1 = "DI=" + IntToStr(iolen[0]) + " DO=" + IntToStr(iolen[1]) + " AI=" + IntToStr(iolen[2]) + " AO=" + IntToStr(iolen[3]);
itemx->SubItems->Add(str1);
str1 = IntToStr(Slave_GetID(hslave));
itemx=ListView_Data->Items->Add();
itemx->Data=hslave;
itemx->Caption=str1;
itemx->SubItems->Add("DI");
itemx->SubItems->Add("00:00:00");
itemx->SubItems->Add(" ");
str1 = IntToStr(Slave_GetID(hslave));
itemx=ListView_Data->Items->Add();
itemx->Data=hslave;
itemx->Caption=str1;
itemx->SubItems->Add("AI");
itemx->SubItems->Add("00:00:00");
itemx->SubItems->Add(" ");
}
void __fastcall TForm1::Button_SendDataClick(TObject *Sender)
{
int ind = ComboBox_ConSlave->ItemIndex;
if(ind ==-1)
{
ShowMessage("请选择从站");
return;
}
HANDLE hslave;
int id = StrToInt(ComboBox_ConSlave->Items->Strings[ind]);
Route_GetSlavebyID(m_hRoute, id, &hslave);
int addrarr[2];
addrarr[0] = 0x20;
addrarr[1] = 0x60;
int len = 32;
byte buf[32];
GetByteArr(Edit_Data,buf,&len);
if(len == 0)
{
ShowMessage("请输入发送数据");
return;
}
if(Slave_SendData(hslave, addrarr[ComboBox_Datatype->ItemIndex], buf,len) != ICANOK)
ShowMessage("发送数据失败");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GetByteArr(TEdit* box, byte* buf, int* len)
{
AnsiString textbuf=box->Text;
if(textbuf.Length() >(*len)*3)
return;
*len = textbuf.Length()/3;
if(*len==0)
return;
byte* ptmp=buf;
AnsiString strdata;
for(int i=0;i<*len;i++)
{
strdata=textbuf.SubString(3*i,2);
strdata=strdata.Trim();
*ptmp=StrToInt("0x"+strdata);
ptmp++;
}
}
void __fastcall TForm1::Button_DisconnectClick(TObject *Sender)
{
int ind = ComboBox_ConSlave->ItemIndex;
if(ind == -1)
return;
HANDLE hslave;
Route_GetSlavebyID(m_hRoute, StrToInt(ComboBox_ConSlave->Items->Strings[ind]),&hslave);
Slave_Disconnect(hslave);
DelItemFromCombo(ComboBox_ConSlave, Slave_GetID(hslave));
AddItemToCombo(ComboBox_Disslave,Slave_GetID(hslave));
int sz = ListView_Data->Items->Count;
HANDLE hslave2;
for(int j=sz-1;j>=0;j--)
{
hslave2 = ListView_Data->Items->Item[j]->Data;
if(hslave2 == hslave)
ListView_Data->Items->Delete(j);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DelItemFromCombo(TComboBox* box, int slaveid)
{
AnsiString str1;
str1 = IntToStr(slaveid);
int icount = box->Items->Count;
for(int i = 0;i<icount;i++)
{
if(box->Items->Strings[i] == str1)
box->Items->Delete(i);
}
if((box->ItemIndex == -1) && (box->Items->Count > 0))
box->ItemIndex = 0;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int sz = ListView_Data->Items->Count;
DWORD len = 32;
byte buf[32];
TDateTime DateTime = Time(); // store the current date and time
AnsiString strtm = TimeToStr(DateTime); // convert the time into a string
HANDLE hslave;
for(int i = 0;i<sz;i++)
{
hslave = ListView_Data->Items->Item[i]->Data;
len = 32;
if((i%3)==0)
{
if(Slave_IsConnected(hslave) == 0)
{
DisconnectItem(i);
return;
}
}
else if((i%3) == 2)
{
Slave_GetAIData(hslave, buf,&len);
if(len > 0)
{
ListView_Data->Items->Item[i]->SubItems->Insert(1,strtm);
ListView_Data->Items->Item[i]->SubItems->Insert(2,DataToStr(buf, len));
}
}
else if((i%3) == 1)
{
Slave_GetDIData(hslave, buf, &len);
if(len > 0)
{
ListView_Data->Items->Item[i]->SubItems->Insert(1,strtm);
ListView_Data->Items->Item[i]->SubItems->Insert(2,DataToStr(buf, len));
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DisconnectItem(int ind)
{
HANDLE hslave;
hslave = ListView_Data->Items->Item[ind]->Data;
Slave_Disconnect(hslave);
DelItemFromCombo(ComboBox_ConSlave, Slave_GetID(hslave));
AddItemToCombo(ComboBox_Disslave, Slave_GetID(hslave));
int sz = ListView_Data->Items->Count;
HANDLE hslave2;
for(int j = sz-1;j>=0;j--)
{
hslave2 = ListView_Data->Items->Item[j]->Data;
if(hslave2 == hslave)
ListView_Data->Items->Delete(j);
}
}
AnsiString __fastcall TForm1::DataToStr(byte* buf, int len)
{
AnsiString str;
for(int i = 0;i<len;i++)
{
str = str + IntToHex(buf[i],2) + " ";
}
return str;
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if(Mgr_IsStarted() == 1)
Button_StartClick(Sender);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -