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

📄 unit1.~pas

📁 delphi实现的MODBUS主站程序
💻 ~PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RzButton, ModbusM, StdCtrls, RzLstBox, ExtCtrls, ComCtrls,IniFiles,
  Buttons;

type
  TDataByte = array of byte;
  TForm1 = class(TForm)
    MBM: TModbusM;
    Timer1: TTimer;
    Panel1: TPanel;
    StatusBar1: TStatusBar;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Memo1: TMemo;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    Edit3: TEdit;
    Label3: TLabel;
    Edit4: TEdit;
    Label4: TLabel;
    Memo2: TMemo;
    procedure MBMResponseReady(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure MBMError(Sender: TObject; const ErrorMsg: String);
    procedure Timer1Timer(Sender: TObject);
    procedure ReadSlave(Code:Byte;Offset:byte;Quantity:Byte);
    procedure InitParameter;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  aa:Integer=0;
  recv:TDataByte;
  curr_length:Integer;
  slave_count:Integer;
  parameter:array [1..32] of array[1..4] of Integer;

implementation

{$R *.dfm}
procedure TForm1.InitParameter;
var
  temp:Tinifile;
  count,i:integer;
begin
  temp:=Tinifile.create('config.ini');
  count:=temp.ReadInteger('SLAVE','COUNT',0);
  slave_count:=count;
  //ListBox1.Items.Add(IntToStr(count));
  for i:=1 to count do
  begin
    parameter[i][1]:=temp.ReadInteger('STATION'+IntToStr(i),'ADDRESS',0);
    parameter[i][2]:=temp.ReadInteger('STATION'+IntToStr(i),'CODE',0);
    parameter[i][3]:=temp.ReadInteger('STATION'+IntToStr(i),'OFFSET',0);
    parameter[i][4]:=temp.ReadInteger('STATION'+IntToStr(i),'QUANTITY',0);
  end;
  temp.Free;
end;

procedure TForm1.ReadSlave(Code:Byte;Offset:byte;Quantity:Byte);
begin
  MBM.FunctionCode:=Code;
  MBM.Offset:=Offset;
  MBM.Quantity:=Quantity;
  MBM.Query;
end;

procedure TForm1.MBMResponseReady(Sender: TObject);
var
i:Integer;
hi,lo:Word;
value:array [0..128] of Word;
temp:STRING;
begin
  for i:=0 to MBM.Quantity-1 do
  begin
    hi:=MBM.ReadValues[i*2]*256;
    lo:=MBM.ReadValues[i*2+1];
    temp:=temp+IntToHex(hi+lo,4)+' ';
  end;
  Memo1.Text:=temp;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MBM.Connect;
InitParameter;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
mbm.Disconnect;
end;

procedure TForm1.MBMError(Sender: TObject; const ErrorMsg: String);
begin
Memo2.Lines.Add(ErrorMsg);
//StatusBar1.Panels.Items[0].Text:='超时时间';
aa:=0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if MBM.Busy then Panel1.Color:=clRed
else panel1.Color:=clLime;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
i:integer;
begin

if not MBM.Busy then
begin
  for i:=0 to 1000 do
  begin
  end;
  Memo1.Clear;
  MBM.SlaveId:=StrToInt(Edit4.text);
  MBM.FunctionCode:=StrToInt(Edit1.text);
  MBM.Offset:=StrToInt(Edit2.text);
  MBM.Quantity:=StrToInt(Edit3.text);
  MBM.Query;
end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
t1,t2:int64;
r1:int64;
begin
t1:=GetTickCount;//获取开始计数 WINDOWS API
sleep(1000);{do...}//执行要计时的代码
t2:=GetTickCount;//获取结束计数值
r1:=t2-t1;//取得计时时间,单位毫秒(ms)
showmessage(inttostr(r1));
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -