OPC DA的Client对象模型

OPC DA的Client对象模型可以如下图表示

一个OPC Server对象可以包含一个OPC Groups对象

一个OPC Groups对象可以包含多个OPC Group对象

一个OPC Group对象可以包含一个OPC Items对象

一个OPC Items对象可以包含多个OPC Item对象

一个OPC Item对象就是OPC Server端的一个变量

以下只是我的个人理解,如果有不对,还请指正

 

代码

using OPCAutomation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace shangchaiDataAnalyz
{

    internal class OPC_operation
    {
        public OPCServer oPCServer;
        public OPCGroups oPCGroups;
        public OPCGroup oPCGroup;
        public OPCItem oPCItem;
        public OPCItems oOPCItems;
        public void Connect()
        {
            try
            {
                oPCServer = new OPCServer();
                oPCServer.Connect("");//链接地址
                if (oPCServer.ServerState == Convert.ToInt32(OPCServerState.OPCRunning))
                {
                    Console.WriteLine("OPCServer is Running");
                    oPCGroups = oPCServer.OPCGroups;//获取Groups对象
                    /*
                     给Groups设置的属性 同样也可以给Group设置
                     */
                    oPCGroups.DefaultGroupDeadband = 0;//死区设置 用来过滤一些细微的数据波动,避免造成服务器网络压力过大
                    oPCGroups.DefaultGroupIsActive = true;//激活OPCGroups
                    oPCGroups.DefaultGroupUpdateRate = 250;//设置OPCGroups的数据更新速率
                    OPCGroup oPCGroup1 = oPCGroups.Add("gourp1");//添加组
                    oPCGroup1.IsSubscribed = true;//订阅 发生dataChange时发出通知
                    OPCItems oPCItems = oPCGroup1.OPCItems;
                    OPCItem oPCItem1 = oPCItems.AddItem("test.tag1",1);//第一个参数时标签名称,第二个参数是客户端句柄用来代表这个item对象(ClientHandle不要重复,触发数据修改事件后,需要根据ClientHandle区分数据项)
                    oPCGroup1.DataChange += Group_DataChange;

                }
                else
                {
                    Console.WriteLine(" OPC Server is not Connected");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
           

        }

        /// <summary>
        /// group的数据改变事件
        /// </summary>
        /// <param name="TransactionID">OPC 事物标识符</param>
        /// <param name="NumItems">本次检测到OPC数据项值改动个数</param>
        /// <param name="ClientHandles">检测到改动数据项ClientHandle数组</param>
        /// <param name="ItemValues">检测到改动数据项值数据</param>
        /// <param name="Qualities">检测到改动数据项质量值数据</param>
        /// <param name="TimeStamps">检测到改动数据项时间戳数据</param>
        private void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            for (int i = 1; i <= NumItems; i++)
            {
                int tmpClientHandle = Convert.ToInt32(ClientHandles.GetValue(i));
                string tmpValue = ItemValues.GetValue(i).ToString();
                string tmpTime = ((DateTime)(TimeStamps.GetValue(i))).ToString();
                Console.WriteLine("Time:" + tmpTime);
                Console.WriteLine("ClientHandle : " + tmpClientHandle.ToString());
                Console.WriteLine("tag value " + tmpValue);

            }
        }
    }
}

  

 

posted @ 2023-06-18 14:00  初学者ssss  阅读(187)  评论(0编辑  收藏  举报