Jump to content
GMTCNT Ekranlı Mini PLC'miz Çıktı Devamını oku... ×
DC Güç Kaynaklarımız stoklarımıza girmiştir! Devamını oku... ×
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

İletiyi paylaş


İletiye bağlantı
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

İletiyi paylaş


İletiye bağlantı
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....

İletiyi paylaş


İletiye bağlantı
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

İletiyi paylaş


İletiye bağlantı
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. 

İletiyi paylaş


İletiye bağlantı
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

İletiyi paylaş


İletiye bağlantı
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

İletiyi paylaş


İletiye bağlantı
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

İletiyi paylaş


İletiye bağlantı
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...

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş

Bu arkadaşlar bir başka alemdeler. Bu yazılanların GMTSoft ya da GMTSuite bir alakası yok sanırım. Hangi dil bu? 

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş

C# masaüstü yazılımla plc yi kontrol etme üzerine plc kodlama da gmt suit ile 

saygılar

İletiyi paylaş


İletiye bağlantı
Sitelerde Paylaş

Hesap oluşturun veya yorum yazmak için oturum açın

Yorum yapmak için üye olmanız gerekiyor

Hesap oluştur

Hesap oluşturmak ve bize katılmak çok kolay.

Hesap Oluştur

Giriş yap

Zaten bir hesabınız var mı? Buradan giriş yapın.

Giriş Yap

×