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);
等待太行
凡在'閱讀()'不會暫停發生的方法?是否在'sonuclar = server.Read(items);'行上? – DonBoitnott 2014-10-09 11:39:44
是的,這是正確的。 – MOD 2014-10-09 11:45:59
然後似乎很清楚,它是服務器的響應滯後,而不是您對值的請求。 – DonBoitnott 2014-10-09 11:47:20