1、DAIS Data Acquisition for Industrial Systems 简 介,Part 1: 概 述, DAIS简介 DAIS处理到的问题 DAIS未处理到的问题 DAIS的设计原理 DAIS与其它相关标准的关系,1. DAIS简介,DAIS的用途 为应用(如SCADA)高效、实时地传送大批量数据给多个客户端提供通用的接口;使用DAIS的一个典型场合 实线箭头表示数据由服务器 传给客户 量侧值; 状态量等; 虚线箭头表示数据由客户端 写入服务器 数据为控制量等; 正如右图所示,DAIS API在一个系统中可 以使用在不同的层次。例如,一个DAIS API 服务器可以作为RT
2、U/Process station通信单 元,可以作为一个SCADA服务器,也可以作 为一个管理系统服务器。,DAIS支持 读/写操作 事件订阅 DAIS客户端实现一个回调对象,当数据更新(update),DAIS服务器可以调用此对象把此事件通知给相对应的客户端。CIM模型符合(conformance to)DAIS DAIS有三个功能模块: DAIS Server DAIS Data Access DAIS Alarms and Events 实现DAIS,就是说: 符合(实现)DAIS Server; 符合(实现) DAIS Data Access或DAIS Alarms and Even
3、ts 也可以同时符合(实现) DAIS Data Access和DAIS Alarms and Events,DAIS Server & DAIS Alarms and Events,DAIS Server & DAIS Data Access,DAIS Server & DAIS Data Access DAIS Alarms and Events,一个DAIS服务器,DAIS API可以用于广泛的工业领域。例如, power transmission power generation power distribution water and sewage(污水) management oi
4、l and gas district(区域) heating pulp(纸浆) and paper food manufacturing,实时、高效地传送数据数据访问 在服务器端查寻(discovery of)数据; 查询服务器所支持的信息模型(如,类、属性) 同步、异步读/写服务器数据 创建和维护事件的订阅通过聚集(aggregating)服务器向客户端隐藏掉设备管理,2. DAIS处理到的问题,3. DAIS未处理到的问题,4. DAIS的设计原理,Adherence to OPC OPC规范使用多年,已很成熟;DAIS规范是借鉴(leverage on)OPC规范而制订的 市场上已有大量
5、OPC产品;且DAIS与OPC可以进行桥接(bridge)Simplification and uniformity 为了简化和取得更一致的接口,OPC的一些规则被替换。例如, DAIS中一个方法只进行某一特定行为,这导致一些OPC方法被替换为多个DAIS方法High PerformanceDAIS服务器是一个实时系统。为了满足实时性能要求,典型的DAIS服务器并不使用关系型商用数据库系统进行在线(on-line)操作,而是使用某种实时数据库系统。为了高效地传输数据,DAIS规范本身的设计不能引进性能瓶颈。这对DAIS的设计有如下的影响:,subscription(订阅)minimizing
6、LAN traffic 第一步:客户端向DAIS服务器订阅所需数据项 第二步:服务器向客户端传递所订阅数据 sequences (序列)of structs minimizing LAN traffic 这使客户端一次调用可以处理大批数据 从而减少客户端调用的次数 Iterators(遍历器) for long sequences ( DAISNode.idl) 一次方法调用传输大容量数据并不是高效的 所以,许多函数调用返回一个遍历器,客户端使用返回的遍历器进行数据读取 elimination of the CORBA Any data type Any是较复杂的数据类型,当传输大数据量时会影
7、响传输性能 DAIS中基本的数据单元为:SimpleValue,它是由简单数据类型所组成的联合(union)类型,5. DAIS与其它相关标准的关系,OPC close adherence following a set of explicit rules DAF fully compatible 在DAIS中通过接口(API)所传送的数据值,其类型使用了DAF的SimpleValue类型。,当一个系统同时支持DAF和DAIS接口时,同一个对象在通过这两种接口时应由同一个ResourceID来标识;对象属性(property)同样如此。,IEC 1346-1 IEC 1346-1描述了对象、属
8、性层次型的命名规则;DAIS采用了这个命名方式。 IEC 61970 IEC 61970 30-x部分描述了电力系统对象的层次型结构; DAIS is transparent to the structure and hence supports the IEC 61970 structure.,DAIS 组成部分,Common基本定义主要功能 数据访问(Data access) 报警和事件(Alarms and Events)DAIS 服务器 客户端由此创建 数据访问会话对象 / 报警&事件会话对象,Part 2: Common Declarations部分, Common IDL文件概观
9、每个IDL 文件简介,1. Common IDL文件概观,公共IDL文件依赖图,每个包(package)对应一个IDL文件,虚箭头表示 使用依赖。DAISCommon 给出了DAIS中的公共声明 (如资源标识的定义、数据访问权限的定义)。Node、Type、Property和Session的定义以及 操作这些数据类型的接口的定义对于数据访问 以及报警和事件部分来说也是公共的。,2. DAISCommon IDL文件简介,进行基本数据类型的定义。如: ResourceID:资源标识 SimpleValue:联合类型,描述一个属性值; ItemID:属性标识,是由一个资源标识和一个属性标识所组成的
10、结构; AccessRights:描述数据访问权限,枚举型可读;可写;可读写 ;,3. DAISNode IDL文件简介,由node来描述实际对象,其对应于DAF的resource(资源); 在DAIS中,nodes(节点)是按层次结构组织的;一个DASI服务器提供了多个由节点组成的层次结构,每一个节点层次结构称为一个视图(view); 在一个视图中:除了根结点外,每个节点都有一个唯一的父节点、一个标签(label,一个标签在同一个父节点下的所有节点中是唯一的)和一个路径名(pathname,由根结点到本节点的标签所组成); node是由结构Description来描述的: id:Resour
11、ceID 节点标识 parent:ResourceID 父节点标识 label:string 节点标签名 type:TypeID 本节点所属的类型(类标识); 使用DASI:Node:Home接口来浏览节点,主要方法有: find():给出节点标识,返回这个节点的描述; find_each():给出一组节点标识,返回这组节点的描述; find_by_parent():给出父节点,返回所有子节点的描述; find_by_type():给出一棵子树,返回特定类型节点的描述; get_pathnames():给出一组节点标识,返回每个节点对应的路径名; get_ids():给出一组路径名,返回每个路
12、径名对应的节点标识;,4. DAISType IDL文件简介,由type来描述节点(node)所属的类型,其对应于DAF中的class(类); 相关的类型(types)可以被组成到一个模式(schema)中; type是由结构Description来描述的: id:TypeID 类型标识 schema:ResourceID 模式标识 label:string 类型标签名 descrip:string 类型描述 aggregated_types:TypeIDs 使用DASI:Type:Home接口来浏览类型,主要方法有: find():给出类型标识,返回这个类型的描述; find_by_sche
13、ma():给出模式标识,返回这个模式所定义的所有类型的描述;,5. DAISProperty IDL文件简介,property,对象属性,其对应于DAF中的property; 每一个属性由一个PropertyID来标识; property由结构Description来描述: id:PropertyID 属性标识 label:string 属性标签名 descrip:string 属性描述 canonical_data_type:SimpleValueType 属性值对应的数据类型 使用DASI:Type:Home接口浏览属性,主要方法有: find():给出属性标识,返回这个属性的描述; fi
14、nd_each():给出一组属性标识,返回这组属性的描述; find_by_node():给出一节点标识,返回描述这个节点items的属性描述; find_by_type():给出一类型,返回这个类型所有的属性描述;,6. DAISSession IDL文件简介,session,会话,表示了客户端与DAIS服务器一次单独的交互(a single conversation);DAIS:Session为一个抽象接口,DataAccess:Session接口 和AlarmsAndEvents:Session接口分别继承了这个接口; 客户端提供回调对象(ShutdownCallback),当DAIS服
15、务器关闭时,服务器使用此对象通知与它相连的客户端; session是由结构SessionStatus来描述的: name:string 会话名字,在一个DAIS服务器中唯一 Start_time:DataTime 会话开始时的时间;,DAIS session IDL in UML,current_time:DataTime 会话在服务器中的当前时间; group_count:unsigned long 数据访问会话中当前的组(groups)数或者报警/事件会话中当前的事件订阅的数目; band_with:long 通信带宽(服务器与设备/RTU之间的通信) session接口中提供的主要方法:
16、 status() 返回当前会话的状态; call_back(ShutdownCallback) 客户端给服务器传递一个ShutdownCallback回调对象; destroy() 删除当前的会话对象;,Part 3: DAIS Server部分, DAISServer IDL文件概观 DAISServer IDL 文件简介,1. DAISServer IDL文件概观,Server IDL文件依赖图,DAISServer IDL文件描述了DAIS服务器 的接口。DAIS服务器的实现依赖于数据访问会话 接口和/或报警&事件会话接口的实现。,2. DAIS Server IDL文件简介,DAIS
17、服务器的主要功能:客户端从这儿获得会话对象一个DAIS服务器只有一个DAIS:Server对象。通常,DAIS:Server被实现为一个持久的对象,通过命名服务或交易服务来访问。DAIS:Server对象用来创建数据访问或报警事件会话对象。一个客户端可以创建它所需要的任意多个会话对象。 一个会话对应于一个视图(view),视图是一个特定的对象(本规范中也称为节点,nodes)层次型组织。,DAIS服务器是由结构ServerStatus来描述的: start_time:DataTime 服务器启动的时间 current_time:DataTime 服务器当前的时间 server_state:Se
18、rverState 服务器当前的运行状态(正常、故障、挂起等) session_count:ULong 客户端创建的会话总数 major_version:ULong 服务器软件的主版本 minor_version:ULong 服务器软件的次版本 bulid_number:ULong 服务器软件的编译号(build number) vendor_info:string 开发商的信息(公司名、支持的设备类型) DASI:Server接口提供的主要方法有: status() 返回这个服务器的状态 create_data_access_session():给出一组节点标识,返回这组节点的描述; 使用默
19、认的视图,创建一个数据访问会话对象 create_data_access_for_view():给出父节点,返回所有子节点的描述; 使用给定的视图名,创建一个数据访问会话对象,create_alarms_and_events_session() 使用默认的视图,创建一个报警&事件会话对象 create_alarms_and_events_session_for_view() 使用给定的视图名,创建一个报警&事件会话对象 find_views() 返回DAIS服务器所支持的视图名小结: 所有客户端与DAIS服务器对象(一个DAIS服务器只有一个)进行连接; 每个客户可以创建一个或多个会话(ses
20、sions),每个会话实现某一特定功能(数据访问或报警&事件); 每个会话都是针对某一特定视图的;若客户没有指定视图名,则使用DAIS服务器提供的默认视图;,Session Management,Part 4: DAIS Data Access部分, Information Model Data Access IDL文件概观 每个IDL 文件简介,1. DAIS数据访问服务器信息模型,Meta data DAISType DAISProperty Instance data DAISDANode appear as a branch in one or more hierarchies is
21、identified by a ResourceID has a type DAISItem appear as leafs to the nodes is identified by an ItemID ResourceID PropertyID has value time stamp quality,2. 命名规则,A Node,An Item,label = Cobden pathname = Cobden type = Station,Root,label = Ceylon pathname = Ceylon type = Station,label = Q1 pathname =
22、Cobden.Q1 type = Breaker,label = G1 pathname = Cobden.G1 type = Generator,label = P pathname = Cobden.G1.P type = Measurement,label = ActivePower pathname = Cobden.G1.P.ActivePower value = 50 time_stamp = 2000-11-17 14.28.05 quality = Good,label = Unit pathname = Cobden.G1.P.Unit value = MW time_sta
23、mp = 2000-11-17 14.28.05 quality = Good,label = HighLimit pathname = Cobden.G1.P. HighLimit value = MW time_stamp = 2000-11-17 14.28.05 quality = Good,3. Data Access IDL文件概观,Data Access IDL文件依赖图,4. DAISDASession IDL文件简介,数据访问会话对象继承自DAIS:Session对象,其实现了数据访问服务,一个数据访问会话对象有好几种服务,每一种服务有一个单独的home对象来提供; 其中,每
24、个home对象提供了对某种数据类型的操作方法: Browsing meta data DAISTypeHome DAISPropertyHome Browsing instance data DAISDANodeHome DAISItemHome Configuring data access DAISGroupHome DAISGroupManager Data transfer (IO) Server side DAISDAIO DAISGroupManager Client side DAISCallback,5. DAISDANode IDL文件简介,DASI:DataAccess:N
25、ode对象继承 自 DAIS:Node对象,增加了如下接口: get_root( )返回整棵节点树的根结点,6. DAISItem IDL文件简介,一个item表示对象的某个属性某一时刻的值; 每一个item由ItemID唯一标识。ItemID是一个结构,由节点的ResourceID和属性的PropertyID组成; item是由结构Description来描述的: id:ItemID item标识 label:string item标签名 value:SimpleValue 这个item的当前值 dais_quality:Quality 这个值的当前质量 time_stamp:DataTim
26、e 这个值的时间标记(time stamp) access_rights:AccessRights 这个值是可读、可写或可读写 scan_rate:ULong 这个值最快的更新速率; 使用DASI:DataAccess:Item:Home接口来浏览item,主要方法有: find():给出item标识,返回这个item的描述; find_each():给出一组item标识,返回这组item的描述; find_by_parent():给出节点,返回属于这个节点的items的描述; find_by_type():给出一棵子树,返回子树每个节点的items的描述; get_pathnames():给
27、出一组items标识,返回每个item对应的路径名; get_ids():给出一组路径名,返回每个路径名对应的item标识; get_access_paths():返回访问这个item多条可能的路径名。,7. DAISDAIO IDL文件简介,用于数据的读/写。在服务器端定义了了读、写操作的接口,在客户端定义了回调操作的接口。,IO接口提供了三种不同的读数据方式和两种不同的写数据方式: 读数据 同步读:所读数据由sync_read()方法返回得到; 异步读:所读数据由回调对象Callback的on_read_complete()方法返回; 订阅: 由服务器调用回调对象的on_data_chan
28、ge()方法自动地(spontaneously)将更新过的数据发送给客户端。 写数据 同步写:所写数据到达设备后,写操作返回; 异步写:DAIS服务器收到所写数据后,写操作就返回。当数据到达设备后,服务器调用回调对象的on_write_complete()方法告诉客户端写操作的完成情况。DAISDAIO的三个主要接口: DAIS:DataAccess:IO:SyncIO接口,同步读写接口,其支持的主要方法有: sync_read(): 同步读 sync_write(): 同步写 DAIS:DataAccess:IO:AsyncIO接口,异步读写接口,其支持的主要方法有; async_read(
29、): 异步读 async_write(): 异步写 refresh(): 刷新操作,对所有数据项(items)进行一次读操作 cancel(): 取消正在进行的refresh、async read或async write操作,DAIS:DataAccess:IO:Callback接口,回调操作接口,其支持的主要方法有 on_data_change()数据更新后或客户端调用refresh()操作后,服务器端调用此方法把已更新的数据传给客户端; on_read_complete()服务器使用此方法把客户所需数据传给客户端,是对async_read()操作的响应; on_write_complete
30、()服务器使用此方法告诉客户异步写操作的完成状况,是对async_write()操作的响应; on_cancel_complete()服务器使用此方法告诉客户取消操作已完成,是对cancel()操作的响应。,8. DAISDAGroup IDL文件简介,为了使不同的客户端得到它所需的更新数据(而不是更新数据的全部),引进了组(group)的概念。组是相关items的集合(collection)。为此,还引进了GroupEntry的概念,一个GroupEntry使某个组与某个item相关联;一个组有多个GroupEntry,所以一个组拥有多个items。一个组对应一个客户端(但一个客户端可以创建
31、多个组);所以当数据(items)更新后,只有属于这个组所包含的更新items(而不是更新数据的全部)才传给这个组所对应的客户端。,GroupEntry由结构Description来描述: : pathname:string item路径名 item:ItemID item标识 active:boolean item的活动状态 access_path:string 路径名 client_handle:ClientHandle 客户编号 request_data_type:SimpleValueType 客户端所需的数据值类型使用DASI:DataAccess:GroupEntry:Manage
32、r接口创建和浏览GroupEntry: create_entries(): 向组里添加一个或多个GroupEntries; validate_entries():验证客户端所拥有的GroupEntries描述是否仍然有效; remove_entries():从一个组中删除一个或多个GroupEntries; set_active_state():激活(activate)组里指定的items set_inactive_state():去活(deactivate)组里指定的items set_client_handle():改变items对应的客户编号,GroupEntry 简介,Group,组,
33、由结构State来描述: : name:string 组名 update_rate:ULong 这个组的更新速率,单位毫秒 active:boolean 这个组的活动状态 time_bias:long The time bias in minutes for the group. A zero value when used as input will tell the server to use the default system time bias. This bias behaves like the Bias field in the Win32 TIME_ZONE_INFORMAT
34、ION structure. percent_deadband:double 一个item值的变化百分比,这个百分比将导致为这个值进行一次回调操作。这个参数仅应用于模拟量。 locale_id:ULong The localization number for the language used when returning string values.客户端使用DASI:DataAccess:Group:Home接口生成所需的组: find_public_groups():查找DAIS服务器中定义的所有公共组; find():给定公共组标识,返回这个公共组的描述; create_group(
35、):给定组的状态值(State),创建一个组; clone_group_from_public():闯将一个公共组的拷贝; remove_public_group():删除一个公共组。,Group 简介,DASI:DataAccess:Group:Manager接口用来管理组。Manager接口继承了DAISGroupEntry和DAISDAIO中的接口,实现了group entry管理和数据传输功能,除此之外,其自身也提供了一套与组管理相关的方法 : get_state():得到组的状态; set_state():设置组的状态; clone():创建一个组的拷贝; clone_group_t
36、o_public():创建一个组的公共拷贝 destroy():删除一个组小结: 数据访问服务接口给客户端提供了如下功能: 同步/异步读、写服务器端数据(items) DAISDAIO模块; 对DAIS服务器端的更新数据进行分组,实现订阅功能 GroupEntry、Group模块。 每个客户端为了得到它所订阅的数据,必须实现一个回调对象;服务器端使用此回调对象把订阅的更新数据传给对应的客户端;,Group 简介(续),Create And Configure Group,Part 5: DAIS Alarms and Events部分, Information Model Data Acces
37、s IDL文件概观 每个IDL 文件简介,1. DAIS报警与事件服务器信息模型,Meta data DAISType DAISProperty Instance data DAISSource describe the subject involved in an alarm appear as Area leafs has a type may correspond to a DAISNode DAISArea describe an arbitrary organisation of Sources appear as a branch in one or more hierarchie
38、s DAISReason describe the reason behind an alarm three main reasons are defined: simple reason tracking reason condition reason DAISConditionSpace a space of possible (alarm) conditions a Source may take DAISSourceCondition actual condition data for a specific Source,2. Alarms & Events IDL文件概观,Alarm
39、s & Events IDL文件依赖图,3. DAISAESession IDL文件简介,报警&事件会话对象继承自DAIS:Session对象,其实现了报警&事件服务,一个报警&事件会话对象有好几种服务,每一种服务有一个单独的home对象来提供; 其中,每个home对象提供了对某种数据类型的操作方法: Browsing meta data DAISTypeHome DAISPropertyHome Browsing instance data DAISReasonHome DAISConditionSpaceHome DAISAreaHome DAISSourceHome DAISSource
40、ConditionHome Configuring alarms&events subscription DAISSubscriptionHome DAISSubscriptionManager Data transfer (IO) Server side DAISAEIO (DAISSubscriptionManager) Client side DAISCallback,4. DAISAESubscription IDL文件简介,客户端使用其提供的Home接口创建报警&事件订阅;同时,客户端通过Manager接口可以对所创建的订阅设置过滤功能,指定DAIS服务器把客户端所需的事件通知给它。
41、,由结构State来描述所创建的订阅的状态: active:boolean 这个订阅是否是活动态; buffer_time:ULong 客户端请求的缓冲时间值; max_size:ULong 客户端请求一次回调操作所发送的最大事件数目。 客户端使用结构FilterSpec进行事件过滤设置: reasons:ResourceIDs 指定Reasons,客户端因此而得到事件通知; low_severity:ULong 客户端所要事件的严重性值不得低于这个值; high_severity:ULong 客户端所要事件的严重性值不得高于这个值; areas:FilteringIdents 指定areas
42、,客户端得到因这些areas而引发的通知; sources:FilteringIdents 指定sources,客户端得到因这些sources而引发的通知。 客户端使用Home接口来创建订阅: query_available_filters( ) 查询DAIS服务器所支持的过滤功能; create_subscription() 创建订阅对象; 返回Manager对象。,客户端通过Manager对象设置过滤功能,指定它所需的事件通知: callback(DAIS:AlarmsAndEvents:IO:CallBack) 客户端给服务器提供一回调对象,服务器由这个回调对象进行事件通知; set_f
43、ilters( ) 客户端由此进行事件过滤设置; get_filter( ) 客户端取得服务器的事件过滤设置; set_state( ) 客户端由此进行订阅状态的设置; get_state( ) 客户端取得服务器的订阅状态设置; select_returned_properties( ) 设置事件通知中所包含的属性; get_returned_properties( ) 得到事件通知所包含的属性; refresh( ) 强行服务器端进行事件通知; refresh_with_history( ) 强行服务器对一段时间内的报警&事件进行通知; cancel_refresh( ) 取消正在进行的re
44、fresh(刷新)操作; clone( ) 创建这个这个订阅对象的拷贝; destroy( ) 销毁这个订阅对象。,Set Up Subscription,5. DAISAEArea IDL文件简介,一个area是sources的集合,由这些sources组成了一个层次型的结构。DAIS:AlarmsAndEvents:Area:Home接口继承自 DAIS:Node:Home接口,增加如下接口:get_root( )返回整棵area树的根结点;enable_condition( )启用指定areas中所包含的sources; (A method for enabling the source
45、s contained by the specified areas.)disable_condition( )停用指定areas中所包含的sources。,Browse Areas,6. DAISAESource IDL文件简介,一个source表示了产生报警和事件的一个对象,其可以包含在不同的areas中。DAIS:AlarmsAndEvents:Source:Home接口继承自 DAIS:Node:Home接口,增加如下接口:translate_to_item_ids( )实现sources(alarms (A method for enabling the sources contai
46、ned by the specified areas.)disable_condition( )停用指定的sources。,7. DAISConditionSpace IDL文件简介,一个条件空间描述了多个条件的集合;条件空间与ConditionReason(三个main reason之一)相关联;由结构ConditionDescription来描述一个条件: id_number:ULong 在某个条件空间中的唯一编号; name:string 条件的名字; condition_logic:string 逻辑字符串,指示这个条件是否激活(active); severity:ULong 表明严重
47、程度的一个1-1000的数字: 1-200 : low severity 201-400 : medium low severity 401-600 : medium severity 601-800 : medium high severity 801-1000 : high severity descrip:string 对这个条件的描述,一个条件空间描述了多个条件的集合;条件空间与ConditionReason(三个main reason之一)相关联;由结构ConditionDescription来描述一个条件: id_number:ULong 在某个条件空间中的唯一编号; name:s
48、tring 条件的名字; condition_logic:string 逻辑字符串,指示这个条件是否激活(active); severity:ULong 表明严重程度的一个1-1000的数字: 1-200 : low severity 201-400 : medium low severity 401-600 : medium severity 601-800 : medium high severity 801-1000 : high severity descrip:string 对这个条件的描述,条件空间由结构ConditionSpaceDescription来描述: id:Resour
49、ceID 条件空间的标识; name:string 条件空间的名字; descrip:string 条件空间的描述; conditions:ConditionDescriptions 组成这个条件空间的一组条件。客户端使用Home接口来浏览(而非设置)服务器所定义的条件空间: find( ) 由一个条件空间标识找到某个条件空间; find_each() 由一组条件空间标识找到一组条件空间; find_by_reason( ) 找到为某个reason而定义的所有条件空间; find_by_source( ) 找到为某个source而定义的所有条件空间; get_names( ) 由一组条件空间标识得到对应的一组名字; get_ids( ) 由一组条件空间的名字得到对应的一组条件空间标识。,