Skip to content
Snippets Groups Projects
PowerStation.cs 8.39 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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>
    
            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
    
            /// тип подстанции: 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 List<Powerline> LineList { get; private 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.Name = name;
                this.Voltage = voltage;
                this.Stationtype = stationtype;
    
                this.IsSource = issource;
                this.IsON = false;
    
            private void CheckValue()
    
                if (Identifier < 0)
                {
    
                    throw new System.ArgumentOutOfRangeException("Identifier", Identifier, "Expected >=0");
    
                    throw new System.ArgumentOutOfRangeException("Voltage", Voltage, "Expected 0<Voltage<=1500");
    
            /// <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;
            }