c#da modbus gönderme alma

Başlatan canbulut, 19 Temmuz 2015, 12:29:43

canbulut

arkadaslar türlü incelemelerim oldu c# ve modbus ile alakalı.testini yapabileceğim uygulamalar buldum fakat açık kaynak kodlu işimi görecek bir şey bulamadım.amacım c# dan bir butona basıp 0 ile 7 dahil arasındaki bobin bilgilerini okuyup bilgileri richtextboxta yazdırmak. farklı kodlar denedim fakat sonuç olmadığı için paylaşmamayı uygun görüyorum. görüşlerinizi beklerim.

tunayk

Açıkçası codeproject vb. yerlerde modbus tcp dahil güzel çalışan kodları da dahil onlarca proje var.  Bulamadım demek biraz eksik bence.  Bununla beraber tam istediğim gibi uygulama arıyorum derseniz böyle birşey olmayacaktır.
Tam olarak nerede takıldığınızı anlarsak belki daha kolay yardımcı olunabilir. 
Seri haberleşme konusunda durumunuz nasıl ?
Modbus protokolü ile birşeyler gönderip alabildiniz de sadece bit memory ile ilgili mi sorun var yoksa henüz daha hiç bir şey gönderip alamadınız mı?
Sadece birkaç bitlik bir veri okunacaksa modbus ile boğuşmayada çok gerek yok hani

canbulut



canbulut

#4
Alıntı yapılan: tunayk - 19 Temmuz 2015, 18:15:48
Açıkçası codeproject vb. yerlerde modbus tcp dahil güzel çalışan kodları da dahil onlarca proje var.  Bulamadım demek biraz eksik bence.  Bununla beraber tam istediğim gibi uygulama arıyorum derseniz böyle birşey olmayacaktır.
Tam olarak nerede takıldığınızı anlarsak belki daha kolay yardımcı olunabilir. 
Seri haberleşme konusunda durumunuz nasıl ?
Modbus protokolü ile birşeyler gönderip alabildiniz de sadece bit memory ile ilgili mi sorun var yoksa henüz daha hiç bir şey gönderip alamadınız mı?
Sadece birkaç bitlik bir veri okunacaksa modbus ile boğuşmayada çok gerek yok hani

sizin mesajınızı görmemiştim.
seri portta ascii modunda birşeyler yazabiliyorum. Yaptığım pic li devreleri haberleştiriyorum. Şimdi modbus ile birlikte işin rengi değişti. Bilgileri hex olarak göndereceğim bunuda şu şekilde yapabiliyorum.


public void yaz()
{
    byte[] bytesToSend = new byte[6] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
    serialPort1.Write(bytesToSend, 0, 6);
}


alma kısmında ise receive kesmesi var. alıyor aldığı bilgileri tek tek gösteriyor. o da şu şekilde

richTextBox1.Text += serialPort1.ReadByte();

yukarıdaki yaz fonksiyonuna benzer bir kodla Read almayı denedim tek tek alıyor ve int olarak gösteriyor. benim istediğim şu şekilde bir çalışmadır. Veriyi bir butona bağlamak. O butona basıldığında bana bir textbox içinde gönderdiğim veriyi aynen gösterebilsin. Ben şu anda tx-rx uçlarını kısa devre ederek gönderip aldığıma bakmaya çalışıyorum. onuda doğruca görüntüleyebilmiş değilim henüz.

mesaj birleştirme:: 19 Temmuz 2015, 23:31:02

string olarak gönderdiğimi aynı zamanda okuyabiliyorum fakat byte olarak yapamıyorum. sanırım richtextboxta gelen byte'ları gösterebilmek için çevirme işlemleri yapmak gerekiyor. cevrimlerle ilgili bilinçli yaptığım bişey yok maalesef.

tunayk

Kardeş senin başlık hatalı olmuş biraz. Şimdi sorun gönderdiğin ve aldığın veriyi textbox ta göstermek anlaşılan.
Textbox ta göstermenin farklı yolları var. Eğer göndereceğin sayılar ekrana basılan ascii karakterler ise A=65, 0=48 olarak gidecek ise doğrudan string çalışabilirsin. Yok tamamen binary data ise önce gelen datayı bir byte dizisine oku. Tüm olarak yani, tek tek değil.
Örneğin,  seriport komponenti sp olsun.
Okurken
Byte B= New Byte[sp.BytesToread ];
Sp.Read(B,0,sp.BytesToread);
Dediğinde tüm datalar diziye gelmiş olur.
Eğer sen de aldığın sayıları olduğu gibi görmek istersen
String s= B[0].ToString () + B[1].ToString ()....
Textbox1.Text =s;
Şeklinde bir string oluşturup bunu da metin kutusuna basabilirsin. Bu dönüşümü gönderdiğin diziye de uygulayıp giden veriyi de aynı şekilde gösterebilirsiniz.
Dizi işlerken for döngüsü ile de daha esnek çalışabilirsin. Lakin haberleşmeden önce biraz dilin temellerini öğrensen daha hızlı yol alıcan gibi.

canbulut

#6
Alıntı yapılan: tunayk - 20 Temmuz 2015, 01:31:07
Kardeş senin başlık hatalı olmuş biraz. Şimdi sorun gönderdiğin ve aldığın veriyi textbox ta göstermek anlaşılan.
Textbox ta göstermenin farklı yolları var. Eğer göndereceğin sayılar ekrana basılan ascii karakterler ise A=65, 0=48 olarak gidecek ise doğrudan string çalışabilirsin. Yok tamamen binary data ise önce gelen datayı bir byte dizisine oku. Tüm olarak yani, tek tek değil.
Örneğin,  seriport komponenti sp olsun.
Okurken
Byte B= New Byte[sp.BytesToread ];
Sp.Read(B,0,sp.BytesToread);
Dediğinde tüm datalar diziye gelmiş olur.
Eğer sen de aldığın sayıları olduğu gibi görmek istersen
String s= B[0].ToString () + B[1].ToString ()....
Textbox1.Text =s;
Şeklinde bir string oluşturup bunu da metin kutusuna basabilirsin. Bu dönüşümü gönderdiğin diziye de uygulayıp giden veriyi de aynı şekilde gösterebilirsiniz.
Dizi işlerken for döngüsü ile de daha esnek çalışabilirsin. Lakin haberleşmeden önce biraz dilin temellerini öğrensen daha hızlı yol alıcan gibi.
deneyeceğim fakat gönderdiğiniz String s= B[0].ToString () + B[1].ToString ()....string s kodu dizi değil.

Nedenler

Sorunu ben de tam olarak anlamadım ama ben modbus için nmodbus kütüphanesini kullanıyorum ve hiç başım ağrımıyor. Haberleşmeyle ilgili işleri kütüphane hallediyor ben verilerimle uğraşıyorum sadece.
nModbus Api user manuel ve bir adet de çalışan örnek proje ekledim işinize yararsa.
http://s2.dosya.tc/server2/qczyyq/ModbusDenemeC_.rar.html

canbulut

#8
Alıntı yapılan: Nedenler - 20 Temmuz 2015, 12:35:26
Sorunu ben de tam olarak anlamadım ama ben modbus için nmodbus kütüphanesini kullanıyorum ve hiç başım ağrımıyor. Haberleşmeyle ilgili işleri kütüphane hallediyor ben verilerimle uğraşıyorum sadece.
nModbus Api user manuel ve bir adet de çalışan örnek proje ekledim işinize yararsa.
http://s2.dosya.tc/server2/qczyyq/ModbusDenemeC_.rar.html
advencedhmiv35 olan çzümü çalıştırdım sadece arkaplan gözüküyor.

mesaj birleştirme:: 20 Temmuz 2015, 12:49:38

nasıl anlatacağımı bilemiyorum ama istediğim tam olarak şudur.
bir butona basıp hex veri gönderip hex veri almak ve text'te gelen veriyi aynen göstermek.

Nedenler

Gönderdiğim örnek projeyi inceleyin. O projede istenilen adresten 16 bitlik bir register okuması yapılıyor. Oradaki kurulum ayarlarını direk alın. Programınız master olacak slave adrese yazma işlemini aşağıdaki şekilde yapacaksınız. Kurulum ayarlarını yaptıktan sonra butonun click eventine master.WriteSingleRegister(slaveID, address, istenilenhexdata) yazmanız yeterli olacak.


Aşağıdaki gibi de okuma işlemini yapacaksınız. numofpoints başlangıç adresinden itibaren okunacak register sayısı. Buna 1 değeri girerseniz hattan gelen hex data 0. indiste olacak. register[0].