OPC Client - как читать с удаленного OPC-сервера - PullRequest
1 голос
/ 07 февраля 2011

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

Я могу подключиться, как

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

Но поиск методов DataChanged или ReadCompleted не работает или работает неправильно.

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 07 февраля 2011

У вас есть несколько вариантов совместимости с 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;
4 голосов
/ 29 августа 2014

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

...