Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于C#开发OPC客户端

基于C#开发OPC客户端

作者头像
科控物联
发布于 2022-03-29 12:37:32
发布于 2022-03-29 12:37:32
3.8K05
代码可运行
举报
文章被收录于专栏:科控自动化科控自动化
运行总次数:5
代码可运行

OPC全称是Object Linking and Embedding(OLE) for Process Control,它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁。OPC作为一整套接口、属性和方法的协议标准集,与具体的开发语言没有关系。

1、OPC客户端接口方式

开发OPC客户端程序,其访问接口方式有多种,根据官方提供的资料大约有如下几种方式:

  • 使用OPCNetAPI,需要用到OPCNetAPI.dll,OPCNetAPI.Com.dll
  • 使用自动化接口,需要用到OPCDAAuto.dll
  • 使用自定义接口,需要用到多个Wrapper:OpcRcw.Ae.dll,OpcRcw.Batch.dll,OpcRcw.Comn.dll,OpcRcw.Da.dll,OpcRcw.Dx.dll,OpcRcw.Hda.dll,OpcRcw.Sec.dll

对于像C++这样的语言来开发OPC客户端时,一般需要使用自定义接口的方式。而如果采用VB和C#这样的语言来开发OPC客户端时,一般就采用自动化接口。要使用OPC自动化接口,首先要引用OPCDAAuto.dll文件,并在开发环境中做好相关的引用配置。

2、自动化接口简介

自动化接口是OPC基金会组织为了方便并统一OPC客户端开发而发布的一个接口、属性和方法的协议集。其访问服务器的流程如下:

自动化接口中共定义了6类对象:OPCServer对象、OPCBrowser对象、OPCGroups对象、OPCGroup对象、OPCItems对象、OPCItem对象。接下来简要描述一下这些对象的主要功能。

(1)、OPCServer对象

由客户端创建的OPCServer自动化对象。然后客户端通过其方法实现连接到OPC数据访问自定义接口。OPCServer对象现在可以用来获取关于OPC服务器的一般信息,并创建和操作OPCGroup对象的集合。

主要的属性:

StartTime

CurrentTime

LastUpdateTime

MajorVersion

MinorVersion

BuildNumber

VendorInfo

ServerState

LocaleID

Bandwidth

OPCGroups

PublicGroupNames

ServerName

ServerNode

ClientName

主要的方法:

GetOPCServers

Connect

Disconnect

CreateBrowser

GetErrorString

QueryAvailableLocaleIDs

QueryAvailableProperties

GetItemProperties

LookupItemIDs

(2)、OPCBrowser对象

OPCBrowser对象是在服务器中存在的分支或项目名称的集合。其是可选的。如果服务器不支持,将不会创建这个对象。

主要的属性:

Organization

Filter

DataType

AccessRights

CurrentPosition

Count

主要的方法:

Item

ShowBranches

ShowLeafs

MoveUp

MoveToRoot

MoveDown

MoveTo

GetItemID

GetAccessPaths

(3)、OPCGroups对象

OPCGroups是OPCGroup对象的集合,以及创建、删除和管理它们的方法。

该对象还具有OPCGroup默认属性。当添加OPCGroups时,DefaultGroupXXXX属性设置其初始状态。可以更改默认值,以添加具有不同初始状态的opc组。更改默认值并不会影响已经创建的组。添加OPCGroup后,它的属性可以被修改。这减少了调用Add方法所需的参数数量。

主要的属性:

Parent

DefaultGroupIsActive

DefaultGroupUpdateRate

DefaultGroupDeadband

DefaultGroupLocaleID

DefaultGroupTimeBias

Count

主要的方法:

Item

Add

GetOPCGroup

Remove

RemoveAll

ConnectPublicGroup

RemovePublicGroup

(4)、OPCGroup对象

OPC组为客户组织数据提供了一种方式。例如,组可能表示特定操作符显示或报告中的项。数据可以读写。基于异常的连接也可以在客户端和组中的项之间创建,可以根据需要启用和禁用。OPC客户机可以配置OPC服务器应该向OPC客户机提供数据更改的速率。

主要的属性:

Parent

Name

IsPublic

IsActive

IsSubscribed

ClientHandle

ServerHandle

LocaleID

TimeBias

DeadBand

UpdateRate

OPCItems

主要的方法:

SyncRead

SyncWrite

AsyncRead

AsyncWrite

AsyncRefresh

AsyncCancel

(5)、OPCItems对象

这个对象还具有OPCItem默认的属性。当添加OPCItem时,DefaultXXXX属性设置其初始状态。可以更改默认值,以添加具有不同初始状态的OPCItems。当然,一旦添加了OPCItem,它的属性可以被修改。这减少了调用Add方法所需的参数数量。

主要的属性:

Parent

DefaultRequestedDataType

DefaultAccessPath

DefaultIsActive

Count

主要的方法:

Item

GetOPCItem

AddItem

AddItems

Remove

Validate

SetActive

SetClientHandles

SetDataTypes

(6)、OPCItem对象

OPC项表示与服务器中的数据源的连接。与每个项目相关联的是一个值,质量和时间戳。值以变量的形式出现,质量类似于Fieldbus指定的值。

主要的属性:

Parent

ClientHandle

ServerHandle

AccessPath

AccessRights

ItemID

IsActive

RequestedDataType

Value

Quality

TimeStamp

CanonicalDataType

EUType

EUInfo

主要的方法:

Read

Write

3、客户端的开发

接下来我们基于C#开发OPC客户端。上面说明了自动化接口具体情况,我们需要进一步针对自己的具体应用编写代码。

首先,封装一斜对象、用于存取相关的属性,如:OPC服务器信息(OPCServerInfo)、OPC数据项(OPCDataItem)、组属性(GroupProperty)等。对于组属性我们还需要赋予默认值。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class OPCServerInfo
    {
        public DateTime StartTime { get; set; }
        public string ServerVersion { get; set; }
    }
    public class OPCDataItem
    {
        public object ItemName { get; set; }

        public object ItemValue { get; set; }

        public object Quality { get; set; }

        public object TimeStamp { get; set; }

    }

 

    public class GroupProperty

    {

        public bool DefaultGroupIsActive { get; set; }

        public float DefaultGroupDeadband { get; set; }

        public int UpdateRate { get; set; }

        public bool IsActive { get; set; }

        public bool IsSubscribed { get; set; }

 

        public GroupProperty()

        {

            DefaultGroupIsActive = true;

            DefaultGroupDeadband = 0;

            UpdateRate = 250;

            IsActive = true;

            IsSubscribed = true;

        }

    }
代码语言:javascript
代码运行次数:0
运行
复制

接下来,为了使用方便我们封装了一个ClientHelper类用于实现相关的操作,应为在一个客户端应用中,该对象是唯一的我们为了使用方便将其声明为静态类,以便于使用。具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public class ClientHelper

    {

        /// <summary>
        /// 获取可以使用的OPC服务器
        /// </summary>
        /// <param name="hostName">获取OPC服务器的主机名称</param>
        /// <returns>返回OPC服务器列表</returns>
        public static List<string> GetOPCServerName(string hostName)
        {
            try
            {
                OPCServer OpcServer = new OPCServer();

                object opcServers = OpcServer.GetOPCServers(hostName);

                List<string> serverList = new List<string>();

                foreach (string opcServer in (Array)opcServers)

                {

                    serverList.Add(opcServer);

                }

                return serverList;

            }

            catch(Exception ex)

            {

                throw ex;

            }

        }

 

        /// <summary>

        /// 连接到指定的OPC服务器

        /// </summary>

        /// <param name="serverName">服务器名称</param>

        /// <param name="serverIP">服务器IP</param>

        /// <returns>返回的OPC服务器</returns>

        public static OPCServer ConnectToServer(string serverName, string serverIP)

        {

            OPCServer opcServer = new OPCServer();

            try

            {

                opcServer.Connect(serverName, serverIP);

                if (opcServer.ServerState != (int)OPCServerState.OPCRunning)

                {

                    opcServer.Disconnect();

                    return null;

                }

            }

            catch

            {

                opcServer.Disconnect();

                return null;

            }

            return opcServer;

        }

 

        /// <summary>

        /// 获取OPC服务器的相关信息

        /// </summary>

        /// <param name="opcServer">OPC服务器对象</param>

        /// <returns>OPC服务器信息</returns>

        public static OPCServerInfo GetServerInfo(OPCServer opcServer)

        {

            OPCServerInfo serverInfo = new OPCServerInfo();

            serverInfo.StartTime=opcServer.StartTime;

            serverInfo.ServerVersion = opcServer.MajorVersion.ToString() + "." + opcServer.MinorVersion.ToString() + "." + opcServer.BuildNumber.ToString();

            return serverInfo;

        }

 

        /// <summary>

        /// 展开OPC服务器的节点

        /// </summary>

        /// <param name="opcServer">OPC服务器</param>

        /// <returns>返回展开后的节点数据</returns>

        public static OPCBrowser RecurBrowse(OPCServer opcServer)

        {

            OPCBrowser opcBrowser = opcServer.CreateBrowser();

            //展开分支

            opcBrowser.ShowBranches();

            //展开叶子

            opcBrowser.ShowLeafs(true);

            return opcBrowser;

        }

 

        public static OPCGroup CreateGroup(OPCServer opcServer, OPCItems opcItems, string opcGroupName, GroupProperty groupProperty)

        {

            try

            {

                OPCGroup opcGroup = opcServer.OPCGroups.Add(opcGroupName);

 

                opcServer.OPCGroups.DefaultGroupIsActive = groupProperty.DefaultGroupIsActive;

                opcServer.OPCGroups.DefaultGroupDeadband = groupProperty.DefaultGroupDeadband;

                opcGroup.UpdateRate = groupProperty.UpdateRate;

                opcGroup.IsActive = groupProperty.IsActive;

                opcGroup.IsSubscribed = groupProperty.IsSubscribed;

 

                //opcGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(OpcGroupDataChange);

                //opcGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup_AsyncWriteComplete);

                //opcItems = opcGroup.OPCItems;

                return opcGroup;

            }

            catch (Exception err)

            {

                throw err;

            }

        }

    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)「建议收藏」
编写OPC客户端,网上的资料一般是一上来就要求找OPCDAAuto.dll,其实我想说,用VS,那都是多此一举,当然,如果你是在需要,我也可以提供给您最新版 OPCDAAuto.dll(v2.2.5.30)(https://download.csdn.net/download/wanghuaihu/11057994);
全栈程序员站长
2022/08/31
9.8K0
C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)「建议收藏」
opc服务器消息通知代码,OPC 服务器 操作示例源码
using HaiGrang.Package.OpcNetApiChs.DaNet;
全栈程序员站长
2022/08/31
3.4K0
opc服务器消息通知代码,OPC 服务器 操作示例源码
PC客户端(CS架构)客户端渗透测试指南
本项目主要针对PC客户端(CS架构)渗透测试,结合自身测试经验和网络资料形成清单,如有任何问题,欢迎联系,期待大家贡献更多的技巧和案例。
HACK学习
2019/09/30
14.4K0
PC客户端(CS架构)客户端渗透测试指南
[工具推荐]UA Expert—一个功能齐全的OPC UA客户端
Ua 专家®是一个功能齐全的 OPC UA 客户端,展示了我们C++ OPC UA 客户端 SDK/工具包的功能。Ua 专家设计为支持 OPC UA 功能(如数据访问、警报和条件、历史访问和 UA 方法调用)的通用测试客户端。Ua 专家是一个跨平台 OPC UA 测试客户端,在C++编程。它使用先进的GUI库QT形式诺基亚(原特罗尔技术),形成基本框架,这是可扩展的插件。
科控物联
2022/03/29
20K0
[工具推荐]UA Expert—一个功能齐全的OPC UA客户端
C#开发: 通信篇-TCP客户端
张三的电脑(ip:192.168.1.110)上有一个网络应用程序A(通信端口5000),
杨奉武
2020/03/05
6K0
C#开发: 通信篇-TCP客户端
没有 OPC UA 就没有 Industrie 4.0
工业 4.0 和工业物联网(IIoT)面临的一个主要挑战是如何在不同行业之间安全、标准化地交换数据和信息,尤其是在设备、机器和服务之间。
Hello工控
2025/04/09
1270
没有 OPC UA 就没有 Industrie 4.0
聊聊越来越火的OPC DA 和 OPC UA 的标准
OPC(Open Platform Communications,以前称为 OLE for Process Control)是一组软件技术,为控制各种设备和交换数据提供单一、统一的接口。OPC 规范由国际非营利组织 OPC 基金会制定,该组织于 1994 年由领先的工业自动化产品制造商制定。创建 OPC 的目标是为工程师提供一个通用接口来控制各种设备。
剑指工控
2021/11/04
10.9K0
聊聊越来越火的OPC DA 和 OPC UA 的标准
客户端程序传送图片到服务器
转载:http://www.cnblogs.com/networkcomms/p/4314898.html
跟着阿笨一起玩NET
2018/09/19
2.7K0
客户端程序传送图片到服务器
分享一篇关于C#大文件上传的整个过程
1、创建一个web mvc项目,在创建一个webservice文件夹,在文件夹下创建一个SaveFileWebForm.axpx接口,
用户7053485
2020/03/12
2.9K0
OPC DCOM详细配置方法 - 不关防火墙不换登陆用户
  OPC DCOM的设置是实现跨网络OPC通信的基础,现有的一些OPC DCOM配置教程虽然讲解了如何配置DCOM,但没有讲清楚为什么要这么做,而且各个教程涉及的配置方法也不尽相同。
科控物联
2024/06/27
2.9K0
OPC DCOM详细配置方法 - 不关防火墙不换登陆用户
rpc框架之 thrift连接池实现
接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() {
菩提树下的杨过
2018/01/19
3.4K0
在 .NET 中使用 OPC UA 协议
OPC UA(OPC Unified Architecture,开放平台通信统一架构)是 OPC 基金会应用在自动化技术的机器对机器网络传输协定。OPC UA 不依赖于特定的操作系统或平台,可以在 Windows、Mac、Linux 等多种系统上运行,而传统的 OPC(如 OPC DA)通常只能在 Windows 上使用。该协议提供了一个更为先进、安全和灵活的解决方案,适用于现代工业自动化和物联网环境中的设备间通信。
张高兴
2025/05/21
3390
在 .NET 中使用 OPC UA 协议
c#开发的客户端,如何调用c++开发的sdk dll库
c#客户端不能直接调用c++ dll,需要做2个黏合层把它们连接起来,这里以trtc sdk的dll为例
Tomas7571
2021/05/14
5.7K0
c#开发的客户端,如何调用c++开发的sdk dll库
用 Go 语言轻松构建 MCP 客户端
](https://cloud.tencent.com/developer/article/2509998)。
陈明勇
2025/04/03
1.7K2
用 Go 语言轻松构建 MCP 客户端
【愚公系列】2023年03月 MES生产制造执行系统-004.Kafka的使用
Kafka是一个分布式流处理平台,主要用于处理实时数据流。它可以用于日志收集、数据流处理、消息队列等场景。在大数据处理、实时数据分析等领域,Kafka被广泛应用。
愚公搬代码
2023/03/16
4920
【愚公系列】2023年03月 MES生产制造执行系统-004.Kafka的使用
集高性能高可扩展性于一体的声明式http客户端库-WebApiClientCore
WebApiClient.JIT/AOT[1]的.NET Core版本,集高性能高可扩展性于一体的声明式http客户端库,特别适用于微服务的restful资源请求,也适用于各种畸形http接口请求。
郑子铭
2023/09/28
8250
集高性能高可扩展性于一体的声明式http客户端库-WebApiClientCore
你知道吗?OPC UA除了C/S模型,还有Pub/Sub模型!
简称:OPC UA C/S模型。当然除了这个模型,还有扩展的Pub/Sub模型,我们这期重点分享下Pub/Sub发布/订阅模式。
Hello工控
2025/03/31
2080
你知道吗?OPC UA除了C/S模型,还有Pub/Sub模型!
Open_PCS7 OPC 与Simatic Net OPC 通讯的比较与总结
通过Windows“开始”>“所有程序”>“Siemens Automation>“SIMATIC”>“SIMATIC NET”>“Siemens Communication Settings”进入配置控制台检查,
剑指工控
2021/11/09
2.1K0
庐山真面目之七微服务架构Consul集群、Ocelot网关集群和IdentityServer4版本实现
庐山真面目之七微服务架构Consul集群、Ocelot网关集群和IdentityServer4版本实现
huofo
2022/03/18
5940
庐山真面目之七微服务架构Consul集群、Ocelot网关集群和IdentityServer4版本实现
实现 Cobalt Strike 的外部 C2 规范的库
Cobalt Strike 具有接受第三方命令和控制的能力,允许运营商远远超出该工具默认提供的 HTTP、DNS、TCP 和 SMB 侦听器。在外部命令和控制规范发布在这里,我们将这篇文章中被大量引用它。如果您不熟悉外部 C2 的概念,请务必至少阅读论文中的概述部分。
Khan安全团队
2021/12/29
1.2K0
推荐阅读
相关推荐
C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验