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模式下不…...

前端异常处理合集
文章目录 前言:思考:一、为什么要处理异常?二、需要处理哪些异常? js 代码处理基本的try...catch语句 Promise 异常Promise 错误处理async/await 全局处理错误捕获window.onerrorwindow.onunhandledrejectionwindow.addEventListe…...

求职:求职者在现场面试中应该注意哪些问题?
求职者在现场面试中需要注意诸多方面的问题 面试前的准备 了解公司信息: 提前通过公司官网、社交媒体账号、新闻报道等渠道,熟悉公司的发展历程、业务范围、企业文化、主要产品或服务等内容。例如,如果是应聘一家互联网科技公司,…...

第2章波动光学引论—抓本质,本质必定简单
1波动光学的电磁理论 1.1波动方程 1)波动方程是通过描述波函数随时间和空间的变化来表达波动的传播和演化。 2)一维波动方程: a.一维波动方程描述了沿着一条直线传播的波动。它的一般形式为: ∂u/∂t v ∂u/∂x 其中ÿ…...

分类模型评估利器-混淆矩阵
相关文章 地理时空动态模拟工具介绍(上) 地理时空动态模拟工具介绍(下)地理时空动态模拟工具的使用方法 前言 混淆矩阵(Confusion Matrix)是机器学习领域中用于评估分类模型性能的一种工具。它通过矩阵的…...

算法题(23):只出现一次的数字
初级: 审题: 需要输出只出现了一次的数据,其他数据均出现了两次 思路: 若不限制空间复杂度: 方法一:哈希表 用哈希映射循环一次,把对应数字出现的次数记录到数组里面,然后再遍历一次…...

@RestController与@Controller区别
区别1: RestController是Controller的升级版 区别2: RestController用于标识一个类作为控制器,并且可以处理HTTP请求。控制器类通常用于接收用户输入并决定返回响应的内容。 RestController通常用于返回JSON或XML数据 区别3:…...

使用ExecutorService和@Async来使用多线程
文章目录 使用ExecutorService和Async来使用多线程采用ExecutorService来使用多线程多线程过程的详细解释注意事项优点 使用Async来使用多线程对比Async和ExecutorService的多线程使用方式使用 ExecutorService 的服务类使用 Async 的服务类异步任务类自定义线程池主应用类解释…...

计算机网络 (19)扩展的以太网
前言 以太网(Ethernet)是一种局域网(LAN)技术,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网技术不断演进,从最初的10Mbps到如今的10Gbps、25Gbps、40Gbps、100Gbps等,已成…...

构造器/构造方法
1. 构造器 1.1 概述 先浏览下面简单代码; class Cons{ // 属性int age;String name; // 方法public void show(){System.out.println("age"age);} } class ConsTest{public static void main(String[] args) {Cons c new Cons();// Cons() 就是…...

异常
目录 1. 异常的概念及使用 1.1 异常的概念 1.2 异常的抛出和捕获 1.3 栈展开 1.4 查找匹配的处理代码 1.5 异常的重新抛出 1.6 异常安全问题 1.7 异常规范 2. 标准库的异常 1. 异常的概念及使用 1.1 异常的概念 异常处理机制允许程序中独⽴开发的部分能够在运⾏时就…...