C# & S7300 ile C# Ethernet Haberleşmesi

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:
KNX Standardı, küçük bir rezidansın içerisindeki aydınlatma, perde panjur, klima kontrolünden, Dünya’nın en büyük havalimanlarındaki aydınlatma otomasyonu gibi çözümler için tercih edilen bir Dünya standardıdır.
Yazımızda endüstrinin can damarı sayılabilecek PLC’yi inceleyeceğiz.
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.
 
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).
 
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.
 
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
 
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:
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.
 
Merhabalar. Usb Mpi çevirici ile Mpi bağlantı sağlayamadım Yukarda com portlarla ilgili bağlantıyı vermişsiniz libnodave de de bu örnek var fakatbaşarılı olamadım. S7Net veya Sharp7 ile bir bağlantı yapabilir miyim onlarada baktım fakat MPI ile ilgili bir bağlantı yapısı göremedim.

Plc S7 300 315 2dp Sizin yapmış olduğunuz projeden bağlantı sağlayıp kullanabiliyorum. fakat MPI da bağlantıyı usb çevirici ile nasıl yapıldığını çözemedim. Set PG de PC Adapter MPI olarak seçili
sizin projede PG PC S7 online kısmı seçili şekilde bağlanıyorum bu kısmın bağlantı yapısını nerden bulabilirim.
Teşekkürler.
 
Uzun uğraşlar sonucu USb den S7 Online olarak bağlantıyı başardım. Teşekkürler.
bide şu data gönderirken adresleri nasıl belirliyoruz.
dc.writeBits(libnodave.daveFlags, 0, 8, 1, array1); M1.1 demiş ustamın biri bu adrese yazdığımda m1.1 e yazıyor doğru peki neye göre m1.1 oluyor ?

//------------------------------------------------
Referans olarak libnodave.net i ekleyin
proje dosyasına libnodave.net.dll ve libnodave.dll leri ekleyin.
netframeworks 3.5 de çalıştırdım ve programı x86 da derleyin.
okuma ve yazma parametreleri doc klaserinde var fakat yukardaki örnekten de bulabilirsiniz.
Örnek USB Mpi çevirici ile yapıldı. Set PG den PC Adaptör MPI seçili olacak.
iyi çalışmalar.
Kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace USBtoPLC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
connetti();
}

private void Form1_Load(object sender, EventArgs e)
{


}
private bool initSuccess = false;
static libnodave.daveOSserialType fds;
static libnodave.daveInterface di;
static libnodave.daveConnection dc;
static int localMPI = 0;
static int plcMPI = 2;
static string s7online = "S7ONLINE";
private int connetti()
{
int i, a = 0, j, res, b = 0, c = 0;
float d = 0;
byte[] buf1 = new byte[libnodave.davePartnerListSize];


fds.rfd = libnodave.openS7online(s7online);
fds.wfd = fds.rfd;
if (fds.rfd >= 0)
{
di = new libnodave.daveInterface(fds, "IF1", localMPI, libnodave.daveProtoS7online, libnodave.daveSpeed187k);
di.setTimeout(1000000);
for (i = 0; i < 3; i++)
{
if (0 == di.initAdapter())
{
initSuccess = true;
a = di.listReachablePartners(buf1);
MessageBox.Show("daveListReachablePartners List length: " + a);
if (a > 0)
{
for (j = 0; j < a; j++)
{
if (buf1[j] == libnodave.daveMPIReachable)
MessageBox.Show("Device at address: " + j);

}
}
label1.Text = "Bağlantı Açık";
break;
}
else di.disconnectAdapter();
}
if (!initSuccess)
{
MessageBox.Show("Couldn't connect to Adapter!.\n Please try again. You may also try the option -2 for some adapters.");
return -3;
}

dc = new libnodave.daveConnection(di, plcMPI, 0, 0);

return dc.connectPLC();

}
else
{
MessageBox.Show("Couldn't open s7 online ");
return -1;
}
}

private void button1_Click(object sender, EventArgs e)
{
byte[] array1 = new byte[1];
array1[0] = 1;
// dc.writeBits(libnodave.daveFlags, 0, 8, 1, array1); //q1.0 Start biti 0 ise M0 8 ise M1 16 ise M2
// dc.writeBits(libnodave.daveOutputs, 0, 0, 1, array1); // Q0.0
// dc.writeBits(libnodave.daveOutputs, 0, 8, 1, array1); // Q1.0
// dc.writeBits(libnodave.daveOutputs, 0, 10, 1, array1); // q1.1
dc.writeBits(libnodave.daveOutputs, 0, 12, 1, array1); // q1.3
}

private void button2_Click(object sender, EventArgs e)
{
byte[] bArr = new byte[0];
// dc.writeBits(libnodave.daveFlags, 0, 8, 1, bArr);
// dc.writeBits(libnodave.daveOutputs, 0, 8, 1, bArr); //m1.0
dc.writeBits(libnodave.daveOutputs, 0, 8, 1, bArr);
}

private void button3_Click(object sender, EventArgs e)
{
di.disconnectAdapter();
libnodave.closeS7online(fds.rfd);
GC.Collect();
GC.WaitForPendingFinalizers();
label1.Text = "Bağlantı Kapalı";
}

private void button4_Click(object sender, EventArgs e)
{
connetti();
}
}

}




//------------------------------------------------
 
Moderatör tarafında düzenlendi:

Forum istatistikleri

Konular
127,969
Mesajlar
913,977
Kullanıcılar
449,614
Son üye
Canipk

Yeni konular

Geri
Üst