上海液化天然气有限责任公司 张思元
OPC技术在天然气行业控制系统中的应用
上海液化天然气有限责任公司 张思元
当前工业生产中广泛采用了PCS(Process Control System)系统,天然气行业也不例外。控制系统需要将现场仪表采集的信号传输给HIS(Human Interface System)控制站进行监控。如何使得控制系统与HIS站之间稳定、高效的传输数据,是控制系统设计中的一个关键问题。同时,如何将过程数据传输给第三方设备,以便于生产系统信息化的建设也是目前生产企业需要解决的问题之一。文章讨论的OPC技术即是基于此类问题上的解决方法之一。
天然气 PCS OPC
随着科技的进步,工业生产正向大规模、高效率、复杂化的方向发展,对产品的质量和数量的要求也越来越高,已经不可能依靠纯手工来生产,同时自动化程度的提高也能够有效的减少工作人员的数量和工作强度,增强企业的生产力和竞争力。
上海液化天然气有限责任公司负责上海液化天然气(LNG)项目的投资、建设和运营。是上海市“十一五”期间能源供应的重要项目,也是2006年市政府重点工程之一,项目主要由接收站工程及输气管线工程组成。项目一期工程于2009年底建成,已成为上海市天然气供应保障和调峰应急的主力。根据市场发展和调峰保障的需求,上海液化天然气有限责任公司仍在计划实施上海LNG项目扩建工程,以进一步提高全市天然气调峰供应和安全应急保障能力。
目前上海LNG控制系统广泛采用了PCS (Process Control System)过程控制系统和SIS(Safty Instruments System)安全仪表系统以及SCADA数据采集与监视控制系统。接收站现场仪表采集的信号通过电缆传入PCS和SIS系统,经过相应的控制模块进行数据处理后,对现场设备进行自动控制,同时将现场反馈信号等传输给HIS(Human Interface System)控制站进行监控,也可通过HIS控制站实现操作员对现场设备的远程操作。在即将开始的扩建中,如何保证控制系统与HIS站之间稳定、高效的传输数据,同时具备一定的兼容能力,以整合扩建过程中需要增加的各种控制系统,是设计和招标阶段考虑的一个关键问题。同时PCS、SIS和SCADA的数据如何提供接口,将数据传输给第三方设备,以满足公司信息化的建设要求也是目前LNG公司目前需要解决的问题。本文讨论的OPC技术即是基于此类问题上的解决方法之一。
1.1 OPC技术概述
OPC是OLE for Process Control的缩写。顾名思义,OPC是一种利用微软的COM/DCOM技术来达成自动化控制的协议。OPC的开发目的,正是为了给工业控制系统应用程序之间的通讯建立一个接口标准,在工业控制设备和控制软件之间建立一个统一的数据存取规范,这个规范不仅适用于单机,而且适用于网络分布式系统。
目前OPC规范主要包括:
(1)OPC数据存取(Data Access)规范;
(2)OPC报警与事件(Alarm and Event)规范;
(3)OPC历史数据存取(Historical Data Access)规范;
(4)OPC安全(Security)规范;
(5)OPC批处理(Batch)规范;
(6)OPC服务器数据交换(Data Exchange)规范;
(7)OPC_XML规范。
1.2 OPC接口及应用
OPC数据访问接口标准实现了实时数据的同步,异步读写访问和数据自动刷新,通过COM的连接点技术实现了服务器方到客户方的通讯,即定时或当数据变化超过一定范围时向客户方发送变化的数据。数据访问接口标准定义了数据访问的由上而下的三个层次:服务器层,组层,项层。OPC服务器、组、项的关系如图1所示。
图1 OPC服务器、组、项的关系
OPC组提供了一种途径给客户端用来组织数据。例如:组可以用一种特别的操作来显示和报告项。数据可以被读写。除此以外,在客户端和组的项之间可以创建基本的连接,按照需要可以被使用和禁用。OPC客户端能配置OPC服务器提供的数据变化的速率。OPC项提供的是服务器内的数据源的连接。项不能作为一个对象被OPC客户端访问。所有对OPC项的访问是通过OPC组对象这个项的容器来完成的。和每个项关联的是一个值、性质和时间戳。值是一个变量。项不是数据源,仅仅是连接数据源的一种连接,项应该被认为是一种指定的数据地址,而不是物理上真正的数据。
作为一个最低的级别,OPC接口能够从SCADA和PCS系统的物理设备或者应用程序中得到原始数据。这种结构和设计使得客户端应用程序能够访问OPC厂商提供的多种不同的服务器,见图2。
图2 OPC服务器和客户端应用中的关系
OPC采用客户/服务器结构,提供了两套接口方案,分别为自定义接口和自动化接口。如图3所示。
图3 OPC接口
自定义接口效率高,通过它客户能够发挥OPC服务器的最佳性能,采用C++语言的客户一般采用此方案;自动化接口使解释性语言和宏语言访问OPC服务器成为可能,采用VB语言的客户一般采用此方案,如图4所示。
图4 OPC结构
OPC客户端与服务器端的通信通过OPC的接口来实现。服务器能够提供可靠的数据访问,并能对不同的客户端的访问请求进行优化。
1.3 OPC方式及应用
OPC服务器可以提供以下几种方法的读写:
同步读写数据,读写函数直到读写完成后才能返回,在此期间OPC客户程序一直处于等待状态。同步读写数据如图5。同步方式是按照一定的时间频率交换所有数据的方式,方法简单,但效率较低。适用于发送数据量教少的场合。
图5 同步通讯方法
异步读写数据,OPC客户端对服务器进行读、写操作时,函数直接返回,客户端不用等待OPC服务器的操作,读写完毕后,服务器会产生一个回调(Callback)通知客户己经读写完毕。因此相对于同步通信,异步通信的效率更高,适用于多客户端访问同一OPC服务器和大量数据的场合。异步读写数据如图6。
图6 异步读写方法
除了上述的同步和异步数据访问之外,还有并不需要OPC应用程序向OPC服务器请求,就可以自动接到从OPC服务器送来的变化通知的订阅方式(Subscription),订阅方式是异步数据访问的第二种访问方式。服务器按一定的更新周期(Update Rate)更新OPC服务器的数据缓冲器的数值时,如果发现数值有变化时,就会以数据变化事件(Datachange)通知OPC应用程序。如果服务器支持不敏感带(Dead Band)而且OPC标签的数据类型是模拟量的情况,只要当前值与前次值的差的绝对值超过一定限度时,才更新缓冲器数据并通知OPC应用程序。由此可以无视模拟值的微小变化,从而减轻OPC服务器和OPC应用程序的负荷。订阅通讯方式如图7。订阅方式适用于处于长期监视特定变量的情况下。
图7 异步订阅通讯方式
1.4 OPC技术的必要性
使用OPC技术前,由于每个厂家所采用的通信接口不一样,使得不同厂家、不同设备之间的通信互不兼容,软件开发厂商必须按照各个硬件设备开发特定的接口,硬件的升级也需要更换已有的驱动程序,造成了软件的重复开发,资源不能共享等浪费,不同厂家之间的软件和硬件难以集成,给现场管理带来了很多困难。使用了OPC技术后,各个不同厂家的独立系统可以整合起来,从而实现系统的集成,提高企业生产和管理水品。
从OPC通信方式看,使用了OPC异步读写方式及订阅方式后,极大节省了客户程序在数据访问时期的等待时间。订阅方式在数据变化不超过范围的时候不会进行数据刷新并通知客户程序,减少了传输的数据量和数据访问请求,减少了网络延迟,提高了控制系统的实时性。
上海液化天然气有限责任公司目前采用了广泛使用以OPC技术为基础的横河电机的控制系统,系统架构如图8所示。
图8 系统硬件架构
PCS和SIS系统均通过控制总线与HIS(人机界面工作站)连接,HIS站有2种,一种HIS站中安装有OPC服务器及OPC客户端,直接可以从总线接口上对PCS及SIS系统进行数据读写,一种没有安装OPC服务器,只安装有OPC客户端的HIS通过安装有OPC 服务器的HIS站读写,如图9所示。可以看出在扩建过程中,如果只增加横河电机向下兼容的控制系统或HIS控制站,显然是没有问题的。
图9 OPC通信接口示意
如果增加第三方的控制系统,同时生产过程数据也需要传输给HIS控制站显示,就需要区别对待。由于横河电机使用的是Vnet/IP总线协议,而第三方控制系统的网络协议可能不同,同时考虑到需要跨网段、各系统独立以及安全等问题,就需要使用SIOS(System Integration OPC Station系统整合OPC站)进行转换,通过SIOS将数据转发给HIS控制站,如图9所示。通过这样的OPC技术,可以对如PLC、不同厂家的PCS系统等进行集成,使用HIS站统一进行监控,监控的范围包括实时数据、系统报警、事件消息等。
同样的MES、ERP等第三方系统,也可以通过以上方法,逆向由SIOS获得生产过程数据,以满足企业信息化系统的要求。OPC 服务器与SIOS一般安装在同一台SIOS工作站中。
通过自动化API应用接口,可为企业应用开发人员、第三方开发者提供良好的支持,使用户在任何一个实时数据库客户端上,通过不同的编程环境(MS Excel VBA、VB Script、VB、VB.NET、C#等),在用户权限许可的情况下与实时数据库进行数据交换,开发应用程序。以下分别用同步和异步两种方式对读最新数据和读历史报警事件两种数据进行举例说明。
3.1 读取最新数据
3.1.1 同步读
以下程序以读2个Item为例:
Private Sub CmdSyncReadLatestValues_Click( )
Dim rsBrowseResults As ADODB.Recordset
Dim sItemsArray(1) As String
Dim lNumItems As Long
Dim Count As Long
Dim vItemID As Variant
Dim vData As Variant
Dim vValue1, vValue2 As Variant
Dim lQuality1, lQuality2 As Long
Dim dTimeStamp1, dTimeStamp2 As Date
sItemsArray(0) = "Root.Tag1.Value"
sItemsArray(1) =
"Root.Tag1.Aggregations.Hour.Mean.Value"
lNumItems = 2
Set rsBrowseResults =
objBrowser.PathToMetaData(sItemsArray,
lNumItems,brDetail)
For Count = 1 To lNumItems
vItemID = rsBrowseResults!ItemID
If Not IsNull(vItemID) Then
objDataAccess.Add vItemID
rsBrowseResults.MoveNext
Else
MsgBox "Path is invalid:" & sItemsArray(Count - 1)
Exit Sub
End If
Next Count
vData = objDataAccess.ReadValue
vValue1 = vData(1, 0)(0, 0) ‘ Item1.Value值
lQuality1 = vData(1, 0)(1, 0) ‘Item1.Quality值
dTimeStamp1 = vData(1, 0)(2, 0) ‘Item1. Timestamp值
vValue2 = vData(1, 1)(0, 0) ‘Item2. Value值
lQuality2 = vData(1, 1)(1, 0) ‘Item2. Quality值
dTimeStamp2 = vData(1, 1)(2, 0) ‘Item2.Timestamp值
End Sub
3.1.2 异步读
以下程序以读2个Item为例:
Private Sub cmdAsyncReadLatestValue_Click()
Dim rsBrowseResults As ADODB.Recordset
Dim sItemsArray(1) As String
Dim lNumItems As Long
Dim Count As Long
Dim vItemID As Variant
Dim vData As Variant
Dim vValue1, vValue2 As Variant
Dim lQuality1, lQuality2 As Long
Dim dTimeStamp1, dTimeStamp2 As Date
Set objDataAccess =
New QUANTUMAUTOMATIONLib.QDataAccess
objDataAccess.SetSession objSession
sItemsArray(0) = "Root.Tag1.Value"
sItemsArray(1) =
"Root.Tag1.Aggregations.Hour.Mean.Value"
lNumItems = 2
Set rsBrowseResults =
objBrowser.PathToMetaData(sItemsArray,
lNumItems,brDetail)
For Count = 1 To lNumItems
vItemID = rsBrowseResults!ItemID
If Not IsNull(vItemID) Then
objDataAccess.Add vItemID
rsBrowseResults.MoveNext
Else
MsgBox "Path is invalid:" & sItemsArray(Count - 1)
Exit Sub
End If
Next Count
objDataAccess.Execute
End Sub
Private Sub objDataAccess_
OnData(ByVal ItemID As Variant, ByVal
DataReturnType As QUANTUMAUTOMATIONLib.
qdaDataReturnType, ByVal Data As Variant)
Dim vValue As Variant
Dim lQuality As Long
Dim dTimeStamp As Date
Dim vItemID As Variant
vItemID = ItemID
vValue = Data(0, 0)
lQuality = Data(1, 0)
dTimeStamp = Data(2, 0)
End Sub
3.2 读取历史报警及事件
这里同样有同步读和异步读2种方法。
3.2.1 同步读
Dim ConnectStr As String
Dim objConnection As ADODB.Connection
Dim objRecordset As ADODB.Recordset
Dim Count As Long
Dim i As Long
Dim vAEId As Variant
Dim Events As Variant
Dim vOPCAEPumpHistID As Variant
Dim sSource As String
Dim sMessage As String
Dim dTimeStamp As Date
Dim lSequenceNo As Long
Dim lEventCategory As Long
Dim lSeverity As Long
Dim sConditionName As String
Dim lNoOfAttributes As Long
Dim vEventAttributesArray As Variant
Dim vEventAttribute As Variant
Dim dQueryTime As Date
Set objConnection = New ADODB.Connection
ConnectStr = "Provider=sqloledb;"
ConnectStr = ConnectStr + "Network Library = dbmssocn;"
ConnectStr = ConnectStr + "Server=;"
ConnectStr = ConnectStr + "database=QConfig;"
ConnectStr = ConnectStr + "Trusted_Connection=yes"
objConnection.Open ConnectStr
Set objRecordset = New ADODB.Recordset
objRecordset.LockType = adLockOptimistic
objRecordset.Open "SELECT OPCAEPump HistId
FROM OPCServer WHERE Name = 'OPC Gateway 1'", objConnection
If objRecordset.EOF Then
MsgBox "Invalid OPC Gateway name"
Exit Sub
End If
vAEId = objRecordset!OPCAEPumpHistId
If Not IsNull(vAEId) Then objAEAccess.Add vAEId
Else
MsgBox "OPCAEPumpHistId is Null"
Exit Sub
End If
dQueryTime = DateAdd("n", -5, Now)
objAEAccess.SetQueryTimes dQueryTime
Events = objAEAccess.ReadValue
If Not IsNull(Events) Then
For Count = 0 To UBound(Events, 2)
vOPCAEPumpHistID = Events(0, Count)
sSource = Events(1, Count)
sMessage = Events(2, Count)
dTimeStamp = Events(3, Count)
lSequenceNo = Events(4, Count)
lEventCategory = Events(5, Count)
lSeverity = Events(6, Count)
sConditionName = Events(7, Count)
lNoOfAttributes = Events(8, Count)
EventAttributes
vEventAttributesArray = Events(9, Count)
For i = 0 To lNoOfAttributes - 1
vEventAttribute = vEventAttributesArray(i)
Next i
Next Count
End If
3.2.2 异步读
异步读之前需要先将objAEAccess定义为'With Events',事件触发。
Dim WithEvents objAEAccess As
QUANTUMAUTOMATIONLib.QAEAccess
Dim vAEId As Variant
Dim vData As Variant
Dim vAEData As Variant
Dim lQuality As Long
Dim dTimeStamp As Date
Dim ConnectStr As String
Dim objConnection As ADODB.Connection
Dim objRecordset As ADODB.Recordset
Dim dQueryTime As Date
Set objConnection = New ADODB.Connection
ConnectStr = "Provider=sqloledb;"
ConnectStr = ConnectStr + "Network Library=dbmssocn;"
ConnectStr = ConnectStr + "Server=;"
ConnectStr = ConnectStr + "database=QConfig;"
ConnectStr = ConnectStr + "Trusted_Connection=yes"
connection
objConnection.Open ConnectStr
Set objRecordset = New ADODB.Recordset
objRecordset.LockType = adLockOptimistic
objRecordset.Open "SELECT OPCAEPumpHistId FROM
OPCServer WHERE Name = 'OPC Gateway 1'", objConnection
If objRecordset.EOF Then
MsgBox "Invalid OPC Gateway name"
Exit Sub
End If
vAEId = objRecordset!OPCAEPumpHistId
If Not IsNull(vAEId) Then
objAEAccess.Add vAEId
Else
MsgBox "OPCAEPumpHistId is Null"
Exit Sub
End If
dQueryTime = DateAdd("n", -5, Now)
objAEAccess.SetQueryTimes dQueryTime
objAEAccess.Execute
Private Sub objAEAccess_OnAE(ByVal EventReturnType As
QUANTUMAUTOMATIONLib.qeaEventReturnType, ByVal Events As Variant)
Dim vOPCAEPumpHistID As Variant
Dim sSource As String
Dim sMessage As String
Dim dTimeStamp As Date
Dim lSequenceNo As Long
Dim lEventCategory As Long
Dim lSeverity As Long
Dim sConditionName As String
Dim lNoOfAttributes As Long
Dim vEventAttributesArray As Variant
Dim vEventAttribute As Variant
Dim Count As Long
Dim i As Long
If Not IsNull (Events) Then
For Count = 0 To UBound(Events, 2)
vOPCAEPumpHistID = Events(0, Count)
sSource = Events(1, Count)
sMessage = Events(2, Count)
dTimeStamp = Events(3, Count)
lSequenceNo = Events(4, Count)
lEventCategory = Events(5, Count)
lSeverity = Events(6, Count)
sConditionName = Events(7, Count)
lNoOfAttributes = Events(8, Count)
vEventAttributesArray = Events(9, Count)
For i = 0 To lNoOfAttributes - 1
vEventAttribute = vEventAttributesArray(i)
Next i
Next Count
End If
If EventReturnType = qeaNew Then
ElseIf EventReturnType = qeaMoreEvents Then
MsgBox "More notification to be received"
ElseIf EventReturnType = qeaEnd Then
MsgBox "Last notification received"
End If
End Sub
通过以上举例说明,可以看出OPC规范了接口函数,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而保证软件对客户的透明性,使得用户完全从底层的开发中脱离出来。
现有OPC规范的不足如下:
(1)缺少跨平台通用性。OPC技术是建立在COM/DCOM技术基础上。微软开发的DCOM为远程Windows应用和计算机工作提供了易于使用的通信基础,使得开发者能够在自己的应用程序中重复使用微软的方法和程序。但由于COM/DCOM对Microsoft平台的依赖性,使得OPC-COM接口很难被应用到其它平台上,OPC接口与COM/DCOM接口的关系如图10所示。
图10 OPC接口与COM/DCOM接口关系
(2)较难与Intemet应用程序集成。DCOM需要许多端口用于寻找其他主机、解析名称、请求服务、取得认证、发送数据和其他功能。如果这些端口不可用,DCOM会自动搜寻其他端口。正是由于DCOM这种开放任意端口的行为,使之成为网络攻击、病毒和蠕虫的目标。所以,当DCOM遇到安全问题时,包括OPC应用在内的所有应用都会受到感染。而如果使用防火墙等设备又会造成无法通信的情况。由于网络防火墙会过滤掉大多数基于COM传输的数据,因此OPC-COM不能与Intemet应用程序进行交互。DCOM不适用于Internet 环境,它不支持通过Internet访问对象。
(3)较难与企业应用程序连接。企业应用程序需要实时的工业现场数据,这些数据通常来自具有OPC-COM接口的服务器。但是这些上层应用程序大多没有与OPC-COM服务器交互的OPC-COM接口,因而不能进行连接。
针对OPC的以上缺点,OPC基金会推出了OPC UA (Unified Architecture)标准。
OPC UA服务器与现有OPC服务器比较:
(1)可互操作性:集成了现有OPC各自独立的API,增强了可互操作性。
(2)开放性:增加了对Linux/Unix 等其他非微软平台的支持。
(3)安全性:增加了服务器的鉴别与授权、消息的签名与加密,提高了安全性能。
(4)集成能力:服务器间的链接机制使得更容易实现现场层到管理层的集成,诸如实现MES,ERP系统,更适合作为系统的集成工具。
(5)可靠性:利用冗余技术、消息序列号、生存保持期等方法,提高了可靠性。
基于以上原因,在扩建阶段,LNG公司会重视控制系统在安全性方面的问题,优先考虑采用OPC UA标准的控制设备,同时弥补现有控制设备现存的缺点,以保证生产设备稳定安全的运行。
综上所述,本文详细描述了OPC的概念、接口及通信方式等情况,结合上海液化天然气有限责任公司即将开展的扩建工程,为控制系统的设计、招标提供了一定的理论基础,同时讨论、对比了OPC技术的优缺点,并对OPC技术的发展趋势进行了展望。
First notification
"
Application of OPC Technology in Natural Gas Controlling System
Shanghai LNG Co., Ltd. Zhang Siyuan
At present PCS(Process Control System)has been widely used in industry production ,no exception for natural gas industry. It needs to monitor signals transferring from field instruments to HIS(Human Interface System)control stations. It is important to make signals transferred efficiently between control system and HIS, and how to transfer signals to the third party device is also a problem to be done in the process of informatization for the manufacturing enterprise. The OPC technology discussed in this paper is one of the methods to solve these questions above.
natural gas, PCS, OPC