C# & S7300 ile C# Ethernet Haberleşmesi

isorman

Üye
Katılım
27 Şub 2011
Mesajlar
5
Puanları
3
Yaş
29
Magic üstad merhaba kodlar gayet güzel çalışıyor ellerine sağlık,yanlız benim takıldığım sormak istediğim bir nokta var.Kodları ethernet kablosu takılı olamadan çalıştırdığımda ekran donup kalıyor bunun için kodlarda değişiklik yapayım dedim ama bi türlü beceremedim mesela ethernet kablosunun takılı olup olamadığını bağlan programından önce kontrol etmek istiyorum ama nasıl yapacağımı bilmiyorum bununla ilgili bir fikir verebilirmisiniz şimdiden teşekkürler.
mesela yaptığım örnekten birkaç kod paylaşmakta yarar var sanırım.

incelersen iyi olur. bağlantıyı wifi ile ethernet laptopta denedim sıkıntı tıkır tıkır çalışıyor.
bağlan diye fonksiyon tanımladım onu çağırdım altta.
Kod:
public void baglan()
        {
            toolStripStatusLabel1.Text = "Bağlanmaya Çalışıyor.";
            try // ip adresine 102. portan bağlantı kurulablir ise
            {
              

                if (textBox2.Text!="" && textBox3.Text!="")//textbox larda değer var ise
                {
                  
                    ipadres = textBox2.Text;
                    portno =int.Parse(textBox3.Text);
                    fds.rfd = libnodave.openSocket(portno, ipadres);
                  
                }
                else
                {
                    MessageBox.Show("yanlış ip adresi girdiniz!");
                    baglanti=false;
                }
              
            }
            catch
            {
                toolStripStatusLabel1.Text = ipadres + " 'e ulaşılamadı";
                baglanti = false;
            }
          
            fds.wfd = fds.rfd;
            di = new libnodave.daveInterface(fds, "FD1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
            di.setTimeout(1000); //10 saniye
            dc = new libnodave.daveConnection(di, 0, rack, slot);
            try
            {
                if (fds.rfd > 0) //Eğer Bağlantı Başarılı ise ////burası çok önemli sorduğun sorunun cevabı //serkan 08
                {
                    if (0 == dc.connectPLC())
                    {
                      
                        toolStripStatusLabel1.Text = ipadres + " Ye Bağlı Durumdasınız";
                        //timer1.Enabled = true;
                        baglanti = true;
                    }
                    else
                    {
                        toolStripStatusLabel1.Text = "Bağlantı Başarısız";
                        baglanti = false;
                    }
                }
                else
                {
                    toolStripStatusLabel1.Text = "Bağlantı Başarısız";
                    baglanti = false;
                }
            }
            catch { toolStripStatusLabel1.Text = "Bir Hata Oluştu"; baglanti = false; }

        }
 
Moderatör tarafında düzenlendi:

isorman

Üye
Katılım
27 Şub 2011
Mesajlar
5
Puanları
3
Yaş
29
Multi thread ve cros thread konularını bir araştır.
macix üstad bende merak ettim bunlar nedir? kısaca açıklayabilir misin ne işimize yarar?
 

macix

Onursal Üye
Onursal Üye
Katılım
11 Mar 2007
Mesajlar
816
Puanları
18
Kısaca dilim döndüğünce şöyle anlatayım. Örnek olarak plc'mizi bir sorgu ancak haerhangi bir nedenden dolayı plc'mize sorgu ulaşmadı ve işlem beklediğimizden uzun sürdü ki, bizim kodlarımız satır satır olduğundan dolayı programımız bir alt satıra geçemedi çünki hala plc'den cevap almayı bekliyor. Peki bu esnada neler oluyor, program aynı noktada kalıyor form tarafında dahi hiç mir nesneye dokunamayıyoruz butonlar formlar dahi donmuş durumda, ki programı kapatmak istediğimizde dahi klasik ms windows hata mesajıyla karşılaşırız "Program cevap vermiyor yinede kapatmak istiyormusunuz !". Bu sorunların önüne geçmek için thread kullanılır, thread içerisinde çalışan prosedürler programımızdan tamamen bağımsız yürütüldüğünde, o prosedör içerisinde çalışan kısımların işlemlerinin uzun sürmesi, programın geri kalanını ilgilendirmez yani program içerisinde thread sayesinde aynı anda bir fazla kod çalışabilir.
 

seagate

Profesyonel Üye
Katılım
27 Şub 2007
Mesajlar
1,786
Puanları
283
Konum
IZMIR
Kısaca dilim döndüğünce şöyle anlatayım. Örnek olarak plc'mizi bir sorgu ancak haerhangi bir nedenden dolayı plc'mize sorgu ulaşmadı ve işlem beklediğimizden uzun sürdü ki, bizim kodlarımız satır satır olduğundan dolayı programımız bir alt satıra geçemedi çünki hala plc'den cevap almayı bekliyor. Peki bu esnada neler oluyor, program aynı noktada kalıyor form tarafında dahi hiç mir nesneye dokunamayıyoruz butonlar formlar dahi donmuş durumda, ki programı kapatmak istediğimizde dahi klasik ms windows hata mesajıyla karşılaşırız "Program cevap vermiyor yinede kapatmak istiyormusunuz !". Bu sorunların önüne geçmek için thread kullanılır, thread içerisinde çalışan prosedürler programımızdan tamamen bağımsız yürütüldüğünde, o prosedör içerisinde çalışan kısımların işlemlerinin uzun sürmesi, programın geri kalanını ilgilendirmez yani program içerisinde thread sayesinde aynı anda bir fazla kod çalışabilir.
CPU ile haberleşmek kolay :) , PN-IRT olayına geçtikleri an "zamanında biri söylemişti" diyeceklerinden emin olabilirsiniz.
Edit: Gönderme ve alma ayrı süreç olmak zorunda çünkü ileride aynı anda farklı paketler göndermeniz gerekir. Ayrıca örneklerdeki gibi bir haberleşme yapmak biraz angaryadır. Mesele sadece IO kontrol etmek değildir. Alarmlar, değişen donanımlar, değişen ağlar, daha bir çok sebepten dolayı ethernet kartınızı donanım seviyesinde kullanmanız gerekecek(RAW olarak).
 

eskalen46

Üye
Katılım
20 Nis 2009
Mesajlar
20
Puanları
1
Yaş
37
CPU ile haberleşmek kolay :) , PN-IRT olayına geçtikleri an "zamanında biri söylemişti" diyeceklerinden emin olabilirsiniz.
Edit: Gönderme ve alma ayrı süreç olmak zorunda çünkü ileride aynı anda farklı paketler göndermeniz gerekir. Ayrıca örneklerdeki gibi bir haberleşme yapmak biraz angaryadır. Mesele sadece IO kontrol etmek değildir. Alarmlar, değişen donanımlar, değişen ağlar, daha bir çok sebepten dolayı ethernet kartınızı donanım seviyesinde kullanmanız gerekecek(RAW olarak).
Seagate Kardeş,
Bu söylediğin şeyleri biraz açar mısın?
Bu konuda geçmiş yıllarda arkadaşlarımın paylaşmış olduğu örnekler demode mi oldu diyorsunuz.
 
Katılım
4 May 2014
Mesajlar
1
Puanları
1
Merhabalar Arkadaşlar,

Libnodave kullanarak 4 adet PLC'ye ethernet üzerinden bağlanıyorum ve veri okuyabililyorum.
Ancak rastgele bir zamanda Read -Write protected memory şeklinde bir hata alıyorum konuyla ilgili yardımcı olabilir misiniz?

Saygılarımla
 

ssheec

Üye
Katılım
18 Eki 2017
Mesajlar
1
Puanları
1
Yaş
29
Aşağıdaki belge Rs 232 ile çalışan ve LibNoDave tarafından örnek olarak verilen örnektir. Bilgisayarınız comport ve haberleştiğiniz plc nin haberleşme bilgileri ile birlikte okumak ve yazmak istediğiniz birkaç data registeri yazarsanız sanırım size yardımcı olabilirim.


Kod:
Using System;
class test {
    static libnodave.daveOSserialType fds;
    static libnodave.daveInterface di;
    static libnodave.daveConnection dc;
    static int localMPI=0;
    static int plcMPI=2;
    public static int Main (string[] args)
    {
    int i,a=0,j,res,b=0,c=0;
    float d=0;

        fds.rfd=libnodave.setPort(args[0],"38400",'O');
    fds.wfd=fds.rfd;
        if (fds.rfd>0) {
        di =new libnodave.daveInterface(fds, "IF1", localMPI, libnodave.daveProtoMPI, libnodave.daveSpeed187k);
            di.setTimeout(1000000);
        res=di.initAdapter();
        if(res==0) {
        dc = new libnodave.daveConnection(di,plcMPI, 0, 0);
        if (0==dc.connectPLC()) {
            res=dc.readBytes(libnodave.daveFlags, 0, 0, 16, null);
            if (res==0) {
                a=dc.getS32();   
                b=dc.getS32();
                c=dc.getS32();
            d=dc.getFloat();
            Console.WriteLine("FD0: " + a);
            Console.WriteLine("FD4: " + b);
            Console.WriteLine("FD8: " + c);
            Console.WriteLine("FD12: " + d);
            } else
            Console.WriteLine("error "+res+" "+libnodave.daveStrerror(res));
        }
        dc.disconnectPLC();
        }       
        di.disconnectAdapter();
        libnodave.closePort(fds.rfd);
    } else {
        Console.WriteLine("Couldn't open serial port "+args[0]);
        return -1;
    }   
    return 0;
    }
}

Merhaba, yukarıdaki kodu kendi projemde kullandığımda hata alıyorum. Hata şu : "Index was outside the bounds of the array." Çözemedim. Yardımcı olabilir misiniz ? Bilgisayarıma plc'yi usb ile bağladım ve set PG ayarlarında usb'yi seçtim.

Ekli dosyayı görüntüle 10410

ayarları resimdeki gibi yaptıysanız ve plc ip adresini (cp x43-1) adresini dogru girdiyseniz baglanabilmeniz lazım.

ayrıca ilgili ayarlarda gözüken datablok yada sizin yuklediğiniz herhangi bir datablock plc ye yuklenmiş olmalıdır.

yoksa olmayan bir datayı okuyamazsınız.

bir de 102 nolu portun kullanılmıyor olması lazım.


siemens iepg adlı(ismi bunun gibi birşey) bir servis var onu gecici olarak (eger çalışıyorsa) durdurmalısınız.


iyi çalışmalar.
merhaba. sizin demo ile ppi kablo ile okumaya çalıştığımda bağlanıyor ve hemen kesiyor. veri okunamadı diyor. burada datablock ayarları ve diğer ayarlar nasıl olması gerekiyor ?
 
Moderatör tarafında düzenlendi:

scorpio09

Üye
Katılım
28 Tem 2017
Mesajlar
1
Puanları
1
Yaş
29
Merhaba, libnodave ile plcyle bağlantı kurabilmem için önce tia portaldan bağlantı kurmam gerekiyor. Doğrudan c# tan yaptığımız programla bağlanmanın yolu var mı veya ben hatalı birşey mi yapıyorum.
 

Sponsor Bağlantı

Forum istatistikleri

Konular
105,609
Mesajlar
743,885
Kullanıcılar
392,533
Son üye
ad9199

Yeni konular

Üst