⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 iCAN主站库[windows平台DLL],用于开发iCAN系统windows平台程序[上位机程序]
💻 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 + -