润乾集算器实现 X-DB4.5 实时数据库数据获取和数据展示

目前各种 RTDB 实时数据库层出不穷,如 X-DB、Agilor、Edna、PI、Abb、Ihistory、InSql、OpenPlant、PTime、Vestore、KingHistorian 等实时数据库,本篇将详细介绍集算器通过 JAVA 静态方法调用 XDB 实时库数据的实现方式。

1、 文件

XDB4.5 相关:

imagepng

部分文件我会放在附件中,其中 DLL 库涉及到公司,所以不方便给出,当然咯!如果使用了 X-DB 产品,这些 DLL 脚本自然都会有的。

XDB6.1 相关:(暂时未做研究,欢迎探讨)

2、 安装配置

需要安装最新版润乾 app,建议版本为 20220112 以上

需要获取开发授权文件: 如何获取开发授权

开发授权文件不收费,授权文件版本:脚本版

APP 需要修改为 32 的 JDK,APP 安装时选择 64 位即可

修改文件,路径为安装目录 bin 目录下(G:\Program Files\raqsoft\report\bin):config.txt

imagepng

和 setEnv.bat

imagepng

实时库相关文件存放位置

① JAR 包位置:G:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\lib

imagepng

② CLASS 位置:G:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes\com\report

imagepng

路径中 com\report 为 class 文件的包路径;文章末尾粘贴详细 JAVA 代码

③ DLL 和 XML 配置文件位置:G:\Program Files\raqsoft\report\web\webapps\demo\WEB-INF\classes

imagepng
点表:
imagepng

⑹ 改为 32 位 JDK 后,润乾启动需要用 bin 目录下 startupreport.bat

imagepng

3、 设计模板

imagepng

4、 数据处理

imagepng

5、 参数

SHT 文件:

imagepng

RPX 文件:

6、 展示

imagepng

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();
        }
    }
}

}

附件:

zip