2011-02-07 2 views
1

Я использовал OPCDotNetLib, но не могу читать данные с удаленного OPC-сервера там.OPC Client - как читать с удаленного сервера OPC

Я могу соединиться, как

Type typeofOPCserver = Type.GetTypeFromProgID(clsidOPCserver, ip); 

Но глядя методы DataChanged или ReadCompleted не работает или работает неправильно.

Я тестировал его с локальным OPC-сервером, и он хорошо работает, с удаленным OPC-сервером, с которым я могу подключиться, я могу добавлять элементы и читать данные. OPC-сервер на удаленном компьютере показывает, что я их читаю, но я не вижу никаких данных. Похоже, мне нужно другое обходное решение для OPCDotNetLib для удаленного OPC-сервера.

Я даже нашел там комментарий

Эта библиотека/длл не будет работать на удаленном сервере, только локальное использование возможно.

Есть ли еще некоторые доступные библиотеки OPC-клиентов .NET?

ответ

9

У вас есть несколько вариантов совместимости с OPC. Вы можете использовать классические COM-обертки, предоставленные OPC Foundation, или вы можете использовать новую библиотеку OPC, предназначенную для .Net.

лично я не перешел на новую библиотеку еще, но это разрыв вниз, как использовать OpcNetApi.dll, OpcNetApi.Com.dll и OpcRcw.Da.dll инициализировать соединение и подписаться на DataChanged событие:

Opc.Da.Server scadaServer = null; 
List<Opc.Da.Item> scadaItems = null; 
Opc.Da.Subscription scadaSubscription = null; 

string scadaUrl = string.Format("opcda://{0}/{1}", hostname, 
                opcServerVendor); 

scadaServer = new Opc.Da.Server(new OpcCom.Factory(), new Opc.URL(scadaUrl)); 
scadaServer.Connect(); 

var scadaItems = new List<Opc.Da.Item>(); // I'm using a List<T>, but cast back to a simple array using ToArray(); 

// Repeat this next part for all the items you need to subscribe 
Opc.Da.Item item = new Opc.Da.Item(); 
item.ItemName = TagPath; // Where TagPath is something like device.channel.tag001; 
item.ClientHandle = handle; // handle is up to you, but i use a logical name for it 
item.Active = true; 
item.ActiveSpecified = true; 

scadaItems.Add(item); 

Opc.Da.SubscriptionState subscriptionState = new Opc.Da.SubscriptionState(); 
subscriptionState.Active = true; 
subscriptionState.UpdateRate = 40; 
subscriptionState.Deadband = 0; 

scadaSubscription = scadaSubscription ?? (Opc.Da.Subscription)scadaServer.CreateSubscription(subscriptionState); 

Opc.Da.ItemResult[] result = scadaSubscription.AddItems(scadaItems.ToArray()); 
for (int i = 0; i < result.Length; i++) 
    scadaItems[i].ServerHandle = result[i].ServerHandle; 

scadaSubscription.DataChanged += new Opc.Da.DataChangedEventHandler(OnDataChange); 
scadaSubscription.State.Active = true; 
+0

Так, но где я могу получить OpcNetApi.dll, OpcNetApi.Com.dll и OpcRcw.Da.dll? :(Я не платный член фонда OPC . – Cynede

+0

@nCdy вам понадобится '' OPC Redistributable 2.00' из уважаемого источника. В противном случае вы можете приобрести компонент Fleshed Out из такой компании, как Kepware или Matrikon. –

4

Я знаю, что это было время, но чтобы помочь тем, кому нужны библиотеки. Чтобы согласиться с ответом Грега Буэлера. Они бесплатны и являются частью основного OPC Foundation и могут быть найдены: here нажмите вкладку «Архивы», если вам нужны предыдущие версии. Мне потребовалось много времени, чтобы найти их, поэтому я надеюсь, что это может помочь кому-то.

Смежные вопросы