1. 介绍
关系数据库转储服务,可以将eview中的实时数据,转储到第三方数据库中(可以是eview自己所用的数据库,也可以是第三方关系数据库)。
可转储的数据分为:
- 实时数据表
- 历史数据表
- 报警历史表
- 操作记录表
- 开关量状态变化及关联数据表
实时数据表:每次更新变量/对象属性的当前数据到该表,根据名称更新,不会插入新的记录。表记录条数是固定的,不会不断增长。
历史数据表:按照一定时间间隔,不断保存变量值、时间、质量到历史转储表中。该表的记录条数会不断增长,因此目标数据库应保证数据库记录不会无限扩展下去,而导致磁盘用尽或者插入、查询速度严重变慢。
注意:程序不会自动建立第三方数据库中的表,需要用户通过SQL语句或者工具手工建立表。
2. 后台运行程序
pkdbtransferserver.exe
3. eview自身数据库配置
3.1. 目标数据库连接表
3.1.1. 表名:t_db_transfer_dbconnection
3.1.2. 规则说明
每个第三方数据库的连接信息(包括:ip、用户、密码、实例名等),需增加一条到表t_dbtransfer_connection。
3.1.3. 建表语句
CREATE TABLE t_db_transfer_dbconnection (
id varchar(16) NOT NULL,
name varchar(32) DEFAULT NULL,
dbtype varchar(16) DEFAULT NULL,
connstring varchar(256) DEFAULT NULL,
username varchar(32) DEFAULT NULL,
password varchar(32) DEFAULT NULL,
description varchar(256) DEFAULT NULL,
codingset varchar(16) DEFAULT NULL,
PRIMARY KEY (id)
);
3.1.4. 字段说明
字段名称 | 类型 | 意义 |
id | varchar(16) | 唯一id,也可是自增字段 |
name | varchar(32) | 给定名称,在数据库转储中暂时用不到,但在dbdrv驱动中会用到 |
dbtype | varchar(16) | 以下值中的一种,详见“关系数据库配置手册.docx”:sqlite/mysql/postgresql/oracle/sqlserver/db2/interbase/informix/sybase/odbc/sqlbase |
connstring | varchar(256) | 见“关系数据库配置手册.docx” |
username | varchar(32) | 登录数据库的名称 |
password | varchar(32) | 登录数据库的密码 |
description | varchar(256) | 描述,可选 |
codingset | varchar(16) | 编码,缺省不用输入。如果乱码可尝试:utf8/ansi |
3.2. 转储配置规则表:
3.2.1. 表名t_dbtransfer_rule
3.2.2. 规则说明
需要为每一个第三方数据库的数据库表,在t_dbtransfer_rule表中插入1条或者多条记录。
如第三方数据库需要下述4个表的数据:“空调子系统小时历史数据表t_air_hourdata”、“空调子系统日历史数据表t_air_daydata”、“电梯子系统日数据表t_elevator_daydata”、“电梯子系统实时数据表t_elevator_realdata”,就需要在t_dbtransfer_rule插入至少4条记录。
支持:
- 每行记录只有一个tag点/对象属性的值、质量、时间
Tagname | Tagvalue | Quality | Tagtime | Updatetime | stationid |
泵机.温度 | 25 | 0 | 2020-01-22 12:22:58.123 | 2020-01-22 12:23:00.123 | X2045 |
- 每行记录包含多个tag点/对象属性的值、质量、时间。此时,field_quality列的值所表示的质量字段可能无法表示所有tag的质量:
temp | humid | Quality | Tagtime | Updatetime | stationid |
25 | 87 | 0 | 2020-01-22 12:22:58.123 | 2020-01-22 12:23:00.123 | X2045 |
- 如果各个tag点质量均为OK(0),则为0
- 否则取其中一个tag点质量不是OK(0)的tag点的质量
- 各个tag点的质量需要根据值来判断。质量不好的点的值不正常(常为?!或0)
- fieldname_value字段无效,field_quality取第一个点的质量
- 设备模式下,field_tagname存储多列信息,配置为以分号隔开的多个{fieldname,datatype}的组合,每个表示一个最终转出表的列名。datatype支持int/string/real/datetime,如果未指定则为string。fieldname为数据库列名。示例:humid,int;temp,string。有多少个列名,那么在t_db_transfer_rule_tag表中的tag_id也应该对应个数的以分号隔开的tag点id
- 对象模式下, field_propname配置为以分号隔开的多个{fieldname,datatype}的组合,datatype支持int/string/real/datetime,如果未指定则为string。fieldname为数据库列名。示例:humid,int;temp,string。有多少个列名,那么在t_db_transfer_rule_objprop表中的prop_id也应该有对应个数的以逗号隔开的属性id
- 对象模式下,field_objectname为对象的数据库字段名称,其值为t_db_transfer_rule_objprop表中object_id的对应的对象的名称
3.2.3. 建表语句
DROP TABLE IF EXISTS t_db_transfer_rule;
CREATE TABLE t_db_transfer_rule (
id varchar(16) NOT NULL,
dbconn_id varchar(16) NOT NULL,
name varchar(32) NOT NULL,
tablename varchar(32) DEFAULT NULL,
saveperiod int DEFAULT NULL,
writeonchange int DEFAULT NULL,
description varchar(256) DEFAULT NULL,
writemethod varchar(8) DEFAULT NULL,
fieldname_objname varchar(64),
fieldname_propname varchar(1024),
fieldname_tagname varchar(1024),
fieldname_value varchar(64),
fieldname_quality varchar(64),
fieldname_datatime varchar(24),
fieldname_updatetime varchar(24),
fieldname_fixcols varchar(1024),
PRIMARY KEY (id)
);
3.3. 字段说明
字段名称 | 类型 | 意义 |
id | varchar(16) | 唯一id,也可是自增字段 |
dbconn_id | varchar(32) | 表t_db_connection表的第三方数据连接的id列的值 |
name | varchar(16) | 该次转储规则的名称,目前暂时用不到 |
tablename | varchar(256) | 要转储到第三方数据的表名称,根据第三方数据库的表明配置 |
saveperiod | varchar(32) | 要第三方数据库表插入或更新一次的周期,单位:秒。从每天0分0秒开始计算。如每小时写入1次,则值为:3600 |
writeonchange | varchar(32) | 是否变化时写入数据。该功能暂时无效 |
description | varchar(256) | 描述,可选 |
writemethod | varchar(16) | 转储到实时表还是历史表。需要是下面两种字符串值得一种:history/real history会在每个周期插入记录 real会在每个周期更新记录(除启动的第一次外,不插入记录) 为空时表示history。 |
fieldname_objname | varchar(1024) | 对象模式下,eview的对象名称对应的第三方数据库表的列名称和列数据类型。设备模式下字段无效。为空时表示不保存该列。该列类型只能为字符串 示例1:对象名称 示例2:对象名称,string |
fieldname_propname | varchar(64) | 对象模式下,对象的多个属性名称对应的第三方数据库表的多个列名称和列数据类型。设备模式下字段无效。为空时表示不保存该列。 示例:温度,int;湿度,float;操作模式,string |
fieldname_tagname | varchar(1024) | 设备模式下,eview的tag点名称对应的第三方数据库表的多个列名称和列数据类型。未输入时缺省列名为:tagname。对象模式下字段无效。为空时表示不保存该列。 示例:开关状态,text;温度,float |
fieldname_value | varchar(512) | 变量值。 如果是需要计算差值,则需要填入diff_value(diffvalue,begin_value,end_value) |
fieldname_quality | varchar(64) | 对象模式下,对象的属性值的质量对应的数据库表的列名称和列数据类型。 设备模式下,该行第一个tag点的对应的质量的数据库表列名称和列数据类型。 为空时表示不保存该列。 数据类型支持:int,text 示例1:质量,int 示例2:质量,text |
fieldname_datetime | varchar(64) | 对象模式下,eview对象的属性值的时间(来自驱动的时间)对应的数据库表的列名称和列数据类型。 设备模式下,该行记录第一个tag点时间(来自驱动的时间)对应的数据库表的列名称和列数据类型 数据类型为:string,datetime,[timeformat] 数据时间的时间格式未实现,缺省为:yyyy-mm-dd HH:MI:SS.xxx 为空时表示不保存该列。 示例1:data_time,string, yyyy-mm-dd HH:MI:SS.xxx 示例2:data_time,string |
fieldname_updatetime | varchar(64) | 对象/设备模式下,插入或者更新表记录的服务器系统时间(转储所在服务器的时间)对应的数据库表的列名称和列数据类型。 为空时缺省不保存。 数据类型为:string,datetime,[timeformat] 示例1:update_time,string, yyyy-mm-dd HH:MI:SS.xxx 示例2: update_time,string |
fieldname_fixcols | varchar(1024) | 设备/对象模式下,第三方数据库表要插入固定值的列名称、列数据类型、列值。其格式为:fieldname,int,value;fieldname2,string,value2 示例1:stationid,string,X1234;stationname,string,瓜步汛 |
3.4. 变量配置表
配置哪些对象或者tag变量会转储到第三方数据库中。
3.4.1. 表名
对象模式下:t_db_transfer_rule_objprop
设备模式下:t_db_transfer_rule_tag
3.4.2. 说明
为每个要转储的tag点或者对象属性,在该表中配置1条记录
3.4.3. t_db_transfer_rule_objprop表字段说明
字段名称 | 类型 | 意义 |
id | varchar(16) | 唯一id,也可是自增字段 |
rule_id | varchar(32) | 表t_db_transfer_rule表的记录id列的值 |
object_id | varchar(16) | Eview要转储的对象名。每转储一个对象需要在该表插入一条记录 示例:100---对应温度控制器1 |
prop_id | varchar(256) | 要转储到eview对象的属性ID列表,多个属性以逗号隔开,其ID个数必须和t_db_transfer_rule表的fieldname_prop的数量相同。 示例:105,106---105对应温度控制器1的温度,106对应温度控制器1的湿度 |
3.4.4. t_db_transfer_rule_tag表字段说明
字段名称 | 类型 | 意义 |
id | varchar(16) | 唯一id,也可是自增字段 |
rule_id | varchar(32) | 表t_db_transfer_rule表的记录id列的值 |
tag_id | varchar(256) | 要转储到eview的tag点id列表,多个属性以逗号隔开,其ID个数必须和t_db_transfer_rule表的fieldname_value的数量相同。 示例:105,106---105对应温度控制器1的温度,106对应温度控制器1的湿度 |
3.4.5. 建表语句
设备模式下:
CREATE TABLE t_db_transfer_rule_tag (
id varchar(16) NOT NULL,
rule_id varchar (16) NOT NULL,
tag_id varchar(16) NOT NULL,
PRIMARY KEY (id)
);
对象模式下:
CREATE TABLE t_db_transfer_rule_objprop (
id varchar (16) NOT NULL,
rule_id varchar (16) DEFAULT NULL,
object_id varchar (16) NOT NULL,
prop_id varchar (16) DEFAULT NULL,
PRIMARY KEY (id)
);
3.5. 转出参数配置
配置变量质量为BAD时,此时变量的值。
3.5.1. 表名
t_sys_param
Name | Value | 描述 |
valueonbad_int | -100000 | 数据质量为BAD且转储类型为int时,变量的值 |
valueonbad_real | -100000 | 数据质量为BAD且转储类型为real时,变量的值 |
valueonbad_string | * | 数据质量为BAD且转储类型为string时,变量的值 |
valueonbad_datetime | 1970-01-01 00:00:00 | 数据质量为BAD且转储类型为datetime时,变量的值 |
4. 第三方数据库表结构示例
4.1. 实时数据表结构设计示例
表名:取决于eview数据库t_dbtransfer_rule表配置的表名,如t_dbtransfer_rtdata_line1
字段名:如果t_rule表未设置字段名,则字段名称为下表“缺省字段名”,否则字段名为自定义的字段名称。
4.1.1. 设备模式实时转储表结构例子
字段名 | 类型 | 长度 | 描述 |
tagname | varchar | 64 | 变量名称,主键 |
data_value | varchar | 32 | 数值,转换为字符串格式 |
data_quality | varchar | int | 数据质量,0表示数据质量好,其他表示数据质量不好 |
data_time | varchar | 24 | 数据值时间,格式同create_time相同 |
update_time | varchar | 24 | 最近一次更新数据值的时间,格式:yyyy-mm-dd hh:mm:ss,非主键 |
示例建表SQL语句:
create table t_dbtransfer_rtdata_sample(
tagname varchar(64),
data_time varchar(24),
data_value varchar(32),
data_quality integer,
update_time varchar(24),
primary key(tagname)
);
4.1.2. 对象模式实时转储数据表结构例子
缺省字段名 | 类型 | 长度 | 描述 |
objectname | varchar | 32 | 设备/对象名称,主键 |
temperature | varchar | 32 | 温度 |
humid | varchar | 32 | 湿度 |
data_time | varchar | 24 | 数据值时间,格式同create_time相同 |
data_quality | Int | 数据质量,0表示数据质量好,其他表示数据质量不好 | |
update_time | varchar | 24 | 最近一次更新数据值的时间,格式:yyyy-mm-dd hh:mm:ss.xxx,主键 |
示例建表SQL语句:
create table t_dbtransfer_rtdata_sample(
objectname varchar(32),
temperature varchar(32),
humid varchar(32),
data_time varchar(24),
data_quality integer,
update_time varchar(24),
primary key(objectname,temperature,humid,update_time)
);
4.2. 历史数据表结构设计
表名:取决于eview数据库t_dbtransfer_rule表配置的表名,如t_dbtransfer_hisdata_line1
字段名:如果t_dbtransfer_rule表未设置字段名,则字段名称为下表“缺省字段名”,否则字段名为自定义的字段名称。
4.2.1. 设备模式下历史转储表结构
缺省字段名 | 类型 | 长度 | 描述 |
tagname | varchar | 64 | 变量名称,主键 |
data_time | varchar | 24 | 数据值本身的时间,缺省时间格式:yyyy-mm-dd hh:mm:ss.xxx |
data_value | varchar | 32 | 数值,转换为字符串格式 |
data_quality | int | 数据质量,0表示数据质量好,其他表示数据质量不好 | |
create_time | varchar | 24 | 插入该条数据记录的时间,缺省时间格式:yyyy-mm-dd hh:mm:ss.xxx,主键 |
示例建表SQL语句:
create table t_dbtransfer_hisdata_sample(
tagname varchar(64),
data_time varchar(24),
data_value varchar(32),
data_quality integer,
update_time varchar(24),
primary key(tagname,update_time)
);
4.2.2. 对象模式历史转储表结构定义
缺省字段名 | 类型 | 长度 | 描述 |
objectname | varchar | 32 | 设备/对象名称,主键 |
temperature | varchar | 32 | 温度 |
humid | varchar | 32 | 湿度 |
data_time | varchar | 24 | 数据值本身的时间,缺省时间格式:yyyy-mm-dd hh:mm:ss.xxx |
data_quality | int | 数据质量,0表示数据质量好,其他表示数据质量不好 | |
update_time | varchar | 24 | 插入该条数据记录的时间,缺省时间格式:yyyy-mm-dd hh:mm:ss.xxx,主键 |
示例建表SQL语句:
create table t_dbtransfer_hisdata_sample(
objectname varchar(32),
temperature varchar(32),
humid varchar(32),
data_time varchar(24),
data_quality integer,
update_time varchar(24),
primary key(objectname,attrname,update_time)
);