0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OPC访问接口方式以及读写方式

机器人及PLC自动化应用 来源:机器人及PLC自动化应用 作者:机器人及PLC自动化 2022-09-19 15:10 次阅读

OPC是Object Linking and Embedding(OLE)forProcess Control 的缩写,它是微软公司的对象链接和嵌入技术在过程控制方面的应用。OPC以OLE/COM/DCOM技术为基础,采用客户/服务器模式,为工业自动化软件面向对象的开发提供了统一的标准,这个标准定义了应用Microsoft操作系统在基于PC的客户机之间交换自动化实时数据的方法,采用这项标准后,硬件开发商将取代软件开发商为自己的硬件产品开发统一的OPC接口程序,而软件开发者可免除开发驱动程序的工作,充分发挥自己的特长,把更多的精力投入到其核心产品的开发上。

SimaticNet是西门子全集成自动化系统中的一个重要组成部分,它为完善的工业自动化控制系统的通讯提供部件和网络,同时提供多个OPCServer,为数据的外部访问提供接口,本文主要以OPC.SimaticNET为例说明。

c15326da-3728-11ed-ba43-dac502259ad0.png

采用不同的通信方式,通过OPC.SimaticNET,现场数据可以方便地提供给用户:

c178e4b0-3728-11ed-ba43-dac502259ad0.png

OPC的读写方式

在实际使用中,主要包括对现场数据的读写操作。

OPC读数有三种方式:同步、异步、订阅。

同步通讯时,OPC客户程序向OPC服务器进行请求时,OPC客户程序必须等到OPC服务器对应的响应全部完成以后才能返回,在此期间OPC客户程序一直处于等待状态,若进行读操作,那么必须等待OPC服务器响应后才返回。因此在同步通讯时,如果有大量数据进行操作或者有很多OPC客户程序对OPC服务器进行读操作,必然造成OPC客户程序的阻塞现象。因此同步通讯适用于OPC客户程序较少,数据量较小时的场合。

c18d00ee-3728-11ed-ba43-dac502259ad0.png

异步通讯时,OPC客户程序对服务器进行请求时,OPC客户程序请求后立刻返回,不用等待OPC服务器的响应,可以进行其它操作。OPC服务器完成响应后再通知OPC客户程序,如进行读操作,OPC客户程序通知OPC服务器后离开返回,不等待OPC服务器的读完成,而OPC服务器完成读后,会自动的通知OPC客户程序,把读结果传送给OPC客户程序。因此相对于同步通讯,异步通讯的效率更高。

c1a4bbd0-3728-11ed-ba43-dac502259ad0.png

订阅方式时,OPC客户程序对服务器进行请求时,OPC客户程序操作后立刻返回,不用等待OPC服务器的操作,可以进行其它操作, OPC 服务器的Group组在组内有数据发生改变时,自动根据更新周期刷新相应的客户端数据,如下图,客户端只向OPC服务发送一次请求,之后不再对服务器请求。

c1bdab4a-3728-11ed-ba43-dac502259ad0.png

OPC写数有两种方式:同步、异步。区别与上面讲的机制一样,在生产应用中,如果写数据参与控制,一般采用同步方式。

OPC访问接口方式:

OPC主要包含两种接口:CUSTOM标准接口和OLE自动化标准接口,自定义接口是服务商必须提供的,而自动化接口则是可选的。

自定义接口是一组COM接口,主要用于采用C++语言的应用程序开发;

自动化接口是一组OLE接口,主要用于采用VB,DELPHI,Excel等基于脚本编程语言的应用程序开发。

c1d9e4d6-3728-11ed-ba43-dac502259ad0.png

许多OPC服务器,包括OPC.SimaticNet,是在COM平台开发的,从而对于基于.NET 框架下的C#语言,作为客户端程序语言访问OPCServer,需要解决两个平台间无缝迁移的问题。OPC基金会对会员提供了OpcRcw动态链接库,OPC NET COM包装器和OPC NET API,将OPC复杂的规范封状成简单易用的C#类,可以比较容易地实现数据访问。

