当前位置:文档之家› openPlant开发手册

openPlant开发手册

openPlant开发手册
openPlant开发手册

目录

1. 概述 (5)

1.1 openplant概述 (5)

1.2连接数据库 (6)

1.3增删节点或点 (6)

1.4写实时数据 (7)

1.5取实时值 (8)

1.6写历史数据 (8)

1.7查询历史 (9)

1.8辅助函数介绍 (9)

1.8.1 时间相关函数 (9)

1.8.2 点组操作相关函数 (10)

1.8.3 历史结果集操作相关函数 (10)

1.8.4 opBuffer属性设置相关函数 (10)

2. openPlant APIv2 (11)

3.模块文档 (12)

3.1 openPlant C APIv2 (12)

3.1.1 模块 (12)

3.1.2 详细描述 (13)

3.2 常量定义 (13)

3.2.1 宏定义 (13)

3.2.2详细描述 (16)

3.3 基本类型定义 (16)

3.3.1 组合类型 (16)

3.3.2 详细描述 (17)

3.4 有连接接口 (17)

1

3.4.1 类型定义 (17)

3.4.2 函数 (17)

3.4.3 详细描述 (18)

3.4.4 函数文档 (18)

3.4.4.1 op2_close (18)

3.4.4.2 op2_init (18)

3.4.4.3 op2_status (18)

3.5 属性设置接口 (19)

3.5.1 函数 (19)

3.5.2 详细描述 (19)

3.5.3 函数文档 (20)

3.5.3.1 op2_buffer_set_int (20)

3.5.3.2 op2_buffer_set_point (20)

3.5.3.3 op2_buffer_set_string (20)

3.6 时间操作函数 (21)

3.6.1 函数 (21)

3.6.2 详细描述 (21)

3.6.3 函数文档 (21)

3.6.3.1 op2_decode_time (21)

3.6.3.2 op2_encode_time (22)

3.6.3.3 op2_get_system_time (22)

3.7 点组操作函数 (22)

3.7.1 类型定义 (22)

3.7.2 函数 (23)

3.7.3 详细描述 (23)

3.7.4 类型定义文档 (23)

3.7.5 函数文档 (23)

3.7.5.1 op2_add_group_point (23)

3.7.5.2 op2_free_group (24)

3.7.5.3 op2_group_size (24)

2

3.7.5.4 op2_new_group (24)

3.8 结果集操作函数 (24)

3.8.1 类型定义 (24)

3.8.2 函数 (24)

3.8.3 详细描述 (25)

3.8.4 函数文档 (25)

3.8.4.1 op2_fetch_stat_value (25)

3.8.4.2 op2_fetch_timed_value (25)

3.8.4.3 op2_free_result (26)

3.8.4.4 op2_num_rows (26)

3.9 取实时数据和历史数据相关接口 (26)

3.9.1 函数 (27)

3.9.2 详细描述 (27)

3.9.3 函数文档 (27)

3.9.3.1 op2_get_history_byid (27)

3.9.3.2 op2_get_history_byname (28)

3.9.3.3 op2_get_histroy_top_byid (29)

3.9.3.4 op2_get_histroy_top_byname (29)

3.9.3.5 op2_get_snap_byid (30)

3.9.3.6 op2_get_snap_byname (30)

3.9.3.7 op2_get_value_byid (31)

3.9.3.8 op2_get_value_byname (31)

3.9.3.9 op2_raw_to_span (32)

3.10 写实时数据和历史数据相关接口 (32)

3.10.1 函数 (32)

3.10.2 详细描述 (33)

3.10.3 函数文档 (33)

3.10.3.1 op2_write_cache (33)

3.10.3.2 op2_write_cache_one (34)

3.10.3.3 op2_write_histroy_byid (34)

3

3.10.3.4 op2_write_histroy_byname (35)

3.10.3.5 op2_write_snap (35)

3.10.3.6 op2_write_value (36)

3.10.3.7 op2_write_value_only (36)

3.10.3.8 op2_write_value_tm (37)

3.11 对数据库对象操作相关的接口 (37)

3.11.1 类型定义 (38)

3.11.2 函数 (38)

3.11.3 详细描述 (39)

3.11.4 函数文档 (39)

3.11.4.1 op2_free_list (39)

3.11.4.2 op2_free_object (40)

3.11.4.3 op2_get_child (40)

3.11.4.4 op2_get_child_idname (40)

3.11.4.5 op2_get_database (41)

3.11.4.6 op2_get_id_byname (41)

3.11.4.7 op2_get_object_byid (41)

3.11.4.8 op2_get_object_byname (42)

3.11.4.9 op2_modify_object (42)

3.11.4.10 op2_new_object (43)

3.11.4.11 op2_object_get_double (43)

3.11.4.12 op2_object_get_int (43)

3.11.4.13 op2_object_get_string (44)

3.11.4.14 op2_object_set_double (44)

3.11.4.15 op2_object_set_int (44)

3.11.4.16 op2_object_set_string (45)

4.类文档 (46)

4.1 StatVal结构参考 (46)

4.1.1 公有属性 (46)

4.1.2 详细描述 (46)

4

1.概述

为了方便客户能够快速理解API的使用方法,在这里先对openplant和API做了一个整体的概述:

1.1 openplant概述

openplant实时数据库系统结构划分为三层:数据库节点(database)、节点(node)、点(point),整个系统采用树状结构,如下图:

其中W3为数据库节点,TESTNODE01为节点,POINT00006为点。数据库节点、节点、点可以统称为对象,每个对象在时间轴上的每一个时刻都可以存储一个数值,仅仅只有数值是没有什么意义的,所以每个对象都有各自的属性,用户可以通过配置属性来确定这些数据所代表的意义。关于数值可以有哪些类型,每个对象拥有哪些属性,详细可以参照《openplant介绍》。

下面简单介绍几个概念:

动态信息:点的所有属性中只有三个为动态信息,分别为:当前时间(TM),当前状态(AS),当前数值(A V),这个三个属性随着时间轴的变化而变化。

静态信息:点的所有属性中除了三个动态信息其余的都为静态信息,例如:点名(PN),点标识(ID),描述(ED),单位(EU)等等。静态信息中大部分是可以通过API修改的,也有些属性是点创建好了就固定了不可修改。详细请参考《openplant介绍》。

实时数据:动态信息中的A V值,就是所谓的实时数据。随着时间轴的推移当前实时值在下一个实时值到来的时候就变为了历史数据。

历史数据:实时数据之前的所有数据都称为历史数据。

5

现在如果你想对openplant中的对象或者是数据进行操作,比如加一个点,写一条实时数据,补充一条历史数据等等,该怎么办呢?因为这样的需求我们提供了一组API可以对openplant进行一系列的操作。

1.2连接数据库

说明:要对数据库进行操作,首先要连接上数据库获得一个句柄,有了这个句柄我们就可以对数据库进行想要的操作了,当操作完成以后我们需要对句柄进行关闭。因此设计了以下接口:

op2_init(连接数据库的接口函数)

op2_close(关闭连接的接口函数)

有时候我们获得一个句柄后,有一段时间没有操作了,这个时候想看下句柄是否已经被数据库关闭,增加接口:

op2_status(判断句柄是好是坏)

1.3增删节点或点

说明:根据需求有可能我们会对数据库进行新增节点和点,或者是删除节点和点。因为数据库为树形结构,所以在增加或者删除节点或者点的时候,可以类似如对树的操作思想。

例如:

新增点:首先我们需要创建一个点的对象,然后再把这个对象插入到树的一个分支上,也就是某一个节点下面,如果插入成功就说明新增点成功。

新增节点:类似如新增点。

删除点:首先要获取到这个点对象,也就是找到这个点,然后将其从所在分支删除。

删除节点:类似如删除点,删除节点的同时会删除该节点下的所有点。

修改节点和点同样的道理,要先找到这个对象然后在修改。

