public void AddPNMObject(PhysicalNetworkModel.RatioTapChanger tap) { var controlMrid = GUIDHelper.CreateDerivedGuid(Guid.Parse(tap.mRID), 55); string xml = "<cim:RatioTapChanger rdf:ID = '_" + tap.mRID + "'>\r\n"; xml += " <cim:RatioTapChanger.TransformerEnd rdf:resource='#_" + tap.TransformerEnd.@ref + "'/>\r\n"; //xml += " <cim:TapChanger.TapChangerControl rdf:resource='#_" + controlMrid.ToString() + "'/>\r\n"; xml += " <cim:IdentifiedObject.name>TAP</cim:IdentifiedObject.name>\r\n"; if (tap.neutralU != null) { xml += " <cim:TapChanger.neutralU>" + DoubleToString(tap.neutralU.Value / 1000) + "</cim:TapChanger.neutralU>\r\n"; } if (tap.neutralStep != null) { xml += " <cim:TapChanger.neutralStep>" + tap.neutralStep + "</cim:TapChanger.neutralStep>\r\n"; } if (tap.normalStep != null && tap.normalStep != "") { xml += " <cim:TapChanger.normalStep>" + tap.normalStep + "</cim:TapChanger.normalStep>\r\n"; } xml += " <cim:TapChanger.lowStep>" + tap.lowStep + "</cim:TapChanger.lowStep>\r\n"; xml += " <cim:TapChanger.highStep>" + tap.highStep + "</cim:TapChanger.highStep>\r\n"; xml += " <cim:TapChanger.ltcFlag>" + (tap.ltcFlag ? "true" : "false") + "</cim:TapChanger.ltcFlag>\r\n"; xml += " <cim:RatioTapChanger.tculControlMode rdf:resource='http://iec.ch/TC57/2013/CIM-schema-cim16#TransformerControlMode.volt'/>\r\n"; if (tap.stepVoltageIncrement != null) { xml += " <cim:RatioTapChanger.stepVoltageIncrement>" + DoubleToString(tap.stepVoltageIncrement.Value) + "</cim:RatioTapChanger.stepVoltageIncrement>\r\n"; } xml += "</cim:RatioTapChanger>\r\n\r\n"; _writer.Write(xml); /* * // Create regulating control if automatic * if (tap.ltcFlag) * { * * var ptEnd = _cimContext.GetObject<PhysicalNetworkModel.PowerTransformerEnd>(tap.TransformerEnd.@ref); * * xml = "<cim:TapChangerControl rdf:ID = '_" + controlMrid.ToString() + "'>\r\n"; * xml += " <cim:IdentifiedObject.name>Tab Controler</cim:IdentifiedObject.name>\r\n"; * xml += " <cim:RegulatingControl.mode rdf:resource='http://iec.ch/TC57/2013/CIM-schema-cim16#RegulatingControlModeKind.voltage' />\r\n"; * xml += " <cim:RegulatingControl.Terminal rdf:resource='#_" + ptEnd.Terminal.@ref + "'/>\r\n"; * * xml += "</cim:TapChangerControl>\r\n\r\n"; * } */ }
public void AddCurrentLimit(Guid terminalMrid, string name, double currentLimitValue) { // Limit set string xml = "<cim:OperationalLimitSet rdf:ID='_" + GUIDHelper.CreateDerivedGuid(terminalMrid, 750, true).ToString() + "'>\r\n"; xml += " <cim:IdentifiedObject.name>" + name + "_limitset</cim:IdentifiedObject.name>\r\n"; xml += " <cim:OperationalLimitSet.Terminal rdf:resource = '#_" + terminalMrid.ToString() + "'/>\r\n"; xml += "</cim:OperationalLimitSet>\r\n\r\n"; // Current xml += "<cim:CurrentLimit rdf:ID='_" + GUIDHelper.CreateDerivedGuid(terminalMrid, 760, true).ToString() + "'>\r\n"; xml += " <cim:OperationalLimit.OperationalLimitType rdf:resource='#_b05800c4-9744-45d8-8d9e-c1f39562e4fb' />\r\n"; xml += " <cim:IdentifiedObject.name>" + name + "_limit</cim:IdentifiedObject.name>\r\n"; xml += " <cim:OperationalLimit.OperationalLimitSet rdf:resource = '#_" + GUIDHelper.CreateDerivedGuid(terminalMrid, 750, true).ToString() + "'/>\r\n"; xml += " <cim:CurrentLimit.value>" + DoubleToString(currentLimitValue) + "</cim:CurrentLimit.value>\r\n"; xml += "</cim:CurrentLimit>\r\n\r\n"; _writer.Write(xml); }
public KonstantCimArchiveWriter(IEnumerable <PhysicalNetworkModel.IdentifiedObject> cimObjects, string outputFolder, string archiveName, Guid modelRdfId, bool highVoltageOnly = false) { System.IO.Directory.CreateDirectory(outputFolder); System.IO.Directory.CreateDirectory(outputFolder + "\\files"); CimContext initialContext = CimContext.Create(cimObjects); string eqTempFileName = outputFolder + @"\files\" + archiveName + "_eq.xml"; string glTempFileName = outputFolder + @"\files\" + archiveName + "_gl.xml"; string aiTempFileName = outputFolder + @"\files\" + archiveName + "_ai.xml"; string peTempFileName = outputFolder + @"\files\" + archiveName + "_pe.xml"; Dictionary <string, string> assetToEqRefs = new Dictionary <string, string>(); var filtered = FilterHelper.Filter(initialContext, new FilterRule() { MinVoltageLevel = highVoltageOnly ? 20000 : 10000, }); var mappingContext = new MappingContext(); // Reinitialize cim context to filtered objects CimContext _context = CimContext.Create(filtered); var converter = new PNM2PowerFactoryCimConverter(filtered, new List <IPreProcessor> { new ACLSMerger(mappingContext), new TransformerCableMerger(mappingContext), new KonstantBigEnergyConsumerHandler(mappingContext), new KonstantPowerFactoryDataPrepareAndFix(mappingContext) }); // Reinitialize cim context to converted objects var outputCimObjects = converter.GetCimObjects().ToList(); // We need to reinitialize context, because converter has modified objects _context = CimContext.Create(outputCimObjects); var eqWriter = new EQ_Writer(eqTempFileName, _context, mappingContext, modelRdfId, archiveName); eqWriter.ForceThreePhases = true; var glWriter = new GL_Writer(glTempFileName); var aiWriter = new AI_Writer(aiTempFileName, _context, mappingContext); var peWriter = new PE_Writer(peTempFileName, _context, mappingContext); ////////////////////// // do the lines var lineContext = new LineInfoContext(_context); //lineContext.CreateLineInfo(); Dictionary <SimpleLine, string> lineToGuid = new Dictionary <SimpleLine, string>(); foreach (var line in lineContext.GetLines()) { var lineGuid = GUIDHelper.CreateDerivedGuid(Guid.Parse(line.Children[0].Equipment.mRID), 678, true).ToString(); lineToGuid.Add(line, lineGuid); //eqWriter.AddLine(lineGuid, line.Name); } ////////////////////// // do the general cim objects foreach (var cimObject in _context.GetAllObjects()) { if (cimObject.name != null && cimObject.name.Contains("571313124501006982")) { } if (!(cimObject is Location) && !(cimObject is VoltageLevel && ((VoltageLevel)cimObject).BaseVoltage < 400)) { if (cimObject is ACLineSegment) { var acls = cimObject as ACLineSegment; var lines = lineContext.GetLines().Where(l => l.Children.Exists(c => c.Equipment == acls)).ToList(); if (lines.Count == 1) { var line = lines[0]; eqWriter.AddPNMObject(acls, lineToGuid[line]); } else { eqWriter.AddPNMObject((dynamic)cimObject); } } else { // Don't add things that goes into asset and protectionn file if (!( (cimObject is PhysicalNetworkModel.Asset) || (cimObject is PhysicalNetworkModel.AssetInfo) || (cimObject is PhysicalNetworkModel.ProductAssetModel) || (cimObject is PhysicalNetworkModel.Manufacturer) || (cimObject is CurrentTransformerExt) || (cimObject is PotentialTransformer) || (cimObject is ProtectionEquipmentExt) )) { eqWriter.AddPNMObject((dynamic)cimObject); } } } if (cimObject is PowerSystemResource) { var psrObj = cimObject as PowerSystemResource; if (psrObj.Location != null && psrObj.Location.@ref != null && psrObj.PSRType != "InternalCable") { var loc = _context.GetObject <PhysicalNetworkModel.LocationExt>(psrObj.Location.@ref); glWriter.AddLocation(Guid.Parse(psrObj.mRID), loc); } if (psrObj.Assets != null && psrObj.Assets.@ref != null) { assetToEqRefs.Add(psrObj.Assets.@ref, psrObj.mRID); } } } ////////////////////// // do the asset object foreach (var cimObject in _context.GetAllObjects()) { if (cimObject is PhysicalNetworkModel.Asset) { if (assetToEqRefs.ContainsKey(cimObject.mRID)) { var eqMrid = assetToEqRefs[cimObject.mRID]; aiWriter.AddPNMObject((dynamic)cimObject, eqMrid); } } if (cimObject is PhysicalNetworkModel.AssetInfo) { aiWriter.AddPNMObject((dynamic)cimObject); } if (cimObject is PhysicalNetworkModel.ProductAssetModel) { aiWriter.AddPNMObject((dynamic)cimObject); } if (cimObject is PhysicalNetworkModel.Manufacturer) { aiWriter.AddPNMObject((dynamic)cimObject); } } ////////////////////// // do the projection object foreach (var cimObject in _context.GetAllObjects()) { if (cimObject is PhysicalNetworkModel.ProtectionEquipment) { peWriter.AddPNMObject((dynamic)cimObject); } if (cimObject is PhysicalNetworkModel.PotentialTransformer) { peWriter.AddPNMObject((dynamic)cimObject); } if (cimObject is PhysicalNetworkModel.CurrentTransformer) { peWriter.AddPNMObject((dynamic)cimObject); } } eqWriter.Close(); glWriter.Close(); aiWriter.Close(); peWriter.Close(); string startPath = outputFolder + "\\files"; string zipPath = outputFolder + "\\" + archiveName + ".zip"; File.Delete(zipPath); ZipFile.CreateFromDirectory(startPath, zipPath); }
public IEnumerable <IdentifiedObject> Transform(CimContext context, IEnumerable <IdentifiedObject> inputParam) { FeederInfoContext feederContext = new FeederInfoContext(context); feederContext.CreateFeederObjects(); List <IdentifiedObject> input = inputParam.ToList(); HashSet <PhysicalNetworkModel.IdentifiedObject> dropList = new HashSet <IdentifiedObject>(); List <PhysicalNetworkModel.IdentifiedObject> addList = new List <IdentifiedObject>(); // AssetInfo to Asset ref dictionary Dictionary <string, string> assetInfoToAssetRef = new Dictionary <string, string>(); foreach (var inputCimObject in input) { if (inputCimObject is PhysicalNetworkModel.Asset) { var asset = inputCimObject as PhysicalNetworkModel.Asset; if (asset.AssetInfo != null && !assetInfoToAssetRef.ContainsKey(asset.AssetInfo.@ref)) { assetInfoToAssetRef.Add(asset.AssetInfo.@ref, asset.mRID); } } } // Asset to Equipment ref dictionary Dictionary <string, string> assetToEquipmentRef = new Dictionary <string, string>(); foreach (var inputCimObject in input) { if (inputCimObject is PhysicalNetworkModel.PowerSystemResource) { var psr = inputCimObject as PhysicalNetworkModel.PowerSystemResource; if (psr.Assets != null) { assetToEquipmentRef.Add(psr.Assets.@ref, psr.mRID); } } } // Set busbar names to station + voltagelevel + bay foreach (var inputCimObject in input) { if (inputCimObject is BusbarSection) { var bus = inputCimObject as BusbarSection; var st = bus.GetSubstation(true, context); bus.name = st.name + "_" + GetVoltageLevelStr(bus.BaseVoltage) + "_" + bus.name; var feederInfo = feederContext.GeConductingEquipmentFeederInfo(bus); if (feederInfo != null && feederInfo.Feeders != null && feederInfo.Feeders.Count > 0) { var feeder = feederInfo.Feeders[0]; if (feeder.ConnectionPoint.Substation != null) { bus.description = feeder.ConnectionPoint.Substation.name; } } } } // Set feeder name on junction connectivity nodes between cables foreach (var inputCimObject in input) { if (inputCimObject is ConnectivityNode) { var cn = inputCimObject as ConnectivityNode; if (cn.mRID == "c540b203-e442-7027-824c-bc561b3de47d") { } var cnEqs = context.GetConnections(cn); if (cnEqs.Count > 0) { if (cnEqs.All(e => e.ConductingEquipment is ACLineSegment)) { var eq = cnEqs.First().ConductingEquipment; var feederInfo = feederContext.GeConductingEquipmentFeederInfo(eq); if (feederInfo != null && feederInfo.Feeders != null && feederInfo.Feeders.Count > 0) { var feeder = feederInfo.Feeders[0]; if (feeder.ConnectionPoint.Substation != null) { cn.description = feeder.ConnectionPoint.Substation.name; } } } } } } // Set peterson coil name to station + gis name + min og max foreach (var inputCimObject in input) { if (inputCimObject is PetersenCoil) { var coil = inputCimObject as PetersenCoil; var st = coil.GetSubstation(true, context); if (coil.Asset != null && coil.Asset.AssetInfo != null && coil.Asset.AssetInfo.@ref != null) { var coilInfo = context.GetObject <PetersenCoilInfoExt>(coil.Asset.AssetInfo.@ref); coil.name = st.name + " " + coil.name; if (coilInfo != null && coilInfo.minimumCurrent != null && coilInfo.maximumCurrent != null) { coil.name += " " + (int)coilInfo?.minimumCurrent?.Value + "-" + (int)coilInfo?.maximumCurrent?.Value; } else { Logger.Log(LogLevel.Warning, "Slukkepole på station: " + st.name + " mangler værdier."); } } else { coil.name = st.name + " " + coil.name + " 0-0"; } } } // Set reactor coil (linear shunt compensator) to station + gis name + min og max foreach (var inputCimObject in input) { if (inputCimObject is LinearShuntCompensator) { var coil = inputCimObject as LinearShuntCompensator; var st = coil.GetSubstation(true, context); if (coil.Asset != null && coil.Asset.AssetInfo != null && coil.Asset.AssetInfo.@ref != null) { var coilInfo = context.GetObject <LinearShuntCompensatorInfoExt>(coil.Asset.AssetInfo.@ref); coil.name = st.name + " " + coil.name; if (coilInfo != null && coilInfo.minimumReactivePower != null && coilInfo.maximumReactivePower != null) { coil.name += " " + (int)coilInfo?.minimumReactivePower?.Value + "-" + (int)coilInfo?.maximumReactivePower?.Value; } else { Logger.Log(LogLevel.Warning, "Reaktorspole på station: " + st.name + " mangler værdier."); } } else { coil.name = st.name + " " + coil.name + " 0-0"; } } } // Remove injection > 50 kV foreach (var inputCimObject in input) { if (inputCimObject is ExternalNetworkInjection) { var inj = inputCimObject as ExternalNetworkInjection; if (inj.BaseVoltage > 50000) { dropList.Add(inj); var injConnections = context.GetConnections(inj); foreach (var injCon in injConnections) { dropList.Add(injCon.Terminal); } } } } // Fix and check objects foreach (var inputCimObject in input) { // Remove switch gear busbar asset model information (because PF complain about missing type, and Konstant/Thue says he don't want types into PF for now if (inputCimObject is BusbarSectionInfo) { BusbarSectionInfo bsi = inputCimObject as BusbarSectionInfo; bsi.AssetModel = null; var assetMrid = assetInfoToAssetRef[inputCimObject.mRID]; var asset = context.GetObject <PhysicalNetworkModel.Asset>(assetMrid); asset.type = null; asset.name = null; asset.AssetModel = null; } // Remove asset manufacture information on busbars and switches if (inputCimObject is BusbarSection || inputCimObject is Switch) { ConductingEquipment ci = inputCimObject as ConductingEquipment; var asset = context.GetObject <PhysicalNetworkModel.Asset>(ci.Assets.@ref); asset.type = null; asset.name = null; asset.AssetModel = null; } // Remove measurment current transformer and cts sitting on voltage level < 60 kV if (inputCimObject is CurrentTransformer && !((CurrentTransformer)inputCimObject).PSRType.ToLower().Contains("kundemaaling")) { var ct = inputCimObject as CurrentTransformer; bool ctIsDropped = false; try { var ctTerminal = context.GetObject <Terminal>(ct.Terminal.@ref); var ctEq = context.GetObject <ConductingEquipment>(ctTerminal.ConductingEquipment.@ref); if (ctEq.BaseVoltage < 60000) { dropList.Add(ct); ctIsDropped = true; } } catch (ArgumentException ex) { dropList.Add(ct); ctIsDropped = true; } // Move CT to line end, transformer end var st = ct.GetSubstation(true, context); foreach (var eq in st.GetEquipments(context)) { // If component inside same bay as ct if (eq is ConductingEquipment && eq.EquipmentContainer.@ref == ct.EquipmentContainer.@ref) { var ci = eq as ConductingEquipment; var ciConnections = context.GetConnections(ci); foreach (var ciConnection in ciConnections) { var ciNeighbors = context.GetConnections(ciConnection.ConnectivityNode).Where(c => c.ConductingEquipment != ci).ToList(); if (ciNeighbors.Any(c => c.ConductingEquipment is ACLineSegment)) { ct.Terminal.@ref = ciConnection.Terminal.mRID; } else if (ciNeighbors.Any(c => c.ConductingEquipment is PowerTransformer)) { ct.Terminal.@ref = ciConnection.Terminal.mRID; } else if (ciNeighbors.Count == 0) { ct.Terminal.@ref = ciConnection.Terminal.mRID; } } } } } // Check that current transformer infos has currents if (inputCimObject is CurrentTransformerInfoExt) { var ctInfo = inputCimObject as CurrentTransformerInfoExt; var assetMrid = assetInfoToAssetRef[ctInfo.mRID]; var eqMrid = assetToEquipmentRef[assetMrid]; var ct = context.GetObject <CurrentTransformerExt>(eqMrid); var ctAsset = context.GetObject <PhysicalNetworkModel.Asset>(assetMrid); if (ct.PSRType != null && ct.PSRType == "StromTransformer") { // Make sure primary and secondary current is set, because otherwise PF import fails if (ctInfo.primaryCurrent == null) { var stName = ct.GetSubstation(true, context).name; var bayName = ct.GetBay(true, context).name; Logger.Log(LogLevel.Warning, "CT Missing primary current. Will not be transfered to PF: " + stName + " " + bayName); ctInfo.primaryCurrent = new CurrentFlow() { Value = 0, unit = UnitSymbol.A }; dropList.Add(ct); dropList.Add(ctAsset); dropList.Add(ctInfo); } if (ctInfo.secondaryCurrent == null) { var stName = ct.GetSubstation(true, context).name; var bayName = ct.GetBay(true, context).name; Logger.Log(LogLevel.Warning, "CT Missing secondary current: " + stName + " " + bayName); ctInfo.secondaryCurrent = new CurrentFlow() { Value = 0, unit = UnitSymbol.A }; } } else { dropList.Add(ct); dropList.Add(ctAsset); dropList.Add(ctInfo); } } // Remove potential transformers sitting on voltage level < 60 kV if (inputCimObject is PotentialTransformer) { var pt = inputCimObject as PotentialTransformer; // If terminal point to object we don't have including - i.e. some 400 volt component - don't bother with the CT if (context.GetAllObjects().Exists(o => o.mRID == pt.Terminal.@ref)) { var ptTerminal = context.GetObject <Terminal>(pt.Terminal.@ref); var ptEq = context.GetObject <ConductingEquipment>(ptTerminal.ConductingEquipment.@ref); if (ptEq.BaseVoltage < 60000) { dropList.Add(pt); } } else { dropList.Add(pt); } } // Check that potential transformer info has voltages if (inputCimObject is PotentialTransformerInfoExt) { var vtInfo = inputCimObject as PotentialTransformerInfoExt; var assetMrid = assetInfoToAssetRef[vtInfo.mRID]; var eqMrid = assetToEquipmentRef[assetMrid]; var vtAsset = context.GetObject <PhysicalNetworkModel.Asset>(assetMrid); var vt = context.GetObject <PotentialTransformer>(eqMrid); var vtSt = vt.GetSubstation(true, context); // Make sure primary and secondary voltage is set, because otherwise PF import fails if (vtInfo.primaryVoltage == null) { vtInfo.primaryVoltage = new Voltage() { Value = 0, unit = UnitSymbol.V }; var stName = vt.GetSubstation(true, context).name; var bayName = vt.GetBay(true, context).name; Logger.Log(LogLevel.Warning, "VT Missing primary voltage. VT will not be transfered to PF." + stName + " " + bayName); dropList.Add(vt); dropList.Add(vtAsset); dropList.Add(vtInfo); } else if (vtInfo.secondaryVoltage == null) { vtInfo.secondaryVoltage = new Voltage() { Value = 0, unit = UnitSymbol.V }; var stName = vt.GetSubstation(true, context).name; var bayName = vt.GetBay(true, context).name; Logger.Log(LogLevel.Warning, "VT Missing secondary voltage. VI will not be transfered to PF." + stName + " " + bayName); dropList.Add(vt); dropList.Add(vtAsset); dropList.Add(vtInfo); } } // Set relay names to station + bay if (inputCimObject is ProtectionEquipment) { var relay = inputCimObject as ProtectionEquipment; // get relay station and bay via the switch it is connected to if (relay.ProtectedSwitches != null && relay.ProtectedSwitches.Length > 0) { try { var peSw = context.GetObject <PowerSystemResource>(relay.ProtectedSwitches[0].@ref); var bay = peSw.GetBay(true, context); var st = peSw.GetSubstation(true, context); relay.name = st.name + " " + bay.name; } catch (Exception ex) { Logger.Log(LogLevel.Warning, "Cannot find switch: " + relay.ProtectedSwitches[0].@ref + " connected to replay: " + inputCimObject.mRID); } } else { dropList.Add(inputCimObject); } } // Set electrical values on internal substation cables to 0 if (inputCimObject is ACLineSegment) { var acls = inputCimObject as ACLineSegment; if (acls.PSRType == "InternalCable") { // Set name to internal cable acls.name = "Internal Cable"; // Set length to 1 meter acls.length.Value = 1; // Set value to zero acls.r = new Resistance() { Value = 0 }; acls.r0 = new Resistance() { Value = 0 }; acls.x = new Reactance() { Value = 0 }; acls.x0 = new Reactance() { Value = 0 }; acls.bch = new Susceptance() { Value = 0 }; acls.b0ch = new Susceptance() { Value = 0 }; acls.gch = new Conductance() { Value = 0 }; acls.g0ch = new Conductance() { Value = 0 }; } } // Sæt transformer vikling navn og r,x,b,g værdier på vikling 2 til 0 if (inputCimObject is PowerTransformerEndExt) { var ptEnd = inputCimObject as PowerTransformerEndExt; var pt = context.GetObject <PowerTransformer>(ptEnd.PowerTransformer.@ref); ptEnd.name = pt.Substation.name + "_" + pt.name + "_T" + ptEnd.endNumber; /* Don't calculate r,x,b,g anymore. * if (ptEnd.endNumber == "1") * { * ptEnd.b0 = new Susceptance() { Value = 0 }; * ptEnd.g0 = new Conductance() { Value = 0 }; * * if (ptEnd.ratedU == null || * ptEnd.ratedS == null || * ptEnd.excitingCurrentZero == null || * ptEnd.loss == null || * ptEnd.lossZero == null || * ptEnd.uk == null) * { * // FIX: burde måske logge fejl, men PF skal nok brokke sig * } * else * { * // Beregn r: loss * (ratedU / ratedS * 1000)^2 * ptEnd.r = new Resistance() { Value = ptEnd.loss.Value * Math.Pow((ptEnd.ratedU.Value / (ptEnd.ratedS.Value * 1000)), 2) }; * * // Beregn g: (LossZero / ratedU^2) * double g = ptEnd.lossZero.Value / Math.Pow(ptEnd.ratedU.Value, 2); * ptEnd.g = new Conductance() { Value = g }; * * // Beregn YOC: (excitingCurrentZero*ratedS)/(100 * (ratedU^2)) * double yoc = (ptEnd.excitingCurrentZero.Value * (ptEnd.ratedS.Value * 1000)) / (100 * Math.Pow(ptEnd.ratedU.Value, 2)); * * // Beregn b: SQRT(YOC^2-g^2) * ptEnd.b = new Susceptance() * { * Value = Math.Sqrt(Math.Pow(yoc, 2) - Math.Pow(g, 2)) * }; * * // Beregn Zk: (uk*ratedU^2)/(100*ratedS) * double zk = (ptEnd.uk.Value * Math.Pow(ptEnd.ratedU.Value, 2)) / (100 * (ptEnd.ratedS.Value * 1000)); * * // Beregn x: SQRT(Zk^2-r^2) * ptEnd.x = new Reactance() * { * Value = Math.Sqrt( * Math.Pow(zk, 2) - Math.Pow(ptEnd.r.Value, 2) * ) * }; * } * } */ if (ptEnd.endNumber == "2") { // Set value to zero ptEnd.r = new Resistance() { Value = 0 }; ptEnd.r0 = new Resistance() { Value = 0 }; ptEnd.x = new Reactance() { Value = 0 }; ptEnd.x0 = new Reactance() { Value = 0 }; ptEnd.b = new Susceptance() { Value = 0 }; ptEnd.b0 = new Susceptance() { Value = 0 }; ptEnd.g = new Conductance() { Value = 0 }; ptEnd.g0 = new Conductance() { Value = 0 }; } } // Remove 'TRF' from transformer name if (inputCimObject is PowerTransformer) { inputCimObject.name = inputCimObject.name.Replace("TRF", ""); } // Ensure bay name is max 32 charaters if (inputCimObject is IdentifiedObject && inputCimObject.name != null && inputCimObject.name.Length > 32) { inputCimObject.name = inputCimObject.name.Substring(0, 32); } // Set name of disconnectors to ADSK if (inputCimObject is Disconnector) { inputCimObject.name = "ADSK"; } // Set name of disconnectors to ADSK if (inputCimObject is Fuse) { inputCimObject.name = "SIKRING"; } // Ensure connectivity nodes / busbars have proper names. // Needed by Konstant to support short circuit result extracts etc. PF uses the name of the node/busbar in reports. // Also needed to support time series import (Jakob busbar naming) if (inputCimObject is ConnectivityNode) { var cn = inputCimObject as ConnectivityNode; if (cn.mRID == "1663a3a8-a706-726a-8de5-7f57e2f9e68b") { } if (cn.name == null || cn.name.Length == 0) { var cnNeighbors = cn.GetNeighborConductingEquipments(context); var pt = cnNeighbors.Find(o => o is PowerTransformer) as PowerTransformer; var bus = cnNeighbors.Find(o => o is BusbarSection); if (pt != null) { var stVoltageLevels = context.GetSubstationVoltageLevels(pt.Substation); var ptConnections = context.GetConnections(pt); var ptTerminal = ptConnections.First(c => c.ConnectivityNode == cn); var ptEnds = pt.GetEnds(context); var ptEnd = ptEnds.Find(e => e.Terminal.@ref == ptTerminal.Terminal.mRID); double ptEndVoltageLevel = ptEnd.BaseVoltage; if (pt.name != null) { // HACK SHOULD BE CLEANED UP // Terminal actual exist in source, but get trown away in filter, because nothing connected to it if (!ptConnections.Exists(c => c.Terminal.sequenceNumber == "2")) { Logger.Log(LogLevel.Info, "Station: " + pt.Substation.name + " Trafo: " + pt.name + " mangler secondær skinne. Vil bliver oprettet"); var ptLvCn = new ConnectivityNode() { mRID = Guid.NewGuid().ToString(), name = pt.GetSubstation(true, context).name + "_" + GetVoltageLevelStr(400) + "_" + pt.name.Replace("TRF", "") }; addList.Add(ptLvCn); if (stVoltageLevels.Exists(o => o.BaseVoltage == 400)) { var vl = stVoltageLevels.First(o => o.BaseVoltage == 400); _mappingContext.ConnectivityNodeToVoltageLevel.Add(ptLvCn, vl); } else { var vl = new DAX.CIM.PhysicalNetworkModel.VoltageLevel() { mRID = Guid.NewGuid().ToString(), name = "0,4 kV", EquipmentContainer1 = new VoltageLevelEquipmentContainer() { @ref = pt.Substation.mRID }, BaseVoltage = 400 }; addList.Add(vl); stVoltageLevels.Add(vl); _mappingContext.ConnectivityNodeToVoltageLevel.Add(ptLvCn, vl); } var ptLvTerminal = new Terminal() { mRID = Guid.NewGuid().ToString(), phases = PhaseCode.ABCN, phasesSpecified = true, sequenceNumber = "2", ConnectivityNode = new TerminalConnectivityNode() { @ref = ptLvCn.mRID }, ConductingEquipment = new TerminalConductingEquipment { @ref = pt.mRID } }; var ptEnd2 = context.GetPowerTransformerEnds(pt).First(p => p.endNumber == "2"); ptEnd2.Terminal = new TransformerEndTerminal() { @ref = ptLvTerminal.mRID }; addList.Add(ptLvTerminal); } } // IF the PT END CN is connected to a conducting equipment if (cnNeighbors.Exists(o => !(o is PowerTransformer) && o.BaseVoltage > 0.0)) { ptEndVoltageLevel = cnNeighbors.First(o => !(o is PowerTransformer) && o.BaseVoltage > 0.0).BaseVoltage; if (stVoltageLevels.Exists(o => o.BaseVoltage == ptEndVoltageLevel)) { var vl = stVoltageLevels.First(o => o.BaseVoltage == ptEndVoltageLevel); _mappingContext.ConnectivityNodeToVoltageLevel.Add(cn, vl); } } // IF the PT END CN is *not* connected to anything else { // Set CN to PT END voltage level var vl = stVoltageLevels.First(o => o.BaseVoltage == ptEndVoltageLevel); _mappingContext.ConnectivityNodeToVoltageLevel.Add(cn, vl); // If 60 kV transformer secondary side if (ptEndVoltageLevel < 20000 && ptEndVoltageLevel > 5000) { if (ptEnds.Exists(e => e.BaseVoltage == 60000)) { EnergyConsumer ec = new EnergyConsumer() { mRID = GUIDHelper.CreateDerivedGuid(Guid.Parse(pt.mRID), 1001, true).ToString(), name = pt.GetSubstation(true, context).name + "_" + GetVoltageLevelStr(ptEndVoltageLevel) + "_" + pt.name.Replace("TRF", ""), EquipmentContainer = new EquipmentEquipmentContainer() { @ref = vl.mRID }, BaseVoltage = vl.BaseVoltage }; Terminal ecTerm = new Terminal() { mRID = GUIDHelper.CreateDerivedGuid(Guid.Parse(pt.mRID), 1002, true).ToString(), name = ec.name + "_T1", ConductingEquipment = new TerminalConductingEquipment() { @ref = ec.mRID }, ConnectivityNode = new TerminalConnectivityNode() { @ref = cn.mRID } }; addList.Add(ec); addList.Add(ecTerm); } } } cn.name = pt.GetSubstation(true, context).name + "_" + GetVoltageLevelStr(ptEndVoltageLevel) + "_" + pt.name.Replace("TRF", ""); /* * // Hvis trafo deler node med skinne, eller node er 400 volt, så brug jakob navngivning * if (bus != null || ptEndVoltageLevel == 400) * cn.name = pt.GetSubstation(true, context).name + "_" + GetVoltageLevelStr(ptEndVoltageLevel) + "_" + pt.name.Replace("TRF", ""); * else * cn.name = "CN"; */ } else if (bus != null && bus.name != null) { cn.name = bus.name; cn.description = bus.description; } else { var bay = cn.GetBay(false, context); if (bay != null) { if (cnNeighbors.Count == 1 || cnNeighbors.Exists(n => !(n is Switch))) { cn.name = bay.name + " ENDE"; } else { cn.name = bay.name; } } else { cn.name = "CN"; } } } } } // return objects, except the one dropped foreach (var inputObj in input) { if (!dropList.Contains(inputObj)) { yield return(inputObj); } } // yield added objects, foreach (var inputObj in addList) { yield return(inputObj); } }