本文中通过实验,逐步讲解了通过C#编写客户端程序,访问OPC.SimaticNet,对PLC数据进行读写的实现过程。自定义接口及自动化接口都进行了测试,但基于C#的语言特性,建议采用自定义接口访问,同时有很多OPCServer服务商,对外是不提供自动化接口的,西门子的SimaticNet及WinCC的OPCServer都提供自动化接口。

c1ee054c-3728-11ed-ba43-dac502259ad0.png

OPC Server端组态配置:

c205c56a-3728-11ed-ba43-dac502259ad0.png

c2224050-3728-11ed-ba43-dac502259ad0.png

c23af816-3728-11ed-ba43-dac502259ad0.png

如上图建立连接S7_connection_1,然后在OPC Scout测试连接的正确性。

c25452ca-3728-11ed-ba43-dac502259ad0.png

从上面可以看到数据访问都是正常的。

C#自动化接口

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Collections;

using OPCSiemensDAAutomation;//引用连接库

第一步,添加下列命名空间(首先在COM组件中添加相应组件)

using OPCSiemensDAAutomation;

第二步,定义OPC相关变量

OPCServer MyOpcServer; //定义OPCServer

OPCGroup MyOpcGroup; //定义组

OPCItem MyOpcItem1; //Item

OPCItem MyOpcItem2; //值

long[] ServerHandle = new long[2]; //Item的句柄

第三步,建立连接及对象

MyOpcServer = new OPCServer();

MyOpcServer.Connect("OPC.SimaticNet", "192.168.0.102");

MyOpcGroup = MyOpcServer.OPCGroups.Add("MyGroup1");

MyOpcItem1 = MyOpcGroup.OPCItems.AddItem("S7:[S7 connection_1]DB10,INT0",1);

MyOpcItem2 = MyOpcGroup.OPCItems.AddItem("S7:[S7 connection_1]DB10,INT2", 2);

ServerHandle[0] = MyOpcItem1.ServerHandle;

ServerHandle[1] = MyOpcItem2.ServerHandle;

第四步,同步读数据,

private void Btn_Read_S_Click(object sender,EventArgs e)//同步读数据

{

……

MyOpcItem1.Read(1,out ItemValues,out Qualities, out TimeStamps);

//ItemValues,Qualities,TimeStamps分别是值,质量码

//也可以通过调用SyncRead函数,参数可参考异步读函数

……

}

第四步,同步写数据

private void Btn_Write_S_Click(object sender,EventArgs e)

{

……

MyOpcItem1.Write(Txt_W1.Text);

//也可以通过调用SyncWrite函数,参数可参考异步写函数

……

}

第五步,异步事件定义,

在异步操作情况下,需要定义相应的异步事件

MyOpcGroup.DataChange +=new

DIOPCGroupEvent_DataChangeEventHandler(MyOpcGroup_DataChange); //

//订阅方式下数据改变

iteComplete +=new

DIOPCGroupEvent_AsyncWriteCompleteEventHandler(MyOpcGroup_WriteComplete);

//写完成事件

MyOpcGroup.AsyncReadComplete += new

DIOPCGroupEvent_AsyncReadCompleteEventHandler(MyOpcGroup_ReadComplete);

//读完成事件

MyOpcGroup.AsyncCancelComplete += new

DIOPCGroupEvent_AsyncCancelCompleteEventHandler(MyOpcGroup_CancelComplete);

//取消操作事件

在使用中注意,其事件函数要按照特定接口:

void MyOpcGroup_DataChange(int TransactionID, int NumItems,ref Array ClientHandles,

ref Array ItemValues,ref Array Qualities, ref Array TimeStamps)

void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array ClientHandles,

ref Array Errors)

