uniset-algorithms  0.2
Управление электростанцией

СЭС

Структура СЭС задаётся в конфигурационном файле, в секции <structure>. Структура представляет из себя группы ДГ(SEES) работающие на одну шину, при этом они могу быть разделены между собой межсекционными автоматами. Например:

    <seslist>
        <item name="SEES1"/>
        <item name="SEES2"/>
        <item name="SEES3"/>
    </seslist>
    <automatlist>
        <item name="aQG1"/>
        <item name="aQG2"/>
        <item name="aQG3"/>
        <item name="aQG4"/>
        <item name="aQB1"/>
    </automatlist>
    <structure>
        <group noreserv="" num="1">
            <ses name="SEES1"/>
        </group>
        <asensor name="QC1_On_S"/>
        <group noreserv="" num="2">
            <ses name="SEES2"/>
            <ses name="SEES3"/>
        </group>
    </structure>

Здесь описана структура в которой имеется три ДГ. Причём ДГ1 разделён от ДГ2 и ДГ3 месекционным автоматом QC.

Имена используемые при описании структуры должны совпадать с объектами (именами) заданными в секциях <seslist>,<automatlist>, кроме случая <asensor> (см. ниже). В качестве межсекционного автомата может быть указан автомат из списка <automatlist> (записывается как <automat name="xxx">), либо специальное обозначение <asensor>, в котором задаётся название датчика "автомат включён". Это удобно когда (как в данном примере), SEESControl не управляет автоматом, а нам достаточно только знать состояние межсекционного автомата.

Управление резервом

//!! ОПИСАНИЕ НАДО КОРРЕКТИРОВАТЬ В СВЯЗИ с ПОЯВЛЕНИЕМ SEESGroup и UnionGroups !!//
Основными функциями участвующими в управлении резервом являются
  • SEESControl::setReservControl( UnionGroups* gi, bool set );
  • SESControl::checkReservControl();
  • SESControl::updateReservList( int gnum );

При любом изменении структуры, или состояния ДГ осуществляется проход по всем ДГ в группе (по списку) и формируется список резервных ДГ, а также определяется "ведущий"(лидер) группы. В список попадают все ДГ, находящиеся в режиме автоматического управления. Если нет явно заданного оператором (при помощи, переключателя "приоритет") "ведущего", то им назначается ДГ имеющий наименьший номер, при этом он переводится в режим "AutoMode". Все остальные ДГ, переводятся в режим "ReservMode" (замечу и тот и тот режим, это режимы автоматического управления). Все эти "вычисления" происходят в функции SESControl::updateReservList( int gnum ); Далее в процессе функционирования переодически (при изменении состояния любого ДГ), проверяется необходимость в резерве для "ведущего" (см. функцию SESControl::checkReservControl()). Если ведущему, необходим резерв или наоборот резерв не нужен, то происходит, запуск или остановка резервного ДГ из списка резервных (см. SEESControl::setReservControl( UnionGroups* gi, bool set )). При этом резервные ДГ запускаются в порядке возрастания номеров, т.е. первым запускается с меньшим номером), а останавливаются в обратном порядке (т.е. первым останавливается последний запущенный). Тут надо иметь ввиду, что при такой логике, идёт неравномерный "износ" ДГ. Т.к. более приоритетные (с наименьшим номером) работают больше(дольше) всех. Может стоит сделать наоборот.. На время пуска/остановки очередного резервного ДГ, выставляется таймер, блокирующий работу со списком резервных (SEESControl::reservCommandTimeout. Т.е. пока запускается очередной резервный ДГ, а основной ДГ держит признак необходимости резерва, следующий резервный ДГ, может быть запущен только после того, как текущий запускаемый либо запустится, либо перейдёт в режим, защиты. После того как текущий резервный запустился, выдерживается пауза (SEESControl::reservStatePause), для того чтобы закончились переходные процессы, распределилась нагрузка и т.п. Если после паузы у "ведущего" осталась необходимость в резерве, запускается следующий из списка и т.д.

//!! ОПИСАНИЕ НАДО КОРРЕКТИРОВАТЬ В СВЯЗИ с ПОЯВЛЕНИЕМ SEESGroup и UnionGroups !!//

Расчёт параметров электроэнергии на шинах ЩЭД

Эта функция подразумевает расчёт напряжения, частоты, тока и мощности на шинах ШЭД в зависимости от текущего состояния структуры. На данный момент реализован механизм, с жёстко заданной структурой. Расчёт общей мощности СЭС (выводится на прибор на пульте ПУС) ведётся на основе мощности на шинах ЩЭД1 и ЩЭД2. Вообщем случае она складывается если QC замкнут, а если разомкнут, то неизвестно какую выводить. Т.к. потенциально она может быть на одном равна нулю, а на другом не нулевая. Пока сделан просто вывод большей из двух. (эта логика покрывает и первый случай, при замкнутом автомате) Весь расчёт реализован в функции SEESControl::updatePowerInfo(). Помимо этого в этой функции реализована логика выставления сигнала "ЩЭД: Отклонение частоты от нормы" и "ЩЭД: Отклонение напряжения от нормы". В данной функции запускается таймер, а непосредственно выставление реализовано в функции SEESControl::step(). Параметры по отклонению, задаются через конфигурационный файл в секции <SEESControl> (deviation_f, deviation_U [0..1]). Сигнал формируется с задержкой, задаваемой параметром deviation_f_timeout_msec., deviation_U_timeout_msec. При этом следует иметь ввиду, что функция SEESControl::updatePowerInfo(), вызывается со своей периодичеснотью, соответственно формирование сигналов по отклонению частоты и напряжения будет с задержкой.

//!! ОПИСАНИЕ НАДО КОРРЕКТИРОВАТЬ В СВЯЗИ с ПОЯВЛЕНИЕМ SEESGroup и UnionGroups !!//

управления максимальным количеством ГДГ на шинах.

Для данного проекта существует требование, которое запрещает работать на шинах одновременно больше чем трём ДГ. Для реализации этого требования сделан следующий механизм: Каждый ДГ который хочет запускаться, проверяет можно ли это сделать при помощи вызова функции SEESControl::canRun(). При этом в функции SEESControl::checkAloneWorking() считается текущее количество работающих ГДГ.

См. также:
Управление панелью СЭС
Описание алгоритма управления конкретным ГДГ