取静态信息的步骤也是:首先获取到你要取信息的对象,再通过op2_object_ get_int或op2_object_get_string或op2_object_get_double取这个对象的相关属性既静

6

态信息。

因此设计了以下接口:

op2_new_object(创建一个对象,可以是点,也可以是节点)

op2_free_object(释放对象空间)

op2_get_object_byid(通过对象的唯一标识ID,来获取对象)

op2_get_object_byname(通过对象的唯一名字PN,来获取对象)

op2_get_child(获取某一对象的所以孩子节点对象列表)

op2_get_child_idname(获取某一对象的所有孩子节点对象列表,这里的对象属性只包含ID和点名)

op2_free_list(释放对象列表空间)

op2_get_database(获取数据库节点列表)

op2_object_get_double(获取一个对象的属性值,这个属性类型为double)

op2_object_get_int(获取一个对象的属性值,这个属性类型为int)

op2_object_get_string(获取一个对象的属性值,这个属性类型为string)

op2_object_set_double(对一个对象的属性进行设置,这个属性类型为double)

op2_object_set_int(对一个对象的属性进行设置,这个属性类型为int)

op2_object_set_string(对一个对象的属性进行设置,这个属性类型为string)

op2_modify_object(这是一个关键函数,就是对数据库中对象进行增删改查)1.4写实时数据

说明:写实时值的时候,有时只需要写值不用写状态,有时候既要写值也要写状态,因此设计以下接口:

op2_write_value(既要写值也要写状态,而且这批点都是对同一时刻写。如果这批点要写的时刻都不一样怎么办呢?)

op2_write_value_tm(和op2_write_value的区别就是每一个点都对应一个时刻)

op2_write_value_only(只写实时值而不写状态)

7

1.5取实时值

说明:取实时值就是获取对象的动态信息(当前时间,当前状态,当前数值)。提供两个接口,分别是通过点名和ID:(点名和ID对于每一个对象都是唯一的标识)

op2_get_value_byname(通过点名取动态信息)

op2_get_value_byid(通过ID取动态信息)

1.6写历史数据

说明:可能由于一些特殊原因(比如软、硬件故障,停电等等)需要补充历史数据,那么就需要一组接口来做这个事。介绍这组接口之前先站在客户的角度提这样这样几个问题:

a)我丢了一段时间的值,现在想通过ID来补这段时间的值,有这样的接口吗?

b)我丢了一段时间的值,现在想通过点名来补这段时间的值,有这样的接口吗?

c)我只丢了某一个时刻的值,现在想补回来,有这样的接口吗?

d)我丢了好长一段时间的值,现在补起来太慢了,能有快速补进去的接口吗?

这都是客户可能的需求,为了满足这些,设计了一下几个接口:

op2_write_histroy_byid(通过ID补一个时间段的历史,无压缩,所有记录都写入归档)

op2_write_histroy_byname(通过点名补一个时间段的历史,无压缩,所有记录都写入归档)

op2_write_snap(通过ID补历史快照值,就是对某一时刻补值,考虑效率的原因,所以这个接口不提供点名补值,顺便说下通过点名可以取到ID)

op2_write_cache(通过ID快速补充历史。这里解释一下之所以快速,是因为我们对数据进行了过滤和压缩,然后写缓存)

op2_write_cache_one(和op2_write_cache的差别在于一次只能对一个点进行补充历史)

8

1.7查询历史

说明:查询历史的接口,也提供了好几种方式,这个的理解和用意可以参考写历史,下面直接介绍这些接口:

op2_get_history_byid(通过ID取一个时间段的历史)

op2_get_history_byname(通过点名取一个时间段的历史)

op2_get_histroy_top_byid(和op2_get_history_byid的差别在于对历史数据条数做了一个限制,因为有的时候不要太多的历史数据)

op2_get_histroy_top_byname(和op2_get_history_byname的差别在于对历史数据条\数做了一个限制,因为有的时候不要太多的历史数据)

op2_get_snap_byid(通过ID取快照值,就是取某一时刻的值,如果这一时刻没有值,openplant会根据前后的历史估算一个值)

op2_get_snap_byname(通过ID取快照值,就是取某一时刻的值,如果这一时刻没有值,openplant会根据前后的历史估算一个值)

op2_raw_to_span(把原始值转换为等间距值,这个函数我们可以参照写历史的函数 op2_write_cache来理解,op2_write_cache在写历史的时候对历史数据进行过滤和压缩过,现在可以通过op2_raw_to_span对数据进行还原)

1.8辅助函数介绍

下面的这些函数和数据库并没有直接的数据来往,所以在这里把它统称为辅助函数。顾名思义,辅助就是辅助你取数据、写数据等相关的一些接口。

1.8.1 时间相关函数

说明:这里提供一个取服务器当前时间的函数接口,另外加两个对日期和时间戳相互转换的函数。如下:

op2_get_system_time(取服务器当前时间)

op2_decode_time(把时间戳转换为分段时间值,既日期的年、月、日、时、分、秒) op2_encode_time(把分段时间值,转换为时间戳)

9

1.8.2 点组操作相关函数

说明:点组句柄可以理解为对点名进行管理的容器。当你需要使用点名对数据库进行操作的时候(比如:通过点名取实时、取历史、取静态等等),就需要这样几个接口对一批点名进行打包,然后把得到的点组句柄传给其他接口进行操作。

op2_new_group(创建一个点组句柄)

op2_add_group_point(向点组句柄中添加点名)

op2_group_size(获取点组句柄的大小,既点名的个数)

op2_new_group(释放点组句柄)

1.8.3 历史结果集操作相关函数

说明:在查询历史的时候,通过op2_get_history_byid、op2_get_history_byname等等函数取到的是一个历史数据的结果集,要得到一条条数据还得对结果集进行解析,这里提供两个对结果集解析的接口,一个是对原始结果集解析,一个是对历史统计结果集解析: op2_fetch_timed_value(对原始结果集解析,得到一条记录的时间、状态和值)

op2_fetch_stat_value(对历史统计结果集解析,得到一个结构体,包含所有统计值) op2_num_rows(获取结果集的大小)

op2_free_result(释放结果集空间)

1.8.4 opBuffer属性设置相关函数

说明:opBuffer是API自带的数据缓存功能。如果你正在通过API对数据库写实时值,这个时候突然网络断了,或者服务器断电等原因导致服务器停止工作,实时数据并不会丢失,opBuffer会在本地缓存数据,当服务器重新开始工作后,opBuffer自动上传之前缓存的数据。是否启用这个功能是在你通过op2_init连接的数据库时的第一个参数来控制的。默认opBuffer配置好了基本属性,如有特殊需求,要修改opBuffer的相关属性,可以通过以下接口做到:

op2_buffer_set_point(对缓存点的属性进行设置)

op2_buffer_set_int(对OPBuffer属性值进行设置,其属性值类型为int)

op2_buffer_set_string(对OPBuffer属性值进行设置,其属性值类型为string)

10

2. openPlant APIv2

使用openPlant apiV2 的一般步骤:

a.首先链接openPlant,使用op2_init,保存其返回的句柄如果成功,则返回一个句柄,

如果失败,则返回NULL。

b.然后使用该句柄,传递给相应API执行数据请求。

c.处理API的返回码,检查errors返回值。在保存取到的数据,若数据为一个结果集,

则再调用相应API对结果集进一步处理。

d.若有对象需要释放内存,则释放该对象内存。

e.关闭openPlant句柄。

11

3.模块文档

3.1 openPlant C APIv2

openPlant C APIv2,一组openPlant读写的C结构和函数

3.1.1 模块

●APIv2 常量定义

APIv2 使用的一组常量

●APIv2 基本类型定义

定义一些最基础的常量与类型

●APIv2 有连接接口

把无连接部分接口抽取出来,做成有连接接口;它们的功能都一对应的

●opWriter 属性设置接口

对OPBuffer属性值进行设置

●APIv2 时间操作函数

把标量时间与分段时间互换

●APIv2 点组操作函数

点组操作

●APIv2 结果集操作函数

结果集操作,取值或释放

●APIv2 取实时数据和历史数据相关接口

通过点名或者ID取实时数据或者是历史数据

●APIv2 写实时数据和历史数据相关接口

通过点名或者ID写实时数据或者是历史数据

●APIv2 对数据库对象操作相关的接口

这组接口可以对数据库对象(节点,点)进行增删改查,比如加点,删点,取静态信息,修改静态信息等等

12

3.1.2 详细描述

openPlant C APIv2,一组openPlant读写的C结构和函数

3.2 常量定义

APIv2 使用的一组常量

3.2.1 宏定义

●#define AX_TYPE 0

模拟类型

●#define CA_POINT 1

计算点

●#define DX_TYPE 1

数字类型

●#define I2_TYPE 2

组合类型

●#define I4_TYPE 3

整数类型

●#define IN_POINT 0

采集点

●#define OP_AX_POINT 0x20

模拟量点对象

●#define OP_BAD 0x0300

点值的好坏,如果设置为1,则为坏值

●#define OP_DATABASE 0x01

数据库节点对象

●#define OP_DELETE 3

删除现有值

13

●#define OP_DX_POINT 0x21

数字量点对象

●#define OP_I2_POINT 0x22

短整数点对象

●#define OP_I4_POINT 0x23

长整数点对象

●#define OP_INSERT 2

接入新值

●#define OP_NODE 0x10

节点对象

●#define OP_OPTION_BUFFER 8

在当前句柄启用失败后本地缓存

●#define OP_OPTION_DEBUG_INFO 256

产生出错信息,帮助诊断问题

●#define OP_OPTION_LOG 512

产生出错信息,帮助诊断问题

●#define OP_OPTION_WALL_0BIT 1

客户端与服务器中间经过单向隔离器

●#define OP_OPTION_WALL_1BIT 2

客户端与服务器中间经过单向隔离器

●#define OP_R8_POINT 0x24

双精度点对象

●#define OP_REPLACE 4

如果有就更新,如没有就插入

●#define OP_SELECT 0

查询现有值

●#define OP_TIMEOUT 0x8000

点值的超时,如果设置为1,则为超时

●#define OP_UPDATE 1

更新现有值

14

●#define OPE_BUFF_IO -1002

写入存储缓存文件出错了,最有可能是文件所在分区满了

●#define OPE_BUFF_NET -1001

网络断开

●#define OPE_BUFF_OVERFLOW -1003

数据文件到了预设的大小

●#define OPE_CONNECT -99

无法连接服务器,需要重连

●#define OPE_ERROR -1

未知错误

●#define OPE_MEMORY -96

无法分配内存,需要重连

●#define OPE_NET_CLOSED -98

连接已关闭,需要重连

●#define OPE_NET_IO -97

网络读写IO错误,需要重连

●#define OPE_OK 0

成功,没有错误

●#define OPE_PARAM -10

参数错误

●#define OPE_UNSUPPORTED -11

功能未支持

●#define OPR_HIS_A VG 11

取平均值

●#define OPR_HIS_FLOW 8

取累计值

●#define OPR_HIS_MAX 9

取最大值

●#define OPR_HIS_MEAN 12

取算术平均值

15

●#define OPR_HIS_MIN 10

取最小值

●#define OPR_HIS_PLOT 2

取PLOT值,每区间包括(起始值,最大值,最小值, 结束)

●#define OPR_HIS_RAW 0

取原始值

●#define OPR_HIS_SPAN 1

取等间距值

●#define OPR_HIS_STDEV 13

取标准方差值,未实现

●#define OPR_HIS_SUM 14

取原始值的累加和,

●#define OPR_HIS_SUMMARY 15

取所有统计值:累计/最大/最小/平均/方差

●#define R8_TYPE 4

双精度类型

3.2.2详细描述

APIv2 使用的一组常量

3.3 基本类型定义

定义一些最基础的常量与类型

3.3.1 组合类型

●struct StatVal

统计值

16

相关主题
文本预览
相关文档 最新文档