2014-10-09 92 views
0

我正在使用OpcNetApi與kepware進行通信。我嘗試從kepware中讀取一些值(超過40個值)然而,當我的程序執行opc服務器的讀取方法時,它會等待大約10秒鐘來讀取我想要的值。這太多了。我不希望它等那麼多。我希望它執行讀取方法最多1秒,我不知道是什麼問題。爲什麼opc讀取值非常慢?有什麼辦法可以讓它更快。OpcNetApi從kepware緩慢讀取

這裏是我的OPC類

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace VestelTest 
{ 
    class clsOPC 
    { 

     private static Opc.Da.Server server = null; 
     private static Opc.Da.SubscriptionState groupState; 
     private static Opc.Da.Subscription group; 

     public clsOPC() 
     { 

     } 

     public static void Connect() 
     { 
      //OpcCom.ServerEnumerator se = new OpcCom.ServerEnumerator(); 
      //Opc.Server[] servers = se.GetAvailableServers(Opc.Specification.COM_DA_20); 
      //Opc.Da.Server server = null; 
      Opc.URL url = new Opc.URL("opcda://localhost/KEPware.KEPServerEX.V4"); 
      OpcCom.Factory fact = new OpcCom.Factory(); 
      server = new Opc.Da.Server(fact, url); 
      server.Connect(); 


      groupState = new Opc.Da.SubscriptionState(); 
      groupState.Name = "Salla"; 
      groupState.Active = false; 
      group = (Opc.Da.Subscription)server.CreateSubscription(groupState); 
     } 

     public static void Read(Opc.Da.Item[] items, Opc.Da.ReadCompleteEventHandler method) 
     { 
      //Opc.Da.ItemValueResult[] sonuclar = group.Read(group.Items); 
      if (group != null) 
      { 
       //server.Subscriptions.Clear(); 
       groupState = new Opc.Da.SubscriptionState(); 
       groupState.Name = "Salla"; 
       groupState.Active = false; 
       server.CancelSubscription(group); 
       group = null; 
       group = (Opc.Da.Subscription)server.CreateSubscription(groupState); 

       items = group.AddItems(items); 

       Opc.IRequest req; 
       group.Read(group.Items, 123, method, out req); 
      } 
      //return sonuclar;  
     } 

     public static Opc.Da.ItemValueResult[] Read(Opc.Da.Item[] items) 
     { 
      Opc.Da.ItemValueResult[] sonuclar = new Opc.Da.ItemValueResult[items.Length]; 
      if (group != null) 
      { 
       //server.Subscriptions.Clear(); 
       groupState = new Opc.Da.SubscriptionState(); 
       groupState.Name = "Salla"; 
       groupState.Active = false; 
       server.CancelSubscription(group); 
       group = null; 
       group = (Opc.Da.Subscription)server.CreateSubscription(groupState); 

       items = group.AddItems(items); 

       //sonuclar = group.Read(group.Items); 

       sonuclar = server.Read(items); 
      } 
      return sonuclar; 
     } 

     public static void Write(Opc.Da.Item[] writeItems, Opc.Da.ItemValue[] writeValues, Opc.Da.WriteCompleteEventHandler method, Opc.Da.ReadCompleteEventHandler methodRead) 
     { 
      if (group != null) 
      { 
       //server.Subscriptions.Clear(); 
       groupState = new Opc.Da.SubscriptionState(); 
       groupState.Name = "Salla"; 
       groupState.Active = false; 
       server.CancelSubscription(group); 
       group = null; 
       group = (Opc.Da.Subscription)server.CreateSubscription(groupState); 

       writeItems = group.AddItems(writeItems); 

       for (int i = 0; i < writeItems.Length; i++) 
       { 
        if (writeValues[i] != null) 
         writeValues[i].ServerHandle = group.Items[i].ServerHandle; 
       } 
       Opc.IRequest req; 

       group.Write(writeValues, 321, method, out req); 
       System.Threading.Thread.Sleep(1000); 
       group.Read(group.Items, 123, methodRead, out req); 
      } 

     } 

     public static void Write(Opc.Da.Item[] writeItems, Opc.Da.ItemValue[] writeValues) 
     { 
      if (group != null) 
      { 
       //server.Subscriptions.Clear(); 
       groupState = new Opc.Da.SubscriptionState(); 
       groupState.Name = "Salla"; 
       groupState.Active = false; 
       server.CancelSubscription(group); 
       group = null; 
       group = (Opc.Da.Subscription)server.CreateSubscription(groupState); 

       writeItems = group.AddItems(writeItems); 

       for (int i = 0; i < writeItems.Length; i++) 
       { 
        if (writeValues[i] != null) 
         writeValues[i].ServerHandle = group.Items[i].ServerHandle; 
       } 
       Opc.IRequest req; 

       group.Write(writeValues); 
      } 
     } 

     public static void Disconnect() 
     { 
      server.Disconnect(); 
     } 

     static void ReadCompleteCallback(object clientHandle, Opc.Da.ItemValueResult[] results) 
     { 
      Console.WriteLine("Read completed"); 
      foreach (Opc.Da.ItemValueResult readResult in results) 
      { 
       Console.WriteLine("\t{0}\tval:{1}", readResult.ItemName, readResult.Value); 
      } 
      Console.WriteLine(); 
     } 

     static void WriteCompleteCallback(object clientHandle, Opc.IdentifiedResult[] results) 
     { 
      Console.WriteLine("Write completed"); 
      foreach (Opc.IdentifiedResult writeResult in results) 
      { 
       Console.WriteLine("\t{0} write result: {1}", writeResult.ItemName, writeResult.ResultID); 
      } 
      Console.WriteLine(); 
     } 

    } 
} 

我這樣使用它;

int deviceID = vChannelDevice[i].device.ID; 
         var vAdres = (from adres in d.tblAddress join groupp in d.tblGroup on adres.GroupID equals groupp.ID join device in d.tblDevice on groupp.DeviceID equals device.ID where device.ID == deviceID select new { adres, groupp, device }).ToList(); 
         if (vAdres.Count > 0) 
         { 
          Opc.Da.Item[] valueItems = new Opc.Da.Item[vAdres.Count]; 
          for (int j = 0; j < vAdres.Count; j++) 
          { 
           valueItems[j] = new Opc.Da.Item(); 
           valueItems[j].ItemName = vChannelDevice[i].channel.Ad + "." + vChannelDevice[i].device.Ad + "." + vAdres[j].groupp.Ad + "." + vAdres[j].adres.Ad; 
          } 
          Opc.Da.ItemValueResult[] valueResults = new Opc.Da.ItemValueResult[vAdres.Count]; 
          if (backgroundWorker1.CancellationPending) 
          { 
           e.Cancel = true; 
           return; 
          } 
          valueResults = clsOPC.Read(valueItems); 
          for (int j = 0; j < vAdres.Count; j++) 
          { 
           if (valueResults[j] != null) 
           { 
            if (valueResults[j].Value != null) 
            { 
             Kaydet(vAdres[j].adres.ID, Convert.ToDouble(valueResults[j].Value), donguTarih); 
            } 
           } 
          } 
         } 

valueResults = clsOPC.Read(valueItems);等待太行

+0

凡在'閱讀()'不會暫停發生的方法?是否在'sonuclar = server.Read(items);'行上? – DonBoitnott 2014-10-09 11:39:44

+0

是的,這是正確的。 – MOD 2014-10-09 11:45:59

+0

然後似乎很清楚,它是服務器的響應滯後,而不是您對值的請求。 – DonBoitnott 2014-10-09 11:47:20

回答

0

嗯,我知道這是遲到.. 您將要取消訂閱 - 這需要一個行程。您正在重新創建訂閱時間。然後你決定添加項目,然後閱讀它。

如果您想清除訂閱 - 爲什麼在完成讀取返回後不執行該操作。那麼在讀取請求期間,您不必浪費Opc服務器的時間。

你的代碼是這樣的:

if (group != null) 
    { 
     //server.Subscriptions.Clear(); 
     groupState = new Opc.Da.SubscriptionState(); 
     groupState.Name = "Salla"; 
     groupState.Active = false; 
     server.CancelSubscription(group); 
     group = null; 
     group = (Opc.Da.Subscription)server.CreateSubscription(groupState); 

     items = group.AddItems(items); 

     Opc.IRequest req; 
     group.Read(group.Items, 123, method, out req); 
    }