开发KEP需要用到OPCDAAuto.dll文件并且需要在C盘内注册此文件才能在VS中进行引用
1、在C:\Windows\SysWOW64\下新建目录egs29oa,复制所有的dll到这个目录下
2、右键开始,CMD以管理员模式运行(Windows PowerShell (管理员) )
3、键入cd \windows\syswow64
4、在cmd里键入regsvr32 egs29oa/OPCDAAuto.dll,回车,然后提示注册成功
5、在VS中引用
using OPCAutomation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace KepReadServer
{
class Program
{
OPCServer KepServer;
OPCGroups KepGroups;
OPCGroup KepGroup;
OPCItems KepItems;
//列出所有OPC的名称
List<string> OpcNames = new List<string>();
static void Main(string[] args)
{
new Program().Start();
Console.ReadLine();
}
/// <summary>
/// OPC服务器
/// 开始抓取OPC数据
/// </summary>
public void Start()
{
try
{
KepServer = new OPCServer();
KepServer.Connect("Kepware.KEPServerEX.V6", "192.168.3.122");
//判断连接状态
if (KepServer.ServerState == (int)OPCServerState.OPCRunning)
{
SendMsg("已连接到-" + KepServer.ServerName);
RecurBrowse();
}
else
{
SendMsg("状态:" + KepServer.ServerState.ToString());
return;
}
KepGroups = KepServer.OPCGroups;
Task.Factory.StartNew(CreateGroup);
//this.GatherData = true;
}
catch (Exception e)
{
throw e;
}
Console.WriteLine();
}
/// <summary>
/// 列出OPC服务器中所有节点
/// </summary>
/ <param name="oPCBrowser"></param>
public void RecurBrowse()
{
//展开分支
Console.WriteLine("列出OPC服务器中所有节点");
var oPCBrowser = KepServer.CreateBrowser();
oPCBrowser.ShowBranches();
//展开叶子
oPCBrowser.ShowLeafs(true);
Console.WriteLine("列出OPC服务器中所有节点" + oPCBrowser.Count + "个");
foreach (object turn in oPCBrowser)
{
OpcNames.Add(turn.ToString());
//Console.WriteLine(turn.ToString());
}
}
/// <summary>
/// 日志
/// </summary>
/// <param name="m"></param>
private void SendMsg(string m)
{
Console.WriteLine(m);
//LogHelper.WriteLog(m);
}
/// <summary>
/// 创建组
/// </summary>
private void CreateGroup()
{
try
{
KepGroups = KepServer.OPCGroups;
//KepGroup = KepGroups.Add("OpcGroup");
KepGroup = KepGroups.Add("ST010");
SetGroupProperty();
KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
KepItems = KepGroup.OPCItems;
AddOpcItem();
}
catch (Exception err)
{
SendMsg("枚举本地OPC创建组出现错误:" + err.Message);
}
}
/// <summary>
/// 设置组属性
/// </summary>
private void SetGroupProperty()
{
KepServer.OPCGroups.DefaultGroupIsActive = true;
KepServer.OPCGroups.DefaultGroupDeadband = 0;
KepGroup.UpdateRate = 3000;
KepGroup.IsActive = true;
KepGroup.IsSubscribed = true;
}
/// <summary>
/// 添加需要监听的节点
/// </summary>
private void AddOpcItem()
{
//for (int i = 0; i < OpcNames.Count; i++)
//{
// if (OpcNames[i].Contains("_Slot"))
// {
// KepItems.AddItem(OpcNames[i], i);
// }
//}
KepItems.AddItem("Channel1.ST010._Slot", 0);
}
/// <summary>
/// 每当项数据有变化时执行的事件
/// </summary>
/// <param name="TransactionID">处理ID</param>
/// <param name="NumItems">项个数</param>
/// <param name="ClientHandles">项客户端句柄</param>
/// <param name="ItemValues">TAG值</param>
/// <param name="Qualities">品质</param>
/// <param name="TimeStamps">时间戳</param>
private void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
try
{
for (int i = 1; i <= NumItems; i++)
{
//string temp = string.Concat(OpcNames[Convert.ToInt32(ClientHandles.GetValue(i))] + "值改变:TAG" + ItemValues.GetValue(i) + "品质" + Qualities.GetValue(i));
string temp = string.Concat( "值改变:" + ClientHandles.GetValue(i), "-", ItemValues.GetValue(i), "-", Qualities.GetValue(i), "-", TimeStamps.GetValue(i));
SendMsg(temp);
}
}
catch (Exception e)
{
SendMsg("KepGroup_DataChange" + e.Message);
}
}
}
}
参考:
KEPServerEX 6使用_yuell102的博客-CSDN博客_kepserverex6使用手册
客户端C#读取opc数据_凋零的老树的博客-CSDN博客_c#读取opc数据
通过kepserver实现OPC数据读写的C#实例程序_dalong10的博客-CSDN博客_kepserver读取opc