diff --git a/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModification.java b/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModification.java index b63f423f..31503b19 100644 --- a/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModification.java +++ b/src/main/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModification.java @@ -376,6 +376,14 @@ private static void setPhaseTapChangerRegulationAttributes(PhaseTapChanger phase // the order is important if regulation mode is set and regulation value or target dead band is null it will crash PhaseTapChanger.RegulationMode regulationMode = regulationModeModification == null ? null : regulationModeModification.getValue(); String fieldName = (regulationMode == CURRENT_LIMITER) ? "Value" : "Flow set point"; + // TODO implement some entity to modify all element at once in powsybl core/network store + // it is a fix to avoid to set regulation value to negative before setting regulation mode to ACTIVE_POWER_CONTROL + // so if a new mode is set, regulating is first set to false to pass all check and finally set to its true value + boolean previousRegulatingValue = isModification && phaseTapChanger.isRegulating(); + if (isModification && phaseTapChanger.isRegulating()) { + phaseTapChanger.setRegulating(false); + } + // Regulation value ReportNode regulationValueReportNode = ModificationUtils.getInstance().applyElementaryModificationsAndReturnReport( isModification ? phaseTapChanger::setRegulationValue : phaseTapChangerAdder::setRegulationValue, @@ -405,11 +413,15 @@ private static void setPhaseTapChangerRegulationAttributes(PhaseTapChanger phase // Regulating ReportNode regulatingReportNode = ModificationUtils.getInstance().applyElementaryModificationsAndReturnReport( isModification ? phaseTapChanger::setRegulating : phaseTapChangerAdder::setRegulating, - isModification ? phaseTapChanger::isRegulating : () -> null, + isModification ? () -> previousRegulatingValue : () -> null, regulatingModification, "Phase tap regulating"); if (regulationReports != null && regulatingReportNode != null) { regulationReports.add(regulatingReportNode); } + // fix because can not modify several elements at once + if (isModification && regulatingModification == null && previousRegulatingValue) { + phaseTapChanger.setRegulating(true); + } } private void processRatioTapChanger(Network network, diff --git a/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModificationTest.java b/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModificationTest.java index d350bd68..7781bc4d 100644 --- a/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModificationTest.java +++ b/src/test/java/org/gridsuite/modification/modifications/TwoWindingsTransformerModificationTest.java @@ -1023,5 +1023,42 @@ void testProcessPhaseTapChangerRegulationModification() { regulationActivePowerControlModeModification, regulationValueModification, null, regulatingModification, regulationReports)); } + @Test + void testProcessPhaseTapChangerRegulationModificationWithRegulating() { + TwoWindingsTransformer twt = createTwoWindingsTransformer(getNetwork().getSubstation("s1"), "trf3", "trf3", 2.0, 14.745, 0.0, 3.2E-5, 400.0, 225.0, + 41, 151, getNetwork().getVoltageLevel("v1").getId(), getNetwork().getVoltageLevel("v2").getId(), + "trf3", 1, ConnectablePosition.Direction.TOP, + "trf3", 2, ConnectablePosition.Direction.TOP); + PhaseTapChangerAdder adder = twt.newPhaseTapChanger(); + preparePhaseTapChangerAdder(adder); + adder.add(); + PhaseTapChanger phaseTapChanger = twt.getPhaseTapChanger(); + + phaseTapChanger.setRegulationValue(100); + phaseTapChanger.setTargetDeadband(0); + phaseTapChanger.setRegulationMode(PhaseTapChanger.RegulationMode.CURRENT_LIMITER); + phaseTapChanger.setRegulating(true); + + List regulationReports = new ArrayList<>(); + AttributeModification regulationActivePowerControlModeModification = new AttributeModification<>( + PhaseTapChanger.RegulationMode.ACTIVE_POWER_CONTROL, OperationType.SET); + AttributeModification regulationValueModification = new AttributeModification<>(-100.0, OperationType.SET); + + processPhaseTapRegulation(phaseTapChanger, null, true, + regulationActivePowerControlModeModification, regulationValueModification, null, null, regulationReports); + assertEquals(-100.0, phaseTapChanger.getRegulationValue()); + assertEquals(PhaseTapChanger.RegulationMode.ACTIVE_POWER_CONTROL, phaseTapChanger.getRegulationMode()); + assertTrue(phaseTapChanger.isRegulating()); + + AttributeModification regulationCurrentLimiterModeModification = new AttributeModification<>( + PhaseTapChanger.RegulationMode.CURRENT_LIMITER, OperationType.SET); + AttributeModification regulationValueModification2 = new AttributeModification<>(100.0, OperationType.SET); + processPhaseTapRegulation(phaseTapChanger, null, true, + regulationCurrentLimiterModeModification, regulationValueModification2, null, null, regulationReports); + assertEquals(100.0, phaseTapChanger.getRegulationValue()); + assertEquals(PhaseTapChanger.RegulationMode.CURRENT_LIMITER, phaseTapChanger.getRegulationMode()); + assertTrue(phaseTapChanger.isRegulating()); + } + }