OPC工业控制系统标准规范,C#实现同步读和异步读
一. OPC简介
OPC是基于微软OLE(现在的ActiveX)、COM(组件对象模型)和DCOME(分布式组件对象模型)的技术,OPC包括一整套接口、属性和方法的标准集,用于过程控制和制造业自动化系统。
管理OPC标准的组织是OPC基金会,其前身是一个由多家著名大公司组成的专门工作组,仅用了短短一年的时间便开发出一个基本可运行的OPC技术规范。
百度百科给的解释如下:
OPC是OLE for Process Control的缩写,即应用于过程控制的OLE;OLE是Object Linking and Embedding的缩写,OLE原意是对象连接和嵌入,随着OLE2的发行,其范围已远远超出了这个概念。如今OLE包含了许多新的特征,如统一数据传输、结构化存储和自动化,已经成为独立于计算机语言、操作系统甚至硬件平台的一种规范,是面向对象程序设计概念的进一步推广。OPC建立于OLE规范之上,它为工业控制领域提供了一种标准的数据访问机制。工业控制领域用到大量的现场设备,在OPC出现以前,软件开发商需要开发大量的驱动程序来连接这些设备。即使硬件供应商在硬件上做了一些小小改动,应用程序也可能需要重写。同时,由于不同设备甚至同一设备不同单元的驱动程序也有可能不同,软件开发商很难同时对这些设备进行访问以优化操作。硬件供应商也在尝试解决这个问题,然而由于不同客户有着不同的需要、同时也存在着不同的数据传输协议,因此也一直没有完整的解决方案。
自OPC提出以后,这个问题终于得到解决。OPC规范包括OPC服务器和OPC客户两个部分。其实质是在硬件供应商和软件开发商之间建立一套完整的“规则”。只要遵循这套规则,数据交互对两者来说都是透明的,硬件供应商只需考虑应用程序的多种需求和传输协议,软件开发商也不必了解硬件的实质和操作过程。
二. OPC结构与规范
OPC采用Server/Client架构
OPC Server数据源,它本身拥有数据,或从其他系统、控制器、设备等得到数据。OPC Client客户端,与Server交互,读或写。
OPC的数据规范包括:
Data Access数据访问规范、Alarms and Events报警和事件规范、HDA历史数据存取规范、Complex Data 复杂数据规范、Batch批量过程规范、Data Exchange数据交互规范、过程数据的XML规范、Commands命令规范、Security安全性规范

三. OPC组成
Item:数据项对象,是读写数据的最小逻辑单元,一个数据项与一个具体的测点相连;数据项不能独立于组存在,它必须隶属于某一个组。在每一个组对象中,可以加入多个OPC数据项,OPC数据项是服务器端定义的对象,通常指向设备的一个寄存器单元;OPC客户端对设备寄存器的操作都是通过其数据项来完成的,通过定义数据项,OPC规范尽可能的隐藏了设备的特殊信息,也使OPC服务器的通用性大大增强;OPC数据项并不提供对外接口,客户端不能直接对之进行操作,所有操作都是通过组对象进行的。(在编码实现的时候,还有一个OPCItems对象,它是Item的集合,和Item是一对多的包含关系)
Group:组对象,拥有本组的所有信息,同时包含OPC数据项(Item),组对象提供了客户组织数据的一种方法,组是应用程序组织数据的一个单位。客户可对之进行读写,还可以设置客户端的数据更新速率。当服务器缓冲区内数据发生改变时,OPC将向客户发出通知,客户得到通知后再进行必要的处理,而无需浪费大量时间进行查询。OPC规范定义了两种组对象,公共组(或全局组public)和局部组(或局域组)。公共组有多个客户共有,局部组只隶属于一个OPC客户。全局组对所有链接在服务器上的应用程序都有效。而局域组只能对建立它的client有效。一般来说,客户和服务器的一对连接只需要定义一个组对象。在一个组中可以有若干个项。
Server:服务器对象,拥有服务器的所有信息,同时也是组对象(Group)的容器,一个服务器对应于一个OPC Server,即一种设备的驱动程序。在一个server中可以有若干个组。
四. Server和Client通讯测试
下面进入正题,我们怎么在软件中采用OPC规范读写数据呢
-
首先,模拟通讯,确保Server和客户机可以正常通讯(关于DCOM等的环境配置在文章最后)。
-
编码实现,建议采用微软的C#,对OPC的支持最好。
Server和Client都在我本机调试,首先我们先安装Server模拟软件,我这里用的是美卓的Matrikon OPC(仅测试使用没有商业性质,如有冒犯,可联系我删除)

