润乾集算器实现 X-DB4.5 实时数据库数据获取和数据展示
目前各种 RTDB 实时数据库层出不穷,如 X-DB、Agilor、Edna、PI、Abb、Ihistory、InSql、OpenPlant、PTime、Vestore、KingHistorian 等实时数据库,本篇将详细介绍集算器通过 JAVA 静态方法调用 XDB 实时库数据的实现方式。
1、 文件
XDB4.5 相关:
部分文件我会放在附件中,其中 DLL 库涉及到公司,所以不方便给出,当然咯!如果使用了 X-DB 产品,这些 DLL 脚本自然都会有的。
XDB6.1 相关:(暂时未做研究,欢迎探讨)
2、 安装配置
⑴ 需要安装最新版润乾 app,建议版本为 20220112 以上
⑵ 需要获取开发授权文件: 如何获取开发授权
⑶ 开发授权文件不收费,授权文件版本:脚本版
⑷ APP 需要修改为 32 的 JDK,APP 安装时选择 64 位即可
修改文件,路径为安装目录 bin 目录下(G:\Program Files\raqsoft\report\bin):config.txt
和 setEnv.bat
⑸ 实时库相关文件存放位置
① JAR 包位置:G:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\lib
② CLASS 位置:G:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes\com\report
路径中 com\report 为 class 文件的包路径;文章末尾粘贴详细 JAVA 代码
③ DLL 和 XML 配置文件位置:G:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes
点表:
⑹ 改为 32 位 JDK 后,润乾启动需要用 bin 目录下 startupreport.bat
3、 设计模板
4、 数据处理
5、 参数
SHT 文件:
RPX 文件:
6、 展示
RealTimeData 类代码,需要编译为.class 文件才能使用
package com.report;
import REAP.RealTimeDB.Core.TagNode;
import REAP.RealTimeDB.IRTDBAccess;
import REAP.RealTimeDB.RealTimeDBFactory;
import com.alibaba.fastjson.JSONArray;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.;
import java.util.regex.Pattern;
/**
* 类描述:润乾填报实时库数据获取
*
* @author Meteor
* @version V1.0
* @ClassName: RealTimeData
* @date 2022-2-14
*/
public class RealTimeData {
public static IRTDBAccess rtdb = null;
/**
* 获取XDB实时数据库数据主入口
* @param startTime
* @param endTime
* @param iStep
* @return
*/
public static String realTimeDatahandle(String startTime, String endTime, String iStep){
String data = "";
try {
Map<String, String> map = new HashMap<>();
//获取配置点组信息
Map<String, List<String>> stringListMap = GetFileConfigXml();
//获取实时库连接
if(!getIRTDBAccess()){
testlog("获取实时库连接失败,请检查实时库配置信息");
return "获取实时库连接失败,请检查实时库配置信息";
}
Set<String> keys = stringListMap.keySet();
for(String key : keys){
List<String> values = stringListMap.get(key);
List<Object> dataList = new ArrayList<>();
for(String value:values){
//先忽略http
if(value.startsWith("http")){
continue;
}
List<Object> list = GetPointsHis(value, startTime, endTime, iStep);
dataList.addAll(list);
}
map.put(key,JSONArray.toJSONString(dataList));
}
data = JSONArray.toJSONString(map);
} catch (Exception e) {
e.printStackTrace();
testlog("实时库数据获取出错:"+e);
}
return data;
}
/**
* 获取并解析实时库点组配置文件
* @return
*/
public static Map<String, List<String>> GetFileConfigXml() {
try {
Map<String, List<String>> map = new HashMap<>();
SAXReader sr = new SAXReader();
String path = Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath() + "point.xml";
Document doc = sr.read(path);
Element root = doc.getRootElement();
//获取http请求获取实时库数据路径地址
List<Element> url = root.elements("url");
for (Element urls : url) {
String id = urls.attributeValue("id").trim();
List<Element> name = urls.elements("name");
List<String> list = new ArrayList<>();
for (Element names : name) {
list.add(names.getText().trim());
}
map.put(id,list);
}
//获取实时库请求point点组
List<Element> point = root.elements("point");
for (Element points : point) {
String groupName = points.attributeValue("groupName").trim();
List<Element> name = points.elements("name");
List<String> list = new ArrayList<>();
for (Element names : name) {
list.add(names.getText().trim());
}
map.put(groupName,list);
}
testlog("实时库数据获取点配置信息:"+map.toString());
return map;
} catch (Exception e) {
e.printStackTrace();
testlog("解析point.xml出错:"+e);
}
return null;
}
public static List GetPointsHis(String qryPoint, String startTime, String endTime, String iStep) {
List<Object> list = new ArrayList<>();
try {
if (qryPoint != null && !"".equals(qryPoint)) {
if (isDateTime(startTime, "yyyy-MM-dd HH🇲🇲ss") && isDateTime(endTime, "yyyy-MM-dd HH🇲🇲ss")) {
if (isNumeric(iStep) && Integer.parseInt(iStep) >= 0) {
if (rtdb == null) {
testlog("获取实时库连接为空");
list.add("获取实时库连接为空");
return list;
} else {
if (!rtdb.Connected()) {
testlog("连接实时库失败");
rtdb.Connect();
testlog("重新连接实时库");
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH🇲🇲ss");
Date sTime = format.parse(startTime);
Date eTime = format.parse(endTime);
TagNode[] tagNodes = rtdb.HistoryQuery(qryPoint, sTime, eTime, Integer.parseInt(iStep));
if (tagNodes != null && tagNodes.length > 0) {
int allDataCount = tagNodes.length;
testlog("开始组装DataSet");
testlog("开始插入数据");
TagNode[] var16 = tagNodes;
int var15 = tagNodes.length;
for(int var14 = 0; var14 < var15; ++var14) {
TagNode tagNode = var16[var14];
if (tagNode != null) {
Map map = new HashMap<>();
map.put("pointId", tagNode.getTagName());
map.put("pointValue", tagNode.getTagValueD());
map.put("pointTime", format.format(tagNode.getdtTimeStamp()));
map.put("pointStatus", tagNode.getExtProp().getIntTagState());
list.add(map);
testlog("插入 第" + list.size() + "条数据,完成");
}
}
testlog("插入数据完成");
return list;
} else {
testlog("查询点:" + qryPoint + " 无数据");
list.add("查询点:" + qryPoint + " 无数据");
return list;
}
}
} else {
testlog("步长参数不为整型");
list.add("步长参数不为整型");
return list;
}
} else {
testlog("日期转换出错:" + startTime + "---" + endTime);
list.add("日期转换出错:" + startTime + "---" + endTime);
return list;
}
} else {
testlog("qryPoint查询点为空");
list.add("qryPoint查询点为空");
return list;
}
} catch (Exception var18) {
var18.printStackTrace();
list.add(var18.getMessage());
return list;
}
}
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}
public static boolean isDateTime(String sDate, String sFormat) {
SimpleDateFormat sDateFormat = new SimpleDateFormat(sFormat);
try {
sDateFormat.setLenient(false);
sDateFormat.parse(sDate);
return true;
} catch (ParseException var4) {
return false;
}
}
/**
* 获取实时库连接
* @return
*/
public static boolean getIRTDBAccess() {
boolean isConnect = false;
testlog("进入getIRTDBAccess方法");
try {
String filePath = Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath() + "rtdbconfig.xml";
testlog("读取配置文件" + filePath);
rtdb = RealTimeDBFactory.CreateRtDBAccess(filePath);
if (rtdb == null) {
isConnect = false;
testlog("连接为空...");
} else {
isConnect = true;
testlog("已连接...");
}
} catch (Exception var3) {
var3.printStackTrace();
}
return isConnect;
}
/**
* 日志记录
* @param msg
*/
public static void testlog(String msg) {
String path = "\\G:\\testlog\\repotLog.txt";
BufferedOutputStream bufferedOutputStream = null;
FileOutputStream fos = null;
try {
File file = new File(path);
if (!file.exists()) {
BufferedWriter bw = new BufferedWriter(new FileWriter(path));
bw.append(msg);
bw.newLine();
bw.close();
} else {
if (fos == null) {
fos = new FileOutputStream(path, true);
}
bufferedOutputStream = new BufferedOutputStream(fos);
bufferedOutputStream.write((msg + "\n").getBytes());
}
} catch (Exception var15) {
var15.printStackTrace();
} finally {
try {
if (bufferedOutputStream != null) {
bufferedOutputStream.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException var14) {
var14.printStackTrace();
}
}
}
}
附件: