23 Ekim 2012 Salı

C# ile OPC Bağlantısı ve Uygulama Geliştirmek

Bir önceki yazıda Opc Server kurulumu ve test için birkaç değişken eklemeyi gördük.
Şimdi bir C# projesi oluşturup bu değişkenleri okuyup yazma işlemi yapacağız.

İlk önce OPC apilierini referanlara ekleyelim.


Aşağıdaki kodu adm adım inceleyelim.


  Opc.Da.Server server = null;

        OpcCom.Factory fact = new OpcCom.Factory();

        Opc.Da.Item[] items;

        Opc.Da.Subscription group;

        Opc.IRequest req;

        Opc.Da.WriteCompleteEventHandler WriteEventHandler;

        Opc.Da.ReadCompleteEventHandler ReadEventHandler;


//Networkteki OPC serverların listesin getiren fonksiyon



private void GetOpcServers()

        {

            try

            {

                OpcCom.ServerEnumerator se = new OpcCom.ServerEnumerator();



                Opc.Server[] servers = se.GetAvailableServers(Opc.Specification.COM_DA_20);



                ListServers(servers);

            }

            catch (Exception)

            {

                throw;

            }

        }



//OPC Server connection stringlerini hazırlayan fonksiyon



private void ListServers(Opc.Server[] OpsServerList)

        {

            trwServers.Nodes.Clear();

            lstUrlList.Items.Clear();

            foreach (Opc.Server serv in OpsServerList)

            {

                TreeNode trn = new TreeNode(serv.Name);

                trn.Nodes.Add(serv.Url.HostName + " : " + serv.Url.Path + " : " + serv.Url.Port);

                trn.Nodes.Add(serv.Url.ToString());

                trn.Nodes.Add(serv.IsConnected.ToString());

                trwServers.Nodes.Add(trn);

                lstUrlList.Items.Add(serv.Url.ToString());

            }

        }


Aşağıda bağlanabileceğimiz OPC server listeleri ve bağlantı stringleri gözükmektedir.



        private bool ConnectOPCServer(string OpcUrl)

        {

            // Create a server object and connect to the TwinCATOpcServer

            Opc.URL url = new Opc.URL(OpcUrl);

          

            server = new Opc.Da.Server(fact, null);



            try

            {

                server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));

            }

            catch (Exception Ex)

            {

                MessageBox.Show(Ex.Message);

                return false;

            }



            // Okuma Grubu

            Opc.Da.SubscriptionState groupState = new Opc.Da.SubscriptionState();

            groupState.Name = "Group1";

            groupState.Active = true;





            group = (Opc.Da.Subscription)server.CreateSubscription(groupState);

            group.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged);





            // Gruba 3 adet OPC değişkeni ekle

            items = new Opc.Da.Item[3];

            items[0] = new Opc.Da.Item();

            items[0].ItemName = "Bucket Brigade.Int1";

            items[1] = new Opc.Da.Item();

            items[1].ItemName = "Bucket Brigade.Int2";

            items[2] = new Opc.Da.Item();

            items[2].ItemName = "Bucket Brigade.Int3";

            items = group.AddItems(items);



            //Write Callback fonksiyonumuzu tutacak handler

            WriteEventHandler = new Opc.Da.WriteCompleteEventHandler(WriteCompleteCallback);

             //Read Callback fonksiyonumuzu tutacak handler

            ReadEventHandler = new Opc.Da.ReadCompleteEventHandler(ReadCompleteCallback);



            return true;

        }



        void group_DataChanged(object subscriptionHandle, object requestHandle, Opc.Da.ItemValueResult[] values)

        {

            foreach (Opc.Da.ItemValueResult chitem in values)

            {

                WriteLogList(chitem.ItemName + " : " +

                                chitem.ItemPath + " : " +

                                chitem.Key + " : " +

                                chitem.Value);

            }

        }





        void WriteLogList(string item)

        {

            lstLog.BeginInvoke((MethodInvoker)delegate

            {

                lstLog.Items.Insert(0, item);

            });

        }



        void WriteCompleteCallback(object clientHandle, Opc.IdentifiedResult[] results)

        {



            WriteLogList("Write completed");

            foreach (Opc.IdentifiedResult writeResult in results)

            {

                WriteLogList(writeResult.ItemName + " : " + writeResult.ResultID);

            }



        }



        void ReadCompleteCallback(object clientHandle, Opc.Da.ItemValueResult[] results)

        {

            WriteLogList("Read completed");

            foreach (Opc.Da.ItemValueResult readResult in results)

            {

                WriteLogList(readResult.ItemName + " : " + readResult.Value);

            }

            Console.WriteLine();

        }



        private void Form1_Load(object sender, EventArgs e)

        {

            GetOpcServers(); 

        }



      



        private void button4_Click(object sender, EventArgs e)

        {

            if (server.IsConnected)

            {

                MessageBox.Show("connected");

            }

        }



        private void btnConnect_Click(object sender, EventArgs e)

        {

            if ((server != null) && (server.IsConnected))

                server.Disconnect();



            if (lstUrlList.SelectedItems.Count != 0)

                ConnectOPCServer(lstUrlList.SelectedItem.ToString());

        }



        private void btnWrite_Click(object sender, EventArgs e)

        {

            Opc.Da.ItemValue[] iv = new Opc.Da.ItemValue[group.Items.Count()];

            Random rnd = new Random();





            for (int i = 0; i < group.Items.Count(); i++)

            {

                Opc.Da.ItemValue iiv = new Opc.Da.ItemValue(group.Items[i].ItemName);

                iiv.ItemPath = group.Items[i].ItemPath;

                iiv.ServerHandle = group.Items[i].ServerHandle;

                iiv.Value = rnd.Next(1,1000);

                iv[i] = iiv;

            }



            //group.Write(iv);

            //Asenkron

            group.Write(iv, 1234, WriteCompleteCallback, out req);

        }



        private void btnRead_Click(object sender, EventArgs e)

        {

            //group.Read(group.Items);

            //and now read the items again

            group.Read(group.Items, 123, ReadCompleteCallback, out req);

        }



Örnek programı indirmek için

