📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,icandll, StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
ComboBox_Devtype: TComboBox;
Label2: TLabel;
ComboBox_DevInd: TComboBox;
Label3: TLabel;
ComboBox_CANInd: TComboBox;
Label4: TLabel;
ComboBox_Baud: TComboBox;
Label5: TLabel;
ComboBox_MasterID: TComboBox;
Label6: TLabel;
Edit_MasterCycle: TEdit;
Label7: TLabel;
Button_Start: TButton;
GroupBox2: TGroupBox;
Label8: TLabel;
ComboBox_Disslave: TComboBox;
Button_Connect: TButton;
GroupBox3: TGroupBox;
Label9: TLabel;
ComboBox_ConSlave: TComboBox;
Label10: TLabel;
ComboBox_Datatype: TComboBox;
Button_SendData: TButton;
Button_Disconnect: TButton;
Label11: TLabel;
Edit_Data: TEdit;
Timer1: TTimer;
ListView_Data: TListView;
procedure FormCreate(Sender: TObject);
procedure Button_StartClick(Sender: TObject);
procedure Button_ConnectClick(Sender: TObject);
procedure Button_SendDataClick(Sender: TObject);
procedure Button_DisconnectClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure OnDestory(Sender: TObject);
private
{ Private declarations }
public
m_cfg : ROUTECFG;
m_hRoute : DWORD;
m_baud: array[0..2] of WORD;
published
procedure Selcanbaud();
procedure SetBtnStatus();
procedure DelAllFromList(Sender: TObject);
procedure SetMaster(oldmaster:Integer;newmaster:Integer;Sender: TObject);
procedure AddConnectedItem(hslave:Integer);
procedure AddItemToCombo(box:TComboBox;slaveid:Integer);
procedure DelItemFromCombo(box:TCombobox;slaveid:Integer);
procedure AddItemToList(hslave:Integer);
procedure GetByteArr(box:TEdit;buf:PBYTE;len:PInteger);
procedure DisconnectItem(ind:Integer);
function DataToStr(buf:array of byte;len:Integer):AnsiString;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.DataToStr(buf:array of byte;len:Integer):AnsiString;
var
str:AnsiString;
i:Integer;
begin
For i := 0 To len - 1 do
begin
str := str + IntToHex(buf[i],2) + ' ';
end;
DataToStr := str;
end;
procedure TForm1.Selcanbaud();
var
i:Integer;
begin
For i := 0 To 2 do
begin
If m_baud[i] = m_cfg.wCANBaud Then
begin
ComboBox_Baud.ItemIndex:=i;
Break;
end;
end;
end;
procedure TForm1.DelAllFromList(Sender: TObject);
var
wMasterID:WORD;
i:Integer;
begin
ListView_Data.Clear();
ComboBox_DisSlave.Clear();
ComboBox_ConSlave.Clear();
wMasterID := m_cfg.wMasterID;
For i := 0 To wMasterID - 1 do
ComboBox_DisSlave.Items.Add(IntToStr(i));
For i := wMasterID + 1 To $FF - 1 do
ComboBox_DisSlave.Items.Add(IntToStr(i));
ComboBox_DisSlave.ItemIndex := 0;
end;
procedure TForm1.SetBtnStatus();
begin
Button_Connect.Enabled := (Mgr_IsStarted()=1);
Button_Disconnect.Enabled := (Mgr_IsStarted()=1);
Button_SendData.Enabled := (Mgr_IsStarted()=1);
end;
procedure TForm1.AddConnectedItem(hslave:Integer);
begin
AddItemToCombo(ComboBox_ConSlave, Slave_GetID(hslave));
AddItemToList (hslave);
end;
procedure TForm1.AddItemToCombo(box:TComboBox;slaveid:Integer);
var
sz:Integer;
i:Integer;
begin
sz := box.Items.Count;
for i := 0 To sz - 1 do
begin
If StrToInt(box.Items.Strings[i]) > slaveid Then
begin
box.Items.Insert(i,IntToStr(slaveid));
Exit;
end
Else If StrToInt(box.Items.Strings[i]) = slaveid Then
Exit;
end;
box.Items.Insert(sz,IntToStr(slaveid));
end;
procedure TForm1.DelItemFromCombo(box:TCombobox;slaveid:Integer);
var
str1:AnsiString;
icount:Integer;
i:Integer;
begin
str1 := inttostr(slaveid);
icount := box.Items.Count;
For i := 0 To icount - 1 do
begin
If box.Items.Strings[i] = str1 Then
box.Items.Delete(i);
end;
If (box.ItemIndex = -1) And (box.Items.count > 0) Then
box.ItemIndex := 0;
end;
procedure TForm1.AddItemToList(hslave:Integer);
var
str1:AnsiString;
itemx:TListItem;
iolen:array[0..3] of Integer;
begin
str1 := IntToStr(Slave_GetID(hslave));
itemx:=ListView_Data.Items.Add;
itemx.Caption:=str1;
itemx.Data:=Pointer(hslave);
itemx.SubItems.Add('设备信息');
itemx.SubItems.Add('00:00:00');
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:=Pointer(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:=Pointer(hslave);
itemx.Caption:=str1;
itemx.SubItems.Add('AI');
itemx.SubItems.Add('00:00:00');
itemx.SubItems.Add(' ');
end;
procedure TForm1.DisconnectItem(ind:Integer);
var
hslave2,hslave:Integer;
j,sz:integer;
begin
hslave := Integer(ListView_Data.Items[ind].Data);
Slave_Disconnect (hslave);
DelItemFromCombo(ComboBox_ConSlave, Slave_GetID(hslave));
AddItemToCombo(ComboBox_DisSlave, Slave_GetID(hslave));
sz := ListView_Data.Items.Count;
For j := sz-1 downto 0 do
begin
hslave2 := Integer(ListView_Data.Items[j].Data);
If hslave2 = hslave Then
ListView_Data.Items.Delete(j);
end;
end;
procedure TForm1.GetByteArr(box:TEdit;buf:PBYTE;len:PInteger);
var
textbuf:AnsiString;
strdata:AnsiString;
ptmp:PBYTE;
i:Integer;
begin
textbuf:=box.Text;
If Length(textbuf) > (len^ * 3) Then
Exit;
len^ := Length(textbuf) div 3;
If len^ = 0 Then
Exit;
ptmp:=buf;
for i:=0 to len^-1 do
begin
strdata:=Copy(textbuf,3*i+1,2);
strdata:=Trim(strdata);
ptmp^:=StrToInt('0x'+strdata);
Inc(ptmp);
end;
end;
procedure TForm1.SetMaster(oldmaster:Integer;newmaster:Integer;Sender: TObject);
var
i:Integer;
ifind:Integer;
begin
ifind:=ComboBox_DisSlave.Items.IndexOf(IntToStr(newmaster));
if ifind<>-1 then
ComboBox_DisSlave.Items.Delete(ifind);
If oldmaster = newmaster Then
Exit;
For i := 0 To ComboBox_DisSlave.Items.Count-2 do
begin
If StrToInt(ComboBox_DisSlave.Items.Strings[i+1]) = oldmaster Then
Exit
Else If StrToInt(ComboBox_DisSlave.Items.Strings[i]) > oldmaster Then
begin
ifind:=i;
Break;
end
Else If StrToInt(ComboBox_DisSlave.Items.Strings[i+1]) > oldmaster Then
begin
ifind := i + 1;
Break;
end;
end;
ComboBox_disslave.Items.Insert(ifind,IntToStr(oldmaster));
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
m_cfg.iCardType := 5;
m_cfg.iCardInd := 0;
m_cfg.iCANInd := 0;
m_cfg.iMasterCycle := 100;
m_cfg.wCANBaud := $1C;
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]:=$1c;
m_baud[1]:=$041c;
m_baud[2]:=$311c;
ComboBox_Baud.Items.Add('500K');
ComboBox_Baud.Items.Add('100K');
ComboBox_Baud.Items.Add('10K');
Selcanbaud();
for i := 0 to 254 do
ComboBox_MasterID.Items.Add(IntToStr(i));
ComboBox_MasterID.ItemIndex := m_cfg.wMasterID;
Edit_MasterCycle.Text := IntToStr(m_cfg.iMasterCycle);
For i := 0 To 254 do
ComboBox_Disslave.Items.Add(IntToStr(i));
ComboBox_Disslave.ItemIndex := 0;
Mgr_AddRoute(@m_cfg, @m_hRoute);
SetBtnStatus();
end;
procedure TForm1.Button_StartClick(Sender: TObject);
var
oldmasterid:Integer;
newmasterid:Integer;
icycle:Integer;
cfg:ROUTECFG;
srcport:Integer;
canetport:Integer;
canetip: array[0..3] of BYTE;
begin
If Mgr_IsStarted() = 1 Then
begin
Timer1.Enabled := FALSE;
Mgr_StopSys();
DelAllFromList(Sender);
end
Else
begin
newmasterid := ComboBox_MasterID.ItemIndex;
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);
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 div MASTER_CYCLEUNIT);
cfg.wMasterID := newmasterid;
Route_SetConfig (m_hRoute, @cfg);
//当设备型号为CANET时,需要设置以下参数
If m_cfg.iCardType=VCI_CANETE then
begin
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,1,@srcport,4,0,0);
Route_IOCtl(m_hRoute,2,@canetip[0],4,0,0);
Route_IOCtl(m_hRoute,3,@canetport,4,0,0);
end;
If Mgr_StartSys() <> ICANOK Then
begin
ShowMessage('启动失败');
SetBtnStatus();
Exit;
end;
SetMaster(oldmasterid, newmasterid,Sender);
SetBtnStatus();
Timer1.Interval := m_cfg.iMasterCycle;
Timer1.Enabled := TRUE;
end;
If Mgr_IsStarted() = 1 Then
Button_Start.Caption:='停止'
Else
Button_Start.Caption := '启动';
SetBtnStatus
end;
procedure TForm1.Button_ConnectClick(Sender: TObject);
var
isel:Integer;
slaveid:Integer;
hslave:Integer;
ret:Integer;
begin
isel := ComboBox_DisSlave.ItemIndex;
slaveid := StrToInt(ComboBox_DisSlave.Items.Strings[isel]);
ret := Route_AddSlave(m_hRoute, slaveid, @hslave);
If (ret = ICANOK) or (ret = ICANERR_ITEMEXIST) then
begin
Route_GetSlavebyID(m_hRoute, slaveid, @hslave);
If Slave_Connect(hslave) = ICANOK Then
begin
ComboBox_DisSlave.Items.Delete(isel);
AddConnectedItem (hslave);
end
Else
ShowMessage('连接从站失败');
end
Else
ShowMessage('添加从站失败');
end;
procedure TForm1.Button_SendDataClick(Sender: TObject);
var
ind:Integer;
id:Integer;
hslave:Integer;
addrarr:array[0..1] of byte;
buf:array[0..31] of byte;
len:Integer;
begin
ind := ComboBox_ConSlave.ItemIndex;
If ind =-1 Then
begin
ShowMessage('请选择从站');
Exit;
end;
id := StrToInt(ComboBox_ConSlave.Items.Strings[ind]);
Route_GetSlavebyID(m_hRoute, id, @hslave);
addrarr[0] := $20;
addrarr[1] := $60;
len := 32;
GetByteArr(Edit_Data,@buf[0],@len);
If len = 0 Then
begin
showmessage('请输入发送数据');
Exit;
end;
If Slave_SendData(hslave, addrarr[ComboBox_Datatype.ItemIndex], @buf[0], len) <> ICANOK Then
showmessage('发送数据失败');
end;
procedure TForm1.Button_DisconnectClick(Sender: TObject);
var
ind:Integer;
hslave:Integer;
hslave2:Integer;
sz,j:Integer;
begin
ind := ComboBox_ConSlave.ItemIndex;
If ind = -1 Then
Exit;
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));
sz := ListView_Data.Items.Count;
For j := sz-1 downto 0 do
begin
hslave2 := Integer(ListView_Data.Items.Item[j].Data);
If hslave2 = hslave Then
ListView_Data.Items.Delete(j);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i,sz,len,hslave:Integer;
buf:array[0..31] of byte;
DateTime : TDateTime;
strtm:AnsiString;
begin
sz := ListView_Data.Items.Count;
len := 32;
DateTime := Time; // store the current date and time
strtm := TimeToStr(DateTime); // convert the time into a string
For i := 0 To sz-1 do
begin
hslave := Integer(ListView_Data.Items.Item[i].Data);
len := 32;
If (i Mod 3) = 0 Then
begin
If Slave_IsConnected(hslave) = 0 Then
begin
DisconnectItem (i);
Exit;
end;
end
Else If (i Mod 3) = 2 Then
begin
Slave_GetAIData(hslave, @buf[0],@len);
If len > 0 Then
begin
ListView_Data.Items.Item[i].SubItems[1] := strtm;
ListView_Data.Items.Item[i].SubItems[2] := DataToStr(buf, len);
end;
end
Else If (i Mod 3) = 1 Then
begin
Slave_GetDIData(hslave, @buf[0], @len);
If len > 0 Then
begin
ListView_Data.Items.Item[i].SubItems[1] := strtm;
ListView_Data.Items.Item[i].SubItems[2] := DataToStr(buf, len);
end;
end;
end;
end;
procedure TForm1.OnDestory(Sender: TObject);
begin
If Mgr_IsStarted() = 1 Then
Button_StartClick(Sender);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -