Skip to content

C语言接口使用说明

0、介绍

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

1、基础知识

openPlant实时数据库系统结构划分为三层:数据库节点(root)、节点(node)、点(point)。
动态信息:点的所有属性中只有三个为动态信息,分别为:当前时间(TM), 当前状态(AS), 当前数值(AV),这三个属性随着时间轴的变化而变化。
静态信息:点的所有属性中除了三个动态信息其余的都为静态信息,例如:点名(PN),点标识(ID),描述(ED), 单位(EU)等等。
静态信息中大部分是可以通过 API 修改的,但是点类型、测点ID和测点名称等属性是点创建好了就固定了不可修改。
实时数据:动态信息中的 AV 值,就是所谓的实时数据。随着时间轴的推移当前实时值在下一个实时值到来的时候就变为了历史数据。
历史数据:实时数据之前的所有数据都称为历史数据。

2、基本流程

使用 openPlant api 的一般步骤:
a.首先链接openPlant, 使用op2_init, 保存其返回的句柄 如果成功,则返回一个句柄, 如果失败,则返回 NULL。
b.然后使用该句柄,传递给相应 API 执行数据请求。
c.处理API 的返回码,检查 errors 返回值。在保存取到的数据,若数据为一个结果集, 则再调用相应 API 对结果集进一步处理。
d.若有对象需要释放内存,则释放该对象内存。
e.关闭 openPlant 句柄。

2.1 连接数据库

说明:要对数据库进行操作,首先要连接上数据库获得一个句柄,有了这个句柄我们就可以对数据库进行想要的操作了 , 当操作完成以后我们需要对句柄进行关闭。
因此设计了以下接口:
op2_init(连接数据库的接口函数)
op2_close(关闭连接的接口函数)
获得一个句柄后,有一段时间没有操作,通过如下接口判断是否已经被数据库关闭:
op2_status(判断句柄是好是坏)

2.2 增删节点或点

说明:根据需求有可能我们会对数据库进行新增节点和点,或者是删除节点和点。
因为数据库为树形结构,所以在增加或者删除节点或者点的时候,可以类似如对树的操作思想。
新增点:首先我们需要创建一个点的对象,然后再把这个对象插入到树的一个分支上,也就是某一个节点下面,如果插入成功就说明新增点成功。
新增节点:类似如新增点。
删除点:首先要获取到这个点对象,也就是找到这个点,然后将其从所在分支删除。
删除节点:类似如删除点,删除节点的同时会删除该节点下的所有点。修改节点和点同样的道理,要先找到这个对象然后在修改。
静态信息:首先获取到你要取信息的对象,再通过 op2_object_ get_int 或 op2_object_get_string 或 op2_object_get_double 取这个对象的相关属性既静态信息。
因此设计了以下接口:

开发接口
	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(这是一个关键函数,就是对数据库中对象进行增删改查)

2.3 写实时数据

说明:写实时值的时候,有时只需要写值不用写状态,有时候既要写值也要写状态, 因此设计以下接口:
op2_write_value(既要写值也要写状态,而且这批点都是对同一时刻写。如果这批点要写的时刻都不一样怎么办呢?)
op2_write_value_tm(和op2_write_value 的区别就是每一个点都对应一个时刻)
op2_write_value_only(只写实时值而不写状态)

2.4 取实时值

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

2.5 写历史数据

说明:可能由于一些特殊原因(比如软、硬件故障,停电等等)需要补充历史数据, 那么就需要一组接口来做这个事。为了满足这些,设计了一下几个接口:
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 的差别在于一次只能对一个点进行补充历史)

2.6 查询历史

说明:查询历史的接口,也提供了好几种方式,这个的理解和用意可以参考写历史, 下面直接介绍这些接口 :
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 对数据进行还原)

2.7 辅助函数介绍

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

2.7.1 时间相关函数

说明:这里提供一个取服务器当前时间的函数接口,另外加两个对日期和时间戳相互转换的函数。如下:
op2_get_system_time(取服务器当前时间)
op2_decode_time(把时间戳转换为分段时间值,既日期的年、月、日、时、分、秒) op2_encode_time(把分段时间值,转换为时间戳)

2.7.2 点组操作相关函数

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

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

说明:在查询历史的时候,通过 op2_get_history_byid、op2_get_history_byname 等等函数取到的是一个历史数据的结果集,要得到一条条数据还得对结果集进行解析,这里 提供两个对结果集解析的接口,一个是对原始结果集解析,一个是对历史统计结果集解析:
op2_fetch_timed_value(对原始结果集解析,得到一条记录的时间、状态和值)
op2_fetch_stat_value(对历史统计结果集解析,得到一个结构体,包含所有统计值)
op2_num_rows(获取结果集的大小)
op2_free_result(释放结果集空间)

2.7.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)

3、函数说明文档

3.1.常量定义

3.1.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
	删除现有值

	●#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
	更新现有值

	●#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_AVG 11
	取平均值
	●#define OPR_HIS_FLOW 8
	取累计值
	●#define OPR_HIS_MAX 9
	取最大值
	●#define OPR_HIS_MEAN 12
	取算术平均值

	●#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.1.2详细描述

openPlant API读写的 C 结构和函数

3.2基本类型定义

3.2.1 组合类型

●struct StatVal
统计值

3.2.2 详细描述

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

3.3有连接接口

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

3.3.1 类型定义

●typedef void * OpenPlant
数据库服务器,用户透明

3.3.2 函数

●void op2_close (openPlant op)
关闭连接
●openPlant op2_init (int option, const char *host, int port, int timeout, const char *user, const char *password, const char *buffer_path, int buffer_size)
openPlant 客户端API v2 初始化
●int op2_status (openPlant op)
查询服务器连接状态

3.3.3详细描述

把无连接部分接口抽取出来,做成有连接接口;它们的功能都是对应的。
●这一组函数从 api2_nohandle_face 里抽取出来然后加入连接内容, 其工作实际内容是相同的
●在 api2_nohandle_face 里的UDP 函数和静态数据写函数没有抽取出来
●api2_nohandle_face 是有连接接口的超集,但有连接接口提供一组线程安全的函数, 同时重新统一设计了函数命名,使得对函数的功能更容易从函数名称上体现

3.3.4函数

函数
	void op2_close (openPlant op)
	函数说明:关闭连接参数
	参数说明:
	op	指定连接返回
	返回值:本函数没有返回值

	openPlant op2_init (int option, const char * host, int port, int timeout, const char* user, const char * password, const char * buffer_path, int buffer_size)
	函数说明:openPlant 客户端API v2 初始化参数
	参数说明:
	option	选项 ; 参考宏 : OP_OPTION_*
	host	服务器 IP 或名字
	port	服务器端口
	timeout	网络超时,以秒为单位
	user	用户名
	password	密码
	buffer_path	缓 存 所 在 目 录 ; 如 果 不 需 要 缓 存 指 定 为 NULL buffer_size	缓存最大占用空间(单位 MB);如果不需要缓存指定为 0
	返回 :
	●成功 : ret != 0,这是一个句柄地址
	●失败 : ret == 0

	int op2_status (openPlant op)
	函数说明:查询服务器连接状态参数
	参数说明:
	op	数据库服务器句柄返回
	返回值:
	0 表示 OK,-1 表示已关闭

3.4属性设置接口

对 OPBuffer 属性值进行设置

3.4.1 函数

●**void op2_buffer_set_int** (openPlant op, const char *name, int value)
对 OPBuffer 属性值进行设置,其属性值类型为 int
**●void op2_buffer_set_point** (openPlant op, int id, int type, double deadband)
对点进行设置
●**void op2_buffer_set_string** (openPlant op, const char *name, const char *value)
对 OPBuffer 属性值进行设置,其属性值类型为 string

3.4.2详细描述

详细描述
	对 OPBuffer 属性值进行设置
	key、type、意义、[ 默认值 ]
	●transfer_protocol int 使用tcp 传输 无默认值
	●server_address str 服务器地址 无默认值
	●server_port int 服务器端口号 无默认值
	●client_name str 客户端用户名 无默认值
	●client_password str 客户端密码 无默认值
	●storage_location str 缓存数据存储路径 无默认值
	●storage_capacity int 缓存数据最大容量 无默认值
	●option int 见op_writer_open 无默认值
	●isolator_enabled int 过隔离器 无默认值
	●net_probe_interval int 网络探测间隔 5 second
	●upload_history_interval int 上传历史间隔 100 ms
	●realtime_filter_enabled int 是否过滤实时值 0 bool
	●filter_bool_upload_interval int 开关量上传间隔 30 second
	●filter_bool_storage_interval int 开关量存储间隔 900 second
	●size_for_each_upload int 每次上传文件大小 10 MB
	●upload_history_per_time int 每次上传的记录数 50000 条
	●single_file_capacity int 每个缓存文件大小 1024 MB
	●history_task_interval int 后台线程sleep 时间 1000 ms
	●record_filename str 记录文件名 "op.writer.json"

3.4.3函数文档

函数文档
	void op2_buffer_set_int (openPlant op, const char * name, int value)
	函数说明:对 OPBuffer 属性值进行设置,其属性值类型为 int
	参数说明 :
	op	数据库服务器句柄
	name	属性关键字 (key), 如 :transfer_protocol ( 使用 tcp 传输 )
	value	对应属性的值

	void op2_buffer_set_point (openPlant op, int id, int type, double deadband)
	函数说明:对点进行设置参数
	参数说明 :
	op	数据库服务器句柄
	id	点的 ID
	type	点的类型
	deadband	死区值

	void op2_buffer_set_string (openPlant op, const char * name, const char * value)
	函数说明:对 OPBuffer 属性值进行设置,其属性值类型为 string
	参数 说明:
	op	数据库服务器句柄
	name	属性关键字 (key)
	value	对应属性的值

3.5时间操作函数

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

3.5.1函数

●void op2_decode_time (int time, int *yy, int *mm, int *dd, int *hh, int *mi, int *ss)
函数说明:把 std::time_t 时间值转换为 分段时间值,即 2021-11-23 14:14:20
●int op2_encode_time (int yy, int mm, int dd, int hh, int mi, int ss)
函数说明:把分段时间值,即 2021-11-23 14:14:20,转换为 std::time_t 时间值
●int op2_get_system_time (openPlant op, int *out)
函数说明:取得数据库服务器时间

3.5.2详细描述

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

3.5.3函数解释

函数解释
	void op2_decode_time (int time, int * yy, int * mm, int * dd, int * hh, int * mi, int * ss)
	函数说明:把 std::time_t 时间值转换为 分段时间值,即 2021-11-23 14:14:20
	参数说明:
	t	time_t 类型时间
	yy	返回的年
	mm	返回的月
	dd	返回的日
	hh	返回的时
	mi	返回的分
	ss	返回的秒
	返回值:
	本函数不返回值

	int op2_encode_time (int yy, int mm, int dd, int hh, int mi, int ss)
	函数说明:把分段时间值,即 2021-11-23 14:14:20,转换为 std::time_t 时间值参数
	参数说明:
	yy	输入的年
	mm	输入的月
	dd	输入的日
	hh	输入的时
	mi	输入的分
	ss	输入的秒
	返回值:
	time_t 类型时间
3.6.3.3 int op2_get_system_time (openPlant op, int * out)
取得数据库服务器时间参数 :
op	数据库服务器句柄
out	返回数据库时间 (std::time_t 时间值)
返回 :
正确 返回 0 错误 返回 其他

3.6点组操作函数

点组操作

3.6.1类型定义

●typedef void * OPGroup
点组句柄,一组点名的代表

3.6.2函数

●void op2_add_group_point (OPGroup gh, const char *obj_name)
函数说明:把指定点名加入点组
●void op2_free_group (OPGroup gh)
函数说明:释放一个点组
●int op2_group_size (OPGroup gh)
函数说明:取到指定点组的大小
●OPGroup op2_new_group ()
函数说明:创建指定点组

3.6.3详细描述

点组操作

3.6.4类型定义文档

typedef void* OPGroup
点组句柄,一组点名的代表
●有时我们需要同时操作多个点,并且此时只知道点名;那么点组就为这时准备的
●可以通过点组来完成“从点名到 ID”映射,即通过名字取得 ID

3.6.5函数文档

函数文档
	void op2_add_group_point (OPGroup gh, const char * obj_name)
	函数说明:把指定点名加入点组
	参数说明:
	gh	点组句柄,由 op_new_group
	返回值:
	obj_name	点名

	void op2_free_group (OPGroup gh)
	函数说明:释放一个点组
	参数说明:
	gh	点组句柄

	int op2_group_size (OPGroup gh)
	函数说明:取到指定点组的大小参数
	参数说明:
	gh	点组句柄,用来指定一个点组

	OPGroup op2_new_group ()
	函数说明:创建指定点组
	返回值:
	正确 : 点组句柄;错误 : NULL

3.7结果集操作函数

结果集操作,取值或释放

3.7.1 类型定义

●typedef void * OPResult
结果集,用户透明

3.7.2函数

●int op2_fetch_stat_value (OPResult result, StatVal *sval)
函数说明:假设结果集是一个统计值结果集,取得其中下一个统计值
●int op2_fetch_timed_value (OPResult result, int *time, short *status, double *value)
函数说明:假设结果集是一个历史值结果集,取得其中下一个记录的值
●void op2_free_result (OPResult result)
函数说明:释放一个结果集
●int op2_num_rows (OPResult result)
函数说明:取得结果集尺寸

3.7.3详细描述

结果集操作,取值或释放

3.7.4函数文档

函数文档
	int op2_fetch_stat_value (OPResult result, StatVal * sval)
	函数说明:假设结果集是一个统计值结果集,取得其中下一个统计值
	参数说明:
	result	结果集
	sval	用于返回的统计值
	返回值:
	●0: 已经到结果集末尾
	●1: 还有下一条记录
	●其它 : 出错

	int op2_fetch_timed_value (OPResult result, int * time, short * status, double * value)
	函数说明:假设结果集是一个历史值结果集,取得其中下一个记录的值
	参数说明:
	result	结果集
	time	用于返回时间标签
	status	用于返回状态值
	value	用于返回历史值
	返回值:
	●0: 已经到结果集末尾
	●1: 还有下一条记录
	●其它 : 出错

	void op2_free_result (OPResult result)
	函数说明:释放一个结果集
	参数说明:
	result	结果集
	返回值:
	本函数没有返回值

	int op2_num_rows (OPResult result)
	函数说明:取得结果集尺寸
	参数说明:
	result	结果集
	返回值:
	结果集尺寸

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

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

3.8.1 函数

函数
	●int op2_get_history_byid (openPlant op, int num, int *id, int *value_type, int begin_tm, int end_tm, int interval, OPResult *result, int *errors)
	函数说明:通过点 ID 取历史数据
	●int op2_get_history_byname (openPlant op, OPGroup gh, int *value_type, int begin_ tm, int end_tm, int interval, OPResult *result, int *errors)
	函数说明:通过点名取历史数据
	●int op2_get_histroy_top_byid (openPlant op, int id, int value_type, int begin_tm, int end_tm, int interval, int num, int *time, short *status, double *value, int *actSize)
	函数说明:通过点 id 对一个点取一段历史数据,历史数据的条数有限制
	●int op2_get_histroy_top_byname (openPlant op, const char *obj_name, int value_ type, int begin_tm, int end_tm, int interval, int num, int *time, short *status, double	*value, int *actSize)
	函数说明:通过点名对一个点取一段历史数据,历史数据的条数有限制
	●int op2_get_snap_byid (openPlant op, int num, int *id, int time, short *status, double	*value, int *errors)
	函数说明:通过点 ID 取得快照值
	●int op2_get_snap_byname (openPlant op, OPGroup gh, int time, short *status, double	*value, int *errors)
	函数说明:通过点名取得快照值
	●int op2_get_value_byid (openPlant op, int num, int *id, int *time, short *status, double *value, int *errors)
	函数说明:通过 ID 取得实时值
	●int op2_get_value_byname (openPlant op, OPGroup gh, int *time, short *status, double *value, int *errors)
	函数说明:通过点名取得实时值
	●int op2_raw_to_span (OPResult result, int *num, int **time, short **status, double **value)
	函数说明:把结果集中的原始值还原为等间距值

3.8.2详细描述

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

3.8.3函数文档