我们可以看到,在我的本机有三个OPC Server实例,我们用Matrikon OPC,右键添加Group

建立Group,并设置刷新速率为1秒

然后我们在创建好的Group里面添加Item,测试使用,这个随意添加就行了

添加完成以后,激活

返回以后,可以看到测点的品质是Good,这样服务端就配置完成了
下面我们随便找一个客户端进行读数测试

打开客户端,然后选择要链接的Server实例


然后我们直接添加测点,这里如果不添加Group的话,默认也会自动分配一个Group

然后我们看到数值和时间戳没问题,说明Server和Client配置没问题,可以进行通信。
五. 编码实现
下面我们开始用C#语言实现(其实Java也可以,只是要做一个转换,从适配性和读写速度角度来说还是用.NET比较好)

首先我们先扫描本地OPC Server实例
object serverList = opcServer.GetOPCServers("127.0.0.1"); this.listBox1.Items.Clear(); foreach (var item in (Array)serverList) { this.listBox1.Items.Add(item); }


然后选择要链接的实例,点击按钮Connect
string opcObj = this.listBox1.SelectedItem.ToString(); opcServer.Connect(opcObj, "127.0.0.1"); if (opcServer.ServerState == (int)OPCServerState.OPCRunning) { this.button2.Text = "Disconnect"; }

接下来创建Group
opcGroups = opcServer.OPCGroups; opcGroup = opcGroups.Add("ZZHGROUP_01"); //设置组属性 opcServer.OPCGroups.DefaultGroupIsActive = true; opcServer.OPCGroups.DefaultGroupDeadband = 0; opcGroup.UpdateRate = 3000; opcGroup.IsActive = true; opcGroup.IsSubscribed = true; opcGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(OpcGroup_DataChange); //注册异步读取事件 opcItems = opcGroup.OPCItems; for (int i = 0; i < itemTags.Length; i++) { opcItems.AddItem(itemTags[i], i); }
然后实现异步读
StringBuilder sb = new StringBuilder(); for (int i = 0; i < ItemValues.Length; i++) { int clientHandle = (int)ClientHandles.GetValue(i+1); sb.Append(itemTags[clientHandle] + ":" + ItemValues.GetValue(i+1)+"\r\n"); } this.textBox1.Text = sb.ToString();

当然还有同步读
StringBuilder sb = new StringBuilder(); Object value; Object quality; Object timestamp; for (int i = 0; i < itemHandle.Length; i++) { OPCItem item = opcGroup.OPCItems.GetOPCItem(itemHandle[i]); item.Read((short)OPCDataSource.OPCDevice, out value, out quality, out timestamp); sb.Append(itemTags[i] + ":" + value + "\r\n"); } this.textBox1.Text = sb.ToString();
六. 补充说明
这里我要说明一下,我们平时用的比较多的可能是异步读,异步读的频率不会大于Group的刷新时间,异步读在正常情况下数据的传输速率要高于同步读;但是在实际使用的时候,我们会发现某些测点质量不太好的时候,数据刷新的频率会降低,有时候甚至十几秒才刷新一次;像DCS每秒4次的数据刷新,这种情况下异步就不能满足我们的需要了,我们需要的快频率同步来满足,同步是主动索要,异步是被动接收。在实际生产环境中,同步读实现千个测点秒读是没问题的,并且已经得到了验证。
需要OPC相关资料,需要先关注公众号,然后将公众号里面的这篇文章分享到朋友圈,再加我微信xiaoyiyz

浙公网安备 33010602011771号