1

OPCDotNetLibを使用しましたが、リモート OPC サーバーからデータを読み取ることができません。

のように接続できます

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

しかし、メソッド DataChanged または ReadCompleted を調べても機能しないか、正しく機能しません。

ローカル OPC サーバーで同じことをテストしましたが、うまく動作し、リモート OPC サーバーで接続でき、アイテムを追加し、データを読み取ることができます。リモート マシンの OPC サーバーは、それらを読み取ったことを示していますが、データが表示されません。リモート OPC サーバーの OPCDotNetLib で別の回避策が必要なようです。

そこにコメントも見つけました

このライブラリ / dll はリモート サーバーでは機能せず、ローカルでのみ使用できます。

別の利用可能な OPC クライアント .NET ライブラリはありますか?

4

2 に答える 2

10

OPC 互換性のためのいくつかのオプションがあります。OPC Foundation が提供する従来の COM ラッパーを使用するか、.Net 用に設計された新しい OPC ライブラリを使用できます。

個人的にはまだ新しいライブラリに切り替えていませんが、これはOpcNetApi.dllOpcNetApi.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;
于 2011-02-07T20:39:33.967 に答える