函数文档
	int op2_get_history_byid (openPlant op, int num, int * id, int * value_type, int begin_tm, int end_tm, int interval, OPResult * result, int * errors)
	函数说明:通过点 ID 取历史数据
	参数说明:
	op	数据库服务器句柄
	num	点 ID 个数
	id	指向点 ID 的数组
	value_type	历史数据类型数组, 如:原始值(0),等间距值(1)等等
	begin_tm	起始时间
	end_tm	结束时间
	interval	时间间隔(单位秒)
	result	历史结果集
	errors	指向返回错误码的数组,若数组中有为非零的值,则表明取该点的实时值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_get_history_byname (openPlant op, OPGroup gh, int * value_type, int begin_tm, int end_tm, int interval, OPResult * result, int * errors)
	函数说明:通过点名取历史数据
	参数说明:
	op	数据库服务器句柄
	gh	点名点组
	value_type	历史数据类型数组, 如:原始值(0),等间距值(1)等等
	begin_tm	起始时间
	end_tm	结束时间
	interval	时间间隔(单位秒)
	result	历史结果集
	errors		指向返回错误码的数组,若数组中有为非零的值,则表明取该点的实时值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_get_histroy_top_byid (openPlant op, int id, int value_type, int begin_   tm, int end_tm, int interval, int num, int * time, short * status, double* value, int* actSize)
	函数说明:通过点 id 对一个点取一段历史数据,历史数据的条数有限制
	参数说明:
	op	数据库服务器句柄
	id	一个点 ID
	value_type	历史值类型
	begin_tm	起始时间
	end_tm	结束时间
	interval	时间间隔(单位秒)
	num	历史数据的条数不超过 num
	time	指向时间标签数组
	status	指向状态数组
	value	指向值数组
	actSize	返回值实际的个数

	int op2_get_histroy_top_byname (openPlant op, const char * obj_name, int value_type, int begin_tm, int end_tm, int interval, int num, int * time, short * status, double * value, int * actSize)
	函数说明:通过点名对一个点取一段历史数据,历史数据的条数有限制
	参数说明:
	op	数据库服务器句柄
	obj_name	一个点名
	value_type	历史值类型
	begin_tm	起始时间
	end_tm	结束时间
	interval	时间间隔(单位秒)
	num	历史数据的条数不超过 num
	time	指向时间标签数组
	status	指向状态数组
	value	指向值数组
	actSize	返回值实际的个数

	int op2_get_snap_byid (openPlant op, int num, int * id, int time, short * status, double * value, int * errors)
	函数说明:通过点 ID 取得快照值
	参数说明:
	op	数据库服务器句柄
	num	点 ID 的个数
	id	指向点 ID 的数组
	time	某一个时刻的值(std::time_t)
	status	指向点的状态的数组
	value	指向点对应某一时刻值的数组
	errors	指向返回错误码的数组,若数组中有为非零的值,则表明取该点的实时值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_get_snap_byname (openPlant op, OPGroup gh, int time, short * status, double * value, int * errors)
	函数说明:通过点名取得快照值
	参数说明:
	op	数据库服务器句柄
	gh	点名点组
	time	某一个时刻的值(std::time_t)
	status	指向点的状态的数组
	value	指向点对应某一时刻值的数组
	errors	指向返回错误码的数组,若数组中有为非零的值,则表明取该点的实时值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_get_value_byid (openPlant op, int num, int * id, int * time, short * status, double * value, int * errors)
	函数说明:通过 ID 取得实时值
	参数说明:
	op	数据库服务器句柄
	num	点 ID 的个数
	id	指向点 ID 的数组
	time	指向点的时间的数组
	status	指向点的状态的数组
	value	指向点的实时值的数组
	errors		指向返回错误码的数组,若数组中有为非零的值,则表明取该点的实时值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_get_value_byname (openPlant op, OPGroup gh, int * time, short * status, double * value, int * errors)
	函数说明:通过点名取得实时值
	参数说明:
	op	数据库服务器句柄
	gh	点名的点组
	time	指向点的时间的数组
	status	指向点的状态的数组
	value	指向点的实时值的数组
	errors		指向返回错误码的数组,若数组中有为非零的值,则表明取该点的实时值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_raw_to_span (OPResult result, int * num, int ** time, short ** status, double ** value)
	函数说明:把结果集中的原始值还原为等间距值
	参数说明:
	result	历史结果集,由 op2_get_history_byname 或 op2_get_history_byid 得到
	num	用于返回数据条数
	time	用于返回时间标签数组
	status	用于返回状态数组
	value	用于返回等间距值数组
	返回值:
	正确 返回 0 错误 返回 其他

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

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

3.9.1函数

函数
	●int op2_write_cache (openPlant op, int pt, int num, const int *id, const int *time, const short *status, const double *value, int *errors)
	函数说明:同时向多个点写历史数据
	●int op2_write_cache_one (openPlant op, int pt, int id, int num, const int *time, const short *status, const double *value, int *error)
	函数说明:向一个点写多条历史数据
	●int op2_write_histroy_byid (openPlant op, int pt, int id, int num, const int *time, const short *status, const double *value, int *error)
	函数说明:使用点 ID 向一个点写多个历史数据
	●int op2_write_histroy_byname (openPlant op, int pt, const char *obj_name, int num, const int *time, const short *status, const double *value, int *error)
	函数说明:使用点名向一个点写多个历史数据
	●int op2_write_snap (openPlant op, int pt, int num, const int *id, int time, const short *status, const double *value, int *errors)
	函数说明:使用 ID 向多个点在同一时刻写历史值
	●int op2_write_value (openPlant op, int pt, int num, const int *id, int time, const short *status, const double *value, int *errors)
	函数说明:向多点写某一时刻的实时值
	●int op2_write_value_only (openPlant op, int pt, int num, const int *id, int time, const short *status, const double *value, int *errors)
	函数说明:向多点写某一时刻的实时值( 与op2_write_value 的区别是只向点写值而不写状态)
	●int op2_write_value_tm (openPlant op, int pt, int num, const int *id, const int *time, const short *status, const double *value, int *errors)
	函数说明:向多点的实时值 ( 与 op2_write_value 的区别是:每个点都对应一个时刻 )

3.9.2详细描述

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

3.9.3函数文档

函数文档
	int op2_write_cache (openPlant op, int pt, int num, const int * id, const int * time, const short * status, const double * value, int * errors)
	函数说明:同时向多个点写历史数据
	参数说明:
	op	数据库服务器句柄
	pt	点类型
	num	点的个数
	id	指向点 ID 的数组
	time	指向点时间标签的数组
	status	指向对应与时间标签点状态的数组
	value	指向对于与时间标签点值的数组
	errors	指向返回错误码的数组,若数组中有为非零的值,则表明该点写值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_write_cache_one (openPlant op, int pt, int id, int num, const int * time, const short * status, const double * value, int * error)
	函数说明:向一个点写多条历史数据
	参数说明 :
	op	数据库服务器句柄
	pt	点类型
	id	点 ID
	num	写入历史数据条数
	time	指向点时间标签的数组
	status	指向对应与时间标签点状态的数组
	value	指向对于与时间标签点值的数组
	error	指向返回错误码的值,若该值非零,则表明该点写值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_write_histroy_byid (openPlant op, int pt, int id, int num, const int * time, const short * status, const double * value, int * error)
	函数说明:使用点 ID 向一个点写多个历史数据
	参数说明:
	op	数据库服务器句柄
	pt	点的类型
	id	一个点的 ID
	num	写入数据的条数
	time	指向时间标签的数组
	status	指向对应与时间标签点状态的数组
	value	指向对于与时间标签点值的数组
	error	指向返回错误码的值,若该值非零,则表明该点写值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_write_histroy_byname (openPlant op, int pt, const char * obj_name, int num, const int * time, const short * status, const double * value, int * error)
	函数说明:使用点名向一个点写多个历史数据
	参数说明:
	op	数据库服务器句柄
	pt	点的类型
	obj_name	一个点名
	num	写入数据的条数
	time	指向时间标签的数组
	status	指向对应与时间标签点状态的数组
	value	指向对于与时间标签点值的数组
	error	指向返回错误码的值,若该值非零,则表明该点写值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_write_snap (openPlant op, int pt, int num, const int * id, int time, const short * status, const double * value, int * errors)
	函数说明:使用 ID 向多个点在同一时刻写历史值
	参数说明:
	op	数据库服务器句柄
	pt	点类型
	num	点的个数
	id	指向点 ID 的数组
	time	时刻值

	status	指向点状态的数组
	value	指向点值的数组
	error		指向返回错误码的数组,若数组中有为非零的值,则表明该点写值错误
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_write_value (openPlant op, int pt, int num, const int * id, int time, const short * status, const double * value, int * errors)
	函数说明:向多点写某一时刻的实时值
	参数说明:
	op	数据库服务器句柄
	pt	点类型
	num	点个数
	id	指向点 ID 数组
	time	时刻值(std:time_t)
	status	指向点的状态的数组
	value	指向点的值的数组
	errors		指向返回错误码的数组,数组值为 1 或者 0 都表示写入成功。其中 1 表示写入实时成功,0 表示修改实时值成功。如有负数表示写入失败
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_write_value_only (openPlant op, int pt, int num, const int * id, int time, const short * status, const double * value, int * errors)
	函数说明:向多点写某一时刻的实时值 ( 与 op2_write_value 的区别是只向点写值而不写状态 )
	参数说明:
	op	数据库服务器句柄
	pt	点类型
	num	点个数
	id	指向点 ID 数组
	time	时刻值(std:time_t)
	status	指向点的状态的数组
	value	指向点的值的数组
	errors	指向返回错误码的数组,数组值为 1 或者 0 都表示写入成功。其中 1 表示写入实时成功,0 表示修改实时值成功。如有负数表示写入失败
	返回值:
	正确 返回 0 错误 返回 其他

	int op2_write_value_tm (openPlant op, int pt, int num, const int * id, const int * time, const short * status, const double * value, int * errors)
	函数说明:向多点的实时值 ( 与 op2_write_value 的区别是:每个点都对应一个时刻 )
	参数说明:
	op	数据库服务器句柄
	pt	点类型
	num	点个数
	id	指向点 ID 数组
	time	指向时刻值的数组
	status	指向点的状态的数组
	value	指向点的值的数组
	errors	指向返回错误码的数组,数组值为 1 或者 0 都表示写入成功。其中 1 表示写入实时成功,0 表示修改实时值成功。如有负数表示写入失败
	返回值:
	正确 返回 0 错误 返回 其他

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

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

3.10.1类型定义

●typedef void * OPObject
数据对象,用户透明

3.10.2函数

函数
	●void op2_free_list (int num, OPObject *objects)
	函数说明:释放对象列表
	●void op2_free_object (OPObject o)
	函数说明:释放对象内存空间
	●int op2_get_child (openPlant op, const char *parent, int *num, OPObject **objects)
	函数说明:获取子对象列表
	●int op2_get_child_idname (openPlant op, const char *parent, int *num, OPObject	**objects)
	函数说明:获取子对象列表
	●int op2_get_database (openPlant op, int *num, OPObject **databases)
	函数说明:获取数据库列表
	●int op2_get_id_byname (openPlant op, OPGroup gh, int *id)
	函数说明:通过点名取得对应 ID
	●int op2_get_object_byid (openPlant op, int num, int *id, OPObject *objects, int *errors)
	函数说明:获取数据对象
	●int op2_get_object_byname (openPlant op, OPGroup gh, OPObject *objects, int *errors)
	函数说明:获取数据对象
	●int op2_modify_object (openPlant op, int cmd, const char *parent, int num, OPObject *objects, int *errors)
	函数说明:创建 / 删除 / 更新对象
	●OPObject op2_new_object (openPlant op, const char *name, int type)
	函数说明:创建对象
	●double op2_object_get_double (OPObject o, const char *field)
	函数说明:取得一个对象的静态属性值,其值类型为 double
	●int op2_object_get_int (OPObject o, const char *field)
	函数说明:取得一个对象的静态属性值,其值类型为 int
	●int op2_object_get_string (OPObject o, const char *field, char *buf, int len)
	函数说明:取得一个对象的静态属性值,其值类型为 string
	●void op2_object_set_double (OPObject o, const char *field, double value)
	函数说明:设置一个对象的静态属性值,其值类型为 double
	●void op2_object_set_int (OPObject o, const char *field, int value)
	函数说明:设置一个对象的静态属性值,其值类型为 int
	●void op2_object_set_string (OPObject o, const char *field, char *value)
	函数说明:设置一个对象的静态属性值,其值类型为 string

3.10.3详细描述

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

3.10.4函数文档

函数文档
	void op2_free_list (int num, OPObject* objects)
	函数说明:释放对象列表
	参数说明 :
	num	对象列表的个数
	objects	对象列表
	返回值:
	本函数没有返回值

	void op2_free_object (OPObject o)
	函数说明:释放对象内存空间
	参数说明:
	o	对象句柄

	int op2_get_child (openPlant op, const char* parent, int* num, OPObject** objects)
	函数说明:获取子对象列表
	参数说明:
	op	数据库服务器句柄
	parent	指定父对象名称
	num	取到子对象个数
	objects	获取到的子对象列表
	返回值:
	●成功 : 0
	●失败 : 错误码

	int op2_get_child_idname (openPlant op, const char* parent, int* num, OPObject** objects)
	函数说明:获取子对象列表
	参数说明:
	op	数据库服务器句柄
	parent	指定父对象名称
	num	取到子对象个数
	objects	获取到的子对象列表
	返回值:
	●成功 : 0
	●失败 : 错误码


	int op2_get_database (openPlant op, int* num, OPObject** databases)
	函数说明:获取数据库列表
	参数说明:
	op	数据库服务器句柄
	num	取到的数据库列表个数
	databases	获取到的数据库对象列表
	返回值:
	●成功 : 0
	●失败 : 错误码

	int op2_get_id_byname (openPlant op, OPGroup gh, int* id)
	函数说明:通过点名取得对应 ID
	参数说明:
	op	数据库服务器句柄
	gh	点名的点组
	id	指向点的 ID 的数组,用于存放返回点名对应的 ID
	返回值:
	●成功 : 0
	●失败 : 错误码

	int op2_get_object_byid (openPlant op, int num, int* id, OPObject* objects,   int* errors)
	函数说明:获取数据对象
	参数说明:
	op	数据库服务器句柄
	num	对象个数
	num	对象 ID 数组
	objects	对象数组
	errors	错误码
	返回值:
	●成功 : 0
	●失败 : -1

	int op2_get_object_byname (openPlant op, OPGroup gh, OPObject* objects, int* errors)
	获取数据对象
	参数说明:
	op	数据库服务器句柄
	gh	名字组
	objects	对象数组
	errors	错误码
	返回值:
	●成功 : 0
	●失败 : -1

	int op2_modify_object (openPlant op, int cmd, const char* parent, int num, OPObject* objects, int* errors)
	函数说明:创建 / 删除 / 更新对象
	参数说明 :
	op	数据库服务器句柄
	cmd	对数据库的操作 (OP_SELECT,OP_UPDATE,OP_INSERT,OP_
	DELETE,OP_REPLACE)
	parent	该组对象父节点的名字(全名)
	num	对象的个数
	objects	对象数组
	errors	错误码,若错误码中有 0,则表示对该对象的操作未成功
	返回值:
	●成功 : 返回操作成功的对象个数
	●失败 : -1


	OPObject op2_new_object (openPlant op, const char* name, int type)
	函数说明:创建对象
	参数说明 :
	op	数据库服务器句柄
	name	要创建对象的名字
	type	指定对象类型(参考对象类型) 
	返回值:
	●成功 : 对象描述字
	●失败 : NULL

	double op2_object_get_double (OPObject o, const char* field)
	函数说明:取得一个对象的静态属性值,其值类型为 double
	参数说明:
	o	对象描述字(由 op2_new_object 创建或者取对象的函数取得,如:
	op2_get_object_byname 等等)
	field	静态属性的字段(如:PN、ED、EU 等等)
	返回值:
	返回 静态属性的值

	int op2_object_get_int (OPObject o, const char* field)
	函数说明:取得一个对象的静态属性值,其值类型为 int
	参数说明:
	o	对象描述字(由 op2_new_object 创建或者取对象的函数取得,如:
	op2_get_object_byname 等等)
	field	静态属性的字段(如:PN、ED、EU 等等)
	返回值:
	返回 静态属性的值


	int op2_object_get_string (OPObject o, const char* field, char* buf, int len)
	函数说明:取得一个对象的静态属性值,其值类型为 string
	参数说明:
	o	对象描述字(由 op2_new_object 创建或者取对象的函数取得,如:
	op2_get_object_byname 等等)
	field	静态属性的字段(如:PN、ED、EU 等等)
	buf	字符数组,用来存放静态属性的值
	len	字符数组可用的最大长度
	返回值:
	●成功 : 0
	●失败 : 错误码

	void op2_object_set_double (OPObject o, const char* field, double value)
	函数说明:设置一个对象的静态属性值,其值类型为 double
	参数说明:
	o	对象描述字(由 op2_new_object 创建或者取对象的函数取得,如:
	op2_get_object_byname 等等)
	field	静态属性的字段(如:PN、ED、EU 等等)
	value	静态属性字段的值

	void op2_object_set_int (OPObject o, const char* field, int value)
	函数说明:设置一个对象的静态属性值,其值类型为 int
	参数说明:
	o	对象描述字(由 op2_new_object 创建或者取对象的函数取得,如:
	op2_get_object_byname 等等)
	field	静态属性的字段(如:PN、ED、EU 等等)
	value	静态属性字段的值

	void op2_object_set_string (OPObject o, const char* field, char* value)
	函数说明:设置一个对象的静态属性值,其值类型为 string
	参数说明:
	o	对象描述字(由 op2_new_object 创建或者取对象的函数取得,如:
	op2_get_object_byname 等等)
	field	静态属性的字段(如:PN、ED、EU 等等)
	value	静态属性字段的值

4.类文档

4.1StatVal 结构参考

统计值
\#include <opapi2.h>

4.2公有属性

●double avg
●double flow
●double max
●int maxtime
●double mean
●double min
●int mintime
●short status
●double stdev
●int time

4.3详细描述

统计值的结果集类型