首页 > 其他分享 >OPC DA通信,自动读写数据

OPC DA通信,自动读写数据

时间:2024-04-17 15:59:00浏览次数:24  
标签:读写 tag value DA opcDaTags OPC new server public

主打的就是简单,使用非常简单!

            opcDaTags.Add(new OpcDaTag("numeric.random.int32"));
            opcDaTags.Add(new OpcDaTag("time.current"));
            opcDaTags.Add(new OpcDaTag("textual.weekday"));
            opcDaTags.Add(new OpcDaTag("storage.bool.reg14"));
            opcDaTags.Add(new OpcDaTag("storage.bool.reg15"));
            opcDaTags.Add(new OpcDaTag("storage.bool.reg16"));
            opcDaTags.Add(new OpcDaTag("storage.bool.reg17"));
            OpcHelper = new OpcDA_Helper("Graybox.Simulator.1","ABB", opcDaTags.ToList());

然后需要读取数据的地方,只要订阅OpcDaTag的OnValueChange

需要写入数据的地方,只要调用OpcDaTag的 Write方法

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TitaniumAS.Opc.Client.Common;
using TitaniumAS.Opc.Client.Da;
using TitaniumAS.Opc.Client.Da.Browsing;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace TitaniumASDemo
{
    public class OpcDA_Helper
    {
        public static List<string> GetOpcServers()
        {
            var list = new List<string>();
            var enumerator = new OpcServerEnumeratorAuto();
            var serverDescriptions = enumerator.Enumerate(enumerator.Localhost, OpcServerCategory.OpcDaServer10);
            foreach (var item in serverDescriptions)
            {
                list.Add(item.ProgId);
            }
            return list;
        }
        /// <summary>
        /// 使用TitaniumAS通信的帮助,次类构造后,会自动连接服务器,读写数据,并且按照列表的数据订阅服务器的数据
        /// 需要读取数据的地方,只需要订阅列表里的tag的数据变化委托
        /// 需要写入数据的地方,只有调用列表里的tag的Write方法,数据会自动写入到opc服务器
        /// </summary>
        /// <param name="serverName">opc da服务器的名称</param>
        /// <param name="groupName">当前通信群组的名字</param>
        /// <param name="tagList">opc da 要通信的数据</param>
        public OpcDA_Helper(string serverName, string groupName, List<OpcDaTag> tagList)
        {
            ServerName = serverName;
            GroupName = groupName;
            TagList = tagList ?? new List<OpcDaTag>();
            server = new OpcDaServer(ServerName);
            server.ConnectionStateChanged += OnConnected;
            //browser = new OpcDaBrowserAuto(server);
            AutoConnectThread = new Thread(AutoConnect) { IsBackground = true };
            AutoConnectThread.Start();
            foreach(var tag in tagList)
            {
                tag.WriteHandle += WriteValue;
            }
        }

        private void OnConnected(object sender, OpcDaServerConnectionStateChangedEventArgs e)
        {
            Connected = e.IsConnected;
        }

        Thread AutoConnectThread;
        /// <summary>
        /// opc da服务器名字
        /// </summary>
        public string ServerName { get; private set; } = "ServerName";
        /// <summary>
        /// 群组名字
        /// </summary>
        public string GroupName { get; private set; } = "GroupName";
        /// <summary>
        /// 通信tag列表
        /// </summary>
        List<OpcDaTag> TagList;
        /// <summary>
        /// opc da服务器
        /// </summary>
        public OpcDaServer server;
        OpcDaGroup group;
        /// <summary>
        /// 自动连接服务器
        /// </summary>
        private void AutoConnect()
        {
            while (true)
            {
                if (!Connected)
                {
                    ConnectToServer();
                }
                Connected = server.IsConnected;
                //每分钟尝试连接服务器
                Thread.Sleep(60000);
            }
        }
        /// <summary>
        /// 写入数据到服务器
        /// </summary>
        /// <param name="tag"></param>
        private void WriteValue(OpcDaTag tag)
        {
            Write(tag);
        }
        public Action<OpcDA_Helper> ConnectionStatesChange;
        bool connected = false;
        /// <summary>
        /// 连接服务器。
        /// </summary>
        public bool Connected
        {
            private set
            {
                if (connected != value)
                {
                    connected = value;
                    ConnectionStatesChange?.Invoke(this);
                }
            }
            get => connected;
        }
        /// <summary>
        /// 连接服务器,如果连接成功,则读取一次数据,并且订阅数据,以后的数据变化自动更新
        /// </summary>
        /// <returns></returns>
        private bool ConnectToServer()
        {
            try
            {
                Uri url = UrlBuilder.Build(ServerName);
                server = new OpcDaServer(url);
                server.Connect();
                if (server.IsConnected)
                {                    
                    if(group != null)
                    {
                        server.RemoveGroup(group);
                    }
                    AddGroup(GroupName, TagList.Select(a => a.TagID).ToArray());
                    group.SyncItems();
                    //Read(TagList);
                }                
                return server.IsConnected;
            }
            catch (Exception)
            {

            }
            return false;
        }
        public void Read()
        {
            Read(TagList);
        }
        /// <summary>
        /// 手动读取数据
        /// </summary>
        /// <param name="opcDaTags"></param>
        public void Read(List<OpcDaTag> opcDaTags)
        {
            OpcDaVQTE[] ret = new OpcDaVQTE[opcDaTags.Count];
            Dictionary<string, OpcDaVQTE> result = new Dictionary<string, OpcDaVQTE>(opcDaTags.Count);
            List<string> items = opcDaTags.Select(a => a.TagID).ToList();
            List<object> values = new List<object>(opcDaTags.Count);
            if (!server.IsConnected)
            {
                ConnectToServer();
            }
            if (server.IsConnected)
            {
                //从opc服务器读取数据,返回数据的数组
                ret = server.Read(items, new TimeSpan[opcDaTags.Count]);
                for (int i = 0; i < items.Count; i++)
                {
                    opcDaTags[i].Value = ret[i].Value;
                    opcDaTags[i].Quality = ret[0].Quality;
                    opcDaTags[i].TimeStamp = DateTime.Now;
                }
            }
        }
        /// <summary>
        /// 手动写入数据
        /// </summary>
        /// <param name="id"></param>
        /// <param name="value"></param>
        private void Write(string id, object value)
        {
            if (!server.IsConnected)
            {
                ConnectToServer();
            }
            if (server.IsConnected)
            {
                var ret = server.WriteVQT(new[] { id }, new[] { new OpcDaVQT { Value = value } });
            }
        }
        /// <summary>
        /// 手动写入数据
        /// </summary>
        /// <param name="tag"></param>
        public void Write(OpcDaTag tag)
        {
            if (tag == null) return;
            Write(tag.TagID, tag.ValueToWrite);
        }
        public Action<OpcDaItemValuesChangedEventArgs> GroupValuesChangedHandle;
        OpcDaTag tag;
        private void OnGroupValuesChanged(object sender, OpcDaItemValuesChangedEventArgs args)
        {

            try
            {
                //GroupValuesChangedHandle?.Invoke(args);
                foreach (var item in args.Values)
                {
                    tag = TagList.Where(a => a.TagID == item.Item.ItemId).First();
                    if (tag != null)
                    {
                        tag.TimeStamp = DateTime.Now;
                        tag.Value = item.Value;
                    }
                }
            }
            catch (Exception ex)
            {
                //throw ex;
            }            
        }
        public OpcDaItemResult[] AddGroup(string groupName, string[] items)
        {
            group = server.AddGroup(groupName);
            group.ValuesChanged -= OnGroupValuesChanged;
            group.ValuesChanged += OnGroupValuesChanged;
            group.UpdateRate = TimeSpan.FromMilliseconds(100);
            group.IsActive = true;
            OpcDaItemDefinition[] definitions = new OpcDaItemDefinition[items.Length];
            for (int i = 0; i < items.Length; i++)
            {
                definitions[i] = new OpcDaItemDefinition
                {
                    ItemId = items[i],
                    IsActive = true
                };
            }
            OpcDaItemResult[] results = group.AddItems(definitions);
            return results;
        }
    }
    /// <summary>
    /// OpcDa的核心,用于存储opcda的数据
    /// </summary>
    public class OpcDaTag : INotifyPropertyChanged
    {
        public OpcDaTag(string tagId)
        {
            TagID = tagId;
        }
        public string TagID { get; set; }
        object value = new object();
        public object Value
        {
            get => value;
            set
            {
                if (!Equals(this.value, value))
                {
                    this.value = value;
                    PropertyChange();
                }
            }
        }
        DateTime timeStamp = new DateTime();
        public DateTime TimeStamp
        {
            get => timeStamp;
            set
            {
                if (value != timeStamp)
                {
                    timeStamp = value;
                    PropertyChange();
                }
            }
        }
        OpcDaQuality quality;
        public OpcDaQuality Quality
        {
            get => quality;
            set
            {
                if(!Equals(this.quality, value))
                {
                    quality = value;
                    PropertyChange();
                }
            }
        }
        public void Write(object value)
        {
            ValueToWrite = value;
            WriteHandle?.Invoke(this);
        }
        object valueToWrite = new object();
        public object ValueToWrite
        {
            get => valueToWrite;
            set
            {
                if (!Equals(this.valueToWrite, value))
                {
                    this.valueToWrite = value;
                    PropertyChange();
                }
            }
        }
        private void PropertyChange([CallerMemberName] string property = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
            OnValueChange?.Invoke(this);
        }
        public Action<OpcDaTag> OnValueChange;
        public Action<OpcDaTag> WriteHandle;
        public event PropertyChangedEventHandler PropertyChanged;
    }
}

 

标签:读写,tag,value,DA,opcDaTags,OPC,new,server,public
From: https://www.cnblogs.com/franklin2018/p/18140914

相关文章

  • 暖风机/寻线仪防干扰/防静电LCD液晶段码屏驱动芯片VK1C21A/B/C/D/DA/E/EA具备显示效果
    产品型号:VK1C21A/B产品品牌:永嘉微电/VINKA封装形式:SSOP48/LQFP48可定制裸片:DICE(COB邦定片);COG(邦定玻璃用) 概述:VK1C21A/B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单片机可通过3/4个通信脚配置显示参数和发送显示数据,......
  • 持续性学习-Day14(前端基础HTML5)
    参考教学视频:秦疆 HTML(HyperTexctMarkupLanguage)超文本标记语言W3C:WorldWideWebConsortium万维网联盟W3C标准包括:结构化标准语言(HTML、XML)表现标准语言(CSS)行为标准(DOM、EXMAScript)1.基本标签<!--标题标签--><!--h1-h5--><!--段落标签--><p></p><!--......
  • linux puppeteer 截图提示缺少chrome-linux/chrome error while loading shared libra
    puppeteer/.local-chromium/linux-1002410/chrome-linux/chrome:errorwhileloadingsharedlibraries:libXdamage.so.1:cannotopensharedobjectfile:Nosuchfileordirectory按照错误对照进行安装执行,缺啥安啥......
  • python@dataclass使用
    Python的dataclass是Python3.7中引入的一个装饰器和类库,用于自动添加特殊方法,如__init__和__repr__,到用户定义的类。dataclass使得定义类变得更加简洁,同时它也提供了许多有用的特性,比如默认值、类型提示等。以下是一个dataclass的例子:fromdataclassesimportdatac......
  • gpupdate.exe 是 Windows 操作系统中的一个命令行工具,用于立即刷新本地计算机或用户的
    C:\Mount\Windows\System32\gpupdate.exeC:\Mount\Windows\SysWOW64\gpupdate.exeC:\Mount\Windows\WinSxS\amd64_microsoft-windows-g..policy-cmdlinetools_31bf3856ad364e35_10.0.20348.2340_none_e3e1b64c0e292aa6\gpupdate.exeC:\Mount\Windows\WinSxS\......
  • python封装工具类之excel读写
    在python自动化过程中,如果测试用例数据在excel中,就需要去对excel进行读写操作这个测试类主要是读取excel中的测试用例,然后再将测试结果回写到excel中。excel表格格式示例(cases.xlsx):case_idcase_namemethodurldataexpectedactualresult1用户正常登录post/log......
  • 解决conda创建tf环境失败
    使用conda创建tf环境的时候老师报错: conda解决AnHTTPerroroccurredwhentryingtoretrievethisURL.(已经更新清华源但也无解的解决方法)-CSDN博客采用这个博主的方法成功了前几次改错的时候我感觉也可以成功但是少写了一部就是:condaclean-i导致前面的索引并没有被......
  • Data studio普通用户采用非SSL的方式连接openGauss
    Datastudio普通用户采用非SSL的方式连接openGauss关闭SSL认证由于openGauss默认开启SSL认证,且配置认证较为麻烦,个人开发测试并不需要它。因此关闭openGauss的远程用户登录SSL认证模式。1.找到postgresql.conf。cd/gaussdb/data/openGaussTest1/2.修改postg......
  • 基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发秒杀系统——与京东淘宝同
    ​介绍基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发高性能商品秒杀系统,本系统实测单台(16核32G主频2.2GHz)openresty(nginx)的QPS可高达6w并发,如果您需要应对100w的并发,则需要100w/6w=17台openresty服务器,17台服务器同时接收并处理这100w的并发流量呢?当然是商业......
  • Debezium Adapt openGauss
    DebeziumAdaptopenGaussWhatisDebeziumDebeziumisasetofdistributedservicestocapturechangesinyourdatabasessothatyourapplicationscanseethosechangesandrespondtothem.Debeziumrecordsallrow-levelchangeswithineachdatabasetable......