一种IEC61850模型的访问方法与流程

文档序号:17586165发布日期:2019-05-03 21:20阅读:625来源:国知局
一种IEC61850模型的访问方法与流程

本发明属于电力系统网络通信技术领域,具体涉及一种基于dbus总线的iec61850模型的访问方法。



背景技术:

iec61850是统一的变电站网络通信标准,也是电力系统网络通信的基础,它构建的体系对变电站通信网络和系统做出了全面、详细的描述和规范,主要由模型、服务、具体服务映射等部分组成,其中模型文件一般为xml格式。作为iec61850服务区和客户端,均通过解析模型文件生成所有的数据对象,并以此为基础进行通信。目前几乎所有的国内iec61850通信都是基于开发包二次开发,模型解析后存放于内存中,模型访问只局限于一个进程中。随着变电站内装置的功能的增强、数据量的扩大,特别是分布式的发展,这种实现方式存在以下问题:

1.不能支持多个应用程序访问同一模型信息,特别是多cpu架构或者分布式情况下更加难以实现直接访问同一模型,制约了系统的扩展性。

2.iec61850服务器端和客户端同时运行的模式下,需要各自解析模型,不能共享模型信息,因各自解析模型时内存消耗较大、解析时间较长,造成支持的数据量有一定限制,可能不能满足现场需要,且会导致应用程序启动慢。

一般情况下iec61850服务器端、iec61850客户端独立运行,单独使用各自解析的模型信息,目前已经出现了两者在同一环境运行的需求。目前各应用程序均是单独运行,没有模型信息的共享,由于数据量大,二者重复的模型信息会造成巨大的内存消耗及内存浪费。



技术实现要素:

dbus是一种低延迟、低开销、高可用性的进程间通信机制,其协议是二进制的,避免了序列化过程,通信效率较高。它的使用面向对象化,支持进程间一对一和多对多的对等通信,并支持通过网络进行通信。在多对多的通信时,需要后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将信息转发到目的进程,整个过程由总线自动完成,不需要额外干预。

为解决上述技术问题,本发明利用dbus进程间通信机制,设计实现iec61850模型目录访问接口、模型定义访问接口等,实现了iec61850服务器、客户端同时访问统一模型信息的功能,达到了模型信息共享的目的,同时根据信息访问频率优化数据存放在内存中还是数据库中,可有效节省模型占用的内存空间;另外,有多种语言(如c/c++、java)、多平台(linux、windows)支持dbus总线,本发明也大大提高了应用程序模型解析的兼容性和可扩展性。

本发明所采用的技术方案如下:

一种iec61850模型的访问方法,包括以下步骤:

步骤1、基于dbus总线封装多种iec61850模型访问接口,使得应用程序能够通过dbus总线以远程和本地两种方式访问iec61850模型信息;

步骤2、在iec61850模型信息第一次存入数据库时,按照iec61850模型的功能约束进行分类存储,在后续使用时将访问频率高的模型信息存入内存中,将访问频率低的模型信息仍然留在数据库内;

步骤3、在服务注册到dbus总线后,应用程序调用iec61850模型访问接口对iec61850模型进行存储和访问,如果服务的地址是本地服务、dbus总线会直接调用本地服务,如果服务地址是远程服务、dbus总线会直接通过网络实现远程服务调用。

优选地,步骤1所述的iec61850模型访问接口包括:获取目录接口、保存目录接口、获取定义接口、保存定义接口、获取数据值接口和保存数据值接口。

优选地,步骤2所述的iec61850模型的功能约束包括:mx、st、co、cf、dc、sp、sg、rp、lg、br、go、gs、sv、se、ex、sr、or、bl,按照访问频率,可把功能约束为mx、st、co、rp、br、lg、sp、se、sg的数据存储在内存中。

优选地,步骤3所述的应用程序调用iec61850模型访问接口对iec61850模型进行存储和访问的具体方法是:应用程序调用iec61850模型访问接口的获取目录接口、保存目录接口、获取定义接口,对iec61850模型的目录、定义进行存储和访问。

优选地,基于glib库实现iec61850模型的访问时,基于gdbus总线封装的模型访问接口包括:获取服务器接口、保存服务器接口、获取逻辑设备接口、保存逻辑设备接口、获取数据目录接口、保存数据目录接口、获取数据定义接口、保存数据定义接口、获取数据值接口、以及保存数据值接口。

优选地,基于gdbus总线封装的模型访问接口分为两类:请求函数接口和响应函数接口,其中响应函数接口包括:请求回调函数和响应发送函数。

本发明的有益效果:

1)基于dbus总线封装的模型服务器目录、逻辑设备目录等访问接口,可支持多个应用程序访问同一模型信息,有效解决了模型不能共享的问题,接口一致、多平台和多语言的支持,极大提高了模型访问功能的兼容性和扩展性。

2)通过设计模型信息结构化存储和统一的模型访问接口,使得多个应用程序可以访问同一模型信息,同时根据信息的访问频度决定模型信息是存储在内存中还是仅存储在数据库文件中,在保留访问性能的情况下,减少了内存消耗,特别是在iec61850服务器和iec61850客户端同时运行在同一台设备上时,可大大减少内存消耗,增加iec61850客户端连接终端的数量,提高了设备的启动速度。

附图说明

图1是iec61850模型访问的整体架构示意图。

具体实施方式

下面结合附图,具体说明本发明的实施方式。

一种iec61850模型的访问方法,包括以下步骤:

步骤1、基于dbus总线封装多种iec61850模型访问接口,包括:获取目录接口、保存目录接口、获取定义接口、保存定义接口、获取数据值接口和保存数据值接口,使得应用程序能够通过dbus总线以远程和本地两种方式访问iec61850模型信息。

步骤2、为了兼顾信息都能被访问以及访问性能,在iec61850模型信息第一次存入数据库时,按照iec61850模型的功能约束进行分类存储,在后续使用时将访问频率高的模型信息存入内存中;将访问频率低的模型信息仍然留在数据库内,如需访问可直接查询数据库。

通过dbus总线服务传输过来iec61850的模型信息,存储于数据库中以便后续使用。但在实际使用时,有的信息使用频率较高,如状态量、模拟量等,有的信息使用频率比较低,如描述信息、扩展信息等,而模型信息中有大量使用频率低的信息,应用程序如果把所有数据信息全部解析到内存中,会占用大量内存,但所有信息都可能被访问。

iec61850模型功能约束(functionconstrain)有以下几类:mx、st、co、cf、dc、sp、sg、rp、lg、br、go、gs、sv、se、ex、sr、or、bl,按照访问频率,可把功能约束为mx、st、co、rp、br、lg、sp、se、sg的数据存储在内存中。

在模型信息第一次存入数据库时应根据功能约束加以区分,以便应用程序在重新启动根据不同标志进行解析。这种实现方式不仅可以使得所有数据都能访问,频率高的数据访问性能不受影响,而且节省了大量的内存,增加了支持的终端数量,同时可以加快终端启动速度。

在保存模型时,应用程序根据功能约束树立标志把模型信息存储在数据库中,并根据标志把访问频率高的信息初始化到内存中;后续访问通过功能约束区分是在内存中读取还是在数据库中读取。保存完模型之后,如果应用程序重启则只需根据标志把访问频率高的信息初始化到内存中即可。

步骤3、在服务注册到dbus总线后,应用程序调用iec61850模型的存储、获取接口对iec61850模型目录、定义进行存储和访问。如果服务的地址是本地服务,dbus总线会直接调用本地服务,如果服务地址是远程服务,dbus总线会直接通过网络实现远程服务调用。

dbus总线是c/s模式总线,应用程序首选需要设置调用服务的地址,如果服务地址是远方地址,后续调用服务接口时会自动调用远方服务,如果服务是本地地址,则调用服务接口时会自动调用本地服务。

本发明中把61850模型存储自上而下分为三层:server(服务器)、ld(逻辑设备)和data(数据),61850模型信息主要是指server、ld和data的层次关系以及数据的定义。

传统中所有的模型信息在应用程序运行时都会初始化到内存中,特别是在模型中数据量比较多的情况下会占用大量的内存,且影响应用程序的启动速度,本发明中,在应用程序启动时,只把遥测量、状态量根据其定义初始化内存中,(例如状态量占用1个字节,则对应的在内存中生成1个字节的空间),那么初始化到内存中的数据个数就会大大减少,内存占用率下降,对于不经常访问的数据,其定义和值存储在数据库中即可。使用频率高的遥测量、状态量的能约束为mx和st,其他数据使用较少甚至不使用,在服务方处理请求时可根据功能约束查找该数据的存储位置。

