C# 链接Kep进行读取数据

本文介绍如何使用C#连接KEPServerEX并读取OPC数据,包括注册DLL文件、建立连接、浏览OPC服务器节点、创建数据组及监听数据变化等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发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的博客-优快云博客_kepserverex6使用手册

客户端C#读取opc数据_凋零的老树的博客-优快云博客_c#读取opc数据

通过kepserver实现OPC数据读写的C#实例程序_dalong10的博客-优快云博客_kepserver读取opc

C# 连接KepService进行PLC访问,读写。_biu~zhang~go的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值