50 yorum:

  1. Doğan Bey, çok işime yaradı bu proje , çok teşekkürler , paylaşım tekliflerini de çok çabuk kabul ettiğiniz içinde ayrıca teşekkürler :)

    YanıtlaSil
    Yanıtlar
    1. İşinize yaradığına çok sevindim. Projenizde başarılar...

      Sil
    2. hocam cok teşekkür ederim sizden ricam visual studio 2010 silverlight kullanıyorum silverlihgt ve opc haberleşmesi hakkında yardımcı olurmusunuz

      Sil
  2. Bloğunuzu gördüğüme ben de çok sevindim. Gerçekten çok fayadalı bir çalışma yapmışsınız. Rica etsem bana da örnek kodu indirmek için requestime cevap verebilir misiniz.

    YanıtlaSil
    Yanıtlar
    1. Verdim Volkan Bey kolay gelsin.

      Sil
    2. Çok teşekkür ederim doğan bey, formunuzu merakla takip edeceğim.

      Sil
  3. kolay gelsin web service veya wcf servis hakkında bilginiz varmı
    bu kodları web serviste kullanamadım yardım edermisiniz

    YanıtlaSil
    Yanıtlar
    1. DLL leri referans ettiğinizde hata mı aldınız?
      Wcf servisinizi geliştirirken hata aldığınız yeri söylerseniz daha sağlıklı yardımcı olabilirim.

      Sil
    2. hocam dll referansta skıntı olmadı sizin örneğin kodlarını
      windows service,Wcf service ile kullanamadım

      Sil
  4. merhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz.

    YanıtlaSil
  5. doğan bey opc hakkında çok güzle bilgiler paylaşmıssınız. ama malesef indiremiyorum.yardımcı olurmusunuz?

    YanıtlaSil
    Yanıtlar
    1. işinize yaradığına sevindim. Paylaşrım mesut bey kolay gelsin.

      Sil
    2. doğan bey paylaşım için tesekkürler. çalışmalarınızda başarılar dilerim.

      Sil
  6. merhaba dogan bey, requestime cevap verirseniz cok memnun olurum. calismalarinizda basarilar dilerim.

    YanıtlaSil
  7. Doğan Bey,
    Bloğunuza bayıldım. Rica etsem örnek kodu indirebilmek için requestimi onaylarmısınız?
    Kolay gelsin

    YanıtlaSil
  8. Doğan Bey Selamlar. Ben Delphi ile yazılım yapıyorum. Ancak OPC uygulamaları deneyilerim dışında. Aslında benim yapmak istediğim Siemens marka ProfiNet ile NetWork (RJ45 jack) üzerinden veri (metraj bilgisi) okumak. Bunun için OPC client uygulamasına gerek var mı ? Yoksa Delphi'nin ClientSocket connection'unu kullanarak IP adresi ve portu üzerinden PLC'ye bağlanıp bilgi okuyabilir miyim ?

    YanıtlaSil
    Yanıtlar
    1. Veri aldığınız cihaz size bu bilgiyi bahsi geçen protokol üzerinde gönderecekse tabiki yapabilirsiniz. Uygulamarda OPC server bahsi geçen çoğu protokol için ortak platform oluşturmaktadır.

      Sil
    2. Doğan bey Merhaba. Sahada deneme yaptım ama TCP/IP protokolü bu iş için yeterli olmadı. İşi yaptırmak isteyen firmadan bir kişi www.traeger.de adlı bir siteden bahsetti. Sitede Delphi için yazılmış kaynak kodlar buldum ve çalıştırdım. Tam bu iş oldu derken kaynak kod tarafından kullanılan bir dll (IPS7LNK.DLL) adında bir dosya, Bu program "Demo is over" yazarak artık lisans almadan çalışmayacağını bildirdi. Traeger firmasına e-posta yazdım. Lisans bedeli için 3067 Euro istiyorlar. OPC server uygulamasını ise hiç denemedim. Sizin öneriniz var mı acaba. Bu iş için bir yazılım satın almam gerekecekse bunu yapabilirim ancak 3067 Euro oldukça fazla geldi.
      Önerilerinizi bekliyorum.
      Teşekkürler.

      Sil
    3. Merhaba, PLC S7 serisi mi ?

      Sil
  9. Doğan Bey Merhaba, yazılarınız çok başarılı ve faydalı, böylesi önemli bir konu hakkında bilgi paylaşımı yaptığınız için teşekkür ederim.
    Bir sorum olacak, Anlatımını yaptığınız OPC Server api'si ile ilgili lisans olayı var mı ? Projede kullanırsak ileride lisans sorunu çıkarır mı acaba ?

    YanıtlaSil
    Yanıtlar
    1. Hiç bir lisans sıkıntısı yaşamazsınız. https://opcfoundation.org/developer-tools/developer-kits-classic daha detaylı bilgi alabilirsin. Kolay Gelsin.

      Sil
  10. Dogan Bey,
    Oncelikle yazinizdan dolayi tesekkur ederek, okuma programina ait kodu ben de rica edebilir miyim?

    Kolay Gelsin,

    YanıtlaSil
  11. Dogan Bey,
    Paylasiminiz icin tesekkur ederim, iyi calismalar dilerim,

    YanıtlaSil
  12. Doğan Bey, OPC server ile haberleşmem gerekiyor. Delphi 7.0 kullanıyorum. Nasıl yapabilirim ?

    YanıtlaSil
    Yanıtlar
    1. Merhaba, Delphi ile kullanılan komponentler mevcut... veya dolaylı yoldan c# ile geliştirdiğin uygulamayla server - socket iletişimi yazabilirsin.

      Sil
  13. Doğan Bey merhaba,
    Öncelikle türkiyede otomasyonu ve .neti birleştiren yayın bulmak cidden zor.
    Çoğu insan olayı sadece plcde kod yazmak sanıyor.
    Emeğiniz için teşekkler

    YanıtlaSil
  14. Daha programı indiremesem de çok kişinin beklediği ve işine yarayacak bir yazı olmuş.
    Gerçekten elinize sağlık

    YanıtlaSil
  15. doğan bey merhaba merge modul nasıl açılır kısa açıklayabilirmisiniz.

    YanıtlaSil
    Yanıtlar
    1. REQUEST Gönderdim onaylayabilirmisiniz.
      Bende SCADA uygulamaları geliştiriyorum. OPC ilk defa kullanacağım, daha önceden hep TCP ile bağlantı kuruyordum PLC ler ile

      Sil
    2. Merge modülü açtım sıkıntı yok ABB PLC ye bağlanmaya çalışıyorum ...

      Sil
  16. doğan bey merhaba Request için teşekkürler.
    Tamam herşey güzel ben haberleştim fakat tag lerin adını bilmeden PLC tarafında ne varsa getir yapabilirmiyiz asıl mesele onu yapmak (Matrikon ve kep te var)

    YanıtlaSil
  17. merhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz.

    YanıtlaSil
  18. Doğan bey çok güzel bir örnek olmuş. Uzun zamandır request gönderiyorum, fakat cevap yok. Rica etsem örnek programı indirmek için request ime cavap verir misiniz? Teşekkürler.

    YanıtlaSil
  19. Merhaba Doğan Bey, rica etsem requeste cevap verirmisiniz?

    YanıtlaSil
  20. Doğan bey emeğinize sağlık çok faydalı bir çalışma olmuş.
    Request gönderdim cevap verirmisiniz ?

    YanıtlaSil
  21. Çok güzel bir çalışma olmuş, tebrik ederim. Örnek kod için talebimi onaylarsanız çok sevinirim.

    YanıtlaSil
  22. Could not load file or assembly 'OpcRcw.Comn, Version=1.10.1.21, Culture=neutral, PublicKeyToken=9a40e993cbface53' or one of its dependencies. Bu hata nedir?

    YanıtlaSil
  23. Merhaba Doğan bey, Requestime cevap verirseniz cok memnun olurum. tebrikler, calismalarinizda basarilar dilerim.

    YanıtlaSil
  24. Sayın hocam merhaba,

    Örnek kodunuzu incelemek adına bir talep gönderdim, uygunluk verebilirseniz sevinirim.
    Teşekkürler.

    YanıtlaSil
  25. Merhabalar. Örnek kod için göndermiş olduğum isteği onaylarsanız sevinirim.

    Örnek uygulama ve anlatım için teşekkürler.

    YanıtlaSil
  26. merhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz.

    YanıtlaSil
  27. merhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz. eyazilim@gmail.com

    YanıtlaSil
  28. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  29. Merhaba Erişim izni edinemedim yardımcı olabilir misiniz (bilalikbalpolat@gmail.com )

    YanıtlaSil
  30. Merhaba dosyayı indirmek için erişim izni gerekli yardımcı olurmusunuz

    YanıtlaSil
  31. Merhaba Doğan Bey bu mevcut dll'lerle sıkıntı yaşıyorum benzer sıkıntıyı siz yaşadıysanız çözüm yolunu paylaşmanız mümkün mü ? Aldığı hata bu ---> System.Runtime.InteropServices.ExternalException: 'CoCreateInstanceEx: Class not registered

    YanıtlaSil
  32. merhaba opc ile c# bağlarken System.IO.FileNotFoundException: ''OpcRcw.Comn, Version=1.10.2.0, Culture=neutral, PublicKeyToken=9a40e993cbface53' dosyasını veya bütünleştirilmiş kodunu ya da bağımlılıklarından birini yükleyemedi. Sistem belirtilen dosyayı bulamıyor.' hatasını alıyorum yardımcı olursanız çok sevinirim

    YanıtlaSil