void MyOpcGroup_ReadComplete(int TransactionID, int NumItems,ref System.Array

ClientHandles,ref System.Array ItemValues,ref System.Array Qualities,

ref System.Array TimeStamps,ref System.Array Errors)

void MyOpcGroup_CancelComplete(int CancelID)

第六步订阅方式读

void MyOpcGroup_DataChange(int TransactionID, int NumItems,ref Array ClientHandles,

ref Array ItemValues,ref Array Qualities, ref Array TimeStamps)

{

……

//注意数据改变时,Item数量要通过NumItems得到,也就是说只有数据改变时,才对一

遍,所以降低了服务器负担。要注意读语句写法。

……

}

第七步异步读

private void Btn_Read_A_Click(object sender,EventArgs e)//异步读事件

{

int[] handle = new int[3] {ServerHandle[0], ServerHandle[1],0};//注意方式

Array MyServerHandles = (Array)handle;

Array errors;

int cancelID;

……

MyOpcGroup.AsyncRead(2, ref MyServerHandles, out errors, READASYNC_ID, out

cancelID);

……

}

void MyOpcGroup_ReadComplete(int TransactionID, int NumItems,ref System.Array

ClientHandles,ref System.Array ItemValues,ref System.Array Qualities,

ref System.Array TimeStamps,ref System.Array Errors)

{

……

//注意TransactionID的对应

……

}

注意array在函数内部做参数时,数据下标是从1开始的,所以要考虑将第0位空出

来,n个Item,就要定义n+1列数组,添加一个0,但在函数使用时,又是从左开始读的。

否则会报错。

第八步异步写

private void Btn_Write_A_Click(object sender,EventArgs e)

{

……

MyOpcGroup.AsyncWrite(2,ref MyServerHandles, ref Myvalues,out errors,

WRITEASYNC_ID,out cancelID);

……

}

void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array ClientHandles

ref Array Errors)

{

……

}

同样要注意Array在函数内部做参数的传递。

第九步释放对象

private void Btn_Disconn_Click(object sender,EventArgs e)

{

……

}

OPCItem的数据类型:

在通过自定义接口访问时,

ItemArray[1].szAccessPath = "";

ItemArray[1].szItemID = "S7:[S7 connection_1]DB10,Real4";//地址,不同数据类型表示

ItemArray[1].bActive = 1;//是否激活

ItemArray[1].hClient = 2;//表示ID

ItemArray[1].dwBlobSize = 0;

ItemArray[1].pBlob =IntPtr.Zero;

ItemArray[1].vtRequestedDataType = 5;

ItemArray[2].szAccessPath = "";

ItemArray[2].szItemID = "S7:[S7 connection_1]DB10,STRING26.10";//地址,不同数据类型表

示方法不同

ItemArray[2].bActive = 1;//是否激活

ItemArray[2].hClient = 3;//表示ID

ItemArray[2].dwBlobSize = 0;

ItemArray[2].pBlob =IntPtr.Zero;

ItemArray[2].vtRequestedDataType = 8;

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8173

    浏览量

    149752
  • 西门子
    +关注

    关注

    93

    文章

    2937

    浏览量

    114679
  • OPC
    OPC
    +关注

    关注

    7

    文章

    315

    浏览量

    45952

原文标题:如何在C#中实现OPC数据访问

文章出处:【微信号:gh_a8b121171b08,微信公众号:机器人及PLC自动化应用】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview通过西门子OPC和S7-200 Smart PLC通信的一种方式

    Labview和PLC之间的通信 方式有很多种,比如:1、使用Labview DSC模块的 OPC进行通信,通过在项目中添加I/O Server或者直接在VI中设置控件的Data Binding属性进行
    发表于09-07 15:45

    OPC读写速度问题

    。但是设置较低的时候,感觉 读写的时间在100ms级别,有点慢了。不知道这个问题有没有人有深入研究,一般 OPC的通讯 读写上限速度是多少?能否用于高度实时控制的系统?
    发表于09-08 20:32

    关于C51和ARM读写寄存器方式区别?

    请教各位关于C51和ARM 读写寄存器 方式区别的疑惑C51里 访问寄存器的 方式是:例如sfr P0 = 0x80;然后对P0的赋值就可以 读写这个
    发表于07-15 10:14

    DMA内部寄存器的读写方式和应用场合

      DMA内部寄存器的 读写 方式  基于AXI的DMA对内部寄存器的 读写有着相同的 方式。在普通传输模式下,DMA内部的寄存器都是由处理器通过AXI-Lite总线进行
    发表于12-23 17:48

    钡铼技术的BL102OPCUA网关的OPCUA配置方式

    OPCUA协议已经越来越多的应用在工业物联网中。本文介绍钡铼技术的BL102 OPCUA网关的 OPCUA配置 方式,与大家共享。运行 OPC
    发表于12-23 08:10

    OPC统一数据访问技术研究Study onOPCUnif

    本文在分析传统 OPC数据 访问技术不足的基础上,提出了Kepware OPC统一数据 访问技术方案,并结合实际应用验证了该技术的可行性。关键词: OP
    发表于05-26 10:29 14次下载

    与AB PLC通过opc方式连接的方法

    与AB PLC通过 opc 方式连接的方法 Rockwell Automation 的A-B PLC是一个著名的可编程控制器产品。其产品体系基本上涵盖了工业控制产品的各个领域,由于A-B的PLC的种类繁多,且各种类
    发表于07-04 08:22 26次下载

    OPC数据访问服务器的研究与实现

    简单介绍了 OPC技术及其应用,分析了 OPC服务器的对象组成和程序结构。对服务器开发中要注意的几个关键问题:COM 线程,数据存储 方式和数据 访问
    发表于08-29 10:55 23次下载

    OPC接口技术

      •概述   • OPC基本原理   • OPC自定义 接口
    发表于10-22 16:44 25次下载

    单缓冲方式接口与应用

    单缓冲 方式接口与应用 1.单缓冲 方式连接 所谓单缓冲 方式就是使
    发表于02-27 15:48 1716次阅读
    单缓冲<b class='flag-5'>方式</b>的<b class='flag-5'>接口</b>与应用

    基于OPC的数据访问服务器开发

    基于 OPC的数据 访问服务器开发一文以针对一种PCI总线CAN通信卡设计的 OPC数据 访问服务器为编程实例,详细介绍了 OPC数据
    发表于07-18 16:39 35次下载
    基于<b class='flag-5'>OPC</b>的数据<b class='flag-5'>访问</b>服务器开发

    ARM指令寻址方式之内存访问指令寻址

    4.2 内存 访问指令寻址 根据内存 访问指令的分类,内存 访问指令的寻址 方式可以分为以下几种。 ① 字及无符号字节的Load/Store指令的寻址 方式
    发表于10-18 16:32 1次下载
    ARM指令寻址<b class='flag-5'>方式</b>之内存<b class='flag-5'>访问</b>指令寻址

    HPI接口的工作模式以及与上位主机的连接方式解析

    主机(Host)的 访问,只能被主机 读写。两个DSP 的HPI 接口之间不能通讯。两个DSP 之间互连,可以将一个DSP(从)的HPI 接到另一个DSP(主)的扩展内存 接口(EMIF)上
    发表于07-01 09:14 7506次阅读
    HPI<b class='flag-5'>接口</b>的工作模式<b class='flag-5'>以及</b>与上位主机的连接<b class='flag-5'>方式</b>解析

    谷歌将在2021年改变Chrome的访问数据方式

    在今天举行的2020年Chrome开发峰会上,谷歌宣布将在2021年改变扩展 访问数据的 方式 以及扩展权限的运作 方式
    的头像 发表于12-10 15:52 1752次阅读

    KEPServer通过OPCUA访问迅资料讲解

    KEPServer通过 OPCUA 访问迅资料讲解
    发表于12-10 16:50 8次下载