Jump to content
tbowling

C# TCP haberleşme programında hata alıyorum

Önerilen İletiler

iyi çalışmalar gmt yi delphi ve c# arayüz programlarımla kullanıyorum mevcut durumda delphi7 ile rs485 modbus ile haberleşiyorum bir taraftanda yeni suit programına 

alışmaya çalışıyorum . sitenizde verdiğiniz örneği denemek istediğimde resimdeki hatayı alıyorum sorun ne olabilir acaba.

birde benzer şekilde c# ile rs485 modbus için örnek yapabilirmisiniz.  saygılarımla

PrtScr capture.jpg

Yorum bağlantısı
Sitelerde Paylaş

HATAYA nedn olan satırları iptal edip programı çalıştırdım resimlere göre mb0-mb1 ve mb2 ye kumanda edebildim . fakat deneme amaçlı mw0 registerini eklediğimde

kontrol yapamadım.

sanırım mw0 modbus adresi 4 olarak oluştu programa bu 4 ü bir şekilde göstermek gerekmiyor mu

 

saygılarımla

1_2.jpg

2.jpg

3.jpg

4.jpg

Yorum bağlantısı
Sitelerde Paylaş

GMTSuite programında Bit, Word, DoubleWord, İnteger ve Real olmak üzere 5 çeşit veri tipi kullanılmaktadır. Sizin Bit tipi olan MB0,MB1 ve MB2 operandlarınız C# programınız ile uyumlu olmasından dolayı doğru çalışmaktadır. Fakat MW0 tipi operandınızın tipi Suit'e Bit olarak değil de word olarak tanımlamış olsaydınız uygun olacaktı. C# programınızda da word için aşağıdaki gibi bir dönüşüm yapmak durumundasınız.

 

int gir_adres = Convert.ToInt32(numericUpDown9.Value);  // numericUpDown9 değerini int32 tipine dönüştürür ve gir_adres içine yükler...

int[] okunan = tcpclient.ReadHoldingRegisters(gir_adres - 40001, 2); // gir_adres değerinden 40001 çıkarır ve sonuçta çıkan adresden değer okur bunu da okunan dizisine yükler...

int donusen = ModbusClient.ConvertRegistersToInt(okunan); // okunan dizi değerini ModbusClient yapısına uygun olarak int değerine dönüştürür...

textBox17.Text = Convert.ToString(donusen); // sonucu string olarak ltextBox7'de gösterir.

 

GMT Suite izin verdiği   adres aralığı:   40001 Modbus Adresi 41025 olabilir.

Gönderilen Değer Aralığı:      0  Girilen Değer  65535 

Faydalı olması dileğiyle, Kolay Gelsin....

Yorum bağlantısı
Sitelerde Paylaş

iyi çalışmalar dediğiniz gibi MW0 registerini word yaptım pc den 18 gönderdiğimde role  çalıştı 

artık  registere pc den data göndererek  istediğim değeri yazabileceğim   şimdi MW1 registerine 289 değerini kaydedip 

pc den bu değeri almaya çalışacağım inşallah sorun yaşamam 

 

çok teşekkürler saygılar

 

            //mw yazma butonu
            ModbusClient tcpclient = new ModbusClient(Convert.ToString(textBox1.Text), 502);
            tcpclient.Connect(); 
            //int bb = Convert.ToInt32(textBox11.Text);
            int bb = Convert.ToInt32("0"); //mw0 registeri

            tcpclient.WriteSingleRegister(0 + bb, Convert.ToInt32(textBox7.Text));
            //tcpclient.WriteSingleRegister(0 + bb, Convert.ToInt32("18"));

 

word.jpg

mw18.jpg

Yorum bağlantısı
Sitelerde Paylaş

              Aşağıdaki kodlar yardımcı olur... Kolay Gelsin...

  int mw_adres = Convert.ToInt32(numericUpDown1.Value);      // NumericUpDown1 değerini int32 türüne dönüştürür ve mw_adres' e atar...
  int mw_deger = Convert.ToInt32(textBox1.Text);                      // textBox1 text değerini int 32 türüne çevirir ve mw_deger 'e atar...
  tcpclient.WriteSingleRegister(mw_adres - 40001, mw_deger);  // mw-adres değerinden 40001 çıkartır ve sonuçta çıkan adrese mw_degerini gönderir. 

Yorum bağlantısı
Sitelerde Paylaş

okuma ve yazma örnekleri çalıştı her şey gayet güzel ve süper kolaymış aslında kurcaladıkça daha iyi anlıyor insan .... fakat benim bir türlü çözemediğim bir sorunum 

merakım var 

plc den tek taraflı haberleşme hakkında;

örnek olarak anlatmak gerekirse... :  bir sıcaklık sensörünü plc ye bağladık sürekli sıcaklık değerini okuyacak ve başka bir cihaza gönderecek

plc ile kimse iletişim kurmayacak o sadece okuyup gönderecek bu işlemin bir yöntemi var mı tcp haberleşmede 

başka bir cihazın veya sistemin plc ye bağlanıp değer okumasını istemiyorum isteğim plc diğer cihazlara data göndersin..

saygılarımla

Yorum bağlantısı
Sitelerde Paylaş

plc ile kimse iletişim kurmayacak o sadece okuyup gönderecek bu işlemin bir yöntemi var mı tcp haberleşmede (Bu ifadenizde plc iletişim kurmadan bilgi gönderemez. Başka bir cihazdan kastınız MODBUS/TCP haberleşme yapabilen IP adresine sahip diğer cihaz HMI ise ekteki dosya yardımcı olur. Değilse cihaz özelliğine göre haberleşme yöntemi değişir.)

 

başka bir cihazın veya sistemin plc ye bağlanıp değer okumasını istemiyorum isteğim plc diğer cihazlara data göndersin.. (Bu cümlenizde ki ifade de ise; eğer sıcaklık durumuna bağlı bir invertör kullanacaksanız RS485 protolü ile bilgi gönderebilrisiniz.)

 

Umarım faydalı olur. 

Yeni Microsoft Word Belgesi.docx

Yorum bağlantısı
Sitelerde Paylaş

ilğilendiğiniz için teşekkürler. 

c# örneğini programa uygulamaya çalıştığımda bir sorunla karşılaştım MB1-MB3-MB5-MB7  diye bit registerler atadım ve modbas adreslerini 

elimle 1-3 -5-7  diye değiştirdim. programda değişti görükse bile ilk oluşturma sırasında ne adres verdiyse onu kabul ediyor sonradan verdiğim modbus adresini kabul etmiyor. 

aşagıdaki örnekde çalışmıyor ama adresi  0 yaptığımda çalışıyor bu konuda bir öneriniz var mı yoksa program ne adres verirse onu kullanmak zorundamıyız 

 

saygılarımla

 

 

private void button7_Click_1(object sender, EventArgs e)
        {
            //mb yazma butonu
            ModbusClient tcpclient = new ModbusClient(Convert.ToString("169.254.241.153"), 502);
            tcpclient.Connect();
            tcpclient.WriteSingleCoil(1, true);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            //mb yazma butonu
            ModbusClient tcpclient = new ModbusClient(Convert.ToString("169.254.241.153"), 502);
            tcpclient.Connect();
            tcpclient.WriteSingleCoil(1, false);
        }

 

GMTSuite ver 0.9.8.1.2.jpg

Yorum bağlantısı
Sitelerde Paylaş

tcpclient.WriteSingleCoil(1, true); 

Suite pogramınız tarafından verilen otomatik adresler doğrudur. Siz programınızda bu adreslere veri gönderirken yada çekerken bir eksik adres olarak tanımlayın.

Örneğin yukarıdaki 1 nolu adrese true bilgisini gönderirken "tcpclient.WriteSingleCoil(0, true); " olarak yazın .Böylelikle c# 0. adrese bilgi gönderirken suite 'in 1. adresine bilgi gidecektir. Diğer tüm adreslerinizi c# da bu şekilde 1 eksik olacak şekilde revize edin.

Kolay Gelsin...

Yorum bağlantısı
Sitelerde Paylaş

Merhaba, C#] üzerinde bir uygulama yapıyorum anacak plc ye real ve double veri okumak ve yazmak konusunda sorun yaşıyorum. yardımcı olabilir misiniz.

PLC de real ve double verilerin modbus adresleri 42000 şeklinde başlıyor ve bunu C# üzerinden hiçbir şekilde okuyamadım veya yazamadım.

Aynı zamanda ek bilgi olarak yukarıdaki örnek dosyayı bende indirdim ancak kodlar çalışmıyor. Sanırım EasyModbus kütüphanesinde bir güncelleme olmuş olabilir.

Örneğin.
sizin örneğinizde 

int[] mi = tcpclient.ReadHoldingRegisters(1000 + c, 2);
int[] mf = tcpclient.ReadHoldingRegisters(4000 + d, 2);

bu kodlar da çalışmıyor.

Bunlar yerine

int[] mi = tcpclient.ReadHoldingRegisters(0 + c, 2);
int[] mf = tcpclient.ReadHoldingRegisters(0 + d, 2);

şeklinde kullanınca sorunsuz çalışıyor.

Ancak başta belirttiğim gibi real ve double tipi değişkenler için otomatik oluşan ve 42000 le başlayan modbus adresine hiçbir şekilde ulaşamıyorum.

 

Şimdiden desteğiniz için teşekkürler.

Yorum bağlantısı
Sitelerde Paylaş

malikenes, 10 saat önce yazdı:

PLC' yi hangi yazılım ile programlıyorsunuz?

GMTSuite ile programlıyor iseniz örnek program;

 

GMTSoft ile programlıyorsanız örnek program;

 

Bazı farklılıklar var demek ki.

 

 

GMTSuit kullanıyorum. 
http://gmtcontrol.com/tr/yuklemeler/ornek-uygulamalar.html

bu linkteki örnek uygulamayı denedim tek örnek vardı ve forumda da baktım ama fark etmemişim. 
Teşekkür ederim..

Yorum bağlantısı
Sitelerde Paylaş

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Misafir
Bu konuyu yanıtla

×   Yapıştırdığınız içerik biçimlendirme içeriyor.   Biçimlendirmeyi Temizle

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Önceki içeriğiniz geri yüklendi.   Editör içeriğini temizle

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Yeni Oluştur...