测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OPCAutomation;
using System.Net;
using System.Runtime.CompilerServices;
using System.Threading;
namespace OPCtest
{
class Program
{
static void Main(string[] args)
{
OPCServer opcServer;
OPCGroup opcGroup;
OPCGroups opcGroups;
OPCItems opcItems;
OPCBrowser opcBrowser;
List HostNameList = new List();
Thread thread = new Thread(() =>
{
IPHostEntry iPHostEntry = Dns.GetHostEntry(Environment.MachineName);
foreach (var item in iPHostEntry.AddressList)
{
string str = Dns.GetHostEntry(item.ToString()).HostName;
if (!HostNameList.Contains(str))
{
HostNameList.Add(str);
}
}
// Console.WriteLine("[Get the HostName success]");
});
thread.Start();
//=========================================初始化opcserver 得到本地服务器名字
//initialize server
opcServer = new OPCServer();
Console.WriteLine("1.Initialize server success");
//get the Servers array
object ServerArray = opcServer.GetOPCServers("DESKTOP-RPEHIEB");
Console.WriteLine("2.Get serverArray success r");
//connect server
foreach (string item in (Array)ServerArray)
{
Console.WriteLine(item);
}
//===========================================连接kepserver服务器
opcServer.Connect("Kepware.KEPServerEX.V5", "DESKTOP-RPEHIEB");
Console.WriteLine("Server connect success");
//===========================================OPCgroups赋值
opcGroups = opcServer.OPCGroups;
opcGroups.DefaultGroupDeadband = 0;//死区 设为0时,服务器端该组内任何数据变化都通知组
opcGroups.DefaultGroupIsActive = true;
opcGroup = opcGroups.Add("1");
opcGroup.IsActive = true;
opcGroup.IsSubscribed = true;
opcGroup.UpdateRate = 250;
opcGroup.AsyncReadComplete += AsyncReadHandler;
opcBrowser = opcServer.CreateBrowser();
opcBrowser.ShowBranches();
opcBrowser.ShowLeafs(true);
//==========================================================
opcItems = opcGroup.OPCItems;
int num = 3;
Array itemsIDs;
Array clientHandles;
Array outServerHandles;
Array outErrors;
List clientHandlesList = new List();
clientHandlesList.Add(0);
clientHandlesList.Add(1001);
clientHandlesList.Add(1002);
clientHandlesList.Add(1003);
clientHandles = clientHandlesList.ToArray();
List itemsIDsList = new List();
itemsIDsList.Add(" ");
itemsIDsList.Add("Modbus.Device1.k");
itemsIDsList.Add("Modbus.Device1.k1");
itemsIDsList.Add("Modbus.Device1.k2");
itemsIDs = itemsIDsList.ToArray();
opcItems.AddItems(num, ref itemsIDs, ref clientHandles, out outServerHandles, out outErrors);//get handles
List ServerHandlesList = new List();
ServerHandlesList.Add(0);
foreach (object item in outServerHandles)//返回的句柄
{
ServerHandlesList.Add(Convert.ToInt32(item));
Console.WriteLine("handles:"+Convert.ToInt32(item));
}
Array errors;
int transactionID = 666;
int outCancelID;
opcGroup.AsyncRead(num,ref outServerHandles,out errors,transactionID,out outCancelID);
}
private static void AsyncReadHandler(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors)
{
Console.WriteLine("num:" + NumItems);
Console.WriteLine("rHandles:");
foreach (object item in ClientHandles)
{
Console.Write(Convert.ToInt32(item) + " ");
}
Console.WriteLine("");
Console.WriteLine("Values:");
foreach (object item in ItemValues)
{
Console.Write(item.ToString() + " ");
}
Console.WriteLine("");
Console.WriteLine("Times:");
foreach (object item in TimeStamps)
{
Console.Write(((DateTime)item) + " ");
}
}
}
}
返回的代码:
对比可以发现,每个数据的值都是跟我们发送请求数据的句柄相捆绑的,所以要加一些判断对号入座,整理返回的数据;这就ok了!



