2011-02-07 15 views
1

J'ai utilisé OPCDotNetLib mais je ne peux pas y lire les données du serveur OPC distant.Client OPC - comment lire à partir du serveur OPC distant

je peux connecter, comme

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

Mais en regardant les méthodes DataChanged ou ReadCompleted ne fonctionne pas ou fonctionne mal.

J'ai testé la même chose avec le serveur OPC local et cela fonctionne bien, avec le serveur OPC distant que je peux connecter, je peux ajouter des éléments et lire des données. Le serveur OPC sur l'ordinateur distant montre que je les ai lus, mais je ne vois aucune donnée. On dirait que j'ai besoin d'une autre solution de contournement sur OPCDotNetLib pour le serveur OPC distant.

J'ai même trouvé un commentaire il

Cette bibliothèque/dll ne fonctionnera pas sur un serveur distant, seule l'utilisation locale est possible.

Existe-t-il une autre bibliothèque OPC Client .NET disponible?

Répondre

9

Vous avez quelques options pour la compatibilité OPC. Vous pouvez utiliser les encapsuleurs COM classiques fournis par OPC Foundation, ou vous pouvez utiliser la nouvelle bibliothèque OPC conçue pour .Net.

Je n'ai pas personnellement changé encore plus à la nouvelle bibliothèque, mais cela est une ventilation de l'utilisation OpcNetApi.dll, OpcNetApi.Com.dll et OpcRcw.Da.dll pour initialiser une connexion et abonnez-vous à l'événement 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

Alors, mais où puis-je obtenir OpcNetApi.dll, OpcNetApi.Com.dll et OpcRcw.Da.dll? :(Je ne suis pas payé membre de l'OPC Foundation – Cynede

+0

@nCdy vous aurez besoin du 'OPC Redistributable 2.00' d'une source fiable, sinon vous pouvez acheter un composant élaboré par une société comme Kepware ou Matrikon. –

4

Je sais que cela a pris du temps mais pour aider ceux qui ont besoin des bibliothèques. Pour aller avec Greg Buehlers répondre. Ils sont gratuits et font partie de la Fondation OPC de base et peuvent être trouvés here cliquez sur l'onglet Archives si vous avez besoin des versions précédentes. Cela m'a pris pour toujours de les trouver alors j'espère que cela peut aider quelqu'un.

Questions connexes