using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindStressPRM { /// <summary> /// powerstation/pole point class /// класс для трансформаторных подстанций/столбов/понижающих(конечных) подстанций /// </summary> public class PowerStation { /// <summary> /// unique id /// уникальный идентификатор подстанции/столба /// </summary> public int Identifier { get; set; } /// <summary> /// Coordinates /// </summary> public Coordinate Coordinate { get; set; } /// <summary> /// station name field /// название подстанции /// </summary> public string Name { get; set; } /// <summary> /// voltage, kV /// напряжение, кВ /// </summary> public int Voltage { get; set; } /// <summary> /// type of point - trans/pole/endpoint /// тип станции - трансформаторная подстанция/столб/понижающая(конечная)подстанция ///столбы не идут в аутпут, и обрабатываються алгоритмом, так что если есть на куске графа, саязанного только столбами есть сломанный сегмент /// весь кусок графа обесточен /// </summary> public enum StationType { /// <summary> /// "Столб"/Опора, (Powerstation не будет передовать питание если любая из соедененных с ней линий сломана) /// нужно потому, что с топокарт ЛЭП дешифрируются по столбам и могут на них ветвится /// </summary> Pole, /// <summary> /// Распределительная подстанция, Powerstation, не являющаяся листком дерева графа питания /// </summary> Trans, /// <summary> /// Понижающая подстанция, Powerstation - листок дерева графа питания /// </summary> Endstat }; /// <summary> /// тип подстанции: pole/trans/endstat: является ли станция столбом, распределительной подстанцией, или станцией в вершине графа питания /// тип столб - в картографической дишифровке ЛЭП могут ветвиться на столбах, при этом, очевидно, столбы не распределяют питание в отличии от подстанций. /// распределительная подстанция - станция на которой граф ветвиться и известно что это не столб. /// станция в вершине графа /// </summary> public StationType Stationtype { get; set; } /// <summary> /// is point a source? /// является ли подстаниция источником питания (в случае ТЭЦ или питания от внешних для рассматриваемой цепи ЛЭП) /// </summary> public bool IsSource { get; set; } /// <summary> /// power on switch /// поступает (true) или нет (false) на подстанцию питание /// </summary> public bool IsON { get; set; } /// <summary> /// parameter to control that on this station feeding line has higher power/voltage then leeching lines /// параметр для контроля в алгоритме, чтобы линии питались от линий такого же или более высокого класса напряжения /// </summary> public int CurrentVolt { get; private set; } /// <summary> /// asigned powerlines list /// список оканчивающихся/начинающихся на подстанции ЛЭП /// </summary> public IList<Powerline> LineList { get; set; } /// <summary> /// designated constructor /// </summary> /// <param name="coords"> Coordinates/координаты станции </param> /// <param name="id">Station ID/ ИД станции </param> /// <param name="name">Station Name/Название станции</param> /// <param name="voltage"> voltage, класс напряжения кВ</param> /// <param name="stationtype">Тип станции: столб/Подстанция/Конечная станция</param> /// <param name="issource"> является ли станция генерирующей</param> public PowerStation(Coordinate coords, int id, string name, int voltage, StationType stationtype, bool issource) { this.Coordinate = coords; this.Identifier = id; this.Name = name; this.Voltage = voltage; this.Stationtype = stationtype; this.IsSource = issource; this.IsON = false; CheckValue(); } public bool CheckValue() { if (Identifier < 0) { throw new System.ArgumentOutOfRangeException("Identifier", Identifier, "Identifer expected to be more than 0"); } if (Voltage < 0 || Voltage > 1500) { throw new System.ArgumentOutOfRangeException("Voltage", Voltage, "Voltage expected to be in range (0,1500)"); } return true; } /// <summary> /// Gets attached lines list /// </summary> /// <param name="linenet"></param> public void GetAttachedLines( List<Powerline> linenet) { this.LineList= new List<Powerline>(); foreach(Powerline line in linenet) { if ( line.PointFromID == this.Identifier || line.PointToID == this.Identifier) { this.LineList.Add(line); } } //if (this.LineList.Count == 0) { // throw new System.Exception("Station has no corresponding/attached lines"); //} } /// <summary> /// initializes CurrentVolt parameter /// </summary> public void InitCurrentVolt() { int maxVolt =-1; int minVolt =10000; foreach (Powerline line in this.LineList) { if (line.Voltage > maxVolt) { maxVolt = line.Voltage; } if (line.Voltage < minVolt) { minVolt = line.Voltage; } } if (this.IsSource) { // initial sourcepoints need to get highest attached voltage assigned to be able to power all attached lines this.CurrentVolt = maxVolt; } else { // every other point gets the minimum this.CurrentVolt = minVolt; } //the code above would work when the power network will be consistent //for we have to use this this.CurrentVolt = maxVolt; return; } /// <summary> /// Sets CurrentVolt parameter based on the highest voltage of lines powering it /// Задает текущее значение питающего напряжения станции /// </summary> public void SetCurrentVolt() { foreach (Powerline line in this.LineList) { if (line.IsON && line.Voltage > this.CurrentVolt) { this.CurrentVolt = line.Voltage; } } return; } /// <summary> /// Выключить питание на соединенных со станцией линиях /// </summary> public void TurnOffAttachedLines() { foreach(Powerline line in this.LineList) { line.IsON = false; } return; } } }