Commit c88b9349 by xiang
parents 38caada2 469f7fad
......@@ -202,7 +202,21 @@ public class AvailCapMain {
}
} else if (loadType == 3) {
load[0] = pvAvg;
for (int i = 1; i < 96; i++) {
for (int i = 1; i < 32; i++) {
double r = 0.08 * (Math.random() - 0.5) * loadCap;
load[i] = load[i - 1] + r;
load[i] = Math.min(load[i], loadCap);
load[i] = Math.max(load[i], minLoad);
}
load[32] = pvAvg;
for (int i = 33; i < 88; i++) {
double r = 0.05 * (Math.random() - 0.5) * loadCap;
load[i] = load[i - 1] + r;
load[i] = Math.min(load[i], loadCap);
load[i] = Math.max(load[i], minLoad);
}
load[88] = pvAvg;
for (int i = 89; i < 96; i++) {
double r = 0.1 * (Math.random() - 0.5) * loadCap;
load[i] = load[i - 1] + r;
load[i] = Math.min(load[i], loadCap);
......@@ -497,17 +511,14 @@ public class AvailCapMain {
// lineSummer为线路夏季分析。args[1]为馈线数据库文件夹的路径,args[2]为馈线名称,args[3]为开关mRID
// lineRatedICv为线路限额,seasonCluster2为负荷聚类曲线,seasonMax2为最大负荷曲线,cap2为可开放容量
SqliteDb sqliteDb = new SqliteDb(args[1] + "\\" + args[2] + ".db");
double lineRatedI = sqliteDb.queryOneLineParam(args[2] + oneLineParamTableName, args[3]);
double lineRatedI = sqliteDb.queryOneLineSeasonParam(args[2] + oneLineParamTableName, args[3], 1);
double[] lineRatedICv = new double[96];
for (int i = 0; i < 96; i++) {
lineRatedICv[i] = lineRatedI;
}
double[] seasonCluster2 = sqliteDb.querySeasonSwitchI(args[2] + switchTableName + HistoryData.seasonClusterTable, args[3], 2, 96);
double[] seasonMax2 = sqliteDb.querySeasonSwitchI(args[2] + switchTableName + HistoryData.seasonTable, args[3], 2, 96);
double[] cap1 = sqliteDb.queryAvailCap(args[2] + availCapTableName, args[3], 1, 96);
double[] cap2 = sqliteDb.queryAvailCap(args[2] + availCapTableName, args[3], 2, 96);
double[] cap3 = sqliteDb.queryAvailCap(args[2] + availCapTableName, args[3], 3, 96);
double[] cap4 = sqliteDb.queryAvailCap(args[2] + availCapTableName, args[3], 4, 96);
double[] seasonCluster2 = sqliteDb.querySeasonSwitchI(args[2] + switchTableName + HistoryData.seasonClusterTable, args[3], 3, 96);
double[] seasonMax2 = sqliteDb.querySeasonSwitchI(args[2] + switchTableName + HistoryData.seasonTable, args[3], 3, 96);
double[] cap2 = sqliteDb.queryAvailCap(args[2] + availCapTableName, args[3], 3, 96);
// System.out.println("时段,1,2,3,4");
// for (int i = 0; i < 24; i++) {
// System.out.println(i + "," + cap1[4 * i] + "," + cap2[4 * i] + "," + cap3[4 * i] + "," + cap4[4 * i]);
......@@ -519,7 +530,7 @@ public class AvailCapMain {
// lineWinter为线路冬季分析。args[1]为馈线数据库文件夹的路径,args[2]为馈线名称,args[3]为开关mRID
// lineRatedICv为线路限额,seasonCluster4为负荷聚类曲线,seasonMax4为最大负荷曲线,cap4为可开放容量
SqliteDb sqliteDb = new SqliteDb(args[1] + "\\" + args[2] + ".db");
double lineRatedI = sqliteDb.queryOneLineParam(args[2] + oneLineParamTableName, args[3]);
double lineRatedI = sqliteDb.queryOneLineSeasonParam(args[2] + oneLineParamTableName, args[3], 2);
double[] lineRatedICv = new double[96];
for (int i = 0; i < 96; i++) {
lineRatedICv[i] = lineRatedI;
......
......@@ -69,7 +69,9 @@ public class AvailCapModel {
String initSql = "CREATE TABLE " + tableName + " (" +
" devName varchar(200) NOT NULL," +
" mRID varchar(50) NOT NULL," +
" ratedCurrent decimal(6,2) NULL" +
" ratedCurrent decimal(6,2) NULL," +
" smRatedI decimal(6,2) NULL," +
" winRatedI decimal(6,2) NULL" +
")";
sqliteDb.initDb(initSql);
// 清空表格
......@@ -626,14 +628,19 @@ public class AvailCapModel {
noPush = false;
double[][] availCap = edgeAvailCap.get(e);
for (Edge edge : edgeStack) {
if (!ps.getResource(edge.getEquips().getFirst()).getType().toUpperCase().equals("BREAKER"))
continue;
double[][] pathAvailCap = edgeAvailCap.get(edge);
for (int season = 0; season < 4; season++) {
for (int j = 0; j < pointNum; j++) {
if (availCap[season][j] > pathAvailCap[season][j]) {
availCap[season][j] = pathAvailCap[season][j];
// if (availCap[season][j] < 0) {
// availCap[season][j] = 0;
// }
if (availCap[season][j] < 0) {
if (j > 0)
availCap[season][j] = availCap[season][j - 1];
else
availCap[season][j] = 0;
}
}
}
}
......@@ -931,9 +938,18 @@ public class AvailCapModel {
SqliteDb sqliteDb = new SqliteDb(dbFile);
List<String> sqls = new LinkedList<>();
for (Edge e : edges) {
double smLimI = e.getLimI();
double winLimI = e.getLimI();
if (e.getType() == 1) {
smLimI = e.getLimI() * JKsm;
winLimI = e.getLimI() * JKwin;
} else if (e.getType() == 2) {
smLimI = e.getLimI() * LGJsm;
winLimI = e.getLimI() * LGJwin;
}
String insertSql = "insert into " + oneLineTableName + " values(" +
"'" + ps.getResource(e.getEquips().get(0)).getProperty("NAME") +
"','" + e.getEquips().get(0).substring(3) + "'," + e.getLimI() + ")";
"','" + e.getEquips().get(0).substring(3) + "'," + e.getLimI() + "," + smLimI + "," + winLimI + ")";
sqls.add(insertSql);
}
sqliteDb.executeSqls(sqls);
......@@ -1067,12 +1083,121 @@ public class AvailCapModel {
}
}
}
// if (e.getEquips().getFirst().equals("PD_11100000_10612548")) {
// for (int i = 0; i < pointNum; i++) {
// System.out.println(availCap[0][i] + "," + availCap[1][i] + "," + availCap[2][i] + "," + availCap[3][i]);
// }
// }
edgeAvailCap.put(e, availCap);
}
// }
}
/**
* 查询主线电流和参数
* @param lineISeasontableName 线路电流按季度分析结果表名
* @param swISeasontableName 开关电流按季度分析结果表名
* @param dbFile 数据库名
*/
public void mainLineI(String lineISeasontableName, String swISeasontableName, String dbFile) {
SqliteDb sqliteDb = new SqliteDb(dbFile);
// 查询主线电流数据
double[][] mainLineI = new double[4][pointNum];
for (int season = 1; season < 5; season++) {
int pNTimes = 3;
double[] I = sqliteDb.querySeasonLineI(lineISeasontableName, season, pNTimes * pointNum);
for (int i = 0; i < pointNum; i++) {
mainLineI[season - 1][i] = I[pNTimes * i];
if (mainLineI[season - 1][i] < I[pNTimes * i + 1]) {
mainLineI[season - 1][i] = I[pNTimes * i + 1];
}
if (mainLineI[season - 1][i] < I[pNTimes * i + 2]) {
mainLineI[season - 1][i] = I[pNTimes * i + 2];
}
}
}
// 主线电流裕度,按第一条有额定电流的线路算
String supplyCn = ps.getSourceCns().get(0);
UndirectedGraph<String, Edge> g = ps.getActiveIslands().get(0);
Edge mainLine = g.edgesOf(supplyCn).iterator().next();
// 初始化节点为未访问状态
HashMap<String, Boolean> visited = new HashMap<>(g.vertexSet().size());
for (String cn : g.vertexSet()) {
visited.put(cn, false);
}
//用于深度优先搜索的栈
Deque<String> stack = new ArrayDeque<>();
Deque<Edge> edgeStack = new ArrayDeque<>();
stack.push(supplyCn); // 将电源节点压入栈内
while (!stack.isEmpty()) {
boolean noPush = true;
String cn = stack.peek();
for (Edge e: g.edgesOf(cn)) {
if (!edgeStack.isEmpty() && edgeStack.peek().equals(e))
continue;
if (e.getLimI() < 10000) {
mainLine = e;
stack.clear();
break;
}
String neighbor = g.getEdgeTarget(e);
if (neighbor.equals(cn))
neighbor = g.getEdgeSource(e);
// 如果顶点已经被遍历过,则不进行处理
if (visited.get(neighbor))
continue;
// 未遍历过的节点
stack.push(neighbor);
noPush = false;
edgeStack.push(e);
break;
}
if (noPush) {
if (!stack.isEmpty()) {
visited.put(stack.pop(), true);
}
if (!edgeStack.isEmpty()) {
edgeStack.pop();
}
}
}
double mainLineLimI = mainLine.getLimI();
double mainLineType = mainLine.getType();
double[][] mainLineAvailCap = new double[4][pointNum];
for (int season = 0; season < 4; season++) {
for (int j = 0; j < pointNum; j++) {
if (season == 1 || season == 2) {
if (mainLineType == 1) {
mainLineAvailCap[season][j] = mainLineLimI * JKsm - mainLineI[season][j];
} else if (mainLineType == 2) {
mainLineAvailCap[season][j] = mainLineLimI * LGJsm - mainLineI[season][j];
}
} else {
if (mainLineType == 1) {
mainLineAvailCap[season][j] = mainLineLimI * JKwin - mainLineI[season][j];
} else if (mainLineType == 2) {
mainLineAvailCap[season][j] = mainLineLimI * LGJwin - mainLineI[season][j];
}
}
}
}
System.out.println("夏季额定电流,夏季最大电流,夏季可开放容量,夏季差值,冬季额定电流,冬季最大电流,冬季可开放容量,冬季差值");
for (int i = 0; i < pointNum; i++) {
if (mainLineType == 1) {
System.out.println(mainLineLimI * JKsm + "," + mainLineI[1][i] + "," + mainLineAvailCap[1][i] + "," +
(mainLineLimI * JKsm - mainLineI[1][i] - mainLineAvailCap[1][i]) + "," + mainLineLimI * JKwin + "," +
mainLineI[3][i] + "," + mainLineAvailCap[3][i] + "," +
(mainLineLimI * JKwin - mainLineI[3][i] - mainLineAvailCap[3][i]));
} else if (mainLineType == 2) {
System.out.println(mainLineLimI * LGJsm + "," + mainLineI[1][i] + "," + mainLineAvailCap[1][i] + "," +
(mainLineLimI * LGJsm - mainLineI[1][i] - mainLineAvailCap[1][i]) + "," + mainLineLimI * LGJwin + "," +
mainLineI[3][i] + "," + mainLineAvailCap[3][i] + "," +
(mainLineLimI * LGJwin - mainLineI[3][i] - mainLineAvailCap[3][i]));
}
}
}
/**
* 设备预警分析
*/
public void warnDevAnalysis(String dbFile, String substationTable, String tfWarnTable, String tfTable, String tfParamTable, String tfSeasonTable,
......
......@@ -240,32 +240,6 @@ public class SqliteDb {
return mRIDNames;
}
public List<Object> queryData(String tableName, String psId) {
List<Object> objs = new LinkedList<>();
Connection conn = createConn();
String sql = "select * from " + tableName + " where psId='" + psId + "'";
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
Object obj = createObj(tableName, rs);
objs.add(obj);
}
} catch (SQLException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
} catch (SQLException e) {
}
}
return objs;
}
/**
* 查询变电站名称
* @param tableName 表名
......@@ -947,7 +921,7 @@ public class SqliteDb {
* @return
*/
public double queryOneLineParam(String tableName, String mRID) {
double oneLineParam = 1000;
double oneLineParam = 754;
Connection conn = createConn();
String sql = "select * from " + tableName + " where mRID='" + mRID + "'";
Statement stmt = null;
......@@ -972,6 +946,40 @@ public class SqliteDb {
}
/**
* 查询单线夏季、冬季电流限值
* @param tableName 表名
* @return
*/
public double queryOneLineSeasonParam(String tableName, String mRID, int season) {
double oneLineParam = 754;
Connection conn = createConn();
String sql = "select * from " + tableName + " where mRID='" + mRID + "'";
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
if (season == 1) {
oneLineParam = rs.getDouble("smRatedI");
} else {
oneLineParam = rs.getDouble("winRatedI");
}
}
} catch (SQLException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
} catch (SQLException e) {
}
}
return oneLineParam;
}
/**
* 按mRID和季节查询开关或公变可接入容量
* @param tableName 表名
* @param mRID mRID
......@@ -1666,8 +1674,4 @@ public class SqliteDb {
}
return maxMinAvailCap;
}
private Object createObj(String tableName, ResultSet rs) throws SQLException {
return null;
}
}
......@@ -13,7 +13,7 @@ import java.util.*
import javax.xml.parsers.SAXParserFactory
class TN(var id : String = "", val cns : LinkedList<String> = LinkedList())
class Edge(val equips : LinkedList<String> = LinkedList(), var limI : Double = 1000.0, var type : Int = 1)
class Edge(val equips : LinkedList<String> = LinkedList(), var limI : Double = 754.0, var type : Int = 1)
/**
* 该类用于管理电网资源(MapObject)的方法
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论