返回顶部
首页 > 资讯 > 服务器 >C# 中,使用OpcUaHelper读写OPC服务器
  • 931
分享到

C# 中,使用OpcUaHelper读写OPC服务器

服务器c# 2023-08-18 15:08:49 931人浏览 安东尼
摘要

nuget包 帮助类: using Opc.Ua.Client;using Opc.Ua;using OpcUaHelper;using System;using System.Collections.Generic;using Syst

在这里插入图片描述

nuget包

帮助类:

using Opc.Ua.Client;using Opc.Ua;using OpcUaHelper;using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography.X509Certificates;using System.Text;using System.Threading.Tasks;namespace MyOPCUATest{    public class OPCUAHelper    {        #region   基础参数        //OPCUA客户端        private OpcUaClient opcUaClient;        #endregion        ///         /// 构造函数        ///         public OPCUAHelper()        {            opcUaClient = new OpcUaClient();        }        ///         /// 连接状态        ///         public bool ConnectStatus        {            get { return opcUaClient.Connected; }        }        #region   公有方法        ///         /// 打开连接【匿名方式】        ///         /// 服务器URL【格式:opc.tcp://服务器IP地址/服务名称】        public async void OpenConnectOfAnonymous(string serverUrl)        {            if (!string.IsNullOrEmpty(serverUrl))            {                try                {                    opcUaClient.UserIdentity = new UserIdentity(new AnonymousIdentityToken());                    await opcUaClient.ConnectServer(serverUrl);                }                catch (Exception ex)                {                    ClientUtils.HandleException("连接失败!!!", ex);                }            }        }        ///         /// 打开连接【账号方式】        ///         /// 服务器URL【格式:opc.tcp://服务器IP地址/服务名称】        /// 用户名称        /// 用户密码        public async void OpenConnectOfAccount(string serverUrl, string userName, string userPwd)        {            if (!string.IsNullOrEmpty(serverUrl) &&                !string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(userPwd))            {                try                {                    opcUaClient.UserIdentity = new UserIdentity(userName, userPwd);                    await opcUaClient.ConnectServer(serverUrl);                }                catch (Exception ex)                {                    ClientUtils.HandleException("连接失败!!!", ex);                }            }        }        ///         /// 打开连接【证书方式】        ///         /// 服务器URL【格式:opc.tcp://服务器IP地址/服务名称】        /// 证书路径        /// 密钥        public async void OpenConnectOfCertificate(string serverUrl, string certificatePath, string secreKey)        {            if (!string.IsNullOrEmpty(serverUrl) &&                !string.IsNullOrEmpty(certificatePath) && !string.IsNullOrEmpty(secreKey))            {                try                {                    X509Certificate2 certificate = new X509Certificate2(certificatePath, secreKey, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);                    opcUaClient.UserIdentity = new UserIdentity(certificate);                    await opcUaClient.ConnectServer(serverUrl);                }                catch (Exception ex)                {                    ClientUtils.HandleException("连接失败!!!", ex);                }            }        }        ///         /// 关闭连接        ///         public void CloseConnect()        {            if (opcUaClient != null)            {                try                {                    opcUaClient.Disconnect();                }                catch (Exception ex)                {                    ClientUtils.HandleException("关闭连接失败!!!", ex);                }            }        }        ///         /// 获取到当前节点的值【同步读取】        ///         /// 节点对应的数据类型        /// 节点        /// 返回当前节点的值        public T GetCurrentnodeValue(string nodeId)        {            T value = default(T);            if (!string.IsNullOrEmpty(nodeId) && ConnectStatus)            {                try                {                    value = opcUaClient.ReadNode(nodeId);                }                catch (Exception ex)                {                    ClientUtils.HandleException("读取失败!!!", ex);                }            }            return value;        }        ///         /// 获取到当前节点数据【同步读取】        ///         /// 节点对应的数据类型        /// 节点        /// 返回当前节点的值        public DataValue GetCurrentNodeValue(string nodeId)        {            DataValue dataValue = null;            if (!string.IsNullOrEmpty(nodeId) && ConnectStatus)            {                try                {                    dataValue = opcUaClient.ReadNode(nodeId);                }                catch (Exception ex)                {                    ClientUtils.HandleException("读取失败!!!", ex);                }            }            return dataValue;        }        ///         /// 获取到批量节点数据【同步读取】        ///         /// 节点列表        /// 返回节点数据字典        public Dictionary GetBatchNodeDatasOfSync(List nodeIdList)        {            Dictionary dicNodeInfo = new Dictionary();            if (nodeIdList != null && nodeIdList.Count > 0 && ConnectStatus)            {                try                {                    List dataValues = opcUaClient.ReadNodes(nodeIdList.ToArray());                    int count = nodeIdList.Count;                    for (int i = 0; i < count; i++)                    {                        AddInfoToDic(dicNodeInfo, nodeIdList[i].ToString(), dataValues[i]);                    }                }                catch (Exception ex)                {                    ClientUtils.HandleException("读取失败!!!", ex);                }            }            return dicNodeInfo;        }        ///         /// 获取到当前节点的值【异步读取】        ///         /// 节点对应的数据类型        /// 节点        /// 返回当前节点的值        public async Task GetCurrentNodeValueOfAsync(string nodeId)        {            T value = default(T);            if (!string.IsNullOrEmpty(nodeId) && ConnectStatus)            {                try                {                    value = await opcUaClient.ReadNodeAsync(nodeId);                }                catch (Exception ex)                {                    ClientUtils.HandleException("读取失败!!!", ex);                }            }            return value;        }        ///         /// 获取到批量节点数据【异步读取】        ///         /// 节点列表        /// 返回节点数据字典        public async Task> GetBatchNodeDatasOfAsync(List nodeIdList)        {            Dictionary dicNodeInfo = new Dictionary();            if (nodeIdList != null && nodeIdList.Count > 0 && ConnectStatus)            {                try                {                    List dataValues = await opcUaClient.ReadNodesAsync(nodeIdList.ToArray());                    int count = nodeIdList.Count;                    for (int i = 0; i < count; i++)                    {                        AddInfoToDic(dicNodeInfo, nodeIdList[i].ToString(), dataValues[i]);                    }                }                catch (Exception ex)                {                    ClientUtils.HandleException("读取失败!!!", ex);                }            }            return dicNodeInfo;        }        ///         /// 获取到当前节点的关联节点        ///         /// 当前节点        /// 返回当前节点的关联节点        public ReferenceDescription[] GetAllRelationNodeOfNodeId(string nodeId)        {            ReferenceDescription[] referenceDescriptions = null;            if (!string.IsNullOrEmpty(nodeId) && ConnectStatus)            {                try                {                    referenceDescriptions = opcUaClient.BrowseNodeReference(nodeId);                }                catch (Exception ex)                {                    string str = "获取当前: " + nodeId + "  节点的相关节点失败!!!";                    ClientUtils.HandleException(str, ex);                }            }            return referenceDescriptions;        }        ///         /// 获取到当前节点的所有属性        ///         /// 当前节点        /// 返回当前节点对应的所有属性        public OpcNodeAttribute[] GetCurrentNodeAttributes(string nodeId)        {            OpcNodeAttribute[] opcNodeAttributes = null;            if (!string.IsNullOrEmpty(nodeId) && ConnectStatus)            {                try                {                    opcNodeAttributes = opcUaClient.ReadNoteAttributes(nodeId);                }                catch (Exception ex)                {                    string str = "读取节点;" + nodeId + "  的所有属性失败!!!";                    ClientUtils.HandleException(str, ex);                }            }            return opcNodeAttributes;        }        ///         /// 写入单个节点【同步方式】        ///         /// 写入节点值得数据类型        /// 节点        /// 节点对应的数据值(比如:(short)123))        /// 返回写入结果(true:表示写入成功)        public bool WriteSingleNodeId(string nodeId, T value)        {            bool success = false;            if (opcUaClient != null && ConnectStatus)            {                if (!string.IsNullOrEmpty(nodeId))                {                    try                    {                        success = opcUaClient.WriteNode(nodeId, value);                    }                    catch (Exception ex)                    {                        string str = "当前节点:" + nodeId + "  写入失败";                        ClientUtils.HandleException(str, ex);                    }                }            }            return success;        }        ///         /// 批量写入节点        ///         /// 节点数组        /// 节点对应数据数组        /// 返回写入结果(true:表示写入成功)        public bool BatchWriteNodeIds(string[] nodeIdArray, object[] nodeIdValueArray)        {            bool success = false;            if (nodeIdArray != null && nodeIdArray.Length > 0 &&                nodeIdValueArray != null && nodeIdValueArray.Length > 0)            {                try                {                    success = opcUaClient.WriteNodes(nodeIdArray, nodeIdValueArray);                }                catch (Exception ex)                {                    ClientUtils.HandleException("批量写入节点失败!!!", ex);                }            }            return success;        }        ///         /// 写入单个节点【异步方式】        ///         /// 写入节点值得数据类型        /// 节点        /// 节点对应的数据值        /// 返回写入结果(true:表示写入成功)        public async Task WriteSingleNodeIdOfAsync(string nodeId, T value)        {            bool success = false;            if (opcUaClient != null && ConnectStatus)            {                if (!string.IsNullOrEmpty(nodeId))                {                    try                    {                        success = await opcUaClient.WriteNodeAsync(nodeId, value);                    }                    catch (Exception ex)                    {                        string str = "当前节点:" + nodeId + "  写入失败";                        ClientUtils.HandleException(str, ex);                    }                }            }            return success;        }        ///         /// 读取单个节点的历史数据记录        ///         /// 节点的数据类型        /// 节点        /// 开始时间        /// 结束时间        /// 返回该节点对应的历史数据记录        public List ReadSingleNodeIdHistoryDatas(string nodeId, DateTime startTime, DateTime endTime)        {            List nodeIdDatas = null;            if (!string.IsNullOrEmpty(nodeId) && startTime != null && endTime != null && endTime > startTime)            {                try                {                    nodeIdDatas = opcUaClient.ReadHistoryRawDataValues(nodeId, startTime, endTime).ToList();                }                catch (Exception ex)                {                    ClientUtils.HandleException("读取失败", ex);                }            }            return nodeIdDatas;        }        ///         /// 读取单个节点的历史数据记录        ///         /// 节点的数据类型        /// 节点        /// 开始时间        /// 结束时间        /// 返回该节点对应的历史数据记录        public List ReadSingleNodeIdHistoryDatas(string nodeId, DateTime startTime, DateTime endTime)        {            List nodeIdDatas = null;            if (!string.IsNullOrEmpty(nodeId) && startTime != null && endTime != null && endTime > startTime)            {                if (ConnectStatus)                {                    try                    {                        nodeIdDatas = opcUaClient.ReadHistoryRawDataValues(nodeId, startTime, endTime).ToList();                    }                    catch (Exception ex)                    {                        ClientUtils.HandleException("读取失败", ex);                    }                }            }            return nodeIdDatas;        }        ///         /// 单节点数据订阅        ///         /// 订阅的关键字(必须唯一)        /// 节点        /// 数据订阅的回调方法        public void SingleNodeIdDatasSubscription(string key, string nodeId, Action callback)        {            if (ConnectStatus)            {                try                {                    opcUaClient.AddSubscription(key, nodeId, callback);                }                catch (Exception ex)                {                    string str = "订阅节点:" + nodeId + " 数据失败!!!";                    ClientUtils.HandleException(str, ex);                }            }        }        ///         /// 取消单节点数据订阅        ///         /// 订阅的关键字        public bool CancelSingleNodeIdDatasSubscription(string key)        {            bool success = false;            if (!string.IsNullOrEmpty(key))            {                if (ConnectStatus)                {                    try                    {                        opcUaClient.RemoveSubscription(key);                        success = true;                    }                    catch (Exception ex)                    {                        string str = "取消 " + key + " 的订阅失败";                        ClientUtils.HandleException(str, ex);                    }                }            }            return success;        }        ///         /// 批量节点数据订阅        ///         /// 订阅的关键字(必须唯一)        /// 节点数组        /// 数据订阅的回调方法        public void BatchNodeIdDatasSubscription(string key, string[] nodeIds, Action callback)        {            if (!string.IsNullOrEmpty(key) && nodeIds != null && nodeIds.Length > 0)            {                if (ConnectStatus)                {                    try                    {                        opcUaClient.AddSubscription(key, nodeIds, callback);                    }                    catch (Exception ex)                    {                        string str = "批量订阅节点数据失败!!!";                        ClientUtils.HandleException(str, ex);                    }                }            }        }        ///         /// 取消所有节点的数据订阅        ///         ///         public bool CancelAllNodeIdDatasSubscription()        {            bool success = false;            if (ConnectStatus)            {                try                {                    opcUaClient.RemoveAllSubscription();                    success = true;                }                catch (Exception ex)                {                    ClientUtils.HandleException("取消所有的节点数据订阅失败!!!", ex);                }            }            return success;        }        ///         /// 取消单节点的数据订阅        ///         ///         public bool CancelNodeIdDatasSubscription(string key)        {            bool success = false;            if (ConnectStatus)            {                try                {                    opcUaClient.RemoveSubscription(key);                    success = true;                }                catch (Exception ex)                {                    ClientUtils.HandleException("取消节点数据订阅失败!!!", ex);                }            }            return success;        }        #endregion        #region   私有方法        ///         /// 添加数据到字典中(相同键的则采用最后一个键对应的值)        ///         /// 字典        /// 键        /// 值        private void AddInfoToDic(Dictionary dic, string key, DataValue dataValue)        {            if (dic != null)            {                if (!dic.ContainsKey(key))                {                    dic.Add(key, dataValue);                }                else                {                    dic[key] = dataValue;                }            }        }        #endregion    }//Class_end}

winform

using Opc.Ua;using Opc.Ua.Client;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.windows.FORMs;namespace MyOPCUATest{    public partial class FrmMain : Form    {        public FrmMain()        {            InitializeComponent();        }        private OPCUAHelper opcClient;        private string[] MonitorNodeTags = null;        Dictionary myDic = new Dictionary();        private void BtnConn_Click(object sender, EventArgs e)        {            string url = "opc.tcp://192.168.2.11:4840";            string userName = "Administrator";            string passWord = "123456";            opcClient = new OPCUAHelper();            //opcClient.OpenConnectOfAccount(url, userName, password);            opcClient.OpenConnectOfAnonymous(url);            MessageBox.Show(opcClient.ConnectStatus.ToString());        }        private void BtnCurrentNode_Click(object sender, EventArgs e)        {            //string nodeId = "\"S7MesData\".\"S7Real\"[0]";            string nodeId = "ns=3;s=\"S7MesData\".\"S7Real\"[0]";            DataValue myValue= opcClient.GetCurrentNodeValue(nodeId);            this.Txtbox.Text = myValue.ToString();        }        private void BtnCertificate_Click(object sender, EventArgs e)        {            string url = "opc.tcp://192.168.2.11:4840";            string path = "D:\\zhengshu\\security\\zg-client.pfx";            string key = "123456";            opcClient = new OPCUAHelper();            opcClient.OpenConnectOfCertificate(url, path, key);            MessageBox.Show(opcClient.ConnectStatus.ToString());        }        private void BtnSigleScribe_Click(object sender, EventArgs e)        {            List list = new List();            list.Add("ns=3;s=\"S7MesData\".\"S7Real\"[0]");            list.Add("ns=3;s=\"S7MesData\".\"S7Real\"[1]");            MonitorNodeTags = list.ToArray();            opcClient.BatchNodeIdDatasSubscription("B", MonitorNodeTags, SubCallback);        }        private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args)        {            if (key == "B")            {                MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;    if (monitoredItem.StartNodeId.ToString() == MonitorNodeTags[0])                {                    textBox2.Invoke(new Action(() =>                    {                        textBox2.Text = notification.Value.WrappedValue.Value.ToString();                    }));                }                else if (monitoredItem.StartNodeId.ToString() == MonitorNodeTags[1])                {                    textBox3.Invoke(new Action(() =>                    {                        textBox3.Text = notification.Value.WrappedValue.Value.ToString();                    }));                }                if (myDic.ContainsKey(monitoredItem.StartNodeId.ToString()))                {                    myDic[monitoredItem.StartNodeId.ToString()] = notification.Value.WrappedValue.Value;                }                else                {                    myDic.Add(monitoredItem.StartNodeId.ToString(), notification.Value.WrappedValue.Value);                }                string str = "";                //foreach (var item in myDic)                //{                //    Console.WriteLine(item.Key);                //    Console.WriteLine(item.Value);                //}            }        }        private void btnWrite_Click(object sender, EventArgs e)        {            string myTxt = textBox4.Text.Trim();            string nodeId = "ns=3;s=\"S7MesData\".\"S7Real\"[0]";            opcClient.WriteSingleNodeId(nodeId, (float)Convert.ToDouble(myTxt));                   }    }}

KepServer 设置:

using Opc.Ua;using Opc.Ua.Client;using System;using System.Collections.Generic;using System.Windows.Forms;namespace MyOPCUATest{    public partial class FrmMain : Form    {        public FrmMain()        {            InitializeComponent();        }        private OPCUAHelper opcClient;        private string[] MonitorNodeTags = null;        Dictionary myDic = new Dictionary();        private void BtnConn_Click(object sender, EventArgs e)        {            //string url = "opc.tcp://192.168.2.11:4840";  //PLC            string url = "opc.tcp://192.168.2.125:49320"; //KepServer            string userName = "Administrator";            string password = "123456";            opcClient = new OPCUAHelper();            opcClient.OpenConnectOfAccount(url, userName, password);            //opcClient.OpenConnectOfAnonymous(url);            MessageBox.Show(opcClient.ConnectStatus.ToString());        }        private void BtnCurrentNode_Click(object sender, EventArgs e)        {            //string nodeId = "\"S7MesData\".\"S7Real\"[0]";            //string nodeId = "ns=3;s=\"S7MesData\".\"S7Real\"[0]"; //PLC            string nodeId = "ns=2;s=KxOPC.KX1500.电压1"; //Kep            DataValue myValue = opcClient.GetCurrentNodeValue(nodeId);            this.Txtbox.Text = myValue.ToString();        }        private void BtnCertificate_Click(object sender, EventArgs e)        {            //string url = "opc.tcp://192.168.2.11:4840";            string url = "opc.tcp://192.168.2.125:49320"; //KepServer            string path = @"D:\zhengshu\security\zg-client.pfx";            string key = "123456";            opcClient = new OPCUAHelper();            opcClient.OpenConnectOfCertificate(url, path, key);            MessageBox.Show(opcClient.ConnectStatus.ToString());        }        private void BtnSigleScribe_Click(object sender, EventArgs e)        {            List list = new List();            list.Add("ns=3;s=\"S7MesData\".\"S7Real\"[0]");            list.Add("ns=3;s=\"S7MesData\".\"S7Real\"[1]");            MonitorNodeTags = list.ToArray();            opcClient.BatchNodeIdDatasSubscription("B", MonitorNodeTags, SubCallback);        }        private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args)        {            if (key == "B")            {                MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;                if (monitoredItem.StartNodeId.ToString() == MonitorNodeTags[0])                {                    textBox2.Invoke(new Action(() =>                    {                        textBox2.Text = notification.Value.WrappedValue.Value.ToString();                    }));                }                else if (monitoredItem.StartNodeId.ToString() == MonitorNodeTags[1])                {                    textBox3.Invoke(new Action(() =>                    {                        textBox3.Text = notification.Value.WrappedValue.Value.ToString();                    }));                }                if (myDic.ContainsKey(monitoredItem.StartNodeId.ToString()))                {                    myDic[monitoredItem.StartNodeId.ToString()] = notification.Value.WrappedValue.Value;                }                else                {                    myDic.Add(monitoredItem.StartNodeId.ToString(), notification.Value.WrappedValue.Value);                }                string str = "";                //foreach (var item in myDic)                //{                //    Console.WriteLine(item.Key);                //    Console.WriteLine(item.Value);                //}            }        }        private void btnWrite_Click(object sender, EventArgs e)        {            string myTxt = textBox4.Text.Trim();            string nodeId = "ns=3;s=\"S7MesData\".\"S7Real\"[0]";            opcClient.WriteSingleNodeId(nodeId, (float)Convert.ToDouble(myTxt));        }    }}

结果:

在这里插入图片描述

在这里插入图片描述

来源地址:https://blog.csdn.net/helldoger/article/details/130461630

--结束END--

本文标题: C# 中,使用OpcUaHelper读写OPC服务器

本文链接: https://lsjlt.com/news/374296.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C# 中,使用OpcUaHelper读写OPC服务器
    nuget包 帮助类: using Opc.Ua.Client;using Opc.Ua;using OpcUaHelper;using System;using System.Collections.Generic;using Syst...
    99+
    2023-08-18
    服务器 c#
  • 如何使用golang读写OPC
    如何使用golang读写OPC?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。golang适合做什么golang可以做服务器端开发,但golang很适合做日志处理、数据打包、虚拟...
    99+
    2023-06-06
  • 使用C#开发OPC Server服务器源码解析
    目录1、需要的DLL2、添加引用3、OPC Server 接口开发5、测试OPC Server服务器服务器的开发比较繁琐,本示例采用C#提供了一种简单快速实现OPCServer的方法...
    99+
    2024-04-02
  • OPC UA服务端(Prosys OPC UA Simulation Server)和客户端(OPC UA Explorer)工具使用
    OPC UA服务端(Prosys OPC UA Simulation Server) Prosys OPC UA Simulation Server下载地址 https://downloads.pro...
    99+
    2023-08-31
    经验分享
  • c#中怎么使用FileStream读写文件
    在C#中使用FileStream读写文件,可以按照以下步骤进行操作:1. 创建FileStream对象:首先需要创建一个FileSt...
    99+
    2023-09-13
    c# FileStream
  • C++std::shared_mutex读写锁的使用
    目录0.前言1.认识std::shared_mutex2.实例演示0.前言 读写锁把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。C...
    99+
    2024-04-02
  • C++文件读和写的使用
    C++是一种常用的编程语言,可以用于编写各种应用程序。在这里,我们将介绍如何在C++中进行文件的读和写。在C++中,要进行文件的读或写,需要使用文件流对象。文件流对象是一种C++中的...
    99+
    2023-05-17
    C++文件读写 C++ 读写
  • C++qt使用jsoncppjson读写操作
    JsonCpp的使用 项目需要c++下使用json,我选择了JsonCpp,官网是:https://github.com/open-source-parsers/jsoncpp。 解...
    99+
    2024-04-02
  • C#中怎么使用NPOI库读写Excel文件
    今天小编给大家分享一下C#中怎么使用NPOI库读写Excel文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。第一步添加程引...
    99+
    2023-06-29
  • C#使用NPOI库读写Excel文件
    本文实例为大家分享了C#使用NPOI库读写Excel文件的具体代码,供大家参考,具体内容如下 第一步添加程引用: 右键项目工程 — 管理 NuGet程序包 —...
    99+
    2024-04-02
  • C#使用NPOI对word进行读写
    目录一、简介操作Word的类库:二、简单使用1、XWPFDocument类的实例化2、设置页面的大小3、段落处理4、表格处理5、页眉页脚处理三、综合示例四、参考一、简介 操作Word...
    99+
    2024-04-02
  • 如何使用C#读写文本文件
    这篇文章将为大家详细讲解有关如何使用C#读写文本文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。读取txt文件 如果你要读取的文件内容不是很多,可以使用 File.ReadAllText(...
    99+
    2023-06-15
  • C++的std::shared_mutex读写锁怎么使用
    这篇“C++的std::shared_mutex读写锁怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++的std:...
    99+
    2023-06-29
  • 使用C/C++读写.mat文件的方法详解
    目录一、创建工程并添加测试代码二、修改CmakeLists文件三、添加环境变量四、令人头秃的错误五、运行结果总结最近需要使用C++来处理matlab生成的数据, 参考了网上一些博客,...
    99+
    2024-04-02
  • C#如何使用NPOI对word进行读写
    这篇文章主要介绍了C#如何使用NPOI对word进行读写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何使用NPOI对word进行读写文章都会有所收获,下面我们一起来看看吧。一、简介操作Word的类库:N...
    99+
    2023-07-02
  • JavaAQS中ReentrantReadWriteLock读写锁的使用
    目录一. 简介二. 接口及实现类三.使用四. 应用场景五. 锁降级六.源码解析七.总结一. 简介 为什么会使用读写锁? 日常大多数见到的对共享资源有读和写的操作,写操作并没有读操作那...
    99+
    2023-02-02
    Java 读写锁ReentrantReadWriteLock Java 读写锁 Java ReentrantReadWriteLock
  • 应用MySQL读写分离以提高MySQL服务器的读写性能
      读写分离是借助MySQL中间件 ProxySQL 实现的  ProxySQL 有两个版本:官方版和percona版,percona版是基于官方版基础上修改C++语言开发,轻量级但性能优异(支持处理千亿...
    99+
    2024-04-02
  • C#使用StreamReader和StreamWriter类读写操作文件
    StreamReader 类 (System.IO) | Microsoft 官方文档 StreamWriter 类 (System.IO) | Microsoft 官方文档 一、文...
    99+
    2024-04-02
  • 怎么使用C#二进制读写BinaryReader、BinaryWriter、BinaryFormatter
    本篇内容介绍了“怎么使用C#二进制读写BinaryReader、BinaryWriter、BinaryFormatter”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大...
    99+
    2023-07-02
  • C++ qt如何使用jsoncpp json进行读写操作
    这篇文章将为大家详细讲解有关C++ qt如何使用jsoncpp json进行读写操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JsonCpp的使用项目需要c++下使用...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作