Appearance
Java openPlant API
1. 介绍
该文档是Java封装操作实时数据库的说明文档,实现了操作数据库的大部分功能,简化操作流程,优化接口。
2. 设计原理
Java 使用JNI的方法实现了对新增数据类型、SQL等接口的封装,方便用户使用
3. 使用方式
1. 将对应的jar放到项目依赖里面
2. 使用方式和以前的Java操作数据基本一样,不同的是增加了新的接口,简化了操作逻辑
3、增加了订阅接口,可以订阅Realtime(实时数据),Alarm(报警数据),Point(静态信息)表
4. 新增接口说明和代码示例(适配V5.0/V4.0)
4.1、新协议接口函数解释
新协议接口函数
1.获取连接new OPConnect()
函数示例:new OPConnect(String host, int port, int timeout, String user, String password)
所属包名和类名:com.magus.opio.net.OPConnect
返回类型:com.magus.opio.net.IOPConnect类型
host:数据库所在服务器的ip
port:数据库服务的端口
timeout:数据库超时时间以毫秒:单位
user和password分别:数据库用户名和密码
2.创建查询结构OPConnect.createTable()
函数示例:OPConnect.createTable(String tableName)
所属包名和类名:com.magus.opio.net.OPConnect
返回类型:com.magus.opio.dto.OPTable
tableName:需要查询的数据库里的表,可选参数有:
OPConst.TABLE_DATABASE:数据库
OPConst.TABLE_NODE:节点
OPConst.TABLE_POINT:点信息表
OPConst.TABLE_REALTIME:实时表
OPConst.TABLE_ARCHIVE:历史表
OPConst.TABLE_ALARM:报警表
OPConst.TABLE_AALARM:历史报警表
OPConst.TABLE_STAT:统计表
3.增加查询结构字段OPTable.addColumn()
函数示例1:OPTable.addColumn(String columnName, int type)
函数示例2:OPTable.addColumn(String columnName)
返回类型:int,是加入字段的序号
columnName:表结构字段名,可传数据库对应字段如”AV”、”DS”、”TM”、”ED”等等
type:该字段对应的数据类型,默认:OPValue.TYPE_OBJECT表示是一个Object类型,可选参数还有:
OPValue.TYPE_NULL,是一个null类型
OPValue.TYPE_BOOL,示是一个布尔类型
OPValue.TYPE_INT32,表示一个32位的整型
OPValue.TYPE_INT64,表示一个64位的整型
OPValue.TYPE_FLOAT,表示一个浮点数类型
OPValue.TYPE_DATETIME,表示一个时间类型
OPValue.TYPE_STRING,表示是一个字符串类型
OPValue.TYPE_BINARY,表示是一个二进制类型
OPValue.TYPE_OBJECT,表示是一个Object类型
4.新增要写入或者更新的记录OPTable.newRow()
函数示例:OPTable.newRow()
返回值类型:com.magus.opio.dto.OPRow
5.给新增的记录赋值OPRow.bind()
函数示例1:OPRow.bind(int index, Object value, int type)
函数示例2:OPRow.bind(int index, Object value)
返回值:没有返回值
index:OPTable对象里增加的字段的序号
value :要给这条记录对应字段传入的值
type:该传入的值需要对应的数据类型,默认:OPValue.TYPE_OBJECT表示是一个Object类型,可选参数还有:
OPValue.TYPE_NULL,是一个null类型
OPValue.TYPE_BOOL,示是一个布尔类型
OPValue.TYPE_INT32,表示一个32位的整型
OPValue.TYPE_INT64,表示一个64位的整型
OPValue.TYPE_FLOAT,表示一个浮点数类型
OPValue.TYPE_DATETIME,表示一个时间类型
OPValue.TYPE_STRING,表示是一个字符串类型
OPValue.TYPE_BINARY,表示是一个二进制类型
OPValue.TYPE_OBJECT,表示是一个Object类型
6.把新增的记录增加到表数据结构OPTable.append()
函数示例:OPTable.append(OPRow row)
返回值:int类型,是增加的记录的序号
row :创建的要插入或者更新的记录
7.插入数据到数据库OPConnect.insert()
函数示例:OPConnect.insert(OPTable table)
返回值类型:com.magus.jdbc.OPResultSet
table :创建的要插入的记录的数据结构
8.更新数据到数据库OPConnect.update()
函数示例:OPConnect.update(OPTable table)
返回值类型:com.magus.jdbc.OPResultSet
table :创建的要更新的记录的数据结构
9.查询数据OPConnect.find()
函数示例1:OPConnect.find(OPTable table,Object keys)
函数示例2:OPConnect.find(OPTable table)
返回值类型:com.magus.jdbc.OPResultSet
table :创建的查询字段的结构
keys:查询的id或者点名的数组ID数组:一个int[],点名数组:String[]
10.执行SQL语句 OPConnect.execSQL()
函数示例:OPConnect.execSQL(String sql)
返回值类型:com.magus.jdbc.OPResultSet;
sql :按照openPlant数据库的SQL规范的SQL语句
11.删除数据OPConnect.remove()
函数示例:OPConnect.remove(OPTable table,Object keys)
返回值类型:com.magus.jdbc.OPResultSet
table :创建的需要删除的记录字段的结构
keys:需要删除记录的id或者点名的数组ID数组:一个int[],点名数组:String[]
12.查询历史数据OPConnect.findArchive()
函数示例:OPConnect.findArchive(OPTable table, Object keys, Date begin, Date end, OPConst.ArchiveModel mode, int interval)
返回值类型:com.magus.jdbc.OPResultSet
keys:查询的id或者点名的数组,ID数组:一个int[],点名数组:String[]
begin:查询历史的开始时间
end:查询历史的结束时间
mode:查询历史的方式可选参数:
OPConst.ArchiveModel.raw:原始数据
OPConst.ArchiveModel.span:等间距采样
OPConst.ArchiveModel.plot:绘图值
OPConst.ArchiveModel.flow:流量值
OPConst.ArchiveModel.max:最大值
OPConst.ArchiveModel.min:最小值
OPConst.ArchiveModel.avg:面积平均值
OPConst.ArchiveModel.mean:算数平均值
interval :采样间隔,单位是秒,若mode:原始数据类型,interval参数必须:1
13.删除历史OPConnect.removeArchive()
函数示例:OPConnect.removeArchive(Object keys, Date begin, Date end)
返回值类型:com.magus.jdbc.OPResultSet
begin :需要删除的历史的开始时间
end:需要删除的历史数据的结束时间
14.订阅数据 new OPSubscribe()
函数示例:new OPSubscribe(Connection conn, String tableName, ArrayList<?> keyList, SubscribeResultSet subscribeResultSet)
conn :数据库连接,类型:java.sql.Connection,连接必须按照标准的jdbc使用方式获取
tableName :需要订阅的表名,可选参数:
“Realtime”:表示订阅实时数据
“Alarm”:表示订阅报警数据
“Point”:表示订阅静态数据
keyList :订阅的点的ID的数组或者点名的列表,ID:Integer的列表,点名:String的列表
subscribeResultSet:实现了这个订阅接口的对象,用来订阅接受推送的数据
4.2、新协议接口代码示例
4.2.1 连接信息配置
示例中使用的类都会继承共有数据类,方便全局修改变量。
示例中类定义了使用的基本信息以及连接配置信息,还有统计的结果打印接口。
连接信息配置
package com.magus.jdbc;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.text.SimpleDateFormat;
public class ExampleBase {
public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
public static String ip = "127.0.0.1";
public static int port = 8200;
public static String user = "sis";
public static String password = "openplant";
public static int timeout = 180;
public static int number = 10000;
public static int show(OPResultSet rs) throws SQLException {
int count = 0;
ResultSetMetaData rsmd = rs.getMetaData();
String formatStr = "%-20s";
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.print(String.format(formatStr, rsmd.getColumnLabel(i).toUpperCase()) + "\t");
}
System.out.print("\n");
while (rs.next()) {
StringBuffer sb = new StringBuffer();
count++;
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
if (rsmd.getColumnType(i) == Types.TIMESTAMP) {
sb.append(sdf.format(rs.getDate(i)) + "\t");
} else if (rsmd.getColumnType(i) == Types.BOOLEAN) {
sb.append(rs.getBoolean(i) + "\t");
} else {
sb.append(String.format(formatStr, rs.getString(i)) + "\t");
}
}
if (sb.length() > 0) {
System.out.println(sb.toString());
}
}
return count;
}
}
4.2.1 插入数据接口 insert
详细代码示例
package com.magus.jdbc;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import com.magus.OPException;
import com.magus.opio.dto.OPConst;
import com.magus.opio.dto.OPRow;
import com.magus.opio.dto.OPTable;
import com.magus.opio.dto.OPValue;
import com.magus.opio.net.IOPConnect;
import com.magus.opio.net.OPConnect;
public class ExampleInsert extends ExampleBase {
public static void main(String[] args) throws Exception {
IOPConnect conn = new OPConnect(ip, port, 180, user, password);
Date time = conn.getServerTime();
System.out.println("database now time:" + sdf.format(time));
// insert database node
insertNode(conn);
OPTable table = conn.createTable(OPConst.TABLE_POINT);
// 设置添加的列
table.addColumn("GN", OPValue.TYPE_STRING);
table.addColumn("RT", OPValue.TYPE_INT32);
table.addColumn("ED", OPValue.TYPE_STRING);
OPRow row = null;
// 添加行
for (int i = 1; i <= number; i++) {
row = table.newRow();
row.bind(0, "W3.AX.AX_" + i);
row.bind(1, 0, OPValue.TYPE_INT32);
row.bind(2, "this is ax point " + i);
table.append(row);
row.bind(0, "W3.DX.DX_" + i);
row.bind(1, 1, OPValue.TYPE_INT32);
row.bind(2, "this is dx point " + i);
table.append(row);
row.bind(0, "W3.I2.I2_" + i);
row.bind(1, 2, OPValue.TYPE_INT32);
row.bind(2, "this is i2 point " + i);
table.append(row);
row.bind(0, "W3.I4.I4_" + i);
row.bind(1, 3, OPValue.TYPE_INT32);
row.bind(2, "this is i4 point " + i);
table.append(row);
row.bind(0, "W3.R8.R8_" + i);
row.bind(1, 4, OPValue.TYPE_INT32);
row.bind(2, "this is r8 point " + i);
table.append(row);
row.bind(0, "W3.LONG.LONG_" + i);
row.bind(1, 5, OPValue.TYPE_INT32);
row.bind(2, "this is long point " + i);
table.append(row);
row.bind(0, "W3.TEXT.TEXT_" + i);
row.bind(1, 6, OPValue.TYPE_INT32);
row.bind(2, "this is text point " + i);
table.append(row);
row.bind(0, "W3.BLOB.BLOB_" + i);
row.bind(1, 7, OPValue.TYPE_INT32);
row.bind(2, "this is blob point " + i);
table.append(row);
}
long t = System.currentTimeMillis();
OPResultSet rs = conn.insert(table);
System.out.println("insert database point use time:" + (System.currentTimeMillis() - t));
show(rs);
rs.close();
table.destroy();//OPTable 使用完 必须调用destro方法释放本地内存,否则会内存泄漏
insertRealtime(conn);
conn.close();
}
public static void insertNode(IOPConnect conn) throws OPException, SQLException {
OPTable table = conn.createTable(OPConst.TABLE_NODE);
// 设置添加的列
table.addColumn("GN", OPValue.TYPE_STRING);
table.addColumn("ED", OPValue.TYPE_STRING);
OPRow row = table.newRow();
row.bind(0, "W3.AX");
row.bind(1, "AX NODE");
table.append(row);
row.bind(0, "W3.DX");
row.bind(1, "DX NODE");
table.append(row);
row.bind(0, "W3.I2");
row.bind(1, "I2 NODE");
table.append(row);
row.bind(0, "W3.I4");
row.bind(1, "I4 NODE");
table.append(row);
row.bind(0, "W3.R8");
row.bind(1, "R8 NODE");
table.append(row);
row.bind(0, "W3.LONG");
row.bind(1, "LONG");
table.append(row);
row.bind(0, "W3.TEXT");
row.bind(1, "TEXT NODE");
table.append(row);
row.bind(0, "W3.BLOB");
row.bind(1, "BLOB NODE");
table.append(row);
long t = System.currentTimeMillis();
OPResultSet rs = conn.insert(table);
show(rs);
rs.close();
table.destroy();//OPTable 使用完 必须调用destro方法释放本地内存,否则会内存泄漏
System.out.println("insert database node user time:" + (System.currentTimeMillis() - t));
}
public static void insertRealtime(IOPConnect conn) throws OPException, SQLException, InterruptedException {
OPResultSet rs = null;
OPTable table = conn.createTable(OPConst.TABLE_REALTIME);
// 设置添加的列
table.addColumn("GN", OPValue.TYPE_STRING);
table.addColumn("AV", OPValue.TYPE_OBJECT);
OPRow row = null;
int index = 0;
int rIndex = 2;
// 添加行
while (true) {
table.clear();
long t = System.currentTimeMillis();
index++;
for (int i = 1; i <= number; i++) {
row = table.newRow();
row.bind(0, "W3.AX.AX_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
row.bind(1, Math.random() + index);
}
table.append(row);
row.bind(0, "W3.DX.DX_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
row.bind(1, index % 2);
}
table.append(row);
row.bind(0, "W3.I2.I2_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
row.bind(1, index);
}
table.append(row);
row.bind(0, "W3.I4.I4_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
row.bind(1, index);
}
table.append(row);
row.bind(0, "W3.R8.R8_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
row.bind(1, Math.random() + index * 10);
}
table.append(row);
row.bind(0, "W3.LONG.LONG_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
row.bind(1, index * 10 + (int) (Math.random() * 1000));
}
table.append(row);
row.bind(0, "W3.TEXT.TEXT_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
row.bind(1, "text index " + index);
}
table.append(row);
row.bind(0, "W3.BLOB.BLOB_" + i);
if (index % rIndex == 0) {
row.bind(1, null);
} else {
// row.bind(1, ("blob index " + index).getBytes());
row.bind(1, "text index " + index);
}
table.append(row);
}
rs = conn.insert(table);
t = (System.currentTimeMillis() - t);
System.out.println("insert database realtime use time:" + t);
rs.close();
table.destroy();//OPTable 使用完 必须调用destro方法释放本地内存,否则会内存泄漏
if ((1000 - t) > 0) {
Thread.sleep(1000 - t);
}
// show(rs);
// find(conn);
}
}
public static void find(IOPConnect conn) throws OPException, SQLException {
// insert database node
OPTable table = conn.createTable(OPConst.TABLE_REALTIME);
// 设置添加的列
table.addColumn("GN");
table.addColumn("ED");
table.addColumn("RT");
table.addColumn("AV");
table.addColumn("DS");
ArrayList<String> gns = new ArrayList<String>();
// 添加行
for (int i = 1; i <= number; i++) {
gns.add("W3.AX.AX_" + i);
gns.add("W3.DX.DX_" + i);
gns.add("W3.I2.I2_" + i);
gns.add("W3.I4.I4_" + i);
gns.add("W3.R8.R8_" + i);
gns.add("W3.LONG.LONG_" + i);
gns.add("W3.TEXT.TEXT_" + i);
gns.add("W3.BLOB.BLOB_" + i);
}
long t = System.currentTimeMillis();
OPResultSet rs = conn.find(table, gns.toArray(new String[gns.size()]));
System.out.println("find database node use time:" + (System.currentTimeMillis() - t));
show(rs);
table.destroy();//OPTable 使用完 必须调用destro方法释放本地内存,否则会内存泄漏
rs.close();
}
}
该示例中实现了添加节点、添加点、写入实时数据等功能,写其它表信息类似这种操作方式,添加写空值的函数。
4.2.2 更新数据 update
详细代码示例
package com.magus.jdbc;
import java.sql.SQLException;
import java.util.Date;
import com.magus.OPException;
import com.magus.opio.dto.OPConst;
import com.magus.opio.dto.OPRow;
import com.magus.opio.dto.OPTable;
import com.magus.opio.dto.OPValue;
import com.magus.opio.net.IOPConnect;
import com.magus.opio.net.OPConnect;
public class ExampleUpdate extends ExampleBase {
public static void main(String[] args) throws Exception {
IOPConnect conn = new OPConnect(ip, port, 180, user, password);
Date time = conn.getServerTime();
System.out.println("database now time:" + sdf.format(time));
// insert database node
updateNode(conn);
OPTable table = conn.createTable(OPConst.TABLE_POINT);
// 设置添加的列
table.addColumn("GN", OPValue.TYPE_STRING);
table.addColumn("IV", OPValue.TYPE_INT32);
table.addColumn("ED", OPValue.TYPE_STRING);
OPRow row = null;
// 添加行
for (int i = 1; i <= number; i++) {
row = table.newRow();
row.bind(0, "W3.AX.AX_" + i);
row.bind(1, 0, OPValue.TYPE_INT32);
row.bind(2, "this is ax point " + i + Math.random());
table.append(row);
row.bind(0, "W3.DX.DX_" + i);
row.bind(1, 1, OPValue.TYPE_INT32);
row.bind(2, "this is dx point " + i + Math.random());
table.append(row);
row.bind(0, "W3.I2.I2_" + i);
row.bind(1, 2, OPValue.TYPE_INT32);
row.bind(2, "this is i2 point " + i + Math.random());
table.append(row);
row.bind(0, "W3.I4.I4_" + i);
row.bind(1, 3, OPValue.TYPE_INT32);
row.bind(2, "this is i4 point " + i + Math.random());
table.append(row);
row.bind(0, "W3.R8.R8_" + i);
row.bind(1, 4, OPValue.TYPE_INT32);
row.bind(2, "this is r8 point " + i + Math.random());
table.append(row);
row.bind(0, "W3.LONG.LONG_" + i);
row.bind(1, 5, OPValue.TYPE_INT32);
row.bind(2, "this is long point " + i + Math.random());
table.append(row);
row.bind(0, "W3.TEXT.TEXT_" + i);
row.bind(1, 6, OPValue.TYPE_INT32);
row.bind(2, "this is text point " + i + Math.random());
table.append(row);
row.bind(0, "W3.BLOB.BLOB_" + i);
row.bind(1, 7, OPValue.TYPE_INT32);
row.bind(2, "this is blob point " + i + Math.random());
table.append(row);
}
long t = System.currentTimeMillis();
OPResultSet rs = conn.update(table);
System.out.println("update database point use time:" + (System.currentTimeMillis() - t));
show(rs);
rs.close();
table.destroy();//OPTable 使用完 必须调用destro方法释放本地内存,否则会内存泄漏
conn.close();
}
public static void updateNode(IOPConnect conn) throws OPException, SQLException {
OPTable table = conn.createTable(OPConst.TABLE_NODE);
// 设置添加的列
table.addColumn("GN", OPValue.TYPE_STRING);
table.addColumn("ED", OPValue.TYPE_STRING);
OPRow row = table.newRow();
row.bind(0, "W3.AX");
row.bind(1, "AX NODE update");
table.append(row);
row.bind(0, "W3.DX");
row.bind(1, "DX NODE update");
table.append(row);
row.bind(0, "W3.I2");
row.bind(1, "I2 NODE update");
table.append(row);
row.bind(0, "W3.I4");
row.bind(1, "I4 NODE update");
table.append(row);
row.bind(0, "W3.R8");
row.bind(1, "R8 NODE update");
table.append(row);
row.bind(0, "W3.LONG");
row.bind(1, "LONG NODE update ");
table.append(row);
row.bind(0, "W3.TEXT");
row.bind(1, "TEXT NODE update");
table.append(row);
row.bind(0, "W3.BLOB");
row.bind(1, "BLOB NODE update");
table.append(row);
long t = System.currentTimeMillis();
OPResultSet rs = conn.update(table);
show(rs);
rs.close();
table.destroy();//OPTable 使用完 必须调用destro方法释放本地内存,否则会内存泄漏
System.out.println("insert database node user time:" + (System.currentTimeMillis() - t));
}
}
该示例将上面添加的节点和测点的基本信息修改一部分。
4.2.3 执行查询 find
详细代码示例
package com.magus.jdbc;
import java.util.ArrayList;
import java.util.Date;
import com.magus.opio.dto.OPConst;
import com.magus.opio.dto.OPTable;
import com.magus.opio.net.IOPConnect;
import com.magus.opio.net.OPConnect;
public class ExampleFind extends ExampleBase {
public static void main(String[] args) throws Exception {
IOPConnect conn = new OPConnect(ip, port, 180, user, password);
Date time = conn.getServerTime();
System.out.println("database now time:" + sdf.format(time));
// insert database node
OPTable table = conn.createTable(OPConst.TABLE_POINT);
// 设置添加的列
table.addColumn("GN");
table.addColumn("ED");
table.addColumn("RT");
ArrayList<String> gns = new ArrayList<String>();
// 添加行
for (int i = 1; i <= number; i++) {
gns.add("W3.AX.AX_" + i);
gns.add("W3.DX.DX_" + i);
gns.add("W3.I2.I2_" + i);
gns.add("W3.I4.I4_" + i);
gns.add("W3.R8.R8_" + i);
gns.add("W3.LONG.LONG_" + i);
gns.add("W3.TEXT.TEXT_" + i);
gns.add("W3.BLOB.BLOB_" + i);
}
long t = System.currentTimeMillis();
OPResultSet rs = conn.find(table, gns.toArray(new String[gns.size()]));
// show(rs);
rs.close();
table.destroy();//OPTable 使用完 必须调用destro方法释放本地内存,否则会内存泄漏
System.out.println("find database node use time:" + (System.currentTimeMillis() - t));
conn.close();
}
}
该示例将上述添加和更新的点数据查询出来
4.2.4 删除数据 remove
详细代码示例
package com.magus.jdbc;
import java.util.ArrayList;
import java.util.Date;
import com.magus.opio.dto.OPConst;
import com.magus.opio.net.IOPConnect;
import com.magus.opio.net.OPConnect;
public class ExampleRemove extends ExampleBase {
public static void main(String[] args) throws Exception {
IOPConnect conn = new OPConnect(ip, port, 180, user, password);
Date time = conn.getServerTime();
System.out.println("database now time:" + sdf.format(time));
ArrayList<String> gns = new ArrayList<String>();
// 添加行
for (int i = 1; i <= number; i++) {
gns.add("W3.AX.AX_" + i);
gns.add("W3.DX.DX_" + i);
gns.add("W3.I2.I2_" + i);
gns.add("W3.I4.I4_" + i);
gns.add("W3.R8.R8_" + i);
gns.add("W3.LONG.LONG_" + i);
gns.add("W3.TEXT.TEXT_" + i);
gns.add("W3.BLOB.BLOB_" + i);
}
long t = System.currentTimeMillis();
OPResultSet rs = conn.remove(OPConst.TABLE_POINT, gns.toArray(new String[gns.size()]));
System.out.println("delete database point use time:" + (System.currentTimeMillis() - t));
show(rs);
rs.close();
gns = new ArrayList<String>();
gns.add("W3.AX");
gns.add("W3.DX");
gns.add("W3.I2");
gns.add("W3.I4");
gns.add("W3.R8");
gns.add("W3.LONG");
gns.add("W3.TEXT");
gns.add("W3.BLOB");
t = System.currentTimeMillis();
rs = conn.remove(OPConst.TABLE_NODE, gns.toArray(new String[gns.size()]));
System.out.println("delete database node use time:" + (System.currentTimeMillis() - t));
show(rs);
rs.close();
conn.close();
}
}
这个示例是将添加的测点和节点删除
4.2.5 执行SQL execSQL
详细代码示例
package com.magus.jdbc;
import java.util.Date;
import com.magus.opio.net.IOPConnect;
import com.magus.opio.net.OPConnect;
public class ExampleSQL extends ExampleBase {
public static void main(String[] args) throws Exception {
IOPConnect conn = new OPConnect(ip, port, 180, user, password);
Date time = conn.getServerTime();
System.out.println("database now time:" + sdf.format(time));
String sql = "select ID,Gn,ED,RT,EU from Point where GN like 'W3.%' and RT =5";
long t = System.currentTimeMillis();
OPResultSet rs = conn.execSQL(sql);
show(rs);
rs.close();
System.out.println("sql database use time:" + (System.currentTimeMillis() - t));
conn.close();
}
}
这个是使用sql的方式执行数据操作,具体SQL示例可以参考其他文档
4.2.6 订阅实时
详细代码示例
package com.magus.subscribe;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.magus.jdbc.net.OPSubscribe;
import com.magus.jdbc.net.SubscribeResultSet;
public class RealtimeSubscribe implements SubscribeResultSet {
public static String className = "com.magus.jdbc.Driver";
public static String url = "jdbc:openplant://192.168.2.241:8400/RTDB";
public static String user = "sis";
public static String password = "openplant";
Map<Integer, String> values = new HashMap<Integer, String>();
static final double SKEWING = 0.0005;
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
public static void main(String[] args) throws ClassNotFoundException, SQLException {
OPSubscribe subscribe = null;
Class.forName(className);
Connection conn = DriverManager.getConnection(url, user, password);
if (conn.getAutoCommit()) {
conn.setAutoCommit(false);
}
try {
ArrayList<Integer> ids = new ArrayList<Integer>();
// for (int i = 0; i < 10; i++) {
ids.add(1025);
ids.add(1027);
// }
// ArrayList<Integer> ids = new ArrayList<Integer>();
// for (int i = 0; i < 10; i++) {
// ids.add(8574868);
// }
subscribe = new OPSubscribe(conn, "Realtime", ids, new RealtimeSubscribe());
conn.close();
// 一分钟后 添加订阅 1028,1029
Thread.sleep(1000 * 24 * 60);
ids.clear();
ids.add(1028);
ids.add(1029);
subscribe.subscription(ids);
// 一分钟后取消订阅 1028,1029
Thread.sleep(1000 * 24 * 60);
ids.clear();
ids.add(1028);
ids.add(1029);
subscribe.unsubscribe(ids);
Thread.sleep(3600 * 1000 * 24);
subscribe.close();
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
}
conn.close();
System.exit(0);
}
public void onResponse(ResultSet result) throws SQLException {
// ResultSetMetaData rsmd = resultSet.getMetaData();
int i = 0;
while (result.next()) {
i++;
int ID = result.getInt(1);
String GN = result.getString(2);
double TM = result.getDouble(3);
String DS = result.getString(4);
String AV = result.getString(5);
// if (values.containsKey(ID)) {
// System.out.println("before key:" + ID + "\t" + values.get(ID));
// values.put(ID, "GN:" + GN + "\tTM:" + TM + "\tDS:" + DS + "\tAV:"
// + AV);
// System.out.println("after key:" + ID + "\t" + values.get(ID));
// } else {
// values.put(ID, "GN:" + GN + "\tTM:" + TM + "\tDS:" + DS + "\tAV:"
// + AV);
System.out.println("ID:" + ID + "\tGN:" + GN + "\tTM:" + sdf.format(TM * 1000) + "\t" + (long) (TM * 1000) + "\tDS:" + DS + "\tAV:" + AV);
// }
}
// System.out.println("current number length:" + i + "\tcurrent time:" +
// System.currentTimeMillis());
}
}
4.2.7 订阅报警
详细代码示例
package com.magus.subscribe;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import com.magus.jdbc.net.OPSubscribe;
import com.magus.jdbc.net.SubscribeResultSet;
import com.magus.opio.dto.OPValue;
public class AlarmSubscribe implements SubscribeResultSet {
public static String className = "com.magus.jdbc.Driver";
// jdbc:产品系列://IP:端口/服务
// jdbc:产品系列://IP:端口/
public static String url = "jdbc:openplant://192.168.2.65:8300/RTDB";
public static String user = "sis";
public static String password = "openplant";
static final double SKEWING = 0.0005;
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName(className);
Connection conn = DriverManager.getConnection(url, user, password);
if (conn.getAutoCommit()) {
conn.setAutoCommit(false);
}
try {
ArrayList<Integer> ids = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
ids.add(1024 + i);
}
OPSubscribe subscribe = new OPSubscribe(conn, "Alarm", ids, new AlarmSubscribe());
Thread.sleep(1000 * 3600);
subscribe.close();
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
}
conn.close();
System.exit(0);
}
@Override
public void onResponse(ResultSet resultSet) throws SQLException {
System.out.println("onResponse");
ResultSetMetaData rsmd = resultSet.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(" Column Index " + i);
System.out.println("getColumnLabel \t" + rsmd.getColumnLabel(i));
System.out.println("getColumnType \t" + rsmd.getColumnType(i));
System.out.println("getColumnTypeName \t" + rsmd.getColumnTypeName(i));
System.out.println("getColumnClassName \t" + rsmd.getColumnClassName(i));
System.out.println("++++++++++=====++++++++++++++++++");
}
System.out.print("\n");
while (resultSet.next()) {
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
if (rsmd.getColumnType(i) == OPValue.TYPE_DATETIME) {
sb.append(sdf.format(resultSet.getDate(i)) + "\t");
} else if (rsmd.getColumnType(i) == OPValue.TYPE_BOOL) {
sb.append(resultSet.getBoolean(i) + "\t");
} else {
sb.append(resultSet.getString(i) + "\t");
}
}
System.out.println(sb.toString());
}
}
}
4.2.8 订阅静态信息
详细代码示例
package com.magus.subscribe;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import com.magus.jdbc.net.OPSubscribe;
import com.magus.jdbc.net.SubscribeResultSet;
import com.magus.opio.dto.OPValue;
public class PointSubscribe implements SubscribeResultSet {
public static String className = "com.magus.jdbc.Driver";
// jdbc:浜у搧绯诲垪://IP:绔彛/鏈嶅姟
// jdbc:浜у搧绯诲垪://IP:绔彛/
public static String url = "jdbc:openplant://192.168.2.65:8300/RTDB";
public static String user = "sis";
public static String password = "openplant";
static final double SKEWING = 0.0005;
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName(className);
Connection conn = DriverManager.getConnection(url, user, password);
if (conn.getAutoCommit()) {
conn.setAutoCommit(false);
}
try {
ArrayList<Integer> ids = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
ids.add(1024 + i);
}
OPSubscribe subscribe = new OPSubscribe(conn, "Point", ids, new PointSubscribe());
Thread.sleep(1000 * 600);
subscribe.close();
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
}
conn.close();
System.exit(0);
}
@Override
public void onResponse(ResultSet resultSet) throws SQLException {
System.out.println("onResponse");
ResultSetMetaData rsmd = resultSet.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(" Column Index " + i);
System.out.println("getColumnLabel \t" + rsmd.getColumnLabel(i));
System.out.println("getColumnType \t" + rsmd.getColumnType(i));
System.out.println("getColumnTypeName \t" + rsmd.getColumnTypeName(i));
System.out.println("getColumnClassName \t" + rsmd.getColumnClassName(i));
System.out.println("++++++++++=====++++++++++++++++++");
}
System.out.print("\n");
while (resultSet.next()) {
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
if (rsmd.getColumnType(i) == OPValue.TYPE_DATETIME) {
sb.append(sdf.format(resultSet.getDate(i)) + "\t");
} else if (rsmd.getColumnType(i) == OPValue.TYPE_BOOL) {
sb.append(resultSet.getBoolean(i) + "\t");
} else {
sb.append(resultSet.getString(i) + "\t");
}
}
System.out.println(sb.toString());
}
}
}
5、老协议接口说明(适配openPlantV3.0/V4.0)
老协议接口
1.建立连接new OPConnect(String ip,int port, int timeout, String user,String pwd)
全类名:com.magus.net.OPConnect
函数示例:new OPConnect(String ip,int port, int timeout, String user,String pwd)
ip :数据库服务器的ip
port:数据库服务的端口
timeout:请求超时时间,单位:毫秒
user和pwd分别:数据库用户名和密码
2.获取服务系统时间戳OPConnect.getServerTime()
函数示例:OPConnect.getServerTime()
返回值:long类型
3.获取数据库metadata,OPConnect. getDataBaseMetaData()
函数示例:OPConnect. getDataBaseMetaData()
返回值类型:com.magus.net.scheme.OPDataBaseMetaData
4.批量获取测点静态信息OPConnect.getPointStaticInfos()
函数示例1:OPConnect.getPointStaticInfos(String[] names)
函数示例2:OPConnect.getPointStaticInfos(int[] ids)
返回值类型:OPStaticInfo[]
names :需要查询的测点名的数组
ids:需要查询的测点ID的数组
获取单个测点静态信息OPConnect.getPointStaticInfo()
函数示例1:OPConnect.getPointStaticInfo(String name)
函数示例2:OPConnect.getPointStaticInfo(int id)
返回值类型:com.magus.net.OPStaticInfo
name:需要查询的测点名
id:需要查询的测点的ID
5.批量更新测点静态信息OPConnect.updatePointStaticInfos()
函数示例:OPConnect.updatePointStaticInfos(OPStaticInfo[] infos)
返回值类型:OPStaticInfo[]
infos :需要更新的静态信息数组
6.更新单个测点静态信息OPConnect.updatePointStaticInfo()
函数示例:OPConnect.updatePointStaticInfo(OPStaticInfo info)
返回值类型:com.magus.net.OPStaticInfo
Info:需要更新的静态记录
7.批量写实时OPConnect.insertPointDynamicData()
函数示例1:OPConnect.insertPointDynamicData(String[] globalNames, OPDynamicData[] data)
函数示例2:OPConnect.insertPointDynamicData(int[] ids, OPDynamicData[] data)
返回值类型:int型,是错误码,0表示成功,具体详见数据库api错误码解析
globalNames:测点名的数组
data:实时数据的数组
ids:测点ID的数组
PS.两个参数是按照数组序号一一对应的
8.单个点写实时OPConnect.insertPointDynamicData()
函数示例:OPConnect.insertPointDynamicData(int id, OPDynamicData data)
返回值类型:int类型,是错误码
id :测点的ID
data:需要写入的实时数据
9.更新单个点实时OPConnect.updatePointDynamicData ()
函数示例:OPConnect.updatePointDynamicData (int id, OPDynamicData data)
返回值类型:int类型,是错误码
id :测点的ID
data:需要写入的实时数据
10.批量插入节点OPConnect.insertNodes()
函数示例:OPConnect.insertNodes(OPNode[] nodes)
返回值:OPNode[]
nodes:需要插入的节点的信息的数组
11.插入单个节点OPConnect.insertNode(OPNode node)
函数示例:OPConnect.insertNode(OPNode node)
返回值:com.magus.net.OPNode
node :需要插入的节点的信息
12.批量插入测点OPConnect.insertPointStaticInfos()
函数示例:OPConnect.insertPointStaticInfos(OPStaticInfo[] infos)
返回值类型:OPStaticInfo[]
infos :需要插入的测点的静态信息的数组
13.插入单个测点OPConnect.insertPointStaticInfo()
函数示例:OPConnect.insertPointStaticInfo(OPStaticInfo info)
返回值类型:com.magus.net.OPStaticInfo
info :需要插入的测点的信息
14.创建一个测点对象OPConnect.createStaticInfo()
函数示例:OPConnect.createStaticInfo(int parentID, String name, String type)
返回值类型:com.magus.net.OPStaticInfo
parentID:该测点需要添加到的节点的ID
name :这个测点的点名PN
type是这个静态信息的类型,可填参数:
“AX”:表示是一个模拟量
“DX”:表示是一个开关量
“I2”:表示是一个短整型
“I4”:表示是一个长整型
“R8”:表示是一个浮点数
15.创建节点对象OPConnect.createNode()
函数示例:OPConnect.createNode(int parentID, String name)
返回值类型:com.magus.net.OPNode
parentID:数据库的ID
name :节点名PN
16.创建实时数据对象OPConnect.createDynamicData()
函数示例:OPConnect.createDynamicData(String type)
返回值类型:com.magus.net.OPDynamicData
type:测点的类型,可选参数:
“AX”:表示是一个模拟量
“DX”:表示是一个开关量
“I2”:表示是一个短整型
“I4”:表示是一个长整型
“R8”:表示是一个浮点数
17.创建历史数据对象OPConnect.createHisData()
函数示例:OPConnect.createHisData(String type)
返回值类型:com.magus.net.OPHisData
type:测点的类型,可选参数:
“AX”:表示是一个模拟量
“DX”:表示是一个开关量
“I2”:表示是一个短整型
“I4”:表示是一个长整型
“R8”:表示是一个浮点数
18.删除测点OPConnect.deletePointStaticInfos()
函数示例:OPConnect.deletePointStaticInfos(String[] pointNames)
返回值类型:int[],是数据库错误码,0表示成功
pointNames :测点点名的数组
19.删除单个测点OPConnect.deletePointStaticInfo()
函数示例:OPConnect.deletePointStaticInfo(String pointName)
返回值类型:int,是数据库错误码,0表示成功
pointName:测点点名
20.获取单个测点实时数据OPConnect.getPointDynamicData()
函数示例:OPConnect.getPointDynamicData(String pointName)
返回值类型:com.magus.net.OPDynamicData
pointName:测点名
21.批量获取测点实时数据OPConnect.getPointDynamicDatas()
函数示例:OPConnect.getPointDynamicDatas(String[] pointNames)
返回值类型:Map<String, OPDynamicData>
pointNames :测点名的数组
22.批量获取测点实时数据OPConnect.getPointDynamicDatas2()
函数示例:OPConnect.getPointDynamicDatas2(String[] pointNames)
返回值类型:OPDynamicData[]
pointNames:测点名的数组
23.批量获取测点实时数据OPConnect.getPointDynamicDatasByIds()
函数示例:OPConnect.getPointDynamicDatasByIds(int[] pointIDs)
返回值类型:OPDynamicData[]
pointIds:测点ID的数组
24.查询历史数据按时间范围OPConnect.getPointHistorys()
函数示例1:OPConnect.getPointHistorys(String[] pointNames, Date from, Date to, int hisTypes, int interval)
函数示例2:OPConnect.getPointHistorys(int[] ids, Date from, Date to, int hisTypes, int interval)
返回值类型:Map<String, OPHisData[]>
Ids:测点id的数组
pointNames:点名的数组
from:开始时间
to:结束时间
hisTypes:读取历史的模式,可选参数:
OPNetConst.HISTORY_DATA_SAMPLE:历史原始值,interval需要设置:1
OPNetConst.HISTORY_DATA_SPAN:等间距取历史,时间间隔interval控制
OPNetConst.HISTORY_DATA_PLOT:绘图值取历史,会保留整体趋势及峰谷
OPNetConst.STAT_DATA_FLOW:流量统计值
OPNetConst.STAT_DATA_MAX:最大值
OPNetConst.STAT_DATA_MIN:最小值
OPNetConst.STAT_DATA_AVG:面积平均值
OPNetConst.STAT_DATA_CAVG:算数平均值
interval:取值时间点间隔,单位是秒
25.查询历史数据按时间范围OPConnect.getPointHistorys()
函数示例1:OPConnect.getPointHistorys(String[] pointNames, Date[] from, Date[] to, int hisTypes, int interval)
函数示例2:OPConnect.getPointHistorys(int[] ids, Date[] from, Date[] to, int hisTypes, int interval)
返回值类型:Map<String, OPHisData[]>
ids :测点ID的数组
pointNames:点名的数组
from:开始时间的数组,按照下标对应ids或者pointNames数组里的点名
to:结束时间的数组,按照下标对应ids或者pointNmaes数组里面的点名
hisTypes:读取历史的模式,可选参数同2.25:
interval:取值时间点间隔,单位是秒
26.查询某个时间点历史数据OPConnect.getPointHistorys()
函数示例1:OPConnect.getPointHistorys(String[] pointNames, Date time)
函数示例2:OPConnect.getPointHistorys(int[] ids, Date time)
返回值类型:Map<String, OPHisData>
pointNames:点名的数组
ids:测点ID的数组
time:需要查询的时间点
27.查询单个测点历史数据按时间范围OPConnect.getPointHistory()
函数示例1:OPConnect.getPointHistory(String pointName, Date from, Date to, int hisType, int interval)
函数示例2:OPConnect.getPointHistory(int id, Date from, Date to, int hisType, int interval)
返回值类型:OPHisData[]
pointName:测点名
id:测点ID
from:开始时间
to:结束时间
hisType:读取历史的模式,可选参数同2.25
interval:趋势的时间间隔
28.查询单个测点某个时刻的历史值OPConnect.getPointHistoryValue()
函数示例1:OPConnect.getPointHistoryValue(String pointName, Date time)
函数示例2:OPConnect.getPointHistoryValue(int id, Date time)
返回值类型:OPHisData
id:测点ID
pointName:测点名
time:查询的时刻
29.查询测点某个时间范围内统计数据OPConnect.getPointStats()
函数示例1:OPConnect.getPointStats(String[] pointNames, Date from, Date to, int hisTypes, int interval)
函数示例2:OPConnect.getPointStats(int[] ids, Date from, Date to, int hisTypes, int interval)
返回值类型:Map<String, OPStatData[]>
pointNames:点名的数组
ids:测点ID的数组
from:开始时间
to:结束时间
hisTypes:统计的方式,可选参数::
OPNetConst.STAT_DATA_FLOW:流量统计值
OPNetConst.STAT_DATA_MAX:最大值
OPNetConst.STAT_DATA_MIN:最小值
OPNetConst.STAT_DATA_AVG:面积平均值
OPNetConst.STAT_DATA_CAVG:算数平均值
interval:分段统计的事件间隔
30.查询单个测点某个时间范围内统计数据OPConnect.getPointStat()
函数示例1:OPConnect.getPointStat(String pointName, Date from, Date to, int hisTypes, int interval)
函数示例2:OPConnect.getPointStats(int id, Date from, Date to, int hisTypes, int interval)
pointNams:点名
id:测点ID
from:开始时间
to:结束时间
hisTypes:统计的方式,可选参数同2.30
interval:分段统计的事件间隔
31.查询测点某个时间范围内统计数据OPConnect.getPointStats()
函数示例1:OPConnect.getPointStats(String[] pointNames, Date from, Date to, int hisTypes)
函数示例2:OPConnect.getPointStats(int[] ids, Date from, Date to, int hisTypes)
返回值类型:Map<String, OPStatData[]>
ids:测点ID的数组
pointNames:点名的数组
from:开始时间
to:结束时间
hisTypes同2.30
32.查询单个测点某个时间范围内统计数据OPConnect.getPointStat()
函数示例1:OPConnect.getPointStat(String pointName, Date from, Date to, int hisTypes)
函数示例2:OPConnect.getPointStat(int id, Date from, Date to, int hisTypes)
返回值类型:OPStatData[]
pointName:测点名
id:测点ID
from:开始时间
to:结束时间
hisTypes同2.30
33.插入历史数据OPConnect.insertPointHistorys()
函数示例:OPConnect.insertPointHistorys(Map<String, OPHisData[]> pointHistorys)
返回值类型:int[],是错误码,:0表示成功,具体查看数据库返回码
pointHistorys:点名和历史数据的键值对
34. 插入历史数据OPConnect.insertPointHistorys()
函数示例:OPConnect.insertPointHistorys(Map<String, OPHisData[]> pointHistorys, boolean cache)
返回值类型:int[],是错误码,0表示成功
pointHistorys:点名和历史数据的键值对
cache表示是否缓存
35.通过ID插入历史数据OPConnect.insertPointHistorysByID()
函数示例:OPConnect.insertPointHistorysByID(Map<Integer, OPHisData[]> pointHistorys)
返回值类型:int[],是错误码,0表示成功
pointHistorys:测点ID和历史数据的键值对
36.通过ID插入历史数据OPConnect.insertPointHistorysByID()
函数示例:OPConnect.insertPointHistorysByID(Map<Integer, OPHisData[]> pointHistorys, boolean cache)
返回值类型:int[],是错误码,0表示成功
pointHistorys:测点ID和历史数据的键值对
cache表示是否缓存
37.更新历史数据OPConnect.updatePointHistorys()
函数示例:OPConnect.updatePointHistorys(Map<String, OPHisData[]> map)
返回值类型:int[],是错误码,0表示成功
pointHistorys:测点名和历史数据的键值对
38.更新单个测点历史数据OPConnect.updatePointHistory()
函数示例:OPConnect.updatePointHistory(String name, OPHisData[] datas)
返回值类型:int,是错误码,0表示成功
name:测点点名
datas:历史数据
39.删除历史数据OPConnect.deletePointHistorys()
函数示例:OPConnect.deletePointHistorys(OPHisDeleteDelegate[] hiss)
返回值类型:int[],是错误码,0表示成功
hiss表示需要删除的历史数据的数组
40.删除历史的单次历史数据OPConnect.deletePointHistorys()
函数示例:OPConnect.deletePointHistorys(OPHisDeleteDelegate his)
返回值类型:int,是错误码,0表示成功
his:需要删除的历史数据
41.获取数据库对象OPConnect.getDBs()
函数示例:OPConnect.getDBs()
返回值类型:OPDB[]
42.获取数据库节点OPConnect.getAllNodesByDBName()
函数示例:OPConnect.getAllNodesByDBName(String dbName)
返回值:OPNode[]
dbName:数据库的库名
43.获取数据库节点OPConnect.getNodeByNodeName()
函数示例:OPConnect.getNodeByNodeName(String nodeName)
返回值类型:OPNode
nodeName:节点名
44.获取某个节点所有测点静态信息OPConnect.getAllPointStaticInfosByNodeName()
函数示例:OPConnect.getAllPointStaticInfosByNodeName(String nodeName)
返回值类型:OPStaticInfo[]
nodeName:节点名
45.获取某个节点下测点的ID和点名的MAP,OPConnect.getPointNamesMap()
函数示例:OPConnect.getPointNamesMap(String nodeName)
返回值类型:Map<Integer, String>
nodeName:节点的名字
46.获取某个节点下测点的点名和ID的MAP ,OPConnect.getPointIdsMap()
函数示例:OPConnect.getPointIdsMap(String nodeName)
返回值类型:Map<String, Integer>
nodeName:节点的名字
47.查询数据库报警信息OPConnect. requestAlrmRecord()
函数示例:OPConnect. requestAlrmRecord(Date beginTime, Date endTime, boolean real)
返回值类型:List<AlarmData>
beginTime:开始时间
endTime:结束时间
real表示是否是实时,当real是true的时候,开始时间和结束时间传null
48.查询某个节点下的报警信息OPConnect.requestAlrmRecord()
函数示例:OPConnect.requestAlrmRecord(int nodeID, Date beginTime, Date endTime, boolean real)
返回值类型:List<AlarmData>
nodeID:节点的ID
beginTime:开始时间
endTime:结束时间
real:是否是实时,当real是true的时候,开始时间和结束时间传null
49.查询某个节点下的报警信息OPConnect.requestAlrmRecord()
函数示例:OPConnect.requestAlrmRecord(String nodeName, Date beginTime, Date endTime, boolean real)
返回值类型:List<AlarmData>
nodeName:节点的名字
beginTime:开始时间
endTime:结束时间
real:是否是实时,当real是true的时候,开始时间和结束时间传null
50.更新测点的报警信息OPConnect.updatePointAlarm()
函数示例:OPConnect.updatePointAlarm(String[] globalNames, OPDynamicData[] data)
返回值类型:int[],是错误码,0表示成功
globalNames:测点的全点名的数组
data:需要更新的动态信息的数组,和点名数组按下标一一对应
51.更新测点的报警信息OPConnect.updatePointAlarm()
函数示例:OPConnect.updatePointAlarm(int[] ids, OPDynamicData[] data)
返回值类型:int[],代表错误码,0表示成功
ids:测点ID的数组
data:需要更新的动态数据的数组,和ID数组按下标一一对应
6. 老协议接口代码示例
6.1 基础类
基础类
package com.magus.net.eg;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
/**
* @since 2011-8-23
* @author (liwei.tang@magustek.com) 这些常量供所有示例使用,请根据需要修改连接信息、点名等
*/
public class _Example {
// 示例连接服务器的IP
public static final String IP = "192.168.2.94";
// 示例连接服务器的端口号
public static final int PORT = 8200;
// //示例连接服务器的用户名
public static final String USER_NAME = "sis";
// 示例连接服务器的密码
public static final String PASSWORD = "openplant";
// 示例数据库的ID
public static final int DB_ID = 0;
// 示例连接的数据库名
public static final String DB_NAME = "W3";
// 示例连接的节点ID
public static final int NODE_TEST_ID = 1;
// 示例连接的节点名
public static final String NODE_TEST_NAME = "TEST";
// 示例使用的AX测点名
public static final String POINT_AX_NAME = "AX";
// 示例使用的DX测点名
public static final String POINT_DX_NAME = "DX";
// 示例使用的I2测点名
public static final String POINT_I2_NAME = "I2";
// 示例使用的I4测点名
public static final String POINT_I4_NAME = "I4";
// 示例使用的R8测点名
public static final String POINT_R8_NAME = "R8";
// 示例使用的计算点测点名
public static final String POINT_CALC_NAME = "CALC";
// 节点全局名
public static final String NODE_GLOBAL_NAME = DB_NAME + "." + NODE_TEST_NAME;
// AX测点全局名
public static final String POINT_AX_GLOBAL_NAME = NODE_GLOBAL_NAME + "." + POINT_AX_NAME;
// DX测点全局名
public static final String POINT_DX_GLOBAL_NAME = NODE_GLOBAL_NAME + "." + POINT_DX_NAME;
// 示例使用的AX测点ID
public static final int POINT_AX_ID = 1025;
// 示例使用的DX测点ID
public static final int POINT_DX_ID = 1026;
// 示例使用的I2测点ID
public static final int POINT_I2_ID = 1027;
// 示例使用的I4测点ID
public static final int POINT_I4_ID = 1028;
// 示例使用的R8测点ID
public static final int POINT_R8_ID = 1029;
// 示例使用的计算点ID
public static final int POINT_CALC_ID = 1030;
public static Date FROM, TO;
// static {
// try {
// // 历史数据的起始结束时间
// FROM = DateFormat.getDateTimeInstance().parse("2019-10-28 18:00:00");
// TO = DateFormat.getDateTimeInstance().parse("2019-10-28 19:00:00");
// } catch (ParseException e) {
// e.printStackTrace();
// }
// }
}
6.2建立连接
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.exception.io.UsersException;
/**
* @since 2011-8-24
* @author (liwei.tang@magustek.com) 建立数据库连接
* 注意:使用示例请先检查_Example.java中的连接信息,IP、端口、用户名、密码。
*/
public class A01_Connect extends _Example {
public static void main(String[] args) throws IOException, UsersException {
// 建立与openPlant的连接
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
System.out.println("connect success!");
// 关闭连接
conn.close();
}
}
6.3获取系统时间
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.util.Date;
import com.magus.net.OPConnect;
import com.magus.net.exception.io.UsersException;
/**
* @since 2011-8-24
* @author (liwei.tang@magustek.com) 获取服务器时间 注意:其它的示例中为了代码简单易懂,简化了连接的异常处理部分。
* 请确保处理了OPException并且关闭连接的代码应写在final块中。
* 正确写法请参考请参考本示例的try、catch、finally的结构。
* 如果没有在finally块中关闭连接,可能导致由于在catch块中退出而没有关闭连接,导致连接泄露,最终服务端连接用尽的问题。
*/
public class A02_GetServerTime extends _Example {
public static void main(String[] args) {
OPConnect conn = null;
try {
// 建立连接
conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 取数据
long serverTime = conn.getServerTime();
Date ServerDate = new Date(serverTime);
System.out.println(ServerDate);
} catch (UsersException e) {
// 用户异常
e.printStackTrace();
} catch (IOException e) {
// 网络异常
e.printStackTrace();
} finally {
// 重要:在finally块中关闭连接,其它示例是简化的写法,这里是安全的写法。
// 否则连接可能在异常时被泄露最终导致服务端连接用尽。
try {
if (conn != null) {
conn.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
6.4获取scheme
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.util.Map;
import com.magus.net.OPConnect;
import com.magus.net.common.Version;
import com.magus.net.exception.io.UsersException;
import com.magus.net.scheme.OPDataBaseMetaData;
import com.magus.net.scheme.OPScheme;
import com.magus.net.scheme.OPSchemeField;
import com.magus.net.scheme.OPSchemeNodeTemplate;
/**
* @author liwei.tang@magustek.com
* @since 2015年4月20日 获得元数据
*/
public class A03_GetScheme extends _Example{
public static void main(String[] args) throws UsersException, IOException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
OPDataBaseMetaData metadata=conn.getDataBaseMetaData();
//获得数据库版本
Version version=metadata.getCommProtocolVersion();
System.out.println("Version: "+version);
//获得数据库默认字符编码
String encoding=metadata.getEncoding();
System.out.println("Encoding: "+encoding);
//遍历Scheme
OPScheme scheme=metadata.getDbScheme();
Map<Integer, OPSchemeNodeTemplate> id2SchemeMap=scheme.getStaticFieldTempMap();
for(Map.Entry<Integer, OPSchemeNodeTemplate> entry:id2SchemeMap.entrySet()){
OPSchemeNodeTemplate nodeTempalte=entry.getValue();
//输出静态类型名
System.out.println(nodeTempalte.getName()+"(ID="+nodeTempalte.getId()+")");
for(Map.Entry<String, OPSchemeField> template:nodeTempalte.getFieldMap().entrySet()){
//输出结构
System.out.println("\t"+template.getValue());
}
}
conn.close();
}
}
6.5查询节点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.OPNode;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 根据节点名访问节点
*/
public class B02_NodeByName extends _Example {
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 根据节点全局名获得节点对象
OPNode node = conn.getNodeByNodeName(DB_NAME + "." + NODE_TEST_NAME);
System.out.println("Access node by global name:" + node);
conn.close();
}
}
6.6插入节点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.OPNode;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 插入节点
*/
public class B01_NodeInsert extends _Example {
public static void main(String[] args) throws NetException, IOException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 创建节点
OPNode node = conn.createNode(DB_ID, NODE_TEST_NAME);
// 设定属性
node.putValue("ID", NODE_TEST_ID);
// 执行插入
conn.insertNode(node);
System.out.println("finish...");
conn.close();
}
}
6.7更新节点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.OPNode;
import com.magus.net.OPStaticInfo;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author (liwei.tang@magustek.com) 更新节点
*/
public class B03_NodeUpdate extends _Example {
/**
* @param args
* @throws IOException
* @throws NetException
*/
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 根据节点全局名获得节点对象
OPNode node = conn.getNodeByNodeName(DB_NAME + "." + NODE_TEST_NAME);
// 设定属性
node.putValue("ED", "this is a test node...");
// 更新节点
OPStaticInfo info = OPNode.translate(node);
info = conn.updatePointStaticInfo(info);
System.out.println("Update node:" + info);
conn.close();
}
}
6.8删除节点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 删除节点
*/
public class B04_NodeDelete extends _Example {
/**
* @param args
* @throws IOException
* @throws NetException
*/
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
String nodeName = DB_NAME + "." + NODE_TEST_NAME;
int result = conn.deletePointStaticInfo(nodeName);
System.out.println("delete node by name '" + nodeName + "' result: " + result + ".");
conn.close();
}
}
6.9获取节点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.OPNode;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 列举节点
*/
public class B05_NodeList extends _Example {
/**
* @param args
* @throws IOException
* @throws NetException
*/
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 根据数据库全局名查询
OPNode[] nodes = conn.getAllNodesByDBName(DB_NAME);
// 单数据库情况下也可以按如下方式查询默认数据库下的节点
// OPNode[] nodes = conn.getAllNodesByDBName(null);
// 输出查询结果
for (OPNode node : nodes) {
System.out.println(node);
}
conn.close();
}
}
6.10添加测点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.OPStaticInfo;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 插入测点
*/
public class C01_PointInsert extends _Example {
/**
* @param args
* @throws IOException
* @throws NetException
*/
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 创建测点对象
OPStaticInfo ax = conn.createStaticInfo(NODE_TEST_ID, POINT_AX_NAME, "AX");
OPStaticInfo dx = conn.createStaticInfo(NODE_TEST_ID, POINT_DX_NAME, "DX");
// 设定属性
ax.putValue("ID", POINT_AX_ID);
dx.putValue("ID", POINT_DX_ID);
// 构建静态信息数组
OPStaticInfo[] infos = new OPStaticInfo[] { ax, dx };
// 对静态信息数据执行插入
infos = conn.insertPointStaticInfos(infos);
// 输出插入结果
for (OPStaticInfo info : infos) {
if (info != null) {
System.out.println(info);
}
}
conn.close();
}
}
6.11更新测点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.util.Map;
import com.magus.net.OPConnect;
import com.magus.net.OPStaticInfo;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 更新数据
*/
public class C02_PointUpdate extends _Example {
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 构建点名数组
String[] pointNames = new String[] { POINT_AX_GLOBAL_NAME, POINT_DX_GLOBAL_NAME };
// 根据点名查询
Map<String, OPStaticInfo> result = conn.getPointStaticInfos(pointNames);
// 输出更新前的测点静态信息
System.out.println("-------更新前的数据-------");
System.out.println(result.get(POINT_AX_GLOBAL_NAME));
System.out.println(result.get(POINT_DX_GLOBAL_NAME));
// 设定属性
OPStaticInfo ax = result.get(POINT_AX_GLOBAL_NAME);
ax.putValue("ED", "ax point");
OPStaticInfo dx = result.get(POINT_DX_GLOBAL_NAME);
dx.putValue("ED", "dx point");
// 更新测点
OPStaticInfo[] infos = new OPStaticInfo[] { ax, dx };
infos = conn.updatePointStaticInfos(infos);
// 输出更新后的测点静态信息
System.out.println("-------更新后的数据-------");
for (OPStaticInfo info : infos) {
System.out.println(info);
}
conn.close();
}
}
6.12删除测点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 删除测点
*/
public class C03_PointDelete extends _Example {
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 构建点名数组
String[] pointNames = new String[] { POINT_AX_GLOBAL_NAME, POINT_DX_GLOBAL_NAME };
// 执行静态信息删除
int[] results = conn.deletePointStaticInfos(pointNames);
// 输出删除结果
for (int i = 0; i < pointNames.length; i++) {
String pointName = pointNames[i];
int result = results[i];
System.out.println("delete '" + pointName + "' result:" + result);
}
conn.close();
}
}
6.13通过节点获取测点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.OPStaticInfo;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author liwei.tang@magustek.com 列举节点下的测点
*/
public class C04_PointListByNode extends _Example {
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 根据节点全局名获得测点
OPStaticInfo[] infos = conn.getAllPointStaticInfosByNodeName(DB_NAME + "." + NODE_TEST_NAME);
// 输出测点信息
if (infos != null && infos.length != 0) {
for (OPStaticInfo info : infos) {
System.out.println(info);
}
} else {
System.out.println("该节点下无测点信息!");
}
conn.close();
}
}
6.14通过点名或ID获取测点
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.util.Map;
import com.magus.net.OPConnect;
import com.magus.net.OPStaticInfo;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author (liwei.tang@magustek.com) 根据ID或者全局名访问测点
*/
public class C05_PointByNameOrID extends _Example {
public static void main(String[] args) throws IOException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 根据ID获得测点静态信息
System.out.println("--------By ID----------");
// 构建参数
int[] pointIDs = new int[] { POINT_AX_ID, POINT_DX_ID };
// 取数据
Map<Integer, OPStaticInfo> resultByID = conn.getPointStaticInfos(pointIDs);
// 输出获得的测点静态信息
for (Integer id : resultByID.keySet()) {
OPStaticInfo info = resultByID.get(id);
System.out.println(info);
}
// 根据点名获得测点静态信息
System.out.println("--------By NAME----------");
// 构建参数
String[] pointNames = new String[] { POINT_AX_GLOBAL_NAME, POINT_DX_GLOBAL_NAME };
// 取数据
Map<String, OPStaticInfo> resultByName = conn.getPointStaticInfos(pointNames);
// 输出获得的测点静态信息
for (String globalName : resultByName.keySet()) {
OPStaticInfo info = resultByName.get(globalName);
System.out.println(info);
}
System.out.println("finish...!");
conn.close();
}
}
6.15读实时
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import java.util.Map;
import com.magus.net.OPConnect;
import com.magus.net.OPDynamicData;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author (liwei.tang@magustek.com) 读取实时数据
*/
public class D01_DynamicRead extends _Example {
public static void main(String[] args) throws IOException, NetException, InterruptedException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
String[] pointNames = new String[] { POINT_AX_GLOBAL_NAME, POINT_DX_GLOBAL_NAME };
// 循环10次,每秒一次获取实时数据
for (int i = 0; i < 10; i++) {
// 取实时
Map<String, OPDynamicData> result = conn.getPointDynamicDatas(pointNames);
// 输出获取到的数据
DateFormat df = DateFormat.getDateTimeInstance();
String time = df.format(new Date());
System.out.println("--------" + time + "--------");
for (String globalName : result.keySet()) {
OPDynamicData dynData = result.get(globalName);
System.out.println(globalName + "\t" + dynData);
}
Thread.sleep(1000);
}
System.out.println("operate success!");
conn.close();
}
}
6.16写实时
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import com.magus.net.OPConnect;
import com.magus.net.OPDynamicData;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author (liwei.tang@magustek.com) 写实时数据 注意:返回0表示写入成功,返回1可能是写入的实时数据比现有最新实时数据要旧
*/
public class D02_DynamicWrite extends _Example {
public static void main(String[] args) throws IOException, NetException {
final OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 构建AX测点的实时数据对象
OPDynamicData dyn = conn.createDynamicData("AX");
double a = 100;
double b = 0;
// 循环模拟数据
while (true) {
// 获取实时数据库时间
long serverTime = conn.getServerTime();
// 产生类似正弦曲线的数据
try {
if (b > 180) {
b = 0;
}
String v = String.valueOf(a * Math.sin(b / 180 * Math.PI));
// 设定值和时间的属性
dyn.putValue("AV", v);
dyn.putValue("TM", serverTime - 10 * 60 * 1000);
// 输出要写入的实时数据
System.out.println("Write: " + dyn + "\t" + serverTime);
// 执行写入
// int result =
// conn.insertPointDynamicData(POINT_AX_GLOBAL_NAME, dyn);
String[] pointNames = new String[] { "W3.T.XXX" };
OPDynamicData[] datas = new OPDynamicData[] { dyn };
int[] result = conn.insertPointDynamicData(pointNames, datas);
// 输出执行返回码
System.out.println("Write real time data return " + result[0] + ".");
b++;
// 等待一秒
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
6.17写历史
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;
import com.magus.net.OPConnect;
import com.magus.net.OPHisData;
import com.magus.net.OPNetConst;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-24
* @author (liwei.tang@magustek.com) 写历史
*/
public class E01_HistoryWrite extends _Example {
public static void main(String[] args) throws IOException, ParseException, NetException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 间隔时间,单位(毫秒)
long step = 1000;
OPHisData[] hiss = new OPHisData[(int) ((TO.getTime() - FROM.getTime()) / step)];
// 构建历史数据
int idx = 0;
for (long i = FROM.getTime(); i < TO.getTime(); i += step) {
OPHisData hisData = conn.createHisData("AX");
hisData.putValue("TM", i);
hisData.putValue("AV", (float) (i / 1000L % 100));
hiss[idx++] = hisData;
}
// 写入数据
Map<String, OPHisData[]> hissMap = new HashMap<String, OPHisData[]>();
hissMap.put(POINT_AX_GLOBAL_NAME, hiss);
int[] results = conn.insertPointHistorys(hissMap);
System.out.println("write history return " + results[0]);
// 读取已写入的数据
OPHisData[] hissResult = conn.getPointHistory(POINT_AX_GLOBAL_NAME, FROM, TO, OPNetConst.HISTORY_DATA_SPAN, 1);
for (OPHisData his : hissResult) {
System.out.println(his);
}
System.out.println("finish...");
conn.close();
}
}
6.18读历史
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import com.magus.net.OPConnect;
import com.magus.net.OPHisData;
import com.magus.net.OPNetConst;
import com.magus.net.exception.NetException;
/**
* @since 2011-9-15
* @author (liwei.tang@magustek.com) 读历史
*/
public class E02_HistoryRead extends _Example {
public static void main(String[] args) throws IOException, NetException, ParseException {
OPConnect conn = new OPConnect("192.168.2.41", PORT, 6000, USER_NAME, PASSWORD);
// String[] pointNames = new String[] { POINT_AX_GLOBAL_NAME };
//
// // 获取历史数据
// Map<String, OPHisData[]> pn2HisMap =
// conn.getPointHistorys(pointNames, FROM, TO,
// OPNetConst.HISTORY_DATA_SPAN, 1);
//
// // 输出获取到的数据
// for (Map.Entry<String, OPHisData[]> entry : pn2HisMap.entrySet()) {
// String pn = entry.getKey();
// OPHisData[] hiss = entry.getValue();
// System.out.println(pn);
// for (OPHisData his : hiss) {
// System.out.println("\t" + his);
// }
// }
// 获取历史数据
FROM = DateFormat.getDateTimeInstance().parse("2019-10-28 18:00:00");
TO = DateFormat.getDateTimeInstance().parse("2019-10-28 19:00:00");
OPHisData[] hisData = conn.getPointHistory(POINT_AX_GLOBAL_NAME, FROM, TO, OPNetConst.HISTORY_DATA_SAMPLE, 1);
// 输出获取到的数据
for (OPHisData his : hisData) {
System.out.println("\t" + his);
}
System.out.println("finish...");
conn.close();
}
}
6.19历史统计
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.text.ParseException;
import java.util.Map;
import com.magus.net.OPConnect;
import com.magus.net.OPNetConst;
import com.magus.net.OPStatData;
import com.magus.net.exception.io.UsersException;
/**
* @author liwei.tang@magustek.com
* @since 2015年4月17日 取统计
*/
public class E03_HistoryStat extends _Example {
public static void main(String[] args) throws UsersException, IOException, ParseException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
String[] pointNames = new String[] { POINT_AX_GLOBAL_NAME };
// 可用的统计类型:STAT_DATA_AVG, STAT_DATA_MIN, STAT_DATA_MAX, STAT_DATA_FLOW
// 执行统计
Map<String, OPStatData[]> pn2StatMap = conn.getPointStats(pointNames, FROM, TO, OPNetConst.STAT_DATA_AVG, 5);
// 输出获取到的数据
for (Map.Entry<String, OPStatData[]> entry : pn2StatMap.entrySet()) {
String pn = entry.getKey();
OPStatData[] hiss = entry.getValue();
// 输出点名
System.out.println(pn);
// 输出数据
for (OPStatData his : hiss) {
System.out.println("\t" + his);
}
}
System.out.println("finish...");
conn.close();
}
}
6.20历史统计
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.util.Map;
import com.magus.net.OPConnect;
import com.magus.net.OPNetConst;
import com.magus.net.OPStatData;
import com.magus.net.OPSumStatData;
import com.magus.net.exception.io.UsersException;
/**
* @author liwei.tang@magustek.com
* @since 2015年4月17日 取统计所有类型 注意:
* OPSumStatData.getMaxTime()和OPSumStatData.getMinTime
* ()是从服务端获得的最大最小值的时间点,但最大最小值时间可能实际上是时间延续。
*/
public class E04_HistoryStatAll extends _Example {
public static void main(String[] args) throws UsersException, IOException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
String[] pointNames = new String[] { POINT_AX_GLOBAL_NAME };
// 取统计
Map<String, OPStatData[]> pn2StatMap = conn.getPointStats(pointNames, FROM, TO, OPNetConst.STAT_DATA_SUMSTAT, 5);
// 输出获得的统计数据
for (Map.Entry<String, OPStatData[]> entry : pn2StatMap.entrySet()) {
String pn = entry.getKey();
OPStatData[] stats = entry.getValue();
// 输出点名
System.out.println(pn);
// 输出数据
for (OPStatData stat : stats) {
OPSumStatData statAll = (OPSumStatData) stat;
System.out.println("\t" + statAll);
}
}
System.out.println("finish...");
conn.close();
}
}
6.21获取报警实时
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.util.List;
import com.magus.net.AlarmData;
import com.magus.net.OPConnect;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-19
* @author (liwei.tang@magustek.com) 取实时报警
* 注意:需要设置NODE的LC=1(即开启节点报警),并勾选测点报警属性设定报警高低限值,再写入实时数据后才会有报警数据产生。
*/
public class F01_AlarmRealtime extends _Example {
public static void main(String[] args) throws NetException, InterruptedException, IOException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 取报警
List<AlarmData> alarms = conn.requestAlrmRecord(null, null, true);
// 输出报警
for (AlarmData alarm : alarms) {
F02_AlarmHistory.showAlarm(alarm);
}
}
}
6.22获取报警历史
详细代码示例
package com.magus.net.eg;
import java.io.IOException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.List;
import com.magus.net.AlarmData;
import com.magus.net.OPConnect;
import com.magus.net.exception.NetException;
/**
* @since 2011-8-12
* @author (liwei.tang@magustek.com) 取报警历史
*/
public class F02_AlarmHistory extends _Example {
public static void main(String[] args) throws IOException, NetException, ParseException {
OPConnect conn = new OPConnect(IP, PORT, 6000, USER_NAME, PASSWORD);
// 取历史报警
List<AlarmData> alarms = conn.requestAlrmRecord(FROM, TO, false);
// 输出报警
for (AlarmData alarm : alarms) {
showAlarm(alarm);
}
conn.close();
}
static DateFormat df = DateFormat.getDateTimeInstance();
static DecimalFormat nf = new DecimalFormat("0.###");
static void showAlarm(AlarmData alarm) {
System.out.println(nf.format(alarm.getValue()) + "\t" + alarm.getAlarmStatus() + "\t" + df.format(alarm.getDate()) + "\t" + df.format(alarm.getT1()) + "\t" + df.format(alarm.getT2()) + "\t" + "IsAlarm:" + alarm.isAlarm() + "\t" + "IsAlarm2:" + alarm.isLevel2() + "\t" + "IsHeigh:" + alarm.isHeigh() + "\t" + "IsLow:" + alarm.isLow());
}
}