应用程序在存储模型信息时,调用模型信息存储接口,本地总线会根据设置的地址对请求进行转发,服务所在的总线收到传输过来的信息,经过服务器处理并存储模型信息到数据库,服务器调用响应函数完成本次调用。

在应用程序获取或者保存数据值的时候,首先,服务器根据接收到的数据索引(包含功能约束)判断该数据是在内存中还是在数据库中,如果在内存中,则在内存中找到该数据的位置执行值的读取或者存储;如果在数据库中,则进行数据库查询,找到该数据然后再执行类似操作。

总结上述访问过程,以保存模型目录“server”为例进行描述如下,其他访问步骤类似:

①模型信息程序首先要注册服务,供其他应用程序调用访问。

②应用程序初始化,设置服务地址(每个应用程序设置一次即可)

③应用程序调用请求函数ieslab_iec61850_model_call_set_server_dir_sync,函数参数为server名称,应用程序所在的dbus总线根据设置的地址来转发服务。

④服务所在的dbus总线接收到请求后,根据前期服务注册的回调函数handle_set_server_dir调用本地处理函数,在接收到server名称后,存储到数据库中,最后使用ieslab_iec61850_model_complete_set_server_dir函数返回响应,并通过dbus返回给应用程序。

⑤应用程序在接收到dbus转发的响应结果后进行处理确认。

glib库是一个开源的库,运用范围较广,跨平台,易于学习和使用,除此之外还可以使用qt内部提供的dbus总线接口等。下面以glib库为实施例,具体说明本发明的实施方式。

glib库是linux平台下最常用的c语言函数库,它具有很好的可移植性和实用性。基于glib实现的dbus应用总线接口为gdbus,开发者提供一个xml格式的接口描述文件,通过工具生成对应的gdbus请求和响应接口代码,然后编译进应用程序调用即可。

基于gdbus总线封装的模型访问接口包括获取服务器接口(getserverdir)、保存服务器接口(setserverdir)、获取逻辑设备接口(getlddir)、保存逻辑设备接口(setlddir)、获取数据目录接口(getdatadir)、保存数据目录接口(setdatadir)、获取数据定义接口(getdatadef)、保存数据定义接口(setdatadef)、获取数据值接口(getdataval)以及保存数据值接口(setdataval)。基于xml格式的部分接口描述如下:

上述自动生成的代码中用到的单词,都是it技术中常用的含义,无需作进一步的说明。

接口分为两类:请求函数接口和响应函数接口,其中响应函数接口包括请求回调函数和响应发送函数。

使用生成工具生成对应的请求接口有:

①gbooleanieslab_iec61850_model_call_get_server_dir_sync(ieslabiec61850model*proxy,gvariant**out_serverlist,gcancellable*cancellable,gerror**error);

②gbooleanieslab_iec61850_model_call_set_server_dir_sync(ieslabiec61850model*proxy,gvariant*arg_serverlist,gcancellable*cancellable,gerror**error);

③gbooleanieslab_iec61850_model_call_get_lddir_sync(

ieslabiec61850model*proxy,constgchar*arg_server,gvariant**out_ldlist,gcancellable*cancellable,gerror**error);

④gbooleanieslab_iec61850_model_call_set_lddir_sync(

ieslabiec61850model*proxy,constgchar*arg_server,gvariant*arg_ldlist,gcancellable*cancellable,gerror**error);

⑤gbooleanieslab_iec61850_model_call_get_data_dir_sync(ieslabiec61850model*proxy,constgchar*arg_datref,gvariant**out_datalist,gcancellable*cancellable,gerror**error);

⑥gbooleanieslab_iec61850_model_call_set_data_dir_sync(ieslabiec61850model*proxy,constgchar*arg_datref,gvariant*arg_datalist,gcancellable*cancellable,gerror**error);

⑦gbooleanieslab_iec61850_model_call_get_data_def_sync(ieslabiec61850model*proxy,constgchar*arg_datref,gvariant**out_datalist,gcancellable*cancellable,gerror**error);

⑧gbooleanieslab_iec61850_model_call_set_data_def_sync(

ieslabiec61850model*proxy,constgchar*arg_datref,gvariant*arg_datalist,gcancellable*cancellable,gerror**error);

