map在PI接口开发中的应用

(1) PI数据接口开发时瓶颈

在PI数据接口的开发中,最主要的一个数据结构就是包含与该接口相关的测点及其属性的一个列表,还有对该表中测点元素的查找、插入和删除等基本的操作。同时,较高的性能要求使得必须对该测点表进行一定的排序,对表中元素的访问也需要相应的搜索算法。

而在具体实现数据接口的时,由于数据源的多样性,导致列表排序及搜索的关键字以及数据采集的模式不尽相同,因此曾经在用C实现数据接口时,常需要为每一个或每一类数据源实现一套测点的链接表结构,并配以各自的搜索和排序算法。这样,大多的开发时间消耗在底层数据结构的实现和调试上,而且代码的复用率低。于是,高效的、通用性高的数据结构及实现方式的选择成为当务之急。

(2) STL

STL是C++的标准库,其中定义了多种常用的数据结构容器以及算法模板,包括字符串、顺序列表、栈、队列等。其中的各个容器类充分利用了C++的泛型特性,使得各数据结构对于各种数据类型具有很高的通用性。

通观整个STL库,map类非常适用于作为PI数据接口的测点列表。map类是以RB-Tree(红黑树)实现的一个二元搜索列表。RB-Tree是一种改进的平衡二叉树,具有比一般平衡二叉树更高的搜索效率。因此,map类将成为接口测点列表的首选。

(3) map类测点列表的实现

#include <string>
#include <map>
#include <utility>              // 要用到里面的pair类
using namespace std;
 
typedef struct _PIPoint {
 std::string   strTag;
 std::string   strInstrumentTag;
 long           id;
 PIvaluetype pitypex;
 
// ... 其他属性
} point_t;
 
typedef std::map<string,  point_t> point_list_t;
typedef std::pair<string, point_t> point_pair_t;
 
// 向表中添加测点
void add_point(point_list_t * lp_list) {
    point_t point; 
    // ... (从数据库中取出测点point)
    // 测点插入表中,Instrumenttag为关键字
    lp_list->insert(point_pair_t(point.strInstrumentTag, point)); 
    // 循环以上步骤直到所需的测点都放入表中
}
 
// 根据Instrumenttag查询并取出表中测点
point_t get_point(point_list_t * lp_list, string& strInstrTag) {
    point_t point;
    point.id = 0;
    std::map<string,  point_t>::const_iterator ptlist_iter;
    ptlist_iter = lp_list->find(strInstrTag);
    if (ptlist_iter != lp_list->end()) point = (point_t)ptlist_iter->second;
    return point;          // 如果point.id == 0就是没找到所需的测点
}

3 comments so far

  1. 曹波 July 3, 2007 3:14 pm

    初涉实时数据库系统PI,希望了解测点的更多解释。最初步的比如说,究竟什么是测点,什么是点源。两者有何区别和联系。另外希望学习PI系统的手册,但无从获得,在此求助。谢谢帮助!

  2. gYtHialY July 3, 2007 4:37 pm

    测点(tag)就是一个名称而已,比如说你设置一个叫PowerPlant的点关联电厂的出力,测点是唯一的,点源(PointSource)是它的一个属性而已,其他还有PointID等等。
    你可以去OSI的网站上找找资料。如果你要做开发的话,先熟悉下PB,DL,SMT之类的使用,在研究API和SDK吧。OSI有不少培训,不过价钱挺贵。
    至于手册PI的安装目录下有,别的我也不能提供,公司机密^_^

  3. 曹波 July 4, 2007 9:04 am

    谢谢楼上的。^_^

Leave a comment

Please be polite and on topic. Your e-mail will never be published.