@enervance/insight-cim-model 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/westnetz-neplan/neplan-load.config.js +0 -1
- package/dist/config/westnetz-neplan/neplan-load.config.js.map +1 -1
- package/dist/constants/cim-class-definition.js +6 -0
- package/dist/constants/cim-class-definition.js.map +1 -1
- package/dist/constants/cim-class-names.d.ts +6 -0
- package/dist/constants/cim-class-names.js +6 -0
- package/dist/constants/cim-class-names.js.map +1 -1
- package/dist/converter/integral7/ConverterIntegral7.d.ts +17 -4
- package/dist/converter/integral7/ConverterIntegral7.js +530 -39
- package/dist/converter/integral7/ConverterIntegral7.js.map +1 -1
- package/dist/converter/integral7/config/db-config.d.ts +3 -1
- package/dist/converter/integral7/model/integral/Hgueleitung.d.ts +9 -0
- package/dist/converter/integral7/model/integral/Hgueleitung.js +3 -0
- package/dist/converter/integral7/model/integral/Hgueleitung.js.map +1 -0
- package/dist/converter/integral7/model/integral/Kopfstation.d.ts +31 -0
- package/dist/converter/integral7/model/integral/Kopfstation.js +3 -0
- package/dist/converter/integral7/model/integral/Kopfstation.js.map +1 -0
- package/dist/converter/integral7/model/interfaces.d.ts +8 -0
- package/dist/converter/integral7/sql/integral.sql.d.ts +8 -0
- package/dist/converter/integral7/sql/integral.sql.js +22 -1
- package/dist/converter/integral7/sql/integral.sql.js.map +1 -1
- package/dist/converter/integral7/utils.d.ts +4 -1
- package/dist/converter/integral7/utils.js +26 -8
- package/dist/converter/integral7/utils.js.map +1 -1
- package/dist/etl-neplan/etl-neplan-contingency-analysis.js +22 -7
- package/dist/etl-neplan/etl-neplan-contingency-analysis.js.map +1 -1
- package/dist/etl-neplan/etl-neplan-feederline.d.ts +3 -1
- package/dist/etl-neplan/etl-neplan-feederline.js +73 -15
- package/dist/etl-neplan/etl-neplan-feederline.js.map +1 -1
- package/dist/etl-neplan/etl-neplan.js.map +1 -1
- package/dist/etl-neplan/neplan-contingency-analysis.d.ts +14 -0
- package/dist/etl-neplan/neplan-contingency-analysis.js +337 -0
- package/dist/etl-neplan/neplan-contingency-analysis.js.map +1 -0
- package/dist/graph/Types.d.ts +5 -0
- package/dist/graph/Types.js +10 -0
- package/dist/graph/Types.js.map +1 -0
- package/dist/graph/connections/connection.d.ts +11 -0
- package/dist/graph/connections/connection.js +17 -0
- package/dist/graph/connections/connection.js.map +1 -0
- package/dist/graph/edges/edge.d.ts +8 -0
- package/dist/graph/edges/edge.js +16 -0
- package/dist/graph/edges/edge.js.map +1 -0
- package/dist/graph/graph-interfaces.d.ts +15 -0
- package/dist/graph/graph-interfaces.js +3 -0
- package/dist/graph/graph-interfaces.js.map +1 -0
- package/dist/graph/graph-util.d.ts +13 -0
- package/dist/graph/graph-util.js +114 -0
- package/dist/graph/graph-util.js.map +1 -0
- package/dist/graph/graph.d.ts +15 -0
- package/dist/graph/graph.js +75 -0
- package/dist/graph/graph.js.map +1 -0
- package/dist/graph/nodes/node.d.ts +14 -0
- package/dist/graph/nodes/node.js +28 -0
- package/dist/graph/nodes/node.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/model/core/ACDCTerminal.js +2 -2
- package/dist/model/core/ACDCTerminal.js.map +1 -1
- package/dist/model/core/ConnectivityNode.js +3 -2
- package/dist/model/core/ConnectivityNode.js.map +1 -1
- package/dist/model/core/PSRType.d.ts +0 -1
- package/dist/model/core/PSRType.js +3 -6
- package/dist/model/core/PSRType.js.map +1 -1
- package/dist/model/core/PowerSystemResource.js +3 -8
- package/dist/model/core/PowerSystemResource.js.map +1 -1
- package/dist/model/core/Substation.d.ts +3 -0
- package/dist/model/core/Substation.js +4 -0
- package/dist/model/core/Substation.js.map +1 -1
- package/dist/model/core/Terminal.d.ts +2 -0
- package/dist/model/core/Terminal.js +2 -2
- package/dist/model/core/Terminal.js.map +1 -1
- package/dist/model/core/VoltageLevel.js +0 -1
- package/dist/model/core/VoltageLevel.js.map +1 -1
- package/dist/model/dc/ACDCConverter.d.ts +23 -0
- package/dist/model/dc/ACDCConverter.js +33 -0
- package/dist/model/dc/ACDCConverter.js.map +1 -0
- package/dist/model/dc/ACDCConverterDCTerminal.d.ts +13 -0
- package/dist/model/dc/ACDCConverterDCTerminal.js +54 -0
- package/dist/model/dc/ACDCConverterDCTerminal.js.map +1 -0
- package/dist/model/dc/CsConverter.d.ts +21 -0
- package/dist/model/dc/CsConverter.js +43 -0
- package/dist/model/dc/CsConverter.js.map +1 -0
- package/dist/model/dc/CsOperatingModeKind.d.ts +4 -0
- package/dist/model/dc/CsOperatingModeKind.js +9 -0
- package/dist/model/dc/CsOperatingModeKind.js.map +1 -0
- package/dist/model/dc/CsPpccControlKind.d.ts +5 -0
- package/dist/model/dc/CsPpccControlKind.js +10 -0
- package/dist/model/dc/CsPpccControlKind.js.map +1 -0
- package/dist/model/dc/DCBaseTerminal.d.ts +8 -0
- package/dist/model/dc/DCBaseTerminal.js +30 -0
- package/dist/model/dc/DCBaseTerminal.js.map +1 -0
- package/dist/model/dc/DCConductingEquipment.d.ts +5 -0
- package/dist/model/dc/DCConductingEquipment.js +12 -0
- package/dist/model/dc/DCConductingEquipment.js.map +1 -0
- package/dist/model/dc/DCConverterOperatingModeKind.d.ts +5 -0
- package/dist/model/dc/DCConverterOperatingModeKind.js +10 -0
- package/dist/model/dc/DCConverterOperatingModeKind.js.map +1 -0
- package/dist/model/dc/DCConverterUnit.d.ts +14 -0
- package/dist/model/dc/DCConverterUnit.js +54 -0
- package/dist/model/dc/DCConverterUnit.js.map +1 -0
- package/dist/model/dc/DCEquipmentContainer.d.ts +5 -0
- package/dist/model/dc/DCEquipmentContainer.js +12 -0
- package/dist/model/dc/DCEquipmentContainer.js.map +1 -0
- package/dist/model/dc/DCLine.d.ts +11 -0
- package/dist/model/dc/DCLine.js +48 -0
- package/dist/model/dc/DCLine.js.map +1 -0
- package/dist/model/dc/DCLineSegment.d.ts +13 -0
- package/dist/model/dc/DCLineSegment.js +69 -0
- package/dist/model/dc/DCLineSegment.js.map +1 -0
- package/dist/model/dc/DCNode.d.ts +12 -0
- package/dist/model/dc/DCNode.js +41 -0
- package/dist/model/dc/DCNode.js.map +1 -0
- package/dist/model/dc/DCPolarityKind.d.ts +5 -0
- package/dist/model/dc/DCPolarityKind.js +10 -0
- package/dist/model/dc/DCPolarityKind.js.map +1 -0
- package/dist/model/dc/DCTerminal.d.ts +10 -0
- package/dist/model/dc/DCTerminal.js +38 -0
- package/dist/model/dc/DCTerminal.js.map +1 -0
- package/dist/model/dc/VsConverter.d.ts +18 -0
- package/dist/model/dc/VsConverter.js +33 -0
- package/dist/model/dc/VsConverter.js.map +1 -0
- package/dist/model/dc/VsPpccControlKind.d.ts +7 -0
- package/dist/model/dc/VsPpccControlKind.js +12 -0
- package/dist/model/dc/VsPpccControlKind.js.map +1 -0
- package/dist/model/dc/VsQpccControlKind.d.ts +5 -0
- package/dist/model/dc/VsQpccControlKind.js +10 -0
- package/dist/model/dc/VsQpccControlKind.js.map +1 -0
- package/dist/model/domain/UnitMultiplier.js.map +1 -1
- package/dist/model/extensions/amprion/model/AmprionModell.d.ts +25 -0
- package/dist/model/extensions/amprion/model/AmprionModell.js +64 -0
- package/dist/model/extensions/amprion/model/AmprionModell.js.map +1 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProject.d.ts +34 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProject.js +134 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProject.js.map +1 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProjectBundle.d.ts +17 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProjectBundle.js +77 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProjectBundle.js.map +1 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProjectPlan.d.ts +14 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProjectPlan.js +57 -0
- package/dist/model/extensions/amprion/project/AMPRIONConstructionProjectPlan.js.map +1 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProject.d.ts +7 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProject.js +17 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProject.js.map +1 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProjectPhase.d.ts +19 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProjectPhase.js +74 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProjectPhase.js.map +1 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProjectStructure.d.ts +15 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProjectStructure.js +26 -0
- package/dist/model/extensions/amprion/project/AMPRIONErpProjectStructure.js.map +1 -0
- package/dist/model/extensions/amprion/project/AMPRIONProjectPriorityKind.d.ts +5 -0
- package/dist/model/extensions/amprion/project/AMPRIONProjectPriorityKind.js +10 -0
- package/dist/model/extensions/amprion/project/AMPRIONProjectPriorityKind.js.map +1 -0
- package/dist/model/extensions/amprion/wires/AMPRIONSeriesCompensator.d.ts +9 -0
- package/dist/model/extensions/amprion/wires/AMPRIONSeriesCompensator.js +46 -0
- package/dist/model/extensions/amprion/wires/AMPRIONSeriesCompensator.js.map +1 -0
- package/dist/model/extensions/enervance/operations/EVTerminalAction.js.map +1 -1
- package/dist/model/extensions/neplan-westnetz/assets/WNFacility.js.map +1 -1
- package/dist/model/generation/WindGeneratingUnit.d.ts +5 -0
- package/dist/model/generation/WindGeneratingUnit.js +66 -0
- package/dist/model/generation/WindGeneratingUnit.js.map +1 -1
- package/dist/model/model/Model.d.ts +39 -1
- package/dist/model/model/Model.js +91 -1
- package/dist/model/model/Model.js.map +1 -1
- package/dist/model/wires/ACLineSegment.d.ts +1 -0
- package/dist/model/wires/ACLineSegment.js +15 -2
- package/dist/model/wires/ACLineSegment.js.map +1 -1
- package/dist/model/wires/AsynchronousMachine.d.ts +1 -0
- package/dist/model/wires/AsynchronousMachine.js +37 -1
- package/dist/model/wires/AsynchronousMachine.js.map +1 -1
- package/dist/model/wires/Disconnector.js +1 -1
- package/dist/model/wires/EnergySource.d.ts +2 -0
- package/dist/model/wires/EnergySource.js +28 -2
- package/dist/model/wires/EnergySource.js.map +1 -1
- package/dist/model/wires/SeriesCompensator.d.ts +18 -2
- package/dist/model/wires/SeriesCompensator.js +108 -5
- package/dist/model/wires/SeriesCompensator.js.map +1 -1
- package/dist/util/util-create.js.map +1 -1
- package/dist/util/util-topology.d.ts +2 -2
- package/dist/util/util-topology.js +14 -6
- package/dist/util/util-topology.js.map +1 -1
- package/package.json +1 -1
- package/src/config/westnetz-neplan/neplan-load.config.ts +1 -1
- package/src/constants/cim-class-definition.ts +20 -1
- package/src/constants/cim-class-names.ts +9 -0
- package/src/converter/integral7/ConverterIntegral7.ts +753 -345
- package/src/converter/integral7/config/db-config.ts +3 -2
- package/src/converter/integral7/model/integral/Hgueleitung.ts +12 -0
- package/src/converter/integral7/model/integral/Kopfstation.ts +46 -0
- package/src/converter/integral7/model/interfaces.ts +23 -16
- package/src/converter/integral7/sql/integral.sql.ts +27 -1
- package/src/converter/integral7/utils.ts +43 -11
- package/src/etl-neplan/etl-neplan-contingency-analysis.ts +30 -12
- package/src/etl-neplan/etl-neplan-feederline.ts +100 -17
- package/src/etl-neplan/etl-neplan.ts +1 -0
- package/src/etl-neplan/neplan-contingency-analysis.ts +572 -0
- package/src/graph/Types.ts +7 -0
- package/src/graph/connections/connection.ts +29 -0
- package/src/graph/edges/edge.ts +27 -0
- package/src/graph/graph-interfaces.ts +21 -0
- package/src/graph/graph-util.ts +158 -0
- package/src/graph/graph.ts +84 -0
- package/src/graph/nodes/node.ts +43 -0
- package/src/index.ts +8 -0
- package/src/model/core/ACDCTerminal.ts +2 -2
- package/src/model/core/ConnectivityNode.ts +2 -2
- package/src/model/core/PSRType.ts +3 -6
- package/src/model/core/PowerSystemResource.ts +3 -7
- package/src/model/core/Substation.ts +6 -0
- package/src/model/core/Terminal.ts +15 -6
- package/src/model/core/VoltageLevel.ts +0 -1
- package/src/model/dc/ACDCConverter.ts +66 -0
- package/src/model/dc/ACDCConverterDCTerminal.ts +64 -0
- package/src/model/dc/CsConverter.ts +68 -0
- package/src/model/dc/CsOperatingModeKind.ts +4 -0
- package/src/model/dc/CsPpccControlKind.ts +5 -0
- package/src/model/dc/DCBaseTerminal.ts +30 -0
- package/src/model/dc/DCConductingEquipment.ts +8 -0
- package/src/model/dc/DCConverterOperatingModeKind.ts +6 -0
- package/src/model/dc/DCConverterUnit.ts +60 -0
- package/src/model/dc/DCEquipmentContainer.ts +8 -0
- package/src/model/dc/DCLine.ts +56 -0
- package/src/model/dc/DCLineSegment.ts +81 -0
- package/src/model/dc/DCNode.ts +49 -0
- package/src/model/dc/DCPolarityKind.ts +5 -0
- package/src/model/dc/DCTerminal.ts +45 -0
- package/src/model/dc/VsConverter.ts +48 -0
- package/src/model/dc/VsPpccControlKind.ts +7 -0
- package/src/model/dc/VsQpccControlKind.ts +5 -0
- package/src/model/domain/UnitMultiplier.ts +12 -12
- package/src/model/equivalents/EquivalentBranch.ts +10 -10
- package/src/model/extensions/amprion/model/AmprionModell.ts +92 -0
- package/src/model/extensions/amprion/project/AMPRIONConstructionProject.ts +174 -0
- package/src/model/extensions/amprion/project/AMPRIONConstructionProjectBundle.ts +89 -0
- package/src/model/extensions/amprion/project/AMPRIONConstructionProjectPlan.ts +64 -0
- package/src/model/extensions/amprion/project/AMPRIONErpProject.ts +21 -0
- package/src/model/extensions/amprion/project/AMPRIONErpProjectPhase.ts +89 -0
- package/src/model/extensions/amprion/project/AMPRIONErpProjectStructure.ts +36 -0
- package/src/model/extensions/amprion/project/AMPRIONProjectPriorityKind.ts +5 -0
- package/src/model/extensions/amprion/wires/AMPRIONSeriesCompensator.ts +53 -0
- package/src/model/extensions/enervance/core/EVTerminal.ts +1 -1
- package/src/model/extensions/enervance/operations/EVTerminalAction.ts +0 -1
- package/src/model/extensions/neplan-westnetz/assets/WNFacility.ts +0 -1
- package/src/model/generation/WindGeneratingUnit.ts +73 -0
- package/src/model/model/Model.ts +131 -7
- package/src/model/wires/ACLineSegment.ts +244 -228
- package/src/model/wires/AsynchronousMachine.ts +38 -1
- package/src/model/wires/Disconnector.ts +1 -1
- package/src/model/wires/EnergySource.ts +256 -222
- package/src/model/wires/SeriesCompensator.ts +145 -19
- package/src/util/util-create.ts +2 -0
- package/src/util/util-topology.ts +18 -7
- package/test/apache-jena-fuseki-interface/{apache-jena-fuseki-neplan.tests.spec.ts → apache-jena-fuseki-neplan-1.tests.sp-ec.ts} +0 -26
- package/test/apache-jena-fuseki-interface/apache-jena-fuseki-neplan-2.tests.spec.ts +255 -0
- package/test/apache-jena-fuseki-interface/data/xml/finnentrop/Finnentrop_Rootnet_Area 1_EQ_V1.xml +20867 -0
- package/test/apache-jena-fuseki-interface/data/xml/finnentrop/Finnentrop_Rootnet_Area 1_SSH_V1.xml +3784 -0
- package/test/apache-jena-fuseki-interface/data/xml/ruhrau-katharina/Ruhrau_Katharina_Rootnet_Area 1_EQ_V1.xml +42546 -0
- package/test/apache-jena-fuseki-interface/data/xml/ruhrau-katharina/Ruhrau_Katharina_Rootnet_Area 1_SSH_V1.xml +10101 -0
- package/test/apache-jena-fuseki-interface/data/xml/ruhrau-katharina/Ruhrau_Katharina_Rootnet_Area 1_SV_V1.xml +6229 -0
- package/test/integral7-converter/integral7-converter.tests.spec.ts +12 -3
- package/test/power-system-data-model-converter/power-system-data-model-converter.tests.spec.ts +1 -1
- package/test/apache-jena-fuseki-interface/data/apache-jena-fuseki-3.12.0/run/system/tdb.lock +0 -1
|
@@ -0,0 +1,572 @@
|
|
|
1
|
+
import { Model } from '../model/model/Model';
|
|
2
|
+
import { WNFeeder } from '../model/extensions/neplan-westnetz/core/WNFeeder';
|
|
3
|
+
import { WNConnectivityNode } from '../model/extensions/neplan-westnetz/core/WNConnectivityNode';
|
|
4
|
+
import { ConductingEquipment } from '../model/core/ConductingEquipment';
|
|
5
|
+
import { Switch } from '../model/wires/Switch';
|
|
6
|
+
import { SwitchingPlan } from '../model/operations/SwitchingPlan';
|
|
7
|
+
import { EVTerminalAction } from '../model/extensions/enervance/operations/EVTerminalAction';
|
|
8
|
+
import { SwitchActionKind } from '../model/operations/SwitchActionKind';
|
|
9
|
+
import { IOutage } from '../interfaces/model/operations/IOutage';
|
|
10
|
+
import { Graph } from '../graph/graph';
|
|
11
|
+
import { IIdentifiedObject } from '../interfaces/model/core/IIdentifiedObject';
|
|
12
|
+
import {
|
|
13
|
+
determineComputableGrid,
|
|
14
|
+
determineNetworksSlackElements, determineSubstations,
|
|
15
|
+
determineTopologicalIslands
|
|
16
|
+
} from '../util/util-topology';
|
|
17
|
+
import { ConnectivityNode } from '../model/core/ConnectivityNode';
|
|
18
|
+
import { Terminal } from '../model/core/Terminal';
|
|
19
|
+
import { Edge } from '../graph/edges/edge';
|
|
20
|
+
import { Node } from '../graph/nodes/node';
|
|
21
|
+
import { Type } from '../graph/Types';
|
|
22
|
+
import { Connection } from '../graph/connections/connection';
|
|
23
|
+
import { ExternalNetworkInjection } from '../model/wires/ExternalNetworkInjection';
|
|
24
|
+
import { OutageResult, SwitchEvalResult } from '../graph/graph-interfaces';
|
|
25
|
+
import {
|
|
26
|
+
determineOutageAffectedSubstations, evaluateSwitchActions, isBelongingToFeeder, isSwitchObjectInArray
|
|
27
|
+
} from '../graph/graph-util';
|
|
28
|
+
import { IdentifiedObject } from '../model/core/IdentifiedObject';
|
|
29
|
+
import { ITerminal } from '../interfaces/model/core/ITerminal';
|
|
30
|
+
import { ACLineSegment } from '../model/wires/ACLineSegment';
|
|
31
|
+
import { WNOutage } from '../model/extensions/neplan-westnetz/operations/WNOutage';
|
|
32
|
+
import { generateUUID } from '../util/utils';
|
|
33
|
+
import { EVTerminal } from '../model/extensions/enervance/core/EVTerminal';
|
|
34
|
+
import { WNFaultConnectivityNode } from '../model/extensions/neplan-westnetz/faults/WNFaultConnectivityNode';
|
|
35
|
+
|
|
36
|
+
export function performContingencyAnalysisV2(cimModel: Model): string[] {
|
|
37
|
+
|
|
38
|
+
/** alle elektrisch zusammenhängende Teilnetze bestimmen mit Berücksichtigung des Schaltzustandes */
|
|
39
|
+
const networks: IIdentifiedObject[][] = determineTopologicalIslands(cimModel);
|
|
40
|
+
|
|
41
|
+
/** rechenbare Netze bestimmen */
|
|
42
|
+
const computableGrids: IIdentifiedObject[][] = determineComputableGrid(networks);
|
|
43
|
+
|
|
44
|
+
/** Slackelemente für rechenbare Netze, unabhängig vom Schaltzustand */
|
|
45
|
+
/** Key Netzindex, Value alle vom Slack aus erreichbare Elemente (ACLineSegments trennen Slack-UAs) */
|
|
46
|
+
const computableGridsSlackElements: IIdentifiedObject[][] = determineNetworksSlackElements(cimModel, computableGrids);
|
|
47
|
+
|
|
48
|
+
/** KRUECKE Anlagen mit mehr als 10 Switchelementen und Slacks werden als Umspannanlagen markiert. */
|
|
49
|
+
const substationElements = determineSubstations(cimModel, computableGridsSlackElements);
|
|
50
|
+
|
|
51
|
+
computableGridsSlackElements.push(substationElements);
|
|
52
|
+
|
|
53
|
+
/** Graph initialisieren */
|
|
54
|
+
const graph = new Graph();
|
|
55
|
+
const slackUUIDs = [];
|
|
56
|
+
const terminals = [];
|
|
57
|
+
|
|
58
|
+
/** Graph initialisieren */
|
|
59
|
+
for (const element of cimModel.objects.values()) {
|
|
60
|
+
if (element instanceof ConnectivityNode) {
|
|
61
|
+
graph.addNode(new Node(element.mrid));
|
|
62
|
+
} else if (element instanceof Terminal) {
|
|
63
|
+
terminals.push(element as Terminal);
|
|
64
|
+
} else if (element instanceof ConductingEquipment) {
|
|
65
|
+
if (element instanceof ExternalNetworkInjection) {
|
|
66
|
+
graph.addEdge(new Edge(element.mrid, Type.ExternalNetworkinjection, true));
|
|
67
|
+
slackUUIDs.push(element.mrid);
|
|
68
|
+
} else if (element instanceof Switch) {
|
|
69
|
+
graph.addEdge(new Edge(element.mrid, Type.Switch, (element as Switch).open));
|
|
70
|
+
} else {
|
|
71
|
+
graph.addEdge(new Edge(element.mrid, Type.ConductingEquipment, false));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* for (const network of networks) {
|
|
77
|
+
for (const element of network) {
|
|
78
|
+
if (element instanceof ConnectivityNode) {
|
|
79
|
+
graph.addNode(new Node(element.mrid));
|
|
80
|
+
} else if (element instanceof Terminal) {
|
|
81
|
+
terminals.push(element as Terminal);
|
|
82
|
+
} else if (element instanceof ConductingEquipment) {
|
|
83
|
+
if (element instanceof ExternalNetworkInjection) {
|
|
84
|
+
graph.addEdge(new Edge(element.mrid, Type.ExternalNetworkinjection, true));
|
|
85
|
+
slackUUIDs.push(element.mrid);
|
|
86
|
+
}
|
|
87
|
+
else if (element instanceof Switch) {
|
|
88
|
+
graph.addEdge(new Edge(element.mrid, Type.Switch, (element as Switch).open));
|
|
89
|
+
} else {
|
|
90
|
+
graph.addEdge(new Edge(element.mrid, Type.ConductingEquipment, false));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}*/
|
|
95
|
+
|
|
96
|
+
/* // Spannunsglose Schaltelemente bestimmen und dem Graph hinzufügen
|
|
97
|
+
for (const trm of cimModel.terminals.values()) {
|
|
98
|
+
if (!graph.terminals.has(trm.mrid) && !graph.edges.has(trm.conductingEquipment.mrid)) {
|
|
99
|
+
|
|
100
|
+
}
|
|
101
|
+
if (!graph.edges.has(trm.conductingEquipment.mrid) && trm.conductingEquipment instanceof Switch) {
|
|
102
|
+
if (trm.connectivityNode && ) {
|
|
103
|
+
const swtch = trm.conductingEquipment as Switch;
|
|
104
|
+
const cn = trm.connectivityNode;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
}*/
|
|
109
|
+
|
|
110
|
+
/** Konnektivität durch terminals herstellen */
|
|
111
|
+
for (const terminal of terminals) {
|
|
112
|
+
const node = graph.nodes.get(terminal.connectivityNode.mrid);
|
|
113
|
+
const edge = graph.edges.get(terminal.conductingEquipment.mrid);
|
|
114
|
+
if (node && edge) {
|
|
115
|
+
const term = new Connection(terminal.mrid, terminal.connected, node, edge);
|
|
116
|
+
node.addTerminal(term);
|
|
117
|
+
edge.addTerminal(term);
|
|
118
|
+
graph.addTerminal(term);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
/** 1.1 Bestimme pro Abgang alle elektrisch nicht verbundene Elemente (Knoten und ConductingEquipments) und bbfs. offene Switches */
|
|
124
|
+
/** 1.2 Überrpüfe nicht verbundene Elemente auf die Abgangszugehörigkeit zu anderen Abgängen */
|
|
125
|
+
/** 2 Erstelle für jedes nicht verbundenes Element, das zu einem anderen Abgang gehört, eine Schaltmaßname. */
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
const insertSPARQL = [];
|
|
129
|
+
|
|
130
|
+
for (const feeder of cimModel.feeders.values()) {
|
|
131
|
+
const wnFeeder = feeder as WNFeeder;
|
|
132
|
+
|
|
133
|
+
const disconnectedTerminalCNs: IdentifiedObject[][] = []; // nicht verbundene Knoten zu anderen Abgängen
|
|
134
|
+
const disconnectedTerminalCEs: IdentifiedObject[][] = []; // nicht verbundene leitende Equipments
|
|
135
|
+
const disconnectedSwitches: IdentifiedObject[][] = []; // nicht verbundene Schaltelemente mit allen offenen Terminals zu anderen Abgängen
|
|
136
|
+
|
|
137
|
+
const disconnectedSelfTerminalCN: IdentifiedObject[][] = []; // nicht verbundene Knoten zum gleichen Abgang
|
|
138
|
+
const disconnectedSelfTerminalCE: IdentifiedObject[][] = []; // nicht verbundene Knoten zum gleichen Abgang
|
|
139
|
+
const disconnectedSelfSwitches: IdentifiedObject[][] = []; // nicht verbundene Schaltelemente mit allen offenen Terminals zum gleichen Abgang
|
|
140
|
+
/** 1.1) nicht verbundene Knoten und Switches bestimmen von Equipments aus*/
|
|
141
|
+
for (const equip of wnFeeder.additionalGroupedEquipment.values()) {
|
|
142
|
+
if (equip instanceof ConductingEquipment) {
|
|
143
|
+
const ce = equip as ConductingEquipment;
|
|
144
|
+
//95e7f7b6-4f7a-4468-bb9a-97cdd1c1f56a
|
|
145
|
+
// Bestimme nicht verbundene CNs
|
|
146
|
+
for (const terminal of ce.terminals.values()) {
|
|
147
|
+
/** Offene Terminals */
|
|
148
|
+
if (!terminal.isClosed()) {
|
|
149
|
+
/** verbindungen zu anderen Angängen */
|
|
150
|
+
if (!wnFeeder.normalEnergizedConnectivityNodes.has(terminal.connectivityNode.mrid)) {
|
|
151
|
+
if (terminal.connectivityNode && (terminal.connectivityNode as WNConnectivityNode).additionalConnectivityNodeContainer) {
|
|
152
|
+
disconnectedTerminalCNs.push([terminal as Terminal]);
|
|
153
|
+
}
|
|
154
|
+
} else if (wnFeeder.normalEnergizedConnectivityNodes.has(terminal.connectivityNode.mrid)) {
|
|
155
|
+
/** offene Verbindungen zu sich selbst */
|
|
156
|
+
if (!isSwitchObjectInArray(terminal as Terminal, disconnectedSelfTerminalCN)) disconnectedSelfTerminalCN.push([terminal as Terminal]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** geschlossener Terminal mit offenem Switch */
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** 1.2) nicht verbundene leitende Elemente bestimmen von ConnectivityNodes aus*/
|
|
165
|
+
for (const cn of wnFeeder.normalEnergizedConnectivityNodes.values()) {
|
|
166
|
+
// Bestimme nicht verbundene CNs
|
|
167
|
+
for (const terminal of cn.terminals.values()) {
|
|
168
|
+
|
|
169
|
+
if (cn.mrid === '7b01c8f9-69a3-41dc-af60-f4e68ee68400') {
|
|
170
|
+
console.log();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** offene Terminals */
|
|
174
|
+
if (!terminal.isClosed()) {
|
|
175
|
+
/** ist offen und gehört zu einem anderen Abgang */
|
|
176
|
+
const ce = terminal.conductingEquipment;
|
|
177
|
+
if (cn.mrid === 'a9b2f23b-c799-4edf-9972-8f594d67446b') {
|
|
178
|
+
console.log();
|
|
179
|
+
}
|
|
180
|
+
if (!wnFeeder.additionalGroupedEquipment.has(ce.mrid) && isBelongingToFeeder(ce.mrid, cimModel.feeders, false)) {
|
|
181
|
+
if (terminal.conductingEquipment.additionalEquipmentContainer.size) {
|
|
182
|
+
disconnectedTerminalCEs.push([terminal]);
|
|
183
|
+
}
|
|
184
|
+
} else if (wnFeeder.additionalGroupedEquipment.has(ce.mrid)) {
|
|
185
|
+
/** offene Verbindungen zu sich selbst */
|
|
186
|
+
if (!isSwitchObjectInArray(terminal as Terminal, disconnectedSelfTerminalCE)) disconnectedSelfTerminalCE.push([terminal]);
|
|
187
|
+
} else {
|
|
188
|
+
/** offenes Schaltalement,das zu keinem Abgang gehört */
|
|
189
|
+
if (terminal.conductingEquipment instanceof Switch) {
|
|
190
|
+
const swtch = terminal.conductingEquipment as Switch;
|
|
191
|
+
if (!swtch.isClosed()) {
|
|
192
|
+
/** Bestimme, ob der offene Switch
|
|
193
|
+
* -eine Verbindung in den gleichen Abgang
|
|
194
|
+
* -oder zu einem anderen Abgang darstellt */
|
|
195
|
+
for (const trm of swtch.terminals.values()) {
|
|
196
|
+
/** suche den 'anderen Terminal' */
|
|
197
|
+
if (trm.mrid !== terminal.mrid) {
|
|
198
|
+
const switchConnNodeUUID = trm.connectivityNode.mrid;
|
|
199
|
+
/** gehört zum gleichen Abgang */
|
|
200
|
+
if (wnFeeder.normalEnergizedConnectivityNodes.has(switchConnNodeUUID)) {
|
|
201
|
+
const switchArray = addSwitchTerminalToSwitchAction(terminal, trm, swtch);
|
|
202
|
+
disconnectedSelfSwitches.push(switchArray);
|
|
203
|
+
} else if (isBelongingToFeeder(switchConnNodeUUID, cimModel.feeders, true)) {
|
|
204
|
+
/** gehört zum anderen Abgang? */
|
|
205
|
+
const switchArray = addSwitchTerminalToSwitchAction(terminal, trm, swtch);
|
|
206
|
+
disconnectedSwitches.push(switchArray);
|
|
207
|
+
/** Wenn der Knoten zu keinem Abgang gehört, dann ist er spannungslos
|
|
208
|
+
* und wird daher nicht berücksichtigt? */
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
} else {
|
|
214
|
+
console.log(`n-1 unbekanntes ce am terminal ${terminal.conductingEquipment.mrid}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** relevante Ausfälle bestimmen */
|
|
222
|
+
const outageNodes = [];
|
|
223
|
+
for (const headTerminal of feeder.normalHeadTerminals.values()) {
|
|
224
|
+
outageNodes.push(headTerminal.connectivityNode);
|
|
225
|
+
}
|
|
226
|
+
for (const cn of wnFeeder.normalEnergizedConnectivityNodes.values()) {
|
|
227
|
+
let connectedACLineSegments = 0;
|
|
228
|
+
for (const terminal of cn.terminals.values()) {
|
|
229
|
+
if (terminal.isClosed() && terminal.conductingEquipment instanceof ACLineSegment) {
|
|
230
|
+
connectedACLineSegments++;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (connectedACLineSegments > 2) outageNodes.push(cn);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// HeadTerminal-Ausfälle
|
|
237
|
+
const proceededContingencyNodes = [];
|
|
238
|
+
for (const outageSfCN of outageNodes) {
|
|
239
|
+
console.log(outageSfCN.name);
|
|
240
|
+
if (outageSfCN.name === '05966012-S-K-ST-00042')
|
|
241
|
+
console.log();
|
|
242
|
+
if (outageSfCN.mrid === '128a65ff-702d-47b2-8e7c-0be501740358')
|
|
243
|
+
console.log();
|
|
244
|
+
/** abgearbeitete Knoten überspringen. Tritt auf, wenn ein Feederknoten untergeklemmte Leitungen besitzt */
|
|
245
|
+
if (proceededContingencyNodes.indexOf(outageSfCN.mrid) !== -1) continue;
|
|
246
|
+
|
|
247
|
+
console.log('\tOutage ' + outageSfCN.mrid);
|
|
248
|
+
|
|
249
|
+
proceededContingencyNodes.push(outageSfCN.mrid);
|
|
250
|
+
const graphNode = graph.nodes.get(outageSfCN?.mrid);
|
|
251
|
+
|
|
252
|
+
if (graphNode) {
|
|
253
|
+
/** Als Ausfall markieren */
|
|
254
|
+
graphNode.inService = false
|
|
255
|
+
|
|
256
|
+
const outageResult: OutageResult = determineOutageAffectedSubstations(graph, [graphNode.uuid],
|
|
257
|
+
wnFeeder.normalEnergizedConnectivityNodes,
|
|
258
|
+
slackUUIDs);
|
|
259
|
+
/** 2 Schaltmaßnahmen */
|
|
260
|
+
const switchActionsFullyReenergised = [];
|
|
261
|
+
const switchActionsPartiallyReenergised = [];
|
|
262
|
+
/** Ausfall führt zum Zerfall des Netzes */
|
|
263
|
+
if (outageResult.outageStations.size) {
|
|
264
|
+
const a = [...outageResult.outageStations.values()];
|
|
265
|
+
/* console.log('\toutageStations ' + a.map(elemt => {
|
|
266
|
+
return elemt.map(e => e['uuid']);
|
|
267
|
+
}));*/
|
|
268
|
+
|
|
269
|
+
/** Schaltmaßnahmen evaluieren */
|
|
270
|
+
// Schaltmaßnahmen von den CNs
|
|
271
|
+
const switchActionsTerminalsCN: SwitchEvalResult[] = evaluateSwitchActions(graphNode.uuid, outageResult.outageStations,
|
|
272
|
+
wnFeeder.normalEnergizedConnectivityNodes, graph,
|
|
273
|
+
disconnectedTerminalCNs, slackUUIDs);
|
|
274
|
+
|
|
275
|
+
const switchActionsSelfTerminalsCN: SwitchEvalResult[] = evaluateSwitchActions(graphNode.uuid, outageResult.outageStations,
|
|
276
|
+
wnFeeder.normalEnergizedConnectivityNodes, graph,
|
|
277
|
+
disconnectedSelfTerminalCN, slackUUIDs);
|
|
278
|
+
|
|
279
|
+
// Schaltmaßnahmen von den CEs
|
|
280
|
+
const switchActionsTerminalsCE: SwitchEvalResult[] = evaluateSwitchActions(graphNode.uuid, outageResult.outageStations,
|
|
281
|
+
wnFeeder.normalEnergizedConnectivityNodes, graph,
|
|
282
|
+
disconnectedTerminalCEs, slackUUIDs);
|
|
283
|
+
|
|
284
|
+
const switchActionsSelfTerminalsCE: SwitchEvalResult[] = evaluateSwitchActions(graphNode.uuid, outageResult.outageStations,
|
|
285
|
+
wnFeeder.normalEnergizedConnectivityNodes, graph,
|
|
286
|
+
disconnectedSelfTerminalCE, slackUUIDs);
|
|
287
|
+
|
|
288
|
+
// Schaltmaßnahmen von den Switches
|
|
289
|
+
const switchActionsSwitches: SwitchEvalResult[] = evaluateSwitchActions(graphNode.uuid, outageResult.outageStations,
|
|
290
|
+
wnFeeder.normalEnergizedConnectivityNodes, graph,
|
|
291
|
+
disconnectedSwitches, slackUUIDs);
|
|
292
|
+
|
|
293
|
+
const switchActionsPartially = [
|
|
294
|
+
...switchActionsTerminalsCN.filter(elem => elem.type === 1),
|
|
295
|
+
...switchActionsTerminalsCE.filter(elem => elem.type === 1),
|
|
296
|
+
...switchActionsSwitches.filter(elem => elem.type === 1),
|
|
297
|
+
...switchActionsSelfTerminalsCN.filter(elem => elem.type === 1),
|
|
298
|
+
...switchActionsSelfTerminalsCE.filter(elem => elem.type === 1),
|
|
299
|
+
];
|
|
300
|
+
|
|
301
|
+
switchActionsFullyReenergised.push(
|
|
302
|
+
...switchActionsTerminalsCN.filter(elem => elem.type === 2),
|
|
303
|
+
...switchActionsTerminalsCE.filter(elem => elem.type === 2),
|
|
304
|
+
...switchActionsSwitches.filter(elem => elem.type === 2),
|
|
305
|
+
...switchActionsSelfTerminalsCN.filter(elem => elem.type === 2),
|
|
306
|
+
...switchActionsSelfTerminalsCE.filter(elem => elem.type === 2),
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
/** Wenn es mehr als eine Maßnahme mit partieller Wiederversorgung gibt,
|
|
310
|
+
* dann versuche eine Kombination zur vollständigen Wiederversorgung zu finden */
|
|
311
|
+
if (switchActionsPartially.length > 1) {
|
|
312
|
+
const combinedSwitchUUIDs: string[][] = [];
|
|
313
|
+
for (const currentSwitchAction of switchActionsPartially) {
|
|
314
|
+
/** key -> UUID des unversorgten (Teil-)Abgangs; value -> Schaltmaßnahmen zur Wiederversorgung 0...n */
|
|
315
|
+
const additionalSwitchActions = new Map<string, SwitchEvalResult[]>();
|
|
316
|
+
|
|
317
|
+
/** Ausgefalle Stationen dieser Maßnahme */
|
|
318
|
+
const currentOutageSubstations: Map<string, Node[]> = currentSwitchAction.outageResult.outageStations;
|
|
319
|
+
|
|
320
|
+
/** Iteriere über zerfallene Teilangänge der aktuellen Maßnahme.
|
|
321
|
+
* für jeden zerfallenen Teilabgang muss eine schaltmaßnahme gefunden werden */
|
|
322
|
+
for (const entry of currentOutageSubstations.entries()) {
|
|
323
|
+
const outageNodesToRepair = entry[1];
|
|
324
|
+
if (outageNodesToRepair.length) {
|
|
325
|
+
/** Bestimme Maßnahmen zur Wiederversorgung der Stationen dieses Teilabgangs */
|
|
326
|
+
const repairActions: SwitchEvalResult[] = getPartiallySwitchingActionForSubstations(outageNodesToRepair, switchActionsPartially);
|
|
327
|
+
/* /!** Wenn keine Schaltmaßnahme gefunden werden konnte, dann bereche ab, da der Abgang nicht vollständig wiederversorgt werden kann *!/
|
|
328
|
+
if (!switchActions?.length) break;*/
|
|
329
|
+
if (repairActions?.length) {
|
|
330
|
+
additionalSwitchActions.set(entry[0], repairActions);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/** IDs der SwitchObjekte als 2D array anlegen,
|
|
336
|
+
* um alle Kombinatonen zu bestimmen */
|
|
337
|
+
/** Erste Maßnahme ist currentSwitchAction */
|
|
338
|
+
const switchingAction = [];
|
|
339
|
+
switchingAction.push([currentSwitchAction]);
|
|
340
|
+
for (const repairActions of additionalSwitchActions.values()) {
|
|
341
|
+
switchingAction.push(repairActions);
|
|
342
|
+
}
|
|
343
|
+
const results: string[][] = [];
|
|
344
|
+
getArrayCombination(0, 0, switchingAction, [], results);
|
|
345
|
+
sort2DArray(results);
|
|
346
|
+
addNewRepairActions(combinedSwitchUUIDs, results);
|
|
347
|
+
// console.log(combinedSwitchUUIDs);
|
|
348
|
+
|
|
349
|
+
}
|
|
350
|
+
const combinedSwitchActions = [];
|
|
351
|
+
for (const combinedSwitchesUUID of combinedSwitchUUIDs) {
|
|
352
|
+
const combinedSwitches = combinedSwitchesUUID.map(element => {
|
|
353
|
+
return cimModel.getObject(element)
|
|
354
|
+
});
|
|
355
|
+
combinedSwitchActions.push(combinedSwitches);
|
|
356
|
+
}
|
|
357
|
+
/** Kombinierte Maßnahmen testen */
|
|
358
|
+
const switchEvalResults: SwitchEvalResult[] = evaluateSwitchActions(graphNode.uuid, outageResult.outageStations,
|
|
359
|
+
wnFeeder.normalEnergizedConnectivityNodes, graph,
|
|
360
|
+
combinedSwitchActions, slackUUIDs);
|
|
361
|
+
switchActionsFullyReenergised.push(...switchEvalResults.filter(elem => elem.type === 2));
|
|
362
|
+
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
for (const action of switchActionsFullyReenergised) {
|
|
368
|
+
console.log('\tActions ' + action.switchObjects);
|
|
369
|
+
const outageObjects: string[] = action.outageResult.outageObjects;
|
|
370
|
+
if (outageObjects.length) {
|
|
371
|
+
const faultCN = cimModel.getConnectivityNode(outageObjects[0]) as unknown as WNConnectivityNode;
|
|
372
|
+
|
|
373
|
+
const outageNew = new WNOutage(generateUUID(), `Ausfall-${faultCN.name}`, `${wnFeeder.shortName}`, '', wnFeeder.baseIRI);
|
|
374
|
+
insertSPARQL.push(outageNew.createNewStatementSPARQL());
|
|
375
|
+
/** Equipments */
|
|
376
|
+
for (const object of wnFeeder.additionalGroupedEquipment.values()) {
|
|
377
|
+
if (object instanceof ConductingEquipment) {
|
|
378
|
+
insertSPARQL.push(outageNew.addOutageIsolationEquipment(object as ConductingEquipment));
|
|
379
|
+
|
|
380
|
+
} else if (object instanceof WNConnectivityNode) {
|
|
381
|
+
insertSPARQL.push(outageNew.addOutageIsolationConnectivityNodes(object as WNConnectivityNode));
|
|
382
|
+
} else if (object instanceof EVTerminal) {
|
|
383
|
+
// TBD
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/** WNConnectivityNodes */
|
|
388
|
+
for (const object of wnFeeder.normalEnergizedConnectivityNodes.values()) {
|
|
389
|
+
insertSPARQL.push(outageNew.addOutageIsolationConnectivityNodes(object));
|
|
390
|
+
}
|
|
391
|
+
/** Fault */
|
|
392
|
+
const cnFaultNew = new WNFaultConnectivityNode(generateUUID(), `Ausfall-${faultCN.name}`, '', '', wnFeeder.baseIRI);
|
|
393
|
+
insertSPARQL.push(cnFaultNew.createNewStatementSPARQL());
|
|
394
|
+
|
|
395
|
+
insertSPARQL.push(cnFaultNew.setConnectivityNode(faultCN));
|
|
396
|
+
insertSPARQL.push(cnFaultNew.setOutage(outageNew));
|
|
397
|
+
|
|
398
|
+
/** SwitchingPlan */
|
|
399
|
+
// de-energise
|
|
400
|
+
/* const switchingPlanDeEnergise = createSwitchingPlan(generateUUID(), wnFeeder.baseIRI, `Schaltmaßnahme-Ausfall`, -1, 'de-energise', outageNew, insertSPARQL);
|
|
401
|
+
const switchingActionDeEnergise = createTerminalAction(generateUUID(), wnFeeder.baseIRI, `Schaltung-Ausfall`, SwitchActionKind.open, switchingPlanDeEnergise, insertSPARQL);
|
|
402
|
+
insertSPARQL.push(switchingActionDeEnergise.addTerminal(headTerminal as EVTerminal));
|
|
403
|
+
//restore
|
|
404
|
+
const switchingPlanRestore = createSwitchingPlan(generateUUID(), wnFeeder.baseIRI, `Schaltmaßnahme-Restore`, 0, 'restore', outageNew, insertSPARQL);
|
|
405
|
+
const switchingActionRestore = createTerminalAction(generateUUID(), wnFeeder.baseIRI, `Schaltung-Restore`, SwitchActionKind.close, switchingPlanRestore, insertSPARQL);
|
|
406
|
+
insertSPARQL.push(switchingActionRestore.addTerminal(headTerminal as EVTerminal));*/
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
graphNode.inService = true;
|
|
412
|
+
}
|
|
413
|
+
/** 2 Schaltmaßnahmen */
|
|
414
|
+
|
|
415
|
+
//Lege einen N-1 Fall an, wenn es Schaltmaßnahmen exisitieren
|
|
416
|
+
|
|
417
|
+
/* for (const aa of switchActionsFullyReenergised) {
|
|
418
|
+
|
|
419
|
+
}
|
|
420
|
+
if (disconnectedTerminalCNs.length || disconnectedTerminalCEs.length) {
|
|
421
|
+
const faultCN = headTerminal.connectivityNode as WNConnectivityNode;
|
|
422
|
+
const outageNew = new WNOutage(generateUUID(), `Ausfall-${faultCN.name}`, `${wnFeeder.shortName}`, '', wnFeeder.baseIRI);
|
|
423
|
+
insertSPARQL.push(outageNew.createNewStatementSPARQL());
|
|
424
|
+
|
|
425
|
+
/!** Equipments *!/
|
|
426
|
+
for (const object of wnFeeder.additionalGroupedEquipment.values()) {
|
|
427
|
+
if (object instanceof ConductingEquipment) {
|
|
428
|
+
insertSPARQL.push(outageNew.addOutageIsolationEquipment(object as ConductingEquipment));
|
|
429
|
+
|
|
430
|
+
} else if (object instanceof WNConnectivityNode) {
|
|
431
|
+
insertSPARQL.push(outageNew.addOutageIsolationConnectivityNodes(object as WNConnectivityNode));
|
|
432
|
+
} else if (object instanceof EVTerminal) {
|
|
433
|
+
// TBD
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/!** WNConnectivityNodes *!/
|
|
437
|
+
for (const object of wnFeeder.normalEnergizedConnectivityNodes.values()) {
|
|
438
|
+
insertSPARQL.push(outageNew.addOutageIsolationConnectivityNodes(object));
|
|
439
|
+
}
|
|
440
|
+
//Fault
|
|
441
|
+
const cnFaultNew = new WNFaultConnectivityNode(generateUUID(), `Ausfall-${faultCN.name}`, '', '', wnFeeder.baseIRI);
|
|
442
|
+
insertSPARQL.push(cnFaultNew.createNewStatementSPARQL());
|
|
443
|
+
|
|
444
|
+
insertSPARQL.push(cnFaultNew.setConnectivityNode(faultCN));
|
|
445
|
+
insertSPARQL.push(cnFaultNew.setOutage(outageNew));
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
//SwitchingPlan
|
|
449
|
+
// de-energise
|
|
450
|
+
const switchingPlanDeEnergise = createSwitchingPlan(generateUUID(), wnFeeder.baseIRI, `Schaltmaßnahme-Ausfall`, -1, 'de-energise', outageNew, insertSPARQL);
|
|
451
|
+
const switchingActionDeEnergise = createTerminalAction(generateUUID(), wnFeeder.baseIRI, `Schaltung-Ausfall`, SwitchActionKind.open, switchingPlanDeEnergise, insertSPARQL);
|
|
452
|
+
insertSPARQL.push(switchingActionDeEnergise.addTerminal(headTerminal as EVTerminal));
|
|
453
|
+
//restore
|
|
454
|
+
const switchingPlanRestore = createSwitchingPlan(generateUUID(), wnFeeder.baseIRI, `Schaltmaßnahme-Restore`, 0, 'restore', outageNew, insertSPARQL);
|
|
455
|
+
const switchingActionRestore = createTerminalAction(generateUUID(), wnFeeder.baseIRI, `Schaltung-Restore`, SwitchActionKind.close, switchingPlanRestore, insertSPARQL);
|
|
456
|
+
insertSPARQL.push(switchingActionRestore.addTerminal(headTerminal as EVTerminal));
|
|
457
|
+
|
|
458
|
+
// Schaltmaßnahmen von den CNs
|
|
459
|
+
for (let i = 0; i < disconnectedTerminalCNs.length; i++) {
|
|
460
|
+
const terminal = disconnectedTerminalCNs[i];
|
|
461
|
+
const switchingPlanEnergise = createSwitchingPlan(generateUUID(), wnFeeder.baseIRI, `Schaltmaßnahme-Energise`, (i + 1), 'energise', outageNew, insertSPARQL);
|
|
462
|
+
const switchingActionEnergise = createTerminalAction(generateUUID(), wnFeeder.baseIRI, `Schaltung-${terminal.connectivityNode.name}`, SwitchActionKind.close, switchingPlanEnergise, insertSPARQL);
|
|
463
|
+
insertSPARQL.push(switchingActionEnergise.addTerminal(terminal));
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Schaltmaßnahmen von den CEs
|
|
467
|
+
for (let i = 0; i < disconnectedTerminalCEs.length; i++) {
|
|
468
|
+
const terminal = disconnectedTerminalCEs[i];
|
|
469
|
+
const switchingPlanEnergise = createSwitchingPlan(generateUUID(), wnFeeder.baseIRI, `Schaltmaßnahme-Energise`, (i + 1), 'energise', outageNew, insertSPARQL);
|
|
470
|
+
const switchingActionEnergise = createTerminalAction(generateUUID(), wnFeeder.baseIRI, `Schaltung-${terminal.connectivityNode.name}`, SwitchActionKind.close, switchingPlanEnergise, insertSPARQL);
|
|
471
|
+
insertSPARQL.push(switchingActionEnergise.addTerminal(terminal));
|
|
472
|
+
}
|
|
473
|
+
}*/
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return insertSPARQL;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export function createSwitchingPlan(uuid: string, baseIRI: string, name: string, rank: any, purpose: string, outage: IOutage, insertSPARQL: string[]): SwitchingPlan {
|
|
481
|
+
const switchingPlan = new SwitchingPlan(uuid, name, '', '', baseIRI);
|
|
482
|
+
// switchingPlanNew.rank undefined
|
|
483
|
+
// console.log(switchingPlan.createNewStatementSPARQL());
|
|
484
|
+
insertSPARQL.push(switchingPlan.createNewStatementSPARQL());
|
|
485
|
+
if (rank) insertSPARQL.push(switchingPlan.setRank(rank));
|
|
486
|
+
if (purpose) insertSPARQL.push(switchingPlan.setPurpose(purpose));
|
|
487
|
+
insertSPARQL.push(switchingPlan.setOutage(outage));
|
|
488
|
+
|
|
489
|
+
return switchingPlan;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
export function createTerminalAction(uuid: string, baseIRI: string, name: string, kind: SwitchActionKind, switchingPlan: SwitchingPlan, insertSPARQL: string[]): EVTerminalAction {
|
|
493
|
+
const switchingActionNew = new EVTerminalAction(uuid, name, '', '', baseIRI);
|
|
494
|
+
insertSPARQL.push(switchingActionNew.createNewStatementSPARQL());
|
|
495
|
+
insertSPARQL.push(switchingActionNew.setKind(kind));
|
|
496
|
+
insertSPARQL.push(switchingActionNew.setSwitchingPlan(switchingPlan));
|
|
497
|
+
return switchingActionNew;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/** Bestimmt, ob aussgefallene substations durch die übergenen Maßnahmen wiederversorgt werden können */
|
|
501
|
+
export function getPartiallySwitchingActionForSubstations(substations: Node[], partiallySwitchActions: SwitchEvalResult[]): SwitchEvalResult[] {
|
|
502
|
+
return partiallySwitchActions.filter(elem => {
|
|
503
|
+
const feededSubstations: Map<string, Node[]> = elem.outageResult.feededStations;
|
|
504
|
+
for (const feededNodes of feededSubstations.values()) {
|
|
505
|
+
if (feededNodes.indexOf(substations[0]) !== -1) {
|
|
506
|
+
return elem;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
export function getArrayCombination(row: number, col: number, data: SwitchEvalResult[][], oldCombination: string[], results: string[][]) {
|
|
514
|
+
const newCombination = [...oldCombination, ...data[row][col].switchObjects];
|
|
515
|
+
|
|
516
|
+
if (row === data.length - 1) {
|
|
517
|
+
//console.log(newCombination);
|
|
518
|
+
results.push(newCombination)
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
if (row < data.length - 1) {
|
|
522
|
+
getArrayCombination(row + 1, 0, data, newCombination, results);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
if (col < data[row].length - 1) {
|
|
526
|
+
getArrayCombination(row, col + 1, data, oldCombination, results);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
export function addNewRepairActions(repairActions: string[][], newRepairActions: string[][]) {
|
|
531
|
+
|
|
532
|
+
for (const newRepairAction of newRepairActions) {
|
|
533
|
+
if (!arrayContains(repairActions, newRepairAction)) {
|
|
534
|
+
repairActions.push(newRepairAction);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
function arrayContains(arrays: string[][], b: string[]) {
|
|
541
|
+
for (const a of arrays) {
|
|
542
|
+
if (arraysEqual(a, b)) {
|
|
543
|
+
return true;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function arraysEqual(a: string[], b: string[]): boolean {
|
|
550
|
+
if (a === b) return true;
|
|
551
|
+
if (a == null || b == null) return false;
|
|
552
|
+
if (a.length !== b.length) return false;
|
|
553
|
+
|
|
554
|
+
for (let i = 0; i < a.length; ++i) {
|
|
555
|
+
if (a[i] !== b[i]) return false;
|
|
556
|
+
}
|
|
557
|
+
return true;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
function addSwitchTerminalToSwitchAction(trm1: ITerminal, trm2: ITerminal, swtch: Switch): IdentifiedObject[] {
|
|
561
|
+
const switchArray = [];
|
|
562
|
+
if (!trm1.isClosed()) switchArray.push(trm1);
|
|
563
|
+
if (!swtch.isClosed()) switchArray.push(swtch);
|
|
564
|
+
if (!trm2.isClosed()) switchArray.push(trm2);
|
|
565
|
+
return switchArray;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export function sort2DArray(array: string[][]) {
|
|
569
|
+
for (let _i = 0; _i < array.length; _i++) {
|
|
570
|
+
array[_i].sort();
|
|
571
|
+
}
|
|
572
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Edge } from '../edges/edge';
|
|
2
|
+
import { Node } from '../nodes/Node';
|
|
3
|
+
|
|
4
|
+
export class Connection {
|
|
5
|
+
uuid: string;
|
|
6
|
+
connected: boolean;
|
|
7
|
+
node: Node;
|
|
8
|
+
edge: Edge;
|
|
9
|
+
visited: boolean = false;
|
|
10
|
+
|
|
11
|
+
constructor(uuid: string, connected: boolean, node: Node, edge: Edge) {
|
|
12
|
+
this.uuid = uuid;
|
|
13
|
+
this.connected = connected;
|
|
14
|
+
this.node = node;
|
|
15
|
+
this.edge = edge;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
canPassThrough(): boolean {
|
|
19
|
+
return this.connected;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* isSlackReachable() {
|
|
23
|
+
if (this.connected && !this.visited) {
|
|
24
|
+
this.visited = true;
|
|
25
|
+
this.node.isSlackReachable();
|
|
26
|
+
this.edge.isSlackReachable();
|
|
27
|
+
}
|
|
28
|
+
}*/
|
|
29
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Type } from '../Types';
|
|
2
|
+
import { GraphObject } from '../nodes/node';
|
|
3
|
+
|
|
4
|
+
export class Edge extends GraphObject {
|
|
5
|
+
type: Type;
|
|
6
|
+
open: boolean;
|
|
7
|
+
|
|
8
|
+
constructor(uuid: string, type: Type, open: boolean) {
|
|
9
|
+
super(uuid);
|
|
10
|
+
this.type = type;
|
|
11
|
+
this.open = open;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
canPassThrough(): boolean {
|
|
15
|
+
return this.open === true ? false : true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* isSlackReachable() {
|
|
19
|
+
if (this.closed && !this.visited) {
|
|
20
|
+
this.visited = true;
|
|
21
|
+
for (const term of this.terminals.values()) {
|
|
22
|
+
term.isSlackReachable();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}*/
|
|
26
|
+
|
|
27
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Node } from './nodes/node';
|
|
2
|
+
|
|
3
|
+
export interface ResultBFS {
|
|
4
|
+
found: boolean;
|
|
5
|
+
nodesVisited: Node [];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface SwitchEvalResult {
|
|
9
|
+
switchObjects: string []; // ID des Schaltobjektes
|
|
10
|
+
/** 0 -> keine Wiederversorgung
|
|
11
|
+
* 1 -> partielle Wiederversorgung
|
|
12
|
+
* 2 -> vollständige Wiederversorgung */
|
|
13
|
+
type: number;
|
|
14
|
+
outageResult: OutageResult, // Ergebnis mit durchgefühter Schaltmaßnahme
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface OutageResult {
|
|
18
|
+
outageObjects: string []; // IDs der Ausfallobjekte (z.B. Trennschalter und Station)
|
|
19
|
+
outageStations: Map<string, Node[]>; // nicht versorgte Stationen
|
|
20
|
+
feededStations: Map<string, Node[]>; // versorgte Stationen
|
|
21
|
+
}
|