Delta PLC İçin Modbus Program Yazmak.

aicefire

Üye
Katılım
28 May 2008
Mesajlar
29
Puanları
1
Yaş
40
Merhabalar arkadaşlar.
Forumda yeniyim anladığım kadarı ile PLC üzerine tek forum burası.
Benim şöyle bir problemim var. Elimde DELTA PLC DVP-14SS model bir cihaz var. Ben bunu bilgisayar üzerinden kontrol etmek istiyorum. Ancak bu konulara biraz yabancıyım. Normalde bilgisayar yazılım uzmanıyım ancak Modbus ile ilgili olarak hiçbir çalışmam olmadı. Ancak araştırdığım kadarı ile modbus ile haberleşmek için bir veri formatını cihaza gönderiyoruz cihazda bize ilgili değerli belirli bir formatta geri döndürüyor.
Ancak bu işlemi bildiğimiz seri haberleşme ile mi gerçekleştiriyoruz. Yani en basitinden windows daki HyperTerminal ile bu yapıda veri gönderdiğimizde cevap alabilir miyiz ? Ben denedim olmadı. Yoksa modbus ascii/rtu için bir dll/component mi gerekiyor? Kısacası cihazdan verileri bilgisayara alabilmek için (C#/VB.NET ile) nasıl bir yol izlemeliyim. Bu şekilde bir proje geliştirmeyi düşünüyorum. Eğer yardımcı olacak arkadaşlar varsa böyle bir projeyi beraber de geliştirebiliriz.
Şimdiden teşekkürler.
 
Seri porttan, Delta PLC ve servo sürücülerle MODBUS ile haberleşmek için gerekli modülü bi iş için ben daha önce yazmıştım. Kodu aşağıda:

Delta MODBUS modülü

Bu kod Python programlama dili ile yazılmış. Bunu doğrudan kullanabileceğin gibi, aynı kodu başka bir programlama dili ile de yazabilirsin.

Ancak bu işlemi bildiğimiz seri haberleşme ile mi gerçekleştiriyoruz.
Evet, bildigimiz seri haberleşme ile gerçekleştiriyoruz. RS-232 veya RS-485 kullanabilirsin. Bilgisayara doğrudan bağlayacaksan RS-232 kullanacaksın.


Yani en basitinden windows daki HyperTerminal ile bu yapıda veri gönderdiğimizde cevap alabilir miyiz ?
Hyper Terminal ile cevap alırsın. Cevap alamadığına göre
* ya düzgün kablo kullanmadın
* ya seri port ayarların PC ve PLC'de aynı değil
* ya gönderdiğin paketin formatı bozuk
* ya da Check Sum degeri dogru hesaplanmamış


Yoksa modbus ascii/rtu için bir dll/component mi gerekiyor?
MODBUS için bu komponente ihtiyacın yok.
 
Emrah hocam öncelikle çok teşekkür ediyorum vermiş olduğunuz cevap için. Fakat konu hakkında hiç bilgim olmadığı için birkaç soru daha sorcam eğer cevap verirseniz,
Normal olarak bir program yazdım. 2 tane textbox var ve birtane de buton bu textboxlardan birine girdiğim değeri seriporta gönderiyoum ve göndermiş olduğum değeri aynı porttan geri alıyorum. (Com portunun 2 ve 3 nolu bacaklarını kısa devre yaptım). Bu yazmış olduğum herhangi bir veriyi rahatlıkla porta gönderip geri alabiliyorum.
Sizin yazdıklarınıza göre ben textbox ilgili parametre yapısını yazıp cihaza gönderirsem cihaz bana ilgili değeri gönderecektir.
Peki bu ilgili parametre yapısını textbox a nasıl yazmam gerekir ?(Veya yazılan değerleri arka planda HEX e mi çevirmeliyim ?)
Bu konuda yardımlarınız için şimdiden teşekkür ederim.
 
Sizin yazdıklarınıza göre ben textbox ilgili parametre yapısını yazıp cihaza gönderirsem cihaz bana ilgili değeri gönderecektir. Peki bu ilgili parametre yapısını textbox a nasıl yazmam gerekir ?(Veya yazılan değerleri arka planda HEX e mi çevirmeliyim ?)
Gönderilecek paketi elle bir text kutusu içine yazmak pratik değil çünkü görünmeyen karakterler kullanman gerekecek. Bir de her seferinde checksum degerini elle hesaplaman gerekecek.

Eğer sadece parametre degeri okuyacaksan, text kutusundan sadece okunacak parametrenin numarasini al. Eger parametre degeri gondereceksen, bir text kutusundan parametre numarasini, diger kutudan da set edilecek degeri al.

Sonra bunlari, gonderilecek veri paketi icine uygun formatta yerlestir, checksum degerini hesaplayip paket icinde uygun yere yerlestir ve bu paketi gonder.

Cevap yine belli bir formatta gelecek. Gelen paketin sadece bir bolumu senin asıl aradığın deger, onu paket icinden alıp nasıl kullanacaksan kullanırsın.
 
Peki yazmış olduğunuz bu paket tipi nasıl bir paket biraz daha detaylandırabilir misiniz ? Yani gönderilen paketin nasıl olduğunu bir örnek ile gösterebilir misiniz ? Veya en basitinden hyperTerminal den DVP-14SS modeli için nasıl bir yapı göndermeliyim ?
Benim ilk amacım belli bir adresdeki değeri elde etmek.
Teşekkürler.
 
Bu paketin formati Delta PLC dökümanlarında (sitesinde var) detaylı açıklanmakta. Tavsiyem, öncelikle dökümana bakman. Kabaca formatı su sekilde:

* 1. byte -> baslangic karakteri, yani :

* 2,3 byte -> 2 bytelik PLC numarasi, hex olarak... Örneğin 01

* 4,5 byte -> komut, parametre okunacaksa 03

* 6'dan RC'ye kadar olan byte'lar, yapilacak isleme göre degeri ve uzunlugu degisiyor. Parametre okumada ilk 4 byte'i okunacak adres, sonraki 4 byte kac word okunacagi. Ornegin 0x0222 adresli paramtereden 1 word okuyacaksan 02220001

* son 2 byte RC, yani checksum. Yukarida sayilan alanlarin degerleri toplanip 256'ya göre modu alınıyor ve elde edilen degerin 256'ya tamamlayani kullaniliyor. Benim koda bakarsan daha rahat anlarsin

* Paket sonu isareti, '\r\n' Yani 0x10 ve 0x13 nolu karakterler. Hyper terminalde iken entera basman ayni isi yapar
 
Emreh bey sizin kodunuzu ve cihazın dökümanlarını inceledeim. Aşağıdaki gibi bir bilgi buldum. Fakat yazmış duğum programda bu veriyi gönderdiğimde herhangi bir bilgi alamadım. Sizde nerde hata yapıyorum.

Ornek:01 no'lu PLC'den T20~T27 bobinlerini okuma.
PC→PLC
“:01 03 06 14 00 08 DA CR LF” (Bu kısmı aynen textbox a yazıyorum ve port a gönderiyorum)
PLC→PC
“:01 03 10 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 B8 CR LF”
 
“:01 03 06 14 00 08 DA CR LF” (Bu kısmı aynen textbox a yazıyorum ve port a gönderiyorum)

Sondaki CR ve LF kismini yazmayacaksin. Bunlar Carriage Return ve Line Feed karakterlerini temsil eden kısaltmalar. Hyper Terminal menusunde enter'a basildiginda hangi karakterlerin gönderileceginin secildigi bölüm olması lazım, buranin enter'a basıldığında CR+LF gönderilecek sekilde ayarlanmasi lazim.

Tirnak karakterlerini (") göndermiyorsun. Aradaki boslukları göndermiyorsun. Yani Hyper Terminale sunu yazman lazim:

:010306140008DA

Sonra enter'a basinca sonuna CR+LF karakterlerini Hyper Terminal ekleyecek zaten.

Tabii bunun düzgün çalışması için PLC'nin seri port ayarlari ile Hyper Terminalin seri port ayarlarinin ayni olmasi lazim. Baudrate, stopbit, parity vs. gibi... Aynı zamanda PLC'nin MODBUS ASCII için ayarlanmış olması lazım çünkü bu MODBUS ASCII paketi...

Ayrica bu paket 01 nolu PLC için hazırlanmış. Bu durumda senin PLC'nin de 01 olarak ayarlanmış olması lazım, yoksa PLC bu paketi ciddiye almaz, başkasına gönderiliyor diye, cevaplamaz.
 
Sn.aicefire
Sn.emrah_ arkadaşımız gerekli tüm açıklamaları yapmış fakat burda sizin gözden kaçırdığınız nokta gönderdiğiniz bilginin eksikliği "CR" bir etikettir. yani "CR" nin kendisi değil hesablama sonucunda bulunan değeri gönderilir. Ayrıca bu bilgiler porta çıkarken kodları değişik çıkar. (Bunu tek cümle açıklamaya yetmez)

Ekte size küçük bir program gönderiyorum (Haberleşme için ilk denememdi) bununla plc yi denemeye çalışın sonuç alırsanız herşeyden önce haberleşmeyi sağlamış olursunuz. (Haberleşme protokolü 7,E,1, 9600 PLC adresi 01)

Kolay gelsin
 

Ekli dosyalar

  • Project1.zip
    9 KB · Görüntüleme: 352
Arkadaşlar cevaplarınız ve bana ayırdığınız zaman için çok teşekkür ederim. Yazdıklarınızı hemen deniyorum. Sonuçu yine yazarım.
Tekrar teşekkür ederim.
Bu arada "abuzettin20" göndermiş olduğunuz program bende çalıştırdığımda;
"component 'COMCTL32.OCX' or one of its dependencies not correctly regşstered:a file is missing o0r invalid"
hatasını alıyorum.
 

Forum istatistikleri

Konular
130,118
Mesajlar
933,301
Kullanıcılar
453,191
Son üye
ParaNora

Yeni konular

Geri
Üst