Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public HvdcRangeActionCreator(Crac crac, Network network, List<Contingency> cont
this.cimCracCreationParameters = cimCracCreationParameters;
}

public void addDirection(RemedialActionSeries remedialActionSeries) {
public void addDirection(RemedialActionSeries remedialActionSeries, String applicationModeMarketObjectStatus) {
raSeriesIds.add(remedialActionSeries.getMRID());

try {
Expand All @@ -87,7 +87,7 @@ public void addDirection(RemedialActionSeries remedialActionSeries) {
}
networkElementIds.add(networkElementId);

checkHvdcNetworkElementAndInitAdder(registeredResource, networkElementId);
checkHvdcNetworkElementAndInitAdder(registeredResource, networkElementId, applicationModeMarketObjectStatus);
isRemedialActionSeriesInverted = readRangeAndCheckIfInverted(isRemedialActionSeriesInverted, registeredResource, networkElementId);
}

Expand Down Expand Up @@ -117,14 +117,14 @@ private Boolean readRangeAndCheckIfInverted(Boolean isRemedialActionSeriesInvert
}
}

private void checkHvdcNetworkElementAndInitAdder(RemedialActionRegisteredResource registeredResource, String networkElementId) {
private void checkHvdcNetworkElementAndInitAdder(RemedialActionRegisteredResource registeredResource, String networkElementId, String applicationModeMarketObjectStatus) {
checkHvdcNetworkElement(networkElementId);
HvdcLine hvdcLine = network.getHvdcLine(networkElementId);

boolean terminal1Connected = hvdcLine.getConverterStation1().getTerminal().isConnected();
boolean terminal2Connected = hvdcLine.getConverterStation2().getTerminal().isConnected();
if (terminal1Connected && terminal2Connected) {
hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource));
hvdcRangeActionAdders.putIfAbsent(networkElementId, initHvdcRangeActionAdder(registeredResource, applicationModeMarketObjectStatus));
} else {
isAltered = true;
importStatusDetailifIsAltered = String.format("HVDC line %s has ", hvdcLine.getId());
Expand Down Expand Up @@ -197,7 +197,7 @@ public Set<RemedialActionSeriesCreationContext> add() {
return raSeriesIds.stream().map(id -> RemedialActionSeriesCreationContext.importedHvdcRa(id, createdRaIds, isAltered, isDirectionInverted.get(id), importStatusDetailifIsAltered)).collect(Collectors.toSet());
}

private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredResource registeredResource) {
private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredResource registeredResource, String applicationModeMarketObjectStatus) {
HvdcRangeActionAdder hvdcRangeActionAdder = crac.newHvdcRangeAction();
String hvdcId = registeredResource.getMRID().getValue();
hvdcRangeActionAdder.withNetworkElement(hvdcId);
Expand All @@ -215,7 +215,7 @@ private HvdcRangeActionAdder initHvdcRangeActionAdder(RemedialActionRegisteredRe
}

// Usage rules
RemedialActionSeriesCreator.addUsageRules(crac, CimConstants.ApplicationModeMarketObjectStatus.AUTO.getStatus(), hvdcRangeActionAdder, contingencies, invalidContingencies, cnecs, sharedDomain);
RemedialActionSeriesCreator.addUsageRules(crac, applicationModeMarketObjectStatus, hvdcRangeActionAdder, contingencies, invalidContingencies, cnecs, sharedDomain);

return hvdcRangeActionAdder;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ private boolean identifyAndReadHvdcRangeAction(RemedialActionSeries remedialActi
String applicationModeMarketObjectStatus = remedialActionSeries.getApplicationModeMarketObjectStatusStatus();
for (RemedialActionRegisteredResource remedialActionRegisteredResource : remedialActionRegisteredResources) {
if (remedialActionRegisteredResource.getPSRTypePsrType().equals(PsrType.HVDC.getStatus())) {
if (!applicationModeMarketObjectStatus.equals(ApplicationModeMarketObjectStatus.AUTO.getStatus())) {
if (!applicationModeMarketObjectStatus.equals(ApplicationModeMarketObjectStatus.AUTO.getStatus()) && !applicationModeMarketObjectStatus.equals(ApplicationModeMarketObjectStatus.PRA.getStatus())) {
remedialActionSeriesCreationContexts.add(RemedialActionSeriesCreationContext.notImported(remedialActionSeries.getMRID(), ImportStatus.INCONSISTENCY_IN_DATA, String.format("HVDC cannot be imported at instant %s", applicationModeMarketObjectStatus)));
return true;
}
Expand All @@ -324,7 +324,7 @@ private boolean identifyAndReadHvdcRangeAction(RemedialActionSeries remedialActi
crac, network,
contingencies, invalidContingencies, cnecs, sharedDomain, cimCracCreationParameters);
}
hvdcRangeActionCreator.addDirection(remedialActionSeries);
hvdcRangeActionCreator.addDirection(remedialActionSeries, applicationModeMarketObjectStatus);
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1237,4 +1237,29 @@ void testImportHvdcAutomatonWithPartiallyConnectedHvdc2AndInvalidContingencies()
assert cracCreationContext.getCreationReport().getReport().contains("[ALTERED] RemedialAction_Series \"HVDC-direction12\" was modified: HVDC line BBE2AA12 FFR3AA12 1 has terminals 1 and 2 disconnected; Contingencies Co-2 were not imported. ");
assert cracCreationContext.getCreationReport().getReport().contains("[ALTERED] RemedialAction_Series \"HVDC-direction11\" was modified: HVDC line BBE2AA12 FFR3AA12 1 has terminals 1 and 2 disconnected; Contingencies Co-2 were not imported. ");
}

@Test
void importCimCracWithPreventiveHvdcRa() throws IOException {
Network network = loadNetworkWithHvdc();
setUpWithSpeed("/cracs/CIM_with_preventive_HVDC.xml", network, OffsetDateTime.parse("2021-04-01T23:00Z"), Set.of(new RangeActionSpeed("BBE2AA11 FFR3AA11 1", 1), new RangeActionSpeed("BBE2AA12 FFR3AA12 1", 2)));
Crac crac = cracCreationContext.getCrac();

assertEquals(2, crac.getHvdcRangeActions().size());

HvdcRangeAction hvdcRangeAction1 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA11 FFR3AA11 1");
assertEquals(1, hvdcRangeAction1.getRanges().size());
assertEquals(-4000, hvdcRangeAction1.getRanges().iterator().next().getMin());
assertEquals(5000, hvdcRangeAction1.getRanges().iterator().next().getMax());
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction1.getGroupId());
assertEquals(1, hvdcRangeAction1.getUsageRules().size());
assertEquals("preventive", hvdcRangeAction1.getUsageRules().iterator().next().getInstant().getId());

HvdcRangeAction hvdcRangeAction2 = crac.getHvdcRangeAction("HVDC-direction11 + HVDC-direction12 - BBE2AA12 FFR3AA12 1");
assertEquals(1, hvdcRangeAction2.getRanges().size());
assertEquals(-3000, hvdcRangeAction2.getRanges().iterator().next().getMin());
assertEquals(3500, hvdcRangeAction2.getRanges().iterator().next().getMax());
assertEquals(Optional.of("BBE2AA11 FFR3AA11 1 + BBE2AA12 FFR3AA12 1"), hvdcRangeAction2.getGroupId());
assertEquals(1, hvdcRangeAction2.getUsageRules().size());
assertEquals("preventive", hvdcRangeAction2.getUsageRules().iterator().next().getInstant().getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
<?xml version="1.0" encoding="UTF-8"?>
<CRAC_MarketDocument xmlns="urn:iec62325.351:tc57wg16:451-n:CRACdocument:2:3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iec62325.351:tc57wg16:451-n:CRACdocument:2:3 iec62325-451-n-crac_v2_3.xsd">
<mRID>CIM_CRAC_DOCUMENT</mRID>
<revisionNumber>1</revisionNumber>
<type>B15</type>
<process.processType>A48</process.processType>
<sender_MarketParticipant.mRID codingScheme="A01">FAKE</sender_MarketParticipant.mRID>
<sender_MarketParticipant.marketRole.type>A36</sender_MarketParticipant.marketRole.type>
<receiver_MarketParticipant.mRID codingScheme="A01">FAKE</receiver_MarketParticipant.mRID>
<receiver_MarketParticipant.marketRole.type>A04</receiver_MarketParticipant.marketRole.type>
<createdDateTime>2021-03-31T15:02:00Z</createdDateTime>
<status>
<value>A42</value>
</status>
<time_Period.timeInterval>
<start>2021-04-01T22:00Z</start>
<end>2021-04-02T22:00Z</end>
</time_Period.timeInterval>
<domain.mRID codingScheme="A01">10YCB-FR-ES-PT-S</domain.mRID>
<TimeSeries>
<mRID>TimeSeries</mRID>
<businessType>B54</businessType>
<curveType>A03</curveType>
<in_Domain.mRID codingScheme="A01">1------0</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------0</out_Domain.mRID>
<Period>
<timeInterval>
<start>2021-04-01T22:00Z</start>
<end>2021-04-02T22:00Z</end>
</timeInterval>
<resolution>PT60M</resolution>
<Point>
<position>2</position>
<Series>
<mRID>Contingencies_1</mRID>
<businessType>B55</businessType>
<name>Contingencies_1</name>
<optimization_MarketObjectStatus.status>A52</optimization_MarketObjectStatus.status>
<Contingency_Series>
<mRID>Co-1</mRID>
<name>Contingency name</name>
<RegisteredResource>
<mRID codingScheme="A02">FFR1AA11 FFR3AA11 1</mRID>
<name>FFR1AA11 FFR3AA11 1</name>
<in_Domain.mRID codingScheme="A01">10YFR-RTE------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">10YFR-RTE------C</out_Domain.mRID>
</RegisteredResource>
</Contingency_Series>
</Series>
<Series>
<mRID>RA-Series-1</mRID>
<businessType>B56</businessType>
<name>HVDC valid range actions</name>
<optimization_MarketObjectStatus.status>A52</optimization_MarketObjectStatus.status>
<RemedialAction_Series>
<mRID>HVDC-direction11</mRID>
<name>HVDC-direction11-ra</name>
<businessType>B59</businessType>
<applicationMode_MarketObjectStatus.status>A18</applicationMode_MarketObjectStatus.status>
<availability_MarketObjectStatus.status>A39</availability_MarketObjectStatus.status>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA11 FFR3AA11 1</mRID>
<name>PMode on HVDC BE2 FR3 1</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C</out_Domain.mRID>
<marketObjectStatus.status>A43</marketObjectStatus.status>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA11 FFR3AA11 1</mRID>
<name>RangeAction on HVDC BE2 FR3 1</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C</out_Domain.mRID>
<in_AggregateNode.mRID codingScheme="A02">FFR3AA1</in_AggregateNode.mRID>
<out_AggregateNode.mRID codingScheme="A02">BBE2AA1</out_AggregateNode.mRID>
<marketObjectStatus.status>A26</marketObjectStatus.status>
<resourceCapacity.maximumCapacity>5000.0</resourceCapacity.maximumCapacity>
<resourceCapacity.minimumCapacity>0</resourceCapacity.minimumCapacity>
<resourceCapacity.defaultCapacity>500.0</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>MAW</resourceCapacity.unitSymbol>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA12 FFR3AA12 1</mRID>
<name>PMode on HVDC BE2 FR3 2</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C2</out_Domain.mRID>
<marketObjectStatus.status>A43</marketObjectStatus.status>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA12 FFR3AA12 1</mRID>
<name>RangeAction on HVDC BE2 FR3 2</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C</out_Domain.mRID>
<in_AggregateNode.mRID codingScheme="A02">FFR3AA1</in_AggregateNode.mRID>
<out_AggregateNode.mRID codingScheme="A02">BBE2AA1</out_AggregateNode.mRID>
<marketObjectStatus.status>A26</marketObjectStatus.status>
<resourceCapacity.maximumCapacity>3500.0</resourceCapacity.maximumCapacity>
<resourceCapacity.minimumCapacity>0</resourceCapacity.minimumCapacity>
<resourceCapacity.defaultCapacity>500.0</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>MAW</resourceCapacity.unitSymbol>
</RegisteredResource>
</RemedialAction_Series>
<RemedialAction_Series>
<mRID>HVDC-direction12</mRID>
<name>HVDC-direction12-ra</name>
<businessType>B59</businessType>
<applicationMode_MarketObjectStatus.status>A18</applicationMode_MarketObjectStatus.status>
<availability_MarketObjectStatus.status>A39</availability_MarketObjectStatus.status>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA11 FFR3AA11 1</mRID>
<name>PMode on HVDC BE2 FR3 1</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C</out_Domain.mRID>
<marketObjectStatus.status>A43</marketObjectStatus.status>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA11 FFR3AA11 1</mRID>
<name>RangeAction on HVDC BE2 FR3 1</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C</out_Domain.mRID>
<in_AggregateNode.mRID codingScheme="A02">BBE2AA1</in_AggregateNode.mRID>
<out_AggregateNode.mRID codingScheme="A02">FFR3AA1</out_AggregateNode.mRID>
<marketObjectStatus.status>A26</marketObjectStatus.status>
<resourceCapacity.maximumCapacity>4000.0</resourceCapacity.maximumCapacity>
<resourceCapacity.minimumCapacity>0</resourceCapacity.minimumCapacity>
<resourceCapacity.defaultCapacity>500.0</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>MAW</resourceCapacity.unitSymbol>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA12 FFR3AA12 1</mRID>
<name>PMode on HVDC BE2 FR3 2</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C</out_Domain.mRID>
<marketObjectStatus.status>A43</marketObjectStatus.status>
</RegisteredResource>
<RegisteredResource>
<mRID codingScheme="A02">BBE2AA12 FFR3AA12 1</mRID>
<name>RangeAction on HVDC BE2 FR3 2</name>
<pSRType.psrType>B22</pSRType.psrType>
<in_Domain.mRID codingScheme="A01">1------C</in_Domain.mRID>
<out_Domain.mRID codingScheme="A01">1------C</out_Domain.mRID>
<in_AggregateNode.mRID codingScheme="A02">BBE2AA1</in_AggregateNode.mRID>
<out_AggregateNode.mRID codingScheme="A02">FFR3AA1</out_AggregateNode.mRID>
<marketObjectStatus.status>A26</marketObjectStatus.status>
<resourceCapacity.maximumCapacity>3000.0</resourceCapacity.maximumCapacity>
<resourceCapacity.minimumCapacity>0</resourceCapacity.minimumCapacity>
<resourceCapacity.defaultCapacity>500.0</resourceCapacity.defaultCapacity>
<resourceCapacity.unitSymbol>MAW</resourceCapacity.unitSymbol>
</RegisteredResource>
</RemedialAction_Series>
</Series>
</Point>
</Period>
</TimeSeries>
</CRAC_MarketDocument>