Ş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.
Aşağıda bağlanabileceğimiz OPC server listeleri ve bağlantı stringleri gözükmektedir.
Örnek programı indirmek için
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
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İşinize yaradığına çok sevindim. Projenizde başarılar...
Silhocam cok teşekkür ederim sizden ricam visual studio 2010 silverlight kullanıyorum silverlihgt ve opc haberleşmesi hakkında yardımcı olurmusunuz
SilBloğ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ıtlaSilVerdim Volkan Bey kolay gelsin.
SilÇok teşekkür ederim doğan bey, formunuzu merakla takip edeceğim.
Silkolay gelsin web service veya wcf servis hakkında bilginiz varmı
YanıtlaSilbu kodları web serviste kullanamadım yardım edermisiniz
DLL leri referans ettiğinizde hata mı aldınız?
SilWcf servisinizi geliştirirken hata aldığınız yeri söylerseniz daha sağlıklı yardımcı olabilirim.
hocam dll referansta skıntı olmadı sizin örneğin kodlarını
Silwindows service,Wcf service ile kullanamadım
merhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz.
YanıtlaSilverdim. kolay gelsin.
Sildoğan bey opc hakkında çok güzle bilgiler paylaşmıssınız. ama malesef indiremiyorum.yardımcı olurmusunuz?
YanıtlaSilişinize yaradığına sevindim. Paylaşrım mesut bey kolay gelsin.
Sildoğan bey paylaşım için tesekkürler. çalışmalarınızda başarılar dilerim.
Silmerhaba dogan bey, requestime cevap verirseniz cok memnun olurum. calismalarinizda basarilar dilerim.
YanıtlaSilDoğan Bey,
YanıtlaSilBloğunuza bayıldım. Rica etsem örnek kodu indirebilmek için requestimi onaylarmısınız?
Kolay gelsin
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ıtlaSilVeri 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.
SilDoğ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.
SilÖnerilerinizi bekliyorum.
Teşekkürler.
Merhaba, PLC S7 serisi mi ?
SilEvet.
SilDoğ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.
YanıtlaSilBir 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 ?
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.
SilDogan Bey,
YanıtlaSilOncelikle yazinizdan dolayi tesekkur ederek, okuma programina ait kodu ben de rica edebilir miyim?
Kolay Gelsin,
Dogan Bey,
YanıtlaSilPaylasiminiz icin tesekkur ederim, iyi calismalar dilerim,
Doğan Bey, OPC server ile haberleşmem gerekiyor. Delphi 7.0 kullanıyorum. Nasıl yapabilirim ?
YanıtlaSilMerhaba, Delphi ile kullanılan komponentler mevcut... veya dolaylı yoldan c# ile geliştirdiğin uygulamayla server - socket iletişimi yazabilirsin.
SilDoğan Bey merhaba,
YanıtlaSilÖ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
Daha programı indiremesem de çok kişinin beklediği ve işine yarayacak bir yazı olmuş.
YanıtlaSilGerçekten elinize sağlık
doğan bey merhaba merge modul nasıl açılır kısa açıklayabilirmisiniz.
YanıtlaSilREQUEST Gönderdim onaylayabilirmisiniz.
SilBende SCADA uygulamaları geliştiriyorum. OPC ilk defa kullanacağım, daha önceden hep TCP ile bağlantı kuruyordum PLC ler ile
Merge modülü açtım sıkıntı yok ABB PLC ye bağlanmaya çalışıyorum ...
Sildoğan bey merhaba Request için teşekkürler.
YanıtlaSilTamam 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)
merhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz.
YanıtlaSilDoğ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ıtlaSilMerhaba Doğan Bey, rica etsem requeste cevap verirmisiniz?
YanıtlaSilDoğan bey emeğinize sağlık çok faydalı bir çalışma olmuş.
YanıtlaSilRequest gönderdim cevap verirmisiniz ?
Çok güzel bir çalışma olmuş, tebrik ederim. Örnek kod için talebimi onaylarsanız çok sevinirim.
YanıtlaSilCould 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ıtlaSilMerhaba Doğan bey, Requestime cevap verirseniz cok memnun olurum. tebrikler, calismalarinizda basarilar dilerim.
YanıtlaSilSayın hocam merhaba,
YanıtlaSilÖrnek kodunuzu incelemek adına bir talep gönderdim, uygunluk verebilirseniz sevinirim.
Teşekkürler.
Merhabalar. Örnek kod için göndermiş olduğum isteği onaylarsanız sevinirim.
YanıtlaSilÖrnek uygulama ve anlatım için teşekkürler.
merhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz.
YanıtlaSilmerhabalar doğan bey rica etsem örnek kodu indirmek için request'ime cevap verebilir misiniz. eyazilim@gmail.com
YanıtlaSilBu yorum yazar tarafından silindi.
YanıtlaSilMerhaba Erişim izni edinemedim yardımcı olabilir misiniz (bilalikbalpolat@gmail.com )
YanıtlaSilMerhaba dosyayı indirmek için erişim izni gerekli yardımcı olurmusunuz
YanıtlaSilMerhaba 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ıtlaSilBu yorum yazar tarafından silindi.
Silmerhaba 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