Skip to content
Snippets Groups Projects
PowerStation.cs 7.63 KiB
Newer Older
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
        {
            Pole, Trans, 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.Name = name;
            this.Voltage = voltage;
            this.Stationtype = stationtype;
            this.IsSource = issource;
            this.IsON = false;
        public void CheckValue()
            bool checker = Identifier >= 0;
            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)"); 
            }
        /// <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;
        }