OPC Nedir ? etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
OPC Nedir ? etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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

21 Ekim 2012 Pazar

OPC (OLE for process control) Nedir 2 ?



Opc haberleşmesi kaynak cihazın Opc Servera bağlanması ile başlamaktadır.
Bu bağlantı farklı Modbus, PLC-5, Melsec-Q, ProfiBus ..vb gibi protokollerle gerçekleştirilir.
Opc Serverlar üreticinin geliştirdiği yazılımlar olabileceği gibi üçüncü parti bir yazılımda olabilir. Opc Servera bağlanıp hizmet alan her noktaya Opc client adı verilir.

Opc server ile denemeler yapmak için bir plc ye ihtiyacınız yok. Bu iş için denemelerinizi yapabileceğiniz Opc Server Simulatörler mevcut.

Benim örneklerimde kullandığımı indirmek için tıklayınız.

OPC.NET20 Api
OPC Client Program

İlk adım olarak OPC Simulatör kurulumunu gerçekleştirmelisiniz. Kurulum gerçekleştikten sonra opc server exploreri açıp aşağıdaki tanımlamaları yapmalısınız.




Çalışan Opc Serverların sol menüde gözükmesi gerekli. Bağlanmak istediğimizi seçiyoruz.
Connect düğmesine tıklıyoruz.



Opc Server üzerinde değişkenler Gruplanarak tutulurlar.
Bu yüzden bir adet grup ekleyip altına değişkenler tanımlamanız gerekli.



Grubun altına add items şeçeneğini seçerek istediğimiz test değişkenlerini ekleyebiliriz.
Simulation items altından sabit ve random değişkenler ekleyebilirsiniz.



Eklediğiniz sabit değişkenlere istediğiniz değerleri yazabilirsiniz.



Eklediğiniz sabit değerlere belirli zaman aralıklarında sürekli artan değerler atabilirsiniz.



Herhangi bir Opc Client ile bağlanmak istediğimiz opc serveri seçmelisiniz.



Az önce eklediğiniz grup adının aynısını buraya eklemelisiniz.



Grubun okunma zamanı ... gibi ayarlar seçilir.



Yine ilk server ekranından eklediğimiz tipte ve aynı isimde değişkenleri ekliyoruz. Değişkenlerin ekranda son değerleri ile gözükmesi gerekli.


Şimdilik bu kadar bir sonraki yazımız uygulama geliştirme ile ilgili olacak..