hayır burada çalışan bir örnek var ondada yollanmıyor , form tanımları ayrıca birde değer okuma prosedürü (buton) mevcut,
ancak yapısını çözemedim tam olarak ,,,
///
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
EditSend: TRichEdit;
EditRecv: TRichEdit;
EditIP: TLabeledEdit;
EditAddr: TLabeledEdit;
EditQty: TLabeledEdit;
Splitter1: TSplitter;
IdTCPClient1: TIdTCPClient;
BitBtn2: TBitBtn;
ActionList1: TActionList;
ActConnect: TAction;
SpeedButton1: TSpeedButton;
ActReadCoils: TAction;
ActReadDiscrete: TAction;
ActReadInputRegister: TAction;
ActReadHoldRegister: TAction;
ActWriteCoils: TAction;
ActWriteHoldRegister: TAction;
BitBtn1: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn6: TBitBtn;
EditDeviceID: TLabeledEdit;
BitBtn5: TBitBtn;
procedure ActConnectExecute(Sender: TObject);
procedure ActReadCoilsExecute(Sender: TObject);
procedure ActReadDiscreteExecute(Sender: TObject);
procedure ActReadHoldRegisterExecute(Sender: TObject);
procedure ActReadInputRegisterExecute(Sender: TObject);
procedure ActWriteHoldRegisterExecute(Sender: TObject);
procedure ActWriteCoilsExecute(Sender: TObject);
private
{ Private declarations }
FID: word;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses uModBusClient;
{$R *.dfm}
procedure TForm1.ActConnectExecute(Sender: TObject);
begin
IdTCPClient1.Host := EditiP.Text;
if IdTCPClient1.Connected then
IdTCPClient1.Disconnect
else
IdTCPClient1.Connect();
ActConnect.Checked := IdTCPClient1.Connected;
end;
procedure TForm1.ActReadCoilsExecute(Sender: TObject);
var
Head: Tmb_tcp_header;
Req: Tmb_req_pdu;
Rsp: Tmb_rsp_pdu;
Addr, Qty: word;
S, H: string;
L: word;
I, P: integer;
B: byte;
FDeviceID: byte;
begin
FillChar(Head, Sizeof(Head), 0);
FDeviceID := StrToInt(EditDeviceID.Text);
with Req do
begin
fUnitID := FDeviceID;
fFunctionCode := mbReadCoils;
Addr := StrToInt(EditAddr.Text)-1;
fReadStartAddr := Swap(Addr);
Qty := StrToInt(EditQty.Text);
fReadQuantity := Swap(Qty);
end;
Head.fRecLength := Swap(6);
Head.fTransactionID := Swap(FID);
Inc(FID);
SetLength(S, 256);
Move(Head, S[1], 6);
Move(Req, S[7], 6);
IdTCPClient1.WriteBuffer(S[1], 12);
SetLength(H, 24);
BinToHex(PChar(S), PChar(H), 12);
EditSend.Lines.Add(H);
S := IdTCPClient1.CurrentReadBuffer;
if S > '' then
begin
Move(S[1], Head, 6);
L := Swap(Head.fRecLength);
Move(S[7], Rsp, L);
SetLength(H, (6 + L) * 2);
BinToHex(PChar(S), PChar(H), 6 + L);
EditRecv.Lines.Add(H);
if (Rsp.fFunctionCode and $80) = 0 then
begin
L := 0;
P := 0;
while L < Qty do
begin
B := Rsp.fReadData[P];
for I := 0 to 7 do
begin
H := Format('0%5.5d : %d', [Addr + L+1, B and $01]);
EditRecv.Lines.Add(H);
B := B shr 1;
Inc(L);
if L = Qty then
break;
end;
Inc(P);
end;
end;
end;
end;
------------------
bu arada IdTCPClient1 ---> Indy TCP Client oluyor , yani component gereksinimi de yok