Skip to content

Commit

Permalink
CGMES EQ export fixes (#2528)
Browse files Browse the repository at this point in the history
CGMES EQ export fixes (#2528)

* Fix tculControlMode in CGMES export: it is a reference and not a field
* Add SynchronousMachine.type attribute
* LinearShuntCompensator.gPerSection is not optional
* Add WindGeneratingUnit.windGenUnitType attribute
* Fix `stepVoltageIncrement` to not be infinite

Signed-off-by: VEDELAGO MIORA <miora.ralambotiana@rte-france.com>
  • Loading branch information
miovd authored Apr 13, 2023
1 parent 7d8ff7f commit 798ac92
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,12 @@ private static <C extends Connectable<C>> void writeRatioTapChanger(C eq, RatioT
String cgmesTapChangerId = context.getNamingStrategy().getCgmesIdFromAlias(eq, aliasType);

int neutralStep = getRatioTapChangerNeutralStep(rtc);
double stepVoltageIncrement = 100.0 * (1.0 / rtc.getStep(rtc.getLowTapPosition()).getRho() - 1.0) / (rtc.getLowTapPosition() - neutralStep);
double stepVoltageIncrement;
if (rtc.getHighTapPosition() == rtc.getLowTapPosition()) {
stepVoltageIncrement = 100;
} else {
stepVoltageIncrement = 100.0 * (1.0 / rtc.getStep(rtc.getLowTapPosition()).getRho() - 1.0 / rtc.getStep(rtc.getHighTapPosition()).getRho()) / (rtc.getLowTapPosition() - rtc.getHighTapPosition());
}
String ratioTapChangerTableId = CgmesExportUtil.getUniqueId();
Optional<String> regulatingControlId = getTapChangerControlId(eq, tapChangerId);
String cgmesRegulatingControlId = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,14 @@

import com.powsybl.cgmes.conversion.export.CgmesExportContext;
import com.powsybl.cgmes.conversion.export.CgmesExportUtil;
import com.powsybl.cgmes.model.CgmesNames;
import com.powsybl.iidm.network.EnergySource;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import static com.powsybl.cgmes.model.CgmesNamespace.RDF_NAMESPACE;

/**
* @author Marcos de Miguel <demiguelm at aia.es>
*/
Expand All @@ -39,6 +42,10 @@ public static void write(String id, String generatingUnitName, EnergySource ener
if (equipmentContainer != null) {
CgmesExportUtil.writeReference("Equipment.EquipmentContainer", equipmentContainer, cimNamespace, writer, context);
}
if (energySource == EnergySource.WIND) {
writer.writeEmptyElement(cimNamespace, "WindGeneratingUnit.windGenUnitType");
writer.writeAttribute(RDF_NAMESPACE, CgmesNames.RESOURCE, String.format("%s%s", cimNamespace, "WindGenUnitKind.onshore")); // all generators are considered onshore
}
writer.writeEndElement();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,13 @@ public static void write(String id, String shuntCompensatorName, int normalSecti
writer.writeCharacters(CgmesExportUtil.format(bPerSection));
}
writer.writeEndElement();
writer.writeStartElement(cimNamespace, EQ_LINEARSHUNTCOMPENSATOR_GPERSECTION);
if (!Double.isNaN(gPerSection)) {
writer.writeStartElement(cimNamespace, EQ_LINEARSHUNTCOMPENSATOR_GPERSECTION);
writer.writeCharacters(CgmesExportUtil.format(gPerSection));
writer.writeEndElement();
} else {
writer.writeCharacters("0");
}
writer.writeEndElement();
}
if (regulatingControlId != null) {
CgmesExportUtil.writeReference("RegulatingCondEq.RegulatingControl", regulatingControlId, cimNamespace, writer, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@

import com.powsybl.cgmes.conversion.export.CgmesExportContext;
import com.powsybl.cgmes.conversion.export.CgmesExportUtil;
import com.powsybl.cgmes.model.CgmesNames;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import static com.powsybl.cgmes.model.CgmesNamespace.RDF_NAMESPACE;

/**
* @author Marcos de Miguel <demiguelm at aia.es>
*/
Expand Down Expand Up @@ -39,6 +42,8 @@ public static void write(String id, String generatorName, String equipmentContai
writer.writeCharacters(CgmesExportUtil.format(ratedS));
writer.writeEndElement();
}
writer.writeEmptyElement(cimNamespace, "SynchronousMachine.type");
writer.writeAttribute(RDF_NAMESPACE, CgmesNames.RESOURCE, String.format("%s%s", cimNamespace, "SynchronousMachineKind.generator")); // all generators are considered generators
writer.writeEndElement();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,8 @@ public static void writeRatio(String id, String tapChangerName, String transform
writer.writeCharacters(CgmesExportUtil.format(stepVoltageIncrement));
writer.writeEndElement();
writeSteps(lowStep, highStep, neutralStep, normalStep, neutralU, ltcFlag, cimNamespace, writer);
writer.writeStartElement(cimNamespace, "RatioTapChanger.tculControlMode");
writer.writeCharacters(String.format("%s%s.%s", cimNamespace, "TransformerControlMode", controlMode));
writer.writeEndElement();
writer.writeEmptyElement(cimNamespace, "RatioTapChanger.tculControlMode");
writer.writeAttribute(RDF_NAMESPACE, CgmesNames.RESOURCE, String.format("%s%s.%s", cimNamespace, "TransformerControlMode", controlMode));
CgmesExportUtil.writeReference(EQ_RATIOTAPCHANGER_RATIOTAPCHANGERTABLE, ratioTapChangerTableId, cimNamespace, writer, context);
if (cgmesRegulatingControlId != null) {
CgmesExportUtil.writeReference("TapChanger.TapChangerControl", cgmesRegulatingControlId, cimNamespace, writer, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ void testFromIidm() throws IOException {
Network network = FictitiousSwitchFactory.create();
VoltageLevel vl = network.getVoltageLevel("C");

// set as WIND generator
network.getGenerator("CB").setEnergySource(EnergySource.WIND);

// Add disconnected node on switch (side 2)
vl.getNodeBreakerView().newSwitch().setId("TEST_SW")
.setKind(SwitchKind.DISCONNECTOR)
Expand Down

0 comments on commit 798ac92

Please sign in to comment.