⑨gbooleanieslab_iec61850_model_call_get_data_val_sync(ieslabiec61850model*proxy,constgchar*arg_datref,gvariant**out_datatype,gvariant**out_datalist,gcancellable*cancellable,gerror**error);

⑩gbooleanieslab_iec61850_model_call_set_data_val_sync(ieslabiec61850model*proxy,constgchar*arg_datref,gvariant*arg_datalist,gcancellable*cancellable,gerror**error);

与请求对应的回调函数接口有:

①gboolean(*handle_get_server_dir)(ieslabiec61850model*object,gdbusmethodinvocation*invocation);

②gboolean(*handle_set_server_dir)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,gvariant*arg_serverlist);

③gboolean(*handle_get_lddir)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_server);

④gboolean(*handle_set_lddir)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_server,gvariant*arg_ldlist);

⑤gboolean(*handle_get_data_dir)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_datref);

⑥gboolean(*handle_set_data_dir)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_datref,gvariant*arg_datalist);

⑦gboolean(*handle_get_data_def)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_datref);

⑧gboolean(*handle_set_data_def)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_datref,gvariant*arg_datalist);

⑨gboolean(*handle_get_data_val)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_datref);

⑩gboolean(*handle_set_data_val)(ieslabiec61850model*object,gdbusmethodinvocation*invocation,constgchar*arg_datref,gvariant*arg_datalist);

与请求对应的响应发送函数如下,下面函数与回调函数配套使用:

①voidieslab_iec61850_model_complete_get_server_dir(ieslabiec61850model*object,gdbusmethodinvocation*invocation,gvariant*serverlist);

②voidieslab_iec61850_model_complete_set_server_dir(ieslabiec61850model*object,gdbusmethodinvocation*invocation);

③voidieslab_iec61850_model_complete_get_lddir(ieslabiec61850model*object,gdbusmethodinvocation*invocation,gvariant*ldlist);

④voidieslab_iec61850_model_complete_set_lddir(ieslabiec61850model*object,gdbusmethodinvocation*invocation);

⑤voidieslab_iec61850_model_complete_get_data_dir(ieslabiec61850model*object,gdbusmethodinvocation*invocation,gvariant*datalist);

⑥voidieslab_iec61850_model_complete_set_data_dir(ieslabiec61850model*object,gdbusmethodinvocation*invocation);

⑦voidieslab_iec61850_model_complete_get_data_def(ieslabiec61850model*object,gdbusmethodinvocation*invocation,gvariant*datalist);

⑧voidieslab_iec61850_model_complete_set_data_def(ieslabiec61850model*object,gdbusmethodinvocation*invocation);

⑨voidieslab_iec61850_model_complete_get_data_val(ieslabiec61850model*object,gdbusmethodinvocation*invocation,gvariant*datatype,gvariant*datalist);

⑩voidieslab_iec61850_model_complete_set_data_val(ieslabiec61850model*object,gdbusmethodinvocation*invocation);

从请求和响应接口命名与xml描述的服务接口可以看出之间的关系,例如获取服务器接口(getserverdir),对应的请求接口c代码为ieslab_iec61850_model_call_get_server_dir_sync是由服务名称“ieslab.iec61850.model”和接口“getserverdir”组成,其中“sync”表示为同步接口;对应的响应接口由两个函数:回调函数handle_get_server_dir和响应函数ieslab_iec61850_model_complete_get_server_dir,命名方式类似,其中complete表示完成服务发送响应。

其他接口的作用和命名可从各自对应的xml格式的接口描述以及xml格式接口上的文字解释中获取对应信息。

如图1所示,是本实施例基于gdbus的iec61850模型访问的整体架构示意图。iec61850服务器、iec61850客户端以及本地的数据库访问使用相同的基于gdbus封装组件接口与总线进行通信,其中通过xml格式接口描述文件生成的gdbus接口包含三种类型的接口:发起方的请求接口,接收方的接收接口以及接收方的应响返回接口,因此无论是iec61850客户端还是iec61850服务器端亦或是本地数据库访问均可使用同一套访问接口,简化了开发人员的使用复杂度,并使得iec61850服务器与客户端共享了模型信息,特别是在数据信息量较大的情况下,极大降低了内存消耗,因初始化时不需要解析那么大的模型信息,耗时减少,加快了应用程序的启动速度。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1