1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
{ $Id: frm_Main.pas,v 1.1 2011/08/25 10:04:33 plpolak Exp $ }
unit frm_Main;
interface
uses
SysUtils, Types, Classes, Variants, FMX.Types, FMX.Controls, FMX.Forms,
FMX.Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
ModbusTypes,
IdModBusClient, FMX.Edit, UITypes, FMX.StdCtrls, FMX.Layouts, FMX.Memo;
type
TfrmMain = class(TForm)
mctPLC: TIdModBusClient;
Label1: TLabel;
edtIPAddress: TEdit;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Label2: TLabel;
Label3: TLabel;
edtReadReg: TEdit;
edtReadAmount: TEdit;
btnRead: TButton;
Label4: TLabel;
Label5: TLabel;
edtWriteReg: TEdit;
edtValue: TEdit;
btnWrite: TButton;
Memo1: TMemo;
Button1: TButton;
procedure btnReadClick(Sender: TObject);
procedure btnWriteClick(Sender: TObject);
procedure mctPLCConnected(Sender: TObject);
procedure mctPLCDisconnected(Sender: TObject);
procedure mctPLCResponseError(const FunctionCode, ErrorCode: Byte;
const ResponseBuffer: TModBusResponseBuffer);
(*
procedure mctPLCResponseMismatch(const RequestFunctionCode,
ResponseFunctionCode: Byte; const ResponseBuffer: TModBusResponseBuffer);
*)
procedure mctPLCSocketAllocated(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure mctPLCStatus(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.fmx}
procedure TfrmMain.btnReadClick(Sender: TObject);
var
Data: array[0..4096] of Word;
iAmount: Integer;
i: Integer;
sLine: String;
begin
iAmount := StrToInt(edtReadAmount.Text);
if (iAmount > 0) then
begin
mctPLC.Host := edtIPAddress.Text;
if mctPLC.ReadHoldingRegisters(StrToInt(edtReadReg.Text), iAmount, Data) then
begin
sLine := 'Register value(s) read:';
for i := 0 to (iAmount - 1) do
sLine := sLine +
#13#10' ' +
IntToStr(StrToInt(edtReadReg.Text) + i) +
': 0x' +
IntToHex(Data[i], 4);
ShowMessage(sLine);
end
else
ShowMessage('PLC read operation failed!');
end;
end;
procedure TfrmMain.btnWriteClick(Sender: TObject);
begin
mctPLC.Host := edtIPAddress.Text;
if mctPLC.WriteRegister(StrToInt(edtWriteReg.Text), StrToInt(edtValue.Text)) then
ShowMessage('PLC register write successful!')
else
ShowMessage('PLC register write failed!');
end;
procedure TfrmMain.Button1Click(Sender: TObject);
begin
If not mctPLC.Connected then
begin
mctPLC.Connect;
Button1.Text := 'Deconnecte';
end else begin
mctPLC.Disconnect;
Button1.Text := 'connect';
end;
end;
procedure TfrmMain.mctPLCConnected(Sender: TObject);
begin
Memo1.Lines.Add('connecté')
end;
procedure TfrmMain.mctPLCDisconnected(Sender: TObject);
begin
Memo1.Lines.Add('déconnecté')
end;
procedure TfrmMain.mctPLCResponseError(const FunctionCode, ErrorCode: Byte;
const ResponseBuffer: TModBusResponseBuffer);
begin
// Memo1.Lines.Add('ResponseError>'+ResponseBuffer.Header);
Memo1.Lines.Add('ResponseError>'+IntToStr(ResponseBuffer.FunctionCode));
// Memo1.Lines.Add('ResponseError>'+ResponseBuffer.MBPData);
end;
(*
procedure TfrmMain.mctPLCResponseMismatch(const RequestFunctionCode,
ResponseFunctionCode: Byte; const ResponseBuffer: TModBusResponseBuffer);
begin
Memo1.Lines.Add('ResponseMismatch>');
end;
*)
procedure TfrmMain.mctPLCSocketAllocated(Sender: TObject);
begin
Memo1.Lines.Add('SocketAllocated>');
end;
procedure TfrmMain.mctPLCStatus(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
begin
Memo1.Lines.Add('CStatus>'+AStatusText);
end;
end. |