Professional Documents
Culture Documents
JAVA 语言接口参考手册
2021年04月
目 录
1、概述.......................................................................................................................... 4
2、服务连接维护和查询接口...................................................................................... 6
2.1、命名服务初始化........................................................................................... 6
2.2、服务枚举....................................................................................................... 7
2.3、建立服务连接............................................................................................... 7
2.4、关闭连接....................................................................................................... 8
2.5、查询连接状态............................................................................................... 9
2.6、测试服务连接状态....................................................................................... 9
3、标签配置信息维护和查询接口............................................................................ 10
3.1、创建标签..................................................................................................... 14
3.2、批量创建标签............................................................................................. 15
3.3、删除标签..................................................................................................... 16
3.4、修改标签配置............................................................................................. 17
3.5、批量更新标签配置..................................................................................... 17
3.6、标签更名..................................................................................................... 19
3.7、标签用户自定义属性维护和查询............................................................. 19
3.8、标签过滤与枚举......................................................................................... 22
3.9、获得标签配置信息..................................................................................... 24
4、数据提交接口........................................................................................................ 25
4.1、二进制数据写入......................................................................................... 25
4.2、单标签多数据批量提交............................................................................. 26
4.3、多标签单数据批量提交............................................................................. 28
4.4、清空服务连接缓存..................................................................................... 29
5、数据查询接口........................................................................................................ 30
5.1、历史数据存储范围查询............................................................................. 30
5.2、最近更新值查询......................................................................................... 31
5.3、历史数据定位查询..................................................................................... 31
5.4、历史原始数据查询..................................................................................... 33
5.5、历史采样数据查询..................................................................................... 34
5.6、极值统计查询............................................................................................. 36
5.7、历史断面查询............................................................................................. 37
5.8、二进制历史数据查询................................................................................. 38
5.9、历史统计查询接口..................................................................................... 39
5.10、变化次数统计接口................................................................................... 40
5.11、起止时刻差值查询接口 ........................................................................... 41
5.11、时间占比统计接口 ................................................................................... 42
5.12、批量历史定位查询................................................................................... 43
5.13、批量采样值查询....................................................................................... 44
5.14、批量极值查询........................................................................................... 44
5.15、批量统计值查询....................................................................................... 45
5.16、批量变化次数查询................................................................................... 45
5.17、批量时间占比查询................................................................................... 46
5.18、时间占比实时计算参数设定接口........................................................... 46
5.19、变化次数实时计算参数设定接口........................................................... 47
5.20、时间占比实时计算参数查询接口........................................................... 47
5.21、变化次数实时计算参数查询接口........................................................... 48
6、服务状态监测接口................................................................................................ 48
6.1、服务器性能监测接口................................................................................. 48
6.2、客户端连接枚举......................................................................................... 49
6.2、服务状态查询............................................................................................. 49
7、时间运算函数........................................................................................................ 50
8、标签脚本程序维护接口........................................................................................ 51
8.1、TrendDB 计算引擎 JS 函数 ....................................................................... 52
8.2、水及水蒸气物性计算 JS 函数 ................................................................... 55
8.3、WEB RestAPI 接口函数 ............................................................................ 57
8.4、日志接口函数............................................................................................. 57
8.5、复杂数学计算函数..................................................................................... 58
9、TrendDB 接口函数错误代码 ................................................................................ 58
TrendDB 实时数据库 JAVA 语言程序接口手册
1、概述
现代工业自动化领域(包括电力系统自动化)普遍存在着连续存储量测数
据的应用要求。过去通常采用关系数据库来存储和处理该类数据,但随着工业
自动化系统监测和控制对象的不断复杂化,自动化系统需要监测和控制的数据
越来越多,对数据采集精度和采集速度的要求也不断提高了;加之用户对历史
数据在系统设计、系统优化、企业经营决策、故障预诊断、故障过程记录以及
事后故障分析等方面价值的认识不断深入,用户对历史数据的访问便利性和访
问速度的要求也不断提高了,传统的关系数据库解决方案已经越来越不能满足
应用要求了。
TrendDB 实时数据库(也称为时序数据库)因其采用专门的数据结构,数
据存储和访问接口简单直接,同时还能针对时序历史数据的特点进行数据压缩
处理,能够显著减少存储空间的占用,因此在工业自动化领域(如电网、电厂、
化工、石油、钢铁、制药、IT 数据中心等等领域)得到了越来越广泛的应用。
TrendDB 实时数据库的核心部分由服务管理器(trenddb_manager)、数据处
理服务器(trenddb_server)、命名授权服务器(trenddb_licserv)和客户端数据
访问程序接口(trenddb_api)组成。其中,trenddb_manager 服务管理器用于管
理单个服务器上运行的多个 trenddb_server 数据处理服务,trenddb_server 数据
处理服务器和 trenddb_api 客户端访问接口是 TrendDB 实时数据库系统的核心,
完成对时序历史数据的压缩存储和查询功能;命名授权服务器则主要完成服务
名转换和 TrendDB 的授权控制功能。
TrendDB 的体系架构可以用下图来示意表示:
4
TrendDB 实时数据库 JAVA 语言程序接口手册
如上图所示,数据处理服务器(trenddb_server)在系统启动时,向命名授
权服务器(trenddb_licserv)注册其服务名称和服务地址(包括服务 IP 和端口
号);客户端数据访问程序接口 trenddb_api 在访问数据处理服务器之前,先与
命名服务器建立连接,查询取得需要访问的 trenddb_server 的服务地址,然后与
trenddb_server 建立网络连接,开始进行数据提交和查询访问。由于客户端只需
要具有 trenddb_server 的逻辑服务名就可以进行数据提交和数据查询,因此,当
部署 trenddb_server 的服务器其物理地址发生变化时,客户端不受任何影响,从
而可以做到客户端应用与数据的物理位置完全无关,能显著增强客户端应用的
独立性和可维护性。
一个 trenddb_server 数据处理服务可以同时向最多两个 trenddb_licserv 命名
授权服务注册,可以实现命名授权服务的冗余备份以提高可靠性;同时,一个
命名授权服务可同时管理多个数据处理服务,在同一台物理服务器上可以同时
运行多个 trenddb_server 实例,在不增加物理服务器的情况下,可以保证整个系
统的性能和容量能够平滑升级。
为了便于应用系统的开发,TrendDB 提供了基于标准 JAVA 语言的程序开发
接口(TrendDB_API.jar),TrendDB_API.jar 是按照 JNI 规范调用 TrendDB 的 C
接口函数实现的,因此,在使用 TrendDB_API.jar 时,必须确保 trenddb_api 的
C 接口在 Java 程序的运行目录下,在 Windows 平台上,需确保 TrendDB 的系统
目录设置到环境变量 Path;在 UNIX 以及 LINUX 上,需确保 TrendDB/lib 设置
到环境变量 LD_LIBRARY_PATH 中,一般在 LINUX 上正确安装 TrendDB 即可。
按照接口功能,可以分为如下几类:
5
TrendDB 实时数据库 JAVA 语言程序接口手册
1、服务连接维护、查询接口
2、标签配置信息维护、查询接口
3、实时历史数据提交接口(写数据接口)
4、实时历史数据查询接口
5、命名服务器访问接口
6、数据处理服务器状态监测接口
7、标签脚本程序配置接口
本手册将逐一给出 TrendDB 程序开发接口函数的说明,在必要时给出示例
程序。
2、服务连接维护和查询接口
TrendDB 采用分布式的体系架构,客户端在与服务端通讯之前,必须先建
立与服务端之间的通讯连接,为了隔离客户端应用对服务端地址的敏感性,
TrendDB 引入了“命名服务”的概念,客户端只需要知道服务端的服务名称,客
户端通过命名服务将服务名称转换为服务地址(IP 地址和服务端口号),然后建
立与服务端的通讯连接,所有的接口函数功能必须通过一个建立好的通讯连接
来完成。
TrendDB 客户端通过一个用户指定的字符串来表示一个通讯连接,连接标
识符的典型格式为“id@server”,其中,id 部分表示客户端到一个服务的连接标
识,而 server 则表示该通讯连接所连接的数据处理服务(trenddb_server)的服
务名称。TrendDB 通讯连接标识符只需要在客户端应用进程内唯一标识即可,
不需要在数据处理服务器的服务范围内唯一标识。
2.1、命名服务初始化
TrendDB 客户端在访问服务端之前,必须先设置所使用的命名服务的服务
地址,接口函数如下:
void InitNameServers(String[] servers) throws DB_Exception;
6
TrendDB 实时数据库 JAVA 语言程序接口手册
使 用 InitNameServers 最 多 可 以 为 客 户 端 设 置 2 个 命 名 服 务 的 地 址 ,
name_servers 是一个字符串数组,用来存储命名服务的服务地址,命名服务的
服务地址的格式为“IP:PORT”,例如“192.168.1.19:9000”。
当所设置服务地址有效,客户端能建立与命名服务之间的连接时,
InitNameServers 则成功,否则抛出异常。
示例程序如下:
String[] servers = {"127.0.0.1:9000"}; //数据库地址及端口
try {
API.InitNameServers (servers);
} catch (DB_Exception e) {
e.printStackTrace ();
}
2.2、服务枚举
在正确设置了命名服务地址之后,用户可以在客户端枚举得到在命名授权
服务(trenddb_licserv)注册的数据处理服务的服务名列表,接口函数如下:
String[] ListServers() throws DB_Exception;
如果调用成功,ListServers 返回 String 类型的数组,代表得到的服务名称
列表(ServiceName),如果调用失败,则抛出异常。
示例程序如下:
try {
String [] serviceName = API.ListServers ();
} catch (DB_Exception e) {
e.printStackTrace ();
}
2.3、建立服务连接
7
TrendDB 实时数据库 JAVA 语言程序接口手册
程间复用。
bFireWall 是一个布尔量,如果在 TrendDB 客户端与服务端分别位于单向网
络隔离设备的两边,此参数必须设置为 TRUE,在其他情况下,设置为 FALSE。
bCacheEnabled 是一个布尔量,如果要求对所建立的连接做数据缓存和自动
重发处理,则需要将此参数设置为 TRUE,反之,设置 FALSE。
userName 是数据库登录用户名,password 是数据库登录密码。
连接创建成功,CreateConnection 返回值为连接 ID(为非负整数),否则返
回负整数,表示错误类型,同时抛出异常。
程序示例如下:
String connStr = "123@TrendDB"; //连接标识符
try {
int connId = API.CreateConnection(connStr, false, true,
"admin", "123456");
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
2.4、关闭连接
8
TrendDB 实时数据库 JAVA 语言程序接口手册
2.5、查询连接状态
2.6、测试服务连接状态
9
TrendDB 实时数据库 JAVA 语言程序接口手册
3、标签配置信息维护和查询接口
TrendDB 中标签的配置信息用如下的实体类来描述:
Class TagConfig
{
String name;
String addr;
String desc;
String unit;
int tagId;
float comDev, expDev, loloLim, hihiLim, lowLim, highLim;
int histDays, normalStatus;
short histDepth, limitTimeout, statusTimeout;
byte type;
byte alarmRule;
boolean mirror, archive, statistics,
byte precision;
boolean grpRD, grpWR, otherRD, otherWR;
};
其中,name 是标签的名称,最大长度为63个字符,标签的名称在同一个数
据处理服务上必须具有唯一性。
addr 是标签的地址,最大长度为63个字符,标签的地址在同一个数据处理
服务上必须具有唯一性。
TrendDB 采用2种标识符(Name 和 Address)来标识所存储的数据,每个标
识符最多可以由63个 ASCII 字符组成,在同一个数据处理服务上,这2种标识符
都必须具有唯一性,在不同的数据处理服务器上,数据标签标识符可以复用。
desc 表示标签的描述信息,最大长度为255个字符。
unit 表示标签的数值单位,最大长度为15个字符。
tagId 表示标签在服务器上的唯一标识整数,由系统自动生成,tagId 不会随
着标签的其他属性变化而变化。
comDev 表示对连续标签进行基于线性带宽算法有损压缩时所容许的误差值,
该误差值为容许误差的绝对值,经过线性带宽有损压缩后,TrendDB 可以保证
在同一时刻压缩后的值与压缩前的值之差绝对值小于 comDev。
expDev 表示对连续标签进行越限报警处理时,能够引起报警状态改变的最
小限值,其物理意义详细如下图所示。
10
TrendDB 实时数据库 JAVA 语言程序接口手册
产生“越高限”报警
不解除“越高限”报警状态 highLim
expDev
解除“越高限”报警状态
histDays 表示标签需要保留历史数据的天数,当历史数据的时间跨度超出
设定天数时,TrendDB 会自动删除最早的历史数据,回收其占用的存储空间,
实现存储空间循环利用。
histDepth 是数值标签的历史数据缓存深度,TrendDB 是分组对数值标签的
历史数据进行无损压缩的,histDepth 就是这个分组中包含的历史数据个数。历
史数据缓存深度越大,数据中所包含的冗余信息就越丰富,无损压缩的压缩比
就越大,压缩后占用的存储空间也就越小;但是历史缓存深度越大,就需要更
多的物理内存为其缓存空间,当系统内存有限时,就要增加虚拟内存的内存交
换量,系统性能会显著降低。因此,在实际应用中要综合考虑压缩比和系统性
能之间的平衡、合理设置 histDepth 的值。
limitTimeout 表示标签处于越限报警状态下以秒为单位的时间限值,当某标
签处于越限报警状态的时间超过这个值,TrendDB 会进一步产生报警。
statusTimeout 表示标签处于状态异常报警状态下以秒为单位的时间限值,
当某标签处于状态异常报警状态的时间超过这个值,TrendDB 会进一步产生报
警。
normalStatus 表示标签的正常状态值,当标签的状态值不等于指定的值时,
TrendDB 会根据该标签的报警规则产生状态异常报警。
type 表 示 标 签 类 型 , 有 连 续 ( TAG_CONTINUOUS )、 离 散
(TAG_DISCRETE)、二进制数据(TAG_BLOB)三种,TrendDB 对连续标签
的数据先采用有损压缩方式进行过滤压缩,然后在此基础上进行无损压缩;对
离散标签和二进制标签的数据则值进行无损压缩。
TrendDB 支持三种数据标签,分别是连续数据标签(TAG_CONTINUOUS)、
11
TrendDB 实时数据库 JAVA 语言程序接口手册
离散数据标签(TAG_DISCRETE)和二进制数据标签(TAG_BLOB)。
对于连续数据标签和离散数据标签,TrendDB 存储的历史数据由三部分组
成:时标(Timestamp)、值(Value)和质量标志(Status)。其中,时标由两个
4字节整数(hours 和 usecs)表示,其中 hours 表示的是当前时刻到公元元年的
小时数,usecs 则表示当前时刻到上一个整点时刻的微秒数,时标的表示精度为
1微妙,可以表达的时间范围则是从公元元年到公元后490,000年;数据值由单
精度浮点数(4字节)表示;质量标志由一个4字节整数表示。因此,一个完整
的数据标签事件点占用的存储空间大小为16字节。连续数据标签和离散数据标
签历史数据结构可以用下图表示:
离散数据标签对应工业控制领域中的变化不连续的量测量,例如设备运行
状态、控制系统设定值等等;连续数据标签则对应连续变化的量测量,如电压、
电流、压力、流量等物理上连续变化的数据。对于离散数据标签,TrendDB 对
其历史数据序列只进行无损压缩处理,在查询时也只返回所存储的原始值,不
进行插值处理;对于连续数据标签,TrendDB 根据用户所设置的有损压缩允许
误差(comDev),对其历史数据序列进行线性带宽压缩或者直线压缩,有损压
缩处理后的结果再经过无损压缩处理后存储在磁盘上。
二进制数据标签的历史数据由两部分组成,分别是时标(Timestamp)和二
进制数据内容,由下图所示:
时标,8字节 二进制数据,最大96K 字节
在实际应用中,二进制数据标签可以用于存储事件信息,也可以用于具有
时序特征的设备配置参数,如电力系统中继电保护设备的定值等,这类数据的
特点是他们都随着时间而变化,具有时序特征,另一方面其变化频率不是很高
但数量很大,像保护定值一般一年只变化几次,但电网中运行的保护设备很多,
每个设备的定值平均至少有几十项,如果直接采用连续或者离散数据标签来表
示定值项,会占用大量的标签容量,造成一定的浪费,采用二进制数据标签来
存储这类数据,可以有效地避免这个问题。
12
TrendDB 实时数据库 JAVA 语言程序接口手册
在存储任何数据标签的历史数据之前,TrendDB 首先检查相应数据标签历
史数据的实际保留时间是否超过了用户的设定值,如果超过了设定值,
TrendDB 数据处理服务器首先删除该数据标签最早的历史数据,回收其占用的
磁盘空间,然后再将压缩数据存储到磁盘文件中,达到磁盘空间循环利用的目
的。TrendDB 的数据处理流程可以用下图来表示:
二
进
制
数
据
无损压缩
数据存储
13
TrendDB 实时数据库 JAVA 语言程序接口手册
对于连续数据标签,TrendDB 采用线性带宽压缩算法对其历史序列进行压
缩处理,通过设置合理的有损压缩精度,在满足工业应用精度要求的情况下,
对于一般的工业量测量变化过程,其有损压缩的压缩比率一般都可以达到8倍以
上,有损压缩的结果经过无损压缩处理后,对于连续数据标签 TrendDB 的综合
数据压缩比率可以达到25:1以上,相对于只有无损压缩或者有损压缩一种压缩
处理方法的数据库,TrendDB 在压缩比更高,更加节省存储空间。
mirror 表示是否需要将标签的数据同步到位于其他网络安全隔离区域的数
据处理服务器上。
archive 表示是否存储该标签的历史数据。
statistics 表示是否需要实时统计该标签的最大、最小值,当该标志位为
TRUE 时,TrendDB 会实时对该标签的数据进行最大、最小值统计,并将统计
结果存储在服务端,这种预先统计可以大大加快统计查询接口的查询效率。
precision 表示在存储标签的历史数据时所保留的数位精度,最大值为23,
最小值为1。当某标签的数据其数值有效位数要求不高时,对 precision 设置合理
的值,可以有效地提高无损压缩的压缩比。
grpRD, grpWR 分别表示与该标签的创建者属于同一用户组的用户是否有权
对该标签进行读写的权利。
otherRD, otherWR 分别表示与该标签的创建者不属于同一用户组的用户是否
有权对该标签进行读写的权利。
alarmRule 表示对该标签进行报警处理方法,Java 接口都设置为0。
3.1、创建标签
14
TrendDB 实时数据库 JAVA 语言程序接口手册
config.type = TagConfig.TAG_CONTINUOUS;
config.comDev = 0.01f;
config.histDepth = 300;
config.histDays = 36500;
config.precision = 23;
config.archive = true;
config.statistics = true;
config.grpRD = true;
config.grpWR = true;
config.mirror = false;
config.name = String.format("P%08d", i);
config.addr = String.format("A%08d", i);
config.desc = String.format("D%08d", i);
config.unit = "kA";
API.AddTag(connId, config);
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
3.2、批量创建标签
15
TrendDB 实时数据库 JAVA 语言程序接口手册
config.histDays = 36500;
config.precision = 23;
config.archive = true;
config.statistics = true;
config.grpRD = true;
config.grpWR = true;
config.mirror = false;
config.name = String.format("P%08d", i);
config.addr = String.format("A%08d", i);
config.desc = String.format("D%08d", i);
config.unit = "kA";
}
int[] retV = API.AddTagList(connId, configList);
for(int j = 0; j < retV.length; ++j)
{
System.out.println(j + ", ret code: " + retV[j]);
}
}
}
catch(DB_Exception ex)
{
System.out.println(ex.GetErrMsg() + ", error: " +
ex.errno);
}
3.3、删除标签
16
TrendDB 实时数据库 JAVA 语言程序接口手册
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
3.4、修改标签配置
3.5、批量更新标签配置
17
TrendDB 实时数据库 JAVA 语言程序接口手册
18
TrendDB 实时数据库 JAVA 语言程序接口手册
3.6、标签更名
3.7、标签用户自定义属性维护和查询
19
TrendDB 实时数据库 JAVA 语言程序接口手册
20
TrendDB 实时数据库 JAVA 语言程序接口手册
删除标签自定义属性示例:
try {
AttrHandle attrHandle = API.GetTagAttrByName(connStr,
"tag");
API.DelTagAttr(attrHandle, "name");
API.SetTagAttrByName(connStr, "tag", attrHandle);
API.CloseTagAttrHandle(attrHandle);
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
清除标签自定义属性示例:
try {
AttrHandle attrHandle = API.GetTagAttrByName(connStr,
"tag");
API.ClearTagAttr(attrHandle);
API.SetTagAttrByName(connStr, "tag", attrHandle);
API.CloseTagAttrHandle(attrHandle);
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
21
TrendDB 实时数据库 JAVA 语言程序接口手册
枚举标签自定义属性示例:
try {
AttrHandle attrHandle = API.GetTagAttrByName(connStr,
"tag");
int cnt = API.GetTagAttrCount(attrHandle);
for(int i = 0; i < cnt; ++i)
{
String[] attrs = API.GetTagAttrAt(attrHandle, i);
System.out.println("attr: " + attrs[0] + ", value: "
+ attrs[1]);
}
API.CloseTagAttrHandle(attrHandle);
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
查询标签自定义属性示例:
try {
AttrHandle attrHandle = API.GetTagAttrByName(connStr,
"tag");
String val = API.GetTagAttr(attrHandle, "name");
System.out.println("attr: " + "name" + ", value: " +
val);
}
API.CloseTagAttrHandle(attrHandle);
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
3.8、标签过滤与枚举
22
TrendDB 实时数据库 JAVA 语言程序接口手册
总数,如果访问成功,函数返回标签的总数,pos 指向符合过滤条件的标签列表
的起端,否则抛出异常,表明失败原因。
ListTags 用来枚举获得标签的配置信息,pos 用于指定获得标签的起始位置,
从服务器获得的标签配置信息存放在 TagConfig 数组中,每次调用 ListTags 成功
后,pos 的值被相应进行更新以指向新的检索位置,程序示例如下:
try
{
ConfigPosition pos = new ConfigPosition();
API.SetTagFilter("name-end", "Power");
int count = API.TagCount(connId, pos);
List<Integer> names = new ArrayList<>();
for(int i = 0; i < count; ++i)
{
try
{
TagConfig[] tags = API.ListTags(connId, pos);
for(int j = 0; j < tags.length; ++j)
{
names.add(new Integer(tags[j].tagId));
}
}
catch(DB_Exception ex)
{
break;
}
}
Integer[] tags = new Integer[names.size()];
tags = names.toArray(tags);
return tags;
}
catch(Exception ex)
{
23
TrendDB 实时数据库 JAVA 语言程序接口手册
3.9、获得标签配置信息
从上述定义可以看出,除了标签的基本配置信息之外,TagInfo还包含标签
的所属用户、所属用户组、创建时间、最后修改时间等信息。当需要获得所有
这些标签信息时,bComplete参数应当指定为TRUE,否则,指定为FALSE,函
数返回时,除config之外的所有项目的值无效。
获得标签信息成功,返回结果,否则抛出异常,表明失败原因。示例:
try {
TagInfo info = API.GetTagInfoByName(connStr);
} catch (DB_Exception e) {
// TODO Auto-generated catch block
e.printStackTrace ();
}
24
TrendDB 实时数据库 JAVA 语言程序接口手册
4、数据提交接口
客户端与服务端建立通讯连接之后,即可以通过数据提交接口向服务端写
入数据。TrendDB 支持三种标签,即连续标签、离散标签、二进制标签,提供
了两类数据写入接口,一类是数值标签写入接口,用来写入连续数据和离散数
据;另外一类是二进制标签写入接口,用于写入二进制数据。
对于连续标签和离散标签,TrendDB 提供了两种写入方式,一种是单标签
多数据批量写入方式,另一种是多标签单数据批量写入方式。前者用于数据产
生速度快(如电力系统的广域测量系统 WAMS,一个标签一秒钟就需要写入
25~100个数据)或者数据补充追加的情形,而后者则用于在一般情形下对
TrendDB 写入数据。这两种数据提交接口既可以用于按时间顺序追加数据,也
可以按照需要插入和修改历史数据。
如果写入数据所使用的网络连接开放了客户端数据缓存功能,那么在写入
数据的过程中如果网络连接中断,客户端应用可以在网络中断期间继续提交数
据,客户端在通讯中断期间提交的数据会缓存在客户端机器磁盘上,当网络连
接恢复时,数据提交接口会将其缓存的数据发送到服务端,保证数据不丢失。
4.1、二进制数据写入
25
TrendDB 实时数据库 JAVA 语言程序接口手册
4.2、单标签多数据批量提交
26
TrendDB 实时数据库 JAVA 语言程序接口手册
values 数组中的数据值的时标是按照从过去到现在的顺序排列,否则可能会导
致中间某些乱序数据的丢失。
为了保证数据提交的效率,数据批量提交接口是以异步方式进行的,即如
果函数执行完成,则表明数据已成功发送或缓存,并不表明服务端已经成功处
理;如果抛出异常,则可能是参数不合理或者数据发送失败。因此,数据提交
接口不能用于检查标签是否在服务端存在等目的。示例:
try
{
DB_Time now = API.TimeNow();
for(int h = 0; h < 5000; ++h)
{
DB_Time begin = API.TimeNow();
System.out.println("BEGIN: " + h + ", " +
API.FormatTime(begin));
DB_Value[] values = new DB_Value[100];
for(int d = 0; d < 100; ++d)
{
API.TimeAdd(now, 1, 0);
values[d] = new DB_Value();
values[d].time = new DB_Time();
values[d].time.hours = now.hours;
values[d].time.usecs = now.usecs;
values[d].status = 3;
values[d].value = (float)Math.random();
}
for(int i = 1; i <= 400000; ++i)
{
String name = String.format("P%08d", i);
try
{
API.InsertBlockValueByName(connId, name, val-
ues);
}
catch(DB_Exception ex)
{
System.out.println("internal exception: " +
ex.GetErrMsg());
}
}
DB_Time end = API.TimeNow();
System.out.println("END: " + API.FormatTime(end));
double duration = (end.hours - begin.hours)*3600.0 +
(end.usecs - begin.usecs)/1000.0/1000.0;
System.out.println("Duration: " + duration + ", rate:
" + 40*100/duration);
27
TrendDB 实时数据库 JAVA 语言程序接口手册
}
API.FlushConnectionBuffer(connId);
}
catch(DB_Exception ex)
{
System.out.println(ex.GetErrMsg());
}
4.3、多标签单数据批量提交
为了保证数据提交的效率,数据批量提交接口是以异步方式进行的,即如
果函数执行完成,则表明数据已成功发送或缓存,并不表明服务端已经成功处
理;如果抛出异常,则可能是参数不合理或者数据发送失败。因此,数据提交
接口不能用于检查标签是否在服务端存在等目的。示例:
long tBegin = System.currentTimeMillis();
for(int i = 1; i < 5000000; ++i)
{
API.TimeAdd(tNow, 1, 0);
values[0].time = tNow;
values[0].value = (float)(100.0*(1.0 +
Math.sin(3.1415926/100.0*k++)));
try
{
API.UpdateValueByName(connId, names, values);
}
28
TrendDB 实时数据库 JAVA 语言程序接口手册
catch(DB_Exception ex)
{
System.out.println("UpdateValueByName failed due to:
" + ex.GetErrMsg() + ", error: " + ex.errno);
}
}
API.FlushConnectionBuffer(connId);
long tDuration = System.currentTimeMillis() - tBegin;
System.out.println("5 millions tags: " + tDuration + " ms");
4.4、清空服务连接缓存
29
TrendDB 实时数据库 JAVA 语言程序接口手册
5、数据查询接口
5.1、历史数据存储范围查询
30
TrendDB 实时数据库 JAVA 语言程序接口手册
5.2、最近更新值查询
5.3、历史数据定位查询
31
TrendDB 实时数据库 JAVA 语言程序接口手册
throws DB_Exception;
HistoryPosition QueryHistPositionByID(int connId, int tagId, HistoryPosition pos) throws
DB_Exception;
以上三个函数分别用于按照标签名称、地址和 ID 定位历史数据在 TrendDB
数据库的位置。其中,connection 或 connId 是连接标识符,name 是标签的名称,
addr 是标签的地址,tagId 是标签的 ID,position 是历史数据位置指示结构,其
定义如下:
Class HistoryPosition
{
DB_Time start, end, current;
};
上述定义中 start、end、current 分别代表历史数据的起始、终止和当前时标
指示。对历史数据的任何查询,都要需要使用这三个函数定位其查询位置。在
调用函数前,用户首先用查询起点时间和终止时间设置 HistoryPosition 中的 start
和 end 成员,然后调用函数确定 HistoryPosition 的 current 成员。经查询函数确定
的查询位置,可以用于后面所介绍的历史数据查询函数。
查询定位成功,返回结果,否则抛出异常,表明失败原因。示例:
HistoryPosition historyPosition = new HistoryPosition();
HistoryPosition position = new HistoryPosition();
DB_Value[] dv = null;
List<DB_Value> list = new ArrayList<DB_Value>();
historyPosition = new HistoryPosition();
for (int i = 0; i < tagCount; i++) {
list.clear();
String tagName = “Demo000001”;
try{
HistoryStatus hs = API.QueryHistStatusByName(connId,
tagName);
position.start = hs.start;
position.end = hs.end;
historyPosition = API.QueryHistPositionByName(connId,
tempTagName, position);
} catch (DB_Exception e) {
e.printStackTrace();
}
while (true) {
dv = null;
try {
dv = API.RetrieveTrendByName(connId,
tagName,historyPosition);
for (int j = 0; j < dv.length; j++) {
list.add(dv[j]);
}
} catch (DB_Exception e) {
break;
}
if (dv == null)
32
TrendDB 实时数据库 JAVA 语言程序接口手册
break;
}
}
5.4、历史原始数据查询
33
TrendDB 实时数据库 JAVA 语言程序接口手册
try{
HistoryStatus hs = API.QueryHistStatusByName(connId,
tagName);
position.start = hs.start;
position.end = hs.end;
historyPosition = API.QueryHistPositionByName(connId,
tempTagName, position);
} catch (DB_Exception e) {
e.printStackTrace();
}
while (true) {
dv = null;
try {
dv = API.RetrieveTrendByName(connId,
tagName,historyPosition);
for (int j = 0; j < dv.length; j++) {
list.add(dv[j]);
}
} catch (DB_Exception e) {
break;
}
if (dv == null)
break;
}
}
5.5、历史采样数据查询
34
TrendDB 实时数据库 JAVA 语言程序接口手册
35
TrendDB 实时数据库 JAVA 语言程序接口手册
break;
}
}
5.6、极值统计查询
按照指定时间间隔重复的多个时间范围内的最大、最小值及其发生时间。
DB_Profile 是标签极值信息数据结构,其定义如下:
Class DB_Profile
{
36
TrendDB 实时数据库 JAVA 语言程序接口手册
5.7、历史断面查询
37
TrendDB 实时数据库 JAVA 语言程序接口手册
DB_Exception;
历史断面查询函数用于批量查询多个标签在某一指定时刻的采样值。以上
函数分别用于按照标签名称、地址和 ID 查询历史断面数据。其中,connection
或 connId 是连接标识符,start 是指定的历史断面时刻,names 是标签名称数组,
addrs 是标签地址数组, ids 是标签 ID 数组,DB_Value[]是返回结果,用于存放返
回的各标签在指定时刻的采样值,如果某标签在指定时刻不存在采样值,则
DB_Value[]数组中相应位置的返回值其 time 成员为无效值(为 NULL)。
如果返回结果,表示客户端与服务端通讯过程正常,values 有可能包含有
所查询标签的最近更新值,可以通过判断 DB_Value 的 time 项是否有效(为
NULL)来判别返回值是否有效,如果某位置的 DB_Value 其 time 为无效时标,
则说明对应位置的标签名称或地址不存在或者没有数据;否则抛出异常,表明
失败原因。示例:
DB_Time tNow = API.TimeNow();
String[] sys_vars = {"system.cpu", "system.disk"};
DB_Value[] values = API.RetrieveSnapshotsByName(connId, tNow,
sys_vars);
System.out.println("CPU: " + values[0].value + ", DISK: " +
values[1].value);
5.8、二进制历史数据查询
38
TrendDB 实时数据库 JAVA 语言程序接口手册
5.9、历史统计查询接口
39
TrendDB 实时数据库 JAVA 语言程序接口手册
throws DB_Exception;
DB_Statistics GetStatisticsByID(int connId, int tagId, DB_Time start, DB_Time end) throws
DB_Exception;
以上函数分别用于按照标签名称、地址和 ID 查询标签在指定时间范围内的
最大、最小、平均、标准差以及时间范围起始和终止时间的差值等统计指标。
其中,connection 或 connId 是连接标识符,start 是起始时间,end 是终止时间,
name 是标签名称,addr 是标签地址,tagId 是标签编号,DB_Statistics 是返回结
果结构,其定义为:
class DB_Statistics
{
public DB_Value min;
public DB_Value max;
public float avg;
public float dev;
public float delta;
}
其中,min 为最小值,max 为最大值,avg 为平均值,dev 为标准差,delta
为差值。示例:
HistoryStatus status = API.QueryHistStatusByName(connId,
tags[k]);
DB_Statistics stat = API.GetStatisticsByName(connId, tags[k],
status.start, status.end);
DB_Statistics stat1 = API.GetStatisticsByName(connStr, tags[k],
status.start, status.end);
System.out.println(tags[k] + ": max: " + stat.max.value + ",
min: " + stat.min.value + ", avg: " + stat.avg + ", dev: " +
stat.dev + ", delta: " + stat.delta);
System.out.println(tags[k] + ": max1: " + stat1.max.value + ",
min: " + stat1.min.value + ", avg: " + stat1.avg + ", dev: " +
stat1.dev + ", delta: " + stat1.delta);
5.10、变化次数统计接口
40
TrendDB 实时数据库 JAVA 语言程序接口手册
5.11、起止时刻差值查询接口
41
TrendDB 实时数据库 JAVA 语言程序接口手册
DB_Exception;
RetrieveDifferences 接口返回指定标签在指定终止和起始时刻的值的变化量,
起止时刻都必须是有效时间,否则抛出无数据异常。
程序示例:
String[] servers = new String[1];
servers[0] = "127.0.0.1:9000";
String connStr = "thr1@DB-1";
int connId = -1;
try
{
API.InitNameServers(servers);
connId = API.CreateConnection(connStr, false, false,
"admin", "123456");
HistoryStatus status = API.QueryHistStatusByName(connId,
"tag");
String[] parts = {"tag1", "tag2", "tag3"};
double[] diffs = API.RetrieveDifferencesByName(connStr,
status.start, status.end, parts);
double[] diff1s = API.RetrieveDifferencesByName(connId,
status.start, status.end, parts);
System.out.println(parts[0] + ": 0: " + diffs[0] + ", 1: "
+ diffs[1] + ", 2: " + diffs[2]);
System.out.println(parts[0] + ": 01: " + diff1s[0] + ", 11:
" + diff1s[1] + ", 21: " + diff1s[2]);
}
catch(DB_Exception ex)
{
System.out.println(ex.GetErrMsg() + ", error: " +
ex.errno);
}
catch(Exception ex)
{
System.out.println("" + ex);
}
5.11、时间占比统计接口
42
TrendDB 实时数据库 JAVA 语言程序接口手册
5.12、批量历史定位查询
43
TrendDB 实时数据库 JAVA 语言程序接口手册
5.13、批量采样值查询
5.14、批量极值查询
44
TrendDB 实时数据库 JAVA 语言程序接口手册
5.15、批量统计值查询
5.16、批量变化次数查询
45
TrendDB 实时数据库 JAVA 语言程序接口手册
5.17、批量时间占比查询
5.18、时间占比实时计算参数设定接口
46
TrendDB 实时数据库 JAVA 语言程序接口手册
5.19、变化次数实时计算参数设定接口
5.20、时间占比实时计算参数查询接口
47
TrendDB 实时数据库 JAVA 语言程序接口手册
5.21、变化次数实时计算参数查询接口
6、服务状态监测接口
6.1、服务器性能监测接口
48
TrendDB 实时数据库 JAVA 语言程序接口手册
6.2、客户端连接枚举
查询成功,返回结果,否则抛出异常,表明失败原因。示例:
ClientStatus[] clients = API.ListClients(connId);
for(k = 0; k < clients.length; ++k)
{
System.out.println("addr: " + clients[k].address + ", start:
" + clients[k].start);
}
6.2、服务状态查询
49
TrendDB 实时数据库 JAVA 语言程序接口手册
}
其中,start 为 TrendDB 数据库服务的最近启动时间;tagCount 为当前的标
签数;cleanStart 表示最近一次启动是否为正常启动,如果取值为非0,则为正
常启动,如果为0,则表示 TrendDB 服务在最近一次启动之前产生过非正常关
闭;rt 为到目前为止 TrendDB 接收到的所有数据条目数;arch 为 TrendDB 已经
存储到磁盘上的数据条目数;insert 是 TrendDB 已经处理的非顺序写入的数据条
目数;dataSize 为 TrendDB 数据库所存储的数据占用的磁盘空间大小,单位为
字节;indexSize 为 TrendDB 数据索引的大小,单位为字节。示例:
ServerStatus servStat = API.QueryServerStatus(connId);
System.out.println("Started: " + serveStat.start + ", clean
start: " + servStat.cleanStart);
7、时间运算函数
TrendDB 提供的时间运算函数可以用于获得系统当前时间、时间格式化、
将指定时间转换为 TrendDB 时间格式、基于 TrendDB 时间格式的各种运算等。
时间运算函数有:
DB_Time TimeNow();
DB_Time SetTime(int year, int mon, int day, int hour, int min, int sec, int usec);
DB_TimeDetail MakeTime(DB_Time now);
50
TrendDB 实时数据库 JAVA 语言程序接口手册
8、标签脚本程序维护接口
TrendDB 用于设置和查询标签脚本程序的接口有:
void SetTagScriptByName(String connection, String name, byte[] script, int cycle) throws
DB_Exception;
void SetTagScriptByAddr(String connection, String addr, byte[] script, int cycle) throws
DB_Exception;
void SetTagScriptByID(String connection, int tagId, byte[] script, int cycle) throws
DB_Exception;
void SetTagScriptByName(int connId, String name, byte[] script, int cycle) throws
DB_Exception;
void SetTagScriptByAddr(int connId, String addr, byte[] script, int cycle) throws
DB_Exception;
void SetTagScriptByID(int connId, int tagId, byte[] script, int cycle) throws DB_Exception;
TagScript GetTagScriptByName(String connection, String name) throws DB_Exception;
TagScript GetTagScriptByAddr(String connection, String addr) throws DB_Exception;
TagScript GetTagScriptByID(String connection, int tagId) throws DB_Exception;
TagScript GetTagScriptByName(int connId, String name) throws DB_Exception;
TagScript GetTagScriptByAddr(int connId, String addr) throws DB_Exception;
TagScript GetTagScriptByID(int connId, int tagId) throws DB_Exception; void
SetLibraryScript(String connection, byte[] script) throws DB_Exception;
byte[] GetLibraryScript(String connection) throws DB_Exception;
void SetLibraryScript(int connId, byte[] script) throws DB_Exception;
byte[] GetLibraryScript(int connId) throws DB_Exception;
其中,SetTagScriptByName、SetTagScriptByAddr 和 SetTagScriptByID 分
别用于以名称、地址和 ID 来设置标签的脚本程序;SetLibraryScript 则用于
设置全局可见的脚本函数库;GetTagScriptByName、GetTagScriptByAddr 和
GetTagScriptByID 则分别用来以名称、地址和 ID 来获取标签的脚本程序;
51
TrendDB 实时数据库 JAVA 语言程序接口手册
而 GetLibraryScript 则用来获取全局可见的脚本函数库。
其中,connection 或 connId 是连接标识符,script 是脚本程序数据体(以
UTF-8编码表示),cycle 则用来表示脚本执行的周期,以秒为单位。
表示脚本程序 TagScript 定义如下:
public class TagScript
{
public byte[] data;
public int cycle;
}
其中,data 表示脚本程序体(以 UTF-8编码),TrendDB 中单个标签最大支
持的脚本程序长度为96kB;cycle 表示脚本执行周期。
如果在调用 SetTagScriptByName、SetTagScriptByAddr 或者 SetLibraryScript
时,指定的参数 script 为 NULL,其实际效果是将标签脚本程序或者脚本函数库
删除。
8.1、TrendDB 计算引擎 JS 函数
52
TrendDB 实时数据库 JAVA 语言程序接口手册
53
TrendDB 实时数据库 JAVA 语言程序接口手册
54
TrendDB 实时数据库 JAVA 语言程序接口手册
8.2、水及水蒸气物性计算 JS 函数
脚本计算引擎提供了 IF97水及水蒸气物性函数模块,用于计算水及水蒸气
的密度、焓、熵值及其逆运算,其具体函数如下:
1、rhomass_Tp,根据温度(T【K】)和压力(p【Pa】)计算水或水蒸
55
TrendDB 实时数据库 JAVA 语言程序接口手册
2、 hmass_Tp ,根据温度(T【K】)和压力(p【Pa】)计算水或水蒸气
3、 smass_Tp,根据温度(T【K】)和压力(p【Pa】)计算水或水蒸气
4、 umass_Tp ,根据温度(T【K】)和压力(p【Pa】)计算水或水蒸气
5、cpmass_Tp,根据温度(T【K】)和压力(p【Pa】)计算水或水蒸气
6、cvmass_Tp,根据温度(T【K】)和压力(p【Pa】)计算水或水蒸气
7、T_phmass,根据压力(p【Pa】)和单位质量焓值(h【J/kg】)计算水
8 、 rhomass_phmass , 根 据 压 力 ( p 【 Pa 】) 和 单 位 质 量 焓 值 ( h
10 、 rhomass_psmass , 根 据 压 力 ( p 【 Pa 】) 和 单 位 质 量 熵 值 ( h
56
TrendDB 实时数据库 JAVA 语言程序接口手册
计 算 水 或 水 蒸气 的 水或 水 蒸 气 的 所处 的 区域 编 号 , 调 用格 式为 q = IF97.
region_ps(p,s);
8.4、日志接口函数
57
TrendDB 实时数据库 JAVA 语言程序接口手册
8.5、复杂数学计算函数
9、TrendDB 接口函数错误代码
值 代号 含义
0 ERROR_OK 正常
-1 ERROR_CVT_OPEN 打开当前值表的时候发生错误
-2 ERROR_CVT_MAP 对当前值表进行映射操作时发
生错误
-3 ERROR_INVALID_ITEM 无效的标签项
58
TrendDB 实时数据库 JAVA 语言程序接口手册
-4 ERROR_NAME_EXIST 标签名称已经被占用
-5 ERROR_POINT_FULL 系统标签分配空间已满,无法
继续添加标签
-6 ERROR_POINT_MEM 内存或者磁盘空间不足,无法
继续添加标签
-7 ERROR_POINT_NONE 无法定位给定的标签定义
-8 ERROR_ITER_NONE 无效的标签迭代器
-9 ERROR_ITER_EMPTY 返回空的标签迭代器
-10 ERROR_ITER_END 已经到达标签迭代器的结尾
-11 ERROR_BTREE_NULL 检测到无效的标签历史数据索
引指针
-12 ERROR_BTREE_NOITEM 标签历史数据索引指针为空
-13 ERROR_DATA_NULL 在指定时间范围内没有历史数
据
-14 ERROR_INDEX_ALLOC 没有足够的内存或者磁盘空间
创建数据索引
-15 ERROR_DATA_ALLOC 没有足够的内存或者磁盘空间
存储数据
-16 ERROR_EMPTY_VALUE 标签当前值表为空
-17 ERROR_DATA_SPIT 标签数据存储分裂时检测到错
误
-18 ERROR_HIST_NONE 在指定的时间范围内没有历史
数据
-19 ERROR_HIST_END 指定时间范围内没有更多的历
史数据
-20 ERROR_NO_VALUE 标签没有实时数据
-21 ERROR_INVALID_CACHE 无效的高速缓存指针
-22 ERROR_BTREE_INVALID 无效的索引指针
-23 ERROR_CACHE_OPEN 打开高速缓存模块时遇到错误
59
TrendDB 实时数据库 JAVA 语言程序接口手册
60
TrendDB 实时数据库 JAVA 语言程序接口手册
61
TrendDB 实时数据库 JAVA 语言程序接口手册
62