C#OPC(上)
OPC(OLE for Process Control),用于过程控制的OLE,是一个工业标准,管理这个标准的国际组织是OPC基金会,OPC基金会现有会员以超过220家。遍布全球,包括世界上所有主要的自动化控制系统、仪器仪表及过程控制系统的公司。基于微软的OLE(Active X)、COM (部件对象模型)和DCOM (分布式部件对象模型)技术。OPC包括一整套接口、属性和方法的标准集,用于过程控制和制造业自动化系统。


引用 OPC 相关的库
-
首先需要安装并引用相应的 OPC 客户端库,常见的有 OPC Foundation 提供的.NET OPC 客户端库,如OPC.NET API 等,也可以使用第三方的 OPC 客户端库,如 Kepware 的 OPC 客户端库等。
连接到 OPC 服务器
-
使用 OPC 客户端库提供的类和方法来创建 OPC 连接对象,并指定要连接的 OPC 服务器的名称或地址。
-
调用连接对象的连接方法,建立与 OPC 服务器的连接。例如,使用 OPC Foundation 的.NET API 时,可能的代码如下:
using Opc;
using Opc.Da;class Program
{static void Main(){// 创建OPC连接对象Opc.Da.Server server = new Opc.Da.Server(new Opc.URL("opcda://localhost/OPCServerName"), null);try{// 连接到OPC服务器server.Connect();if (server.ServerState == ServerState.Running){Console.WriteLine("已成功连接到OPC服务器");}else{Console.WriteLine("无法连接到OPC服务器");}}catch (Exception ex){Console.WriteLine("连接OPC服务器时出错: " + ex.Message);}}
}
浏览 OPC 服务器的地址空间
-
连接成功后,可以使用 OPC 连接对象的浏览方法来获取 OPC 服务器的地址空间,即服务器上可用的 OPC 项和组的层次结构。
-
通常可以递归地浏览地址空间,以查找特定的 OPC 项或组。例如:
// 获取根节点
ItemIdentifier root = new ItemIdentifier();
BrowseElement[] elements = server.Browse(root);foreach (BrowseElement element in elements)
{Console.WriteLine(element.ItemName);// 如果元素是文件夹,可以递归浏览if (element.IsFolder){Browse(element.ItemID);}
}
读取 OPC 数据
-
确定要读取的 OPC 项的标识符,可以是项的名称、路径或唯一标识符等。
-
使用 OPC 连接对象的读取方法,传入要读取的 OPC 项的标识符列表,获取相应的 OPC 数据。例如:
// 定义要读取的OPC项的标识符
ItemIdentifier[] itemIds = new ItemIdentifier[]
{new ItemIdentifier("TagName1"),new ItemIdentifier("TagName2")
};// 读取OPC数据
ItemValueResult[] results = server.Read(itemIds);foreach (ItemValueResult result in results)
{Console.WriteLine($"Tag: {result.ItemName}, Value: {result.Value}");
}
写入 OPC 数据
-
确定要写入的 OPC 项的标识符和要写入的值。
-
使用 OPC 连接对象的写入方法,传入要写入的 OPC 项的标识符和相应的值。例如:
// 定义要写入的OPC项的标识符和值
ItemIdentifier[] itemIds = new ItemIdentifier[]
{new ItemIdentifier("TagName1")
};
object[] values = new object[]
{123.45
};// 写入OPC数据
server.Write(itemIds, values);
断开与 OPC 服务器的连接
-
当不再需要与 OPC 服务器通信时,调用 OPC 连接对象的断开连接方法,关闭连接。例如:
server.Disconnect();
OPC安装
在 C# 中安装和引用 OPC 客户端库通常有以下几种方法,以下以常见的 OPC Foundation 提供的.NET OPC 客户端库和第三方 Kepware 的 OPC 客户端库为例进行说明:
使用 NuGet 包管理器安装 OPC Foundation 的.NET OPC 客户端库
-
打开 NuGet 包管理器:在 Visual Studio 中,右键单击项目名称,选择 “管理 NuGet 程序包”,这将打开 NuGet 包管理器窗口。
-
搜索 OPC 客户端库:在 NuGet 包管理器窗口的搜索框中,输入 “OPC Foundation.NET API” 或相关关键词,搜索结果中会列出 OPC Foundation 提供的.NET OPC 客户端库。
-
安装库:选择合适的 OPC 客户端库版本,然后点击 “安装” 按钮,NuGet 包管理器会自动下载并安装该库及其依赖项到你的项目中。
步骤一

步骤二

步骤三

手动添加引用 OPC Foundation 的.NET OPC 客户端库
-
下载库文件:访问 OPC Foundation 的官方网站,找到适用于.NET 的 OPC 客户端库的下载链接,通常会提供一个安装包或一组可下载的文件。下载完成后,解压文件到本地目录。
-
添加引用:在 Visual Studio 中,右键单击项目名称,选择 “添加引用”,在弹出的 “引用管理器” 对话框中,点击 “浏览” 按钮,找到之前解压的 OPC 客户端库文件所在的目录,选择相应的.dll 文件,然后点击 “确定” 按钮将其添加到项目引用中。
### 安装和引用 Kepware 的 OPC 客户端库
安装和引用 Kepware 的 OPC 客户端库
-
获取 Kepware 客户端库:从 Kepware 官方网站下载适用于 C# 的 OPC 客户端库安装包,通常是一个.msi 或.exe 文件。
-
安装客户端库:运行下载的安装程序,按照安装向导的提示完成 Kepware OPC 客户端库的安装,安装过程中可以选择安装路径等选项。
-
添加引用:安装完成后,在 Visual Studio 中,右键单击项目名称,选择 “添加引用”,在 “引用管理器” 对话框中,点击 “浏览” 按钮,找到 Kepware OPC 客户端库的安装目录,一般在 “C:\Program Files (x86)\Kepware\Kepware OPC Server\Client” 或类似目录下,选择相关的.dll 文件,如 “Kepware.OPC.DA.Client.dll” 等,然后点击 “确定” 按钮将其添加到项目引用中。
安装和引用完成后,就可以在 C# 代码中使用`using`语句引入相应的命名空间,开始使用 OPC 客户端库提供的功能了,如`using Opc;`和`using Opc.Da;`等,具体的命名空间根据所使用的 OPC 客户端库而定
相关文章:
C#OPC(上)
OPC(OLE for Process Control),用于过程控制的OLE,是一个工业标准,管理这个标准的国际组织是OPC基金会,OPC基金会现有会员以超过220家。遍布全球,包括世界上所有主要的自动化控制系统、仪器仪表及过程控制系统的公司。基于微软的O…...
Imgui + Cmake + OpenGL + GLFW 隐藏控制台窗口
网上一般是VS,如何在属性里面把控制台改为窗口 本文,使用Clion Cmake,实现如何隐藏控制台窗口 环境:OpenGL3 GLFW 添加头文件#include <windows.h>把main函数入口改为int WinMain(HINSTANCE hInstance, HINSTANCE hPrevI…...
Spring Boot(七):Swagger 接口文档
1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…...
RabbitMQ - 4 ( 22000 字 RabbitMQ 入门级教程 )
一: RabbitMQ 高级特性 前面主要讲解了 RabbitMQ 的概念和应用。RabbitMQ 实现了 AMQP 0-9-1 规范,并在此基础上进行了多项扩展。在 RabbitMQ 官方网站中详细介绍了其特性,我们将其中一些重要且常用的特性挑选出来进行讲解。 1.1 消息确认 …...
印象笔记07——试一试PDF标注
印象笔记07——试一试PDF标注 [!CAUTION] 根据第六期,我再次查询了资料,印象笔记还是有一些可圈可点的功能的(当然部分有平替),针对会员作用,开发使用场景虽然是逆向的,但我坚信这是一部分人的现…...
Vue3实战教程》24:Vue3自定义指令
如果您有疑问,请观看视频教程《Vue3实战教程》 自定义指令 介绍 除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (Custom Directives)。 我们已经介绍了两种在 Vue 中重用代码的方式:组件和组…...
【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向
【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向 【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向 文章目…...
【ArcGIS Pro/GeoScene Pro】可视化时态数据
可视化过去二十年新西兰国际旅游业的发展变化 工程数据下载 ArcGIS Pro 快速入门指南—ArcGIS Pro | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据...
Linux buildroot和ubuntu的异同点
Buildroot 和 Ubuntu 都是 Linux 系统的操作环境,但它们的设计理念和使用场景有很大的不同。 一、定义与目标 Buildroot Buildroot 是一个用于生成嵌入式 Linux 系统的工具集,专注于交叉编译和构建嵌入式设备的最小 Linux 环境。它的目标是为嵌入式系统提供定制化和优化的…...
k8s系列--通过docker拉取的镜像导入到 containerd中
要将通过 docker pull 拉取的镜像导入到 containerd 中,可以按照以下步骤操作: 步骤 1:使用 docker 将镜像保存为 tar 文件 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1 docker save registry.cn-ha…...
Spring Boot(快速上手)
Spring Boot 零、环境配置 1. 创建项目 2. 热部署 添加依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency&…...
note 41:账务系统开发规范
目录 系统设计 防重控制 流量控制 并发控制 异常处理 备份机制 系统开发 前端队列操作 外系统交互 系统设计 防重控制 对于进入到系统中的数据(文件导入、手工录入、系统直连等)以及本系统发往外…...
基于嵌入式无人机UAV通信系统的实时最优资源分配算法matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于嵌入式无人机UAV通信系统的实时最优资源分配算法matlab仿真。具体参考文献: 考虑使用UAV作为中继辅助节点的设备到设备(D2D)无线信息和…...
《Vue3实战教程》35:Vue3测试
如果您有疑问,请观看视频教程《Vue3实战教程》 测试 为什么需要测试 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…...
【Java设计模式-3】门面模式——简化复杂系统的魔法
在软件开发的世界里,我们常常会遇到复杂的系统,这些系统由多个子系统或模块组成,各个部分之间的交互错综复杂。如果直接让外部系统与这些复杂的子系统进行交互,不仅会让外部系统的代码变得复杂难懂,还会增加系统之间的…...
log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件
文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗?2.1.1、场景一:…...
super_vlan
Super VLAN产生的背景 就经典的酒店例子来说,若是将101房和102房的网络划分在同一个vlan下面,那么101房出现了一个懂得某些安全技术的大佬,就会使得102房的隐私得到严重的隐患 所以这时我们就需要将二层给隔离开,但又要去保证10…...
前端CSS3学习
学习菜鸟教程 火狐-moz- 谷歌 Safari -webkit- 前面都加这个,可能才生效 边框 border: 1px solid #ddd 粗细 样式 样色 经常和border-radius 一块用 border-radius: 50px 20px 第一个左右 第二个右左 border-top-left-radius … box-shadow: 10px 5px 10px 0 #88…...
HTML——58.value和placeholder
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>value和placeholder属性</title></head><body><!--input元素的type属性:(必须要有)1.指定输入内容的类型2.默认为text,单行文本框-->&l…...
STM32单片机芯片与内部57 SPI 数据手册 寄存器
目录 一、SPI寄存器 1、SPI控制寄存器 1(SPI_CR1)(I2S模式下不使用) 2、SPI控制寄存器 2(SPI_CR2) 3、SPI 状态寄存器(SPI_SR) 4、SPI 数据寄存器(SPI_DR) 5、SPI CRC多项式寄存器(SPI_CRCPR)(I2S模式下不使用) 6、SPI Rx CRC寄存器(SPI_RXCRCR)(I2S模式下不…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
