DELTA PLC MODBUS - DELPHI

exodussian

Üye
Katılım
12 Şub 2010
Mesajlar
3
Puanları
1
Yaş
40
Selamlar

elimde delta plc ve bunun ethernet parçasıda alıp monte ettim.

DMT MODBUS Library kurdum, Visual Basic ile yapılan örneklerde router da bulunan PLC ile haberleşme oluyor, farklı kodlar yolladım hepsinde çalıştı.

Not: Bağlantım MODBUS TCP olarak gerçekleşmeli

Ancak sorunum delphi, ben bu cihazı hali hazırda delphi de yazdığım programla haberleştirmek istiyorum ancak elimdeki kaynaklar visual basic ve c tabanlı,

DLL i , delphi de load etmeye çalıştım , standart DLL yükleme gibi visual basic tanım ve lib dosyalarına bakarak tiplerine uygun olarak delphi ye port ettim. açılışta bir sorun yok program compile oluyor , ancak bağlan dediğim anda çıkarmadığı hata birakmiyor,

DELPHİ ile MODBUS TCP Bağlantısı yapabilen arkadaşlar yardımcı olabilirlerse çok sevinirim saygılarımla.
 
Yazımızda endüstrinin can damarı sayılabilecek PLC’yi inceleyeceğiz.
KNX Standardı, küçük bir rezidansın içerisindeki aydınlatma, perde panjur, klima kontrolünden, Dünya’nın en büyük havalimanlarındaki aydınlatma otomasyonu gibi çözümler için tercih edilen bir Dünya standardıdır.
Dokumanlara bakarak MODBUS icin herhangi bir DLL kullanmadan haberlesen bir program yazabilirsin.
 
visual basic ile seri porttan haberleşebilen programlar yazdım, ancak bu tcp ip olayı

şimdi delphi de clientsocket ile bağlantı sağlıyorum,

cihazımın local ip si 192.168.1.5 durumda ,

port 502 seçiyorum , sendtext ile komutlar yolluyorum evet hatta cihazın rx lambasıda oynuyor ama ne komutu gerçekleştiriyor nede cevap dönüyor.
 
Seri porttan kullanabiliyorsaniz, TCP paketleri ile yapmanizin bir zorlugu yok. Seri porttan yolladiginiz paketin aynisini TCP socketi vasitasi ile cihazin uygun portuna gondermenizin yeterli olmasi lazim.

Paket gidiyor ama islem yapmiyor diyorsaniz, gonderilen paketin formatinda bir sorun olabilir. Ornegin paketin sonuna enter karakteri ekliyor musunuz?
 
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
 
Son düzenleme:
merhaba...ben rs232 ile delta PLC ime bağlantı kurmya çalışıyorum..ve modbusun içinde varolan example_vb programını çalıştırmaya çalışıyorum..fakat programı çalıştırdığımda dmt.dll'in eklenmediğini söylüyor...visual basic 6.0 kullanıyorum, bu programda project->reference->browse yapıp dmt.dll dosyasını(proje klasörü içerisindeki) eklemek istediğimde "can't add a reference to the specified file" hatası veriyor...bir türlü bu problemi çözemiyorum...yardım ederseniz çok sevinirim..sonuçta kendim bir program yazıcam, example_vb' yi kullanmayacam fakat kendim bir proje yarattığımda dahi bu dmt.dll dosyasını ekleyemiyorum...
 
Seri porttan kullanabiliyorsaniz, TCP paketleri ile yapmanizin bir zorlugu yok. Seri porttan yolladiginiz paketin aynisini TCP socketi vasitasi ile cihazin uygun portuna gondermenizin yeterli olmasi lazim.

Paket gidiyor ama islem yapmiyor diyorsaniz, gonderilen paketin formatinda bir sorun olabilir. Ornegin paketin sonuna enter karakteri ekliyor musunuz?

hocam ben c# üzerinden bu bağlantıyı gerçekleştirmeye çalışıyorum. Ancak dediğiniz gibi modbus ascıı protokolündeki aynı paket formatını IP soket üzerinden göndermem yeterlimi ??
 
Merhaba,

DMT Library v2.2 olarak mevcuttur.
İçerisinde C# için örnek uygulama ve kendi kütüphane dosyası (DLL) mevcuttur.

Genel olarak bahsetmek gerekirse Modbus'ın ASCII/RTU seri haberleşme veri paketi ile
Modbus TCP ethernet veri paketi benzeşse bile yinede birbirinden farklıdır.
Dolayısıyla ASCII/RTU veri paketini ethernet üzerinden gönderdiğinizde bu Modbus TCP olmaz.

Modbus detaylı bilgi için.
The Modbus Organization

İyi çalışmalar.
 
Merhaba,

DMT Library v2.2 olarak mevcuttur.
İçerisinde C# için örnek uygulama ve kendi kütüphane dosyası (DLL) mevcuttur.

Genel olarak bahsetmek gerekirse Modbus'ın ASCII/RTU seri haberleşme veri paketi ile
Modbus TCP ethernet veri paketi benzeşse bile yinede birbirinden farklıdır.
Dolayısıyla ASCII/RTU veri paketini ethernet üzerinden gönderdiğinizde bu Modbus TCP olmaz.

Modbus detaylı bilgi için.
The Modbus Organization

İyi çalışmalar.

hocam teşekkürler. Bu dll dosyası ile veri gönderebiliyorum ancak paketi dll kütüphaneye bağlı kalmadan kendi kodlarımla göndermek istiyorum bu TCP veri pakedi ile ilgili bir bilginiz varmı peki ?
 

Forum istatistikleri

Konular
128,813
Mesajlar
920,680
Kullanıcılar
450,905
Son üye
user111

Yeni konular

Geri
Üst