C# & S7300 ile C# Ethernet Haberleşmesi

Cevap için teşekkür ederim üstad benim çözümüm biraz daha farklı olmuştu bir göz gezdirebilirsen sevinirim. çünkü ne kadar doğru bir çözüm emin değilim.

int deger;
string I07;
string[] I0 = new string[8];

Program.dc.readBytes(libnodave.daveInputs, 0, 0, 1, null); //I 0.0 - I0.7
deger = Program.dc.getU8();
I07 = Convert.ToString(deger, 2);//Binary Dönüşümü


for (int i = 0; i < I07.ToString().Length; i++)
{
I0 = (I07.Substring(i, 1));
}

if (I0[0] == "1")
{
panelI00.BackColor = Color.Green;
}
else
{
panelI00.BackColor = Color.Gray;
}
 
Yazımızda endüstrinin can damarı sayılabilecek PLC’yi inceleyeceğiz.
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.
denediysen çalışıyorsa sorun yok. Convert to string kısmında sorun olacağa benziyor.. deger verisi 24 gibi bir değer alabilir. mesela I0.0 dan I0.7ye kadar olan bitlerden sadece I0.3 ve I0.4 1,gerisi 0 diyelim. deger = 24 olur. (8+16= 24)

dahası kodta sadece panelI00.BackColor var. panel I01.BackColor yok.

verdiğim linkte anlatıyor ben onu kullanarak yapmıştım.proje yanımda yok ama o kodu kullanarak yaptığıma eminim.
 
Üstad denedim problem çıktı tam anlamıyla çalıştığı söylenemez fakat bu iş için başka arkadaşların önerileri oldu bu öneriler gerçekten süper sizinle paylaşmak istiyorum çünkü bu dertden muzdarip bir çok arkadaş vardır umarım faydalı olur.

Altta ki çözüm eğer aynı metot altında çözüm istiyorsak bunu kullanabiliriz.

//1Byte'ı 8Bitlik degere dönüştürme
var I0 = Enumerable.Range(0, 8)
.Select(e => (I07 & (1 << e)) != 0)
.ToArray();

Kontrolüde şu şekilde yapabiliriz.

if (I0[0] == true)
{
panelI00.BackColor = Color.Green;
}
else
{
panelI00.BackColor = Color.Gray;
}


Diğer bir çözümümüzde extension method ekleyerek yapılıyor yeni bir class oluşturuyoruz.

public static class MyExtensions
{
public static bool BitKontrol(this int Değer, int BitNo)
{
return (Değer & (1 << BitNo)) == (1 << BitNo);
}
}


Bu classı istediğimiz yerde kullanabiliriz mesela benim ana programımda şu şekilde kullandım.

if ( I07.BitKontrol(2)== true)
{
panelI02.BackColor = Color.Green;
}
else
{
panelI02.BackColor = Color.Gray;
}


Hangi yöntem işinizi görürse onu kullanabilirsiniz.

Pokajy üstad şimdi sen tek seferde 200küsür byte okuyabiliyorum demiştin. Artık o adıma geçmem gerekiyor bunu tek seferde nasıl yaptığını biraz anladım sanırım. sen verileri dbye move (aktarıp) ordan çekiyorsun peki libnodave'de hangi komutla çekiyorsun bunuda paylaşırsan sevinirim.
 
real time veri okumalarda sıkıntılı olacağını düşünüyorum. sadece libnodave ktüphanesi ile çözüm olmaz. İstenilen değeri okursun ama real time değer okumalarda problem olacaktır. c# bilmeden hazır okuma sistemini alsan bile istediğin verimlilikte çalışmayacaktır. Günümüzde artık winForm uygulamaları kullanılmamaya başladı. Tavsiye olarak WebServer ile Scada sistemi yapmak daha mantıklı. Tabi bunun içinde web bilgisi gerektiriyor. Verileri kayıt altına alacaksanız. ASP.NET veya PHP gibi diller kullanarak verileri veri tabanına kayıt edebilirsiniz.

S7 Web Server HTML5 Tutorial
 
Son düzenleme:
Selam,

Libnodave bende kullanıyorum. Oldukça güzel oluyor. Kendi scada nı kendin yap mantığı.

Senkronizasyon için;
Döngünüyü timer tick e koyup başına timer1.stop() sonunada timer1.start() eklenirse kararlı bir çalışma sağlıyor. 20 komutla falan denedim. Bi sıkıntı yaratmadı.
 
Arkadaslar vb projede ornek db68.dbw8 datasini gormek icin nasil bir kodlama yazmam gerekiyor.
 
Bu konuyu gördüğüm çok iyi oldu ya arkadşalar bende PLC ile çalışmak istyiyorum acaba bilgisayarda similatör olarak kurup c# ile gerçekmiş gibi bağlanıp çalışabileceğim daha doğrusu test ortamı oluşturabilieceğim bir program varmıdır?
 
Kod:
public static libnodave.daveOSserialType fds;
        public static libnodave.daveInterface di;
        public static libnodave.daveConnection dc;
        public static int rack = 0;
        public static int slot = 2;
        string ipadres = "192.168.16.155";

        byte[] boy = new byte[256];
       // int[] tag = new int[64];
        double[] tag = new double[64];
        int[] res = new int[16];

        private void MainForm_Load(object sender, EventArgs e)
        {
            baglan();
        }
        private void baglan()
        {


            try // ip adresine 102. portan bağlantı kurulablir ise
            {
                fds.rfd = libnodave.openSocket(102, ipadres);
            }
            catch { Slbl1.Text = ipadres + " 'e ulaşılamadı"; }
            fds.wfd = fds.rfd;
            di = new libnodave.daveInterface(fds, "FD1", 0, libnodave.daveProtoISOTCP, libnodave.daveSpeed187k);
            di.setTimeout(5000); //50 saniye
            dc = new libnodave.daveConnection(di, 0, rack, slot);
            try
            {
                if (fds.rfd > 0) //Eğer Bağlantı Başarılı ise
                {
                    if (0 == dc.connectPLC())
                    {
                        Slbl1.Text = ipadres + " Ye Bağlı Durumdasınız";
                        //timer1.Enabled = true;
                    }
                    else
                    {
                        Slbl1.Text = "Bağlantı Başarısız";
                    }
                }
                else
                {
                    Slbl1.Text = "Bağlantı Başarısız";
                }
            }
            catch { Slbl1.Text = "Çok Acayip bir Hata Oluştu"; }
        }
        private void kopar()
        {
            if (fds.rfd > 0) //Eğer Bağlantı Başarılı ise
            {
                if (0 == dc.connectPLC())
                {
                    try
                    {
                        libnodave.closePort(fds.wfd);
                        di.disconnectAdapter();
                        dc.disconnectPLC();
                    }
                    catch { }
                    Slbl1.Text = " Plc Bağlantınızı sonlandırdınız";
                }
            }
        }
Kodları inceleyin Takıldığınız yerde elimden geldiğince yardımcı olmaya çalışıcam.
Libnodave Docs klasöründeki bilgileri gözden geçirmenizi öneririm.


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.
 
Multi thread ve cros thread konularını bir araştır.
 

Forum istatistikleri

Konular
128,118
Mesajlar
915,148
Kullanıcılar
449,822
Son üye
hamidettin

Yeni konular

Geri
Üst