Cascade — рабочие и резервные агрегаты
Cascade управляет группой насосов, котлов или другого однотипного оборудования: выбирает, кому работать, а кому оставаться в резерве. Если одного агрегата не хватает, он добавляет следующий. Если работающий агрегат вышел из строя, выбирает исправный резервный.
Чтобы оборудование изнашивалось равномернее, каскад учитывает наработку и может периодически менять рабочий агрегат.
Состав и связи
Для каждого участника нужен CascadeUnit — отдельный или уже встроенный в готовый узел. Cascade выбирает агрегат; его пуск и защиты выполняет компонент оборудования.
Первое подключение
Заполняйте пример в таблице «Параметры» (Params) добавленного компонента. Как добавить компонент и где искать настройки.
В группе K3 два насоса: K31 и K32. Один должен работать, второй — ждать в резерве. При аварии рабочего насоса нужно включить резервный.
У каждого насоса уже должны быть Engine и CascadeUnit. Engine управляет двигателем, а CascadeUnit передаёт его состояние каскаду и возвращает команду пуска. Подключение одного насоса показано в описании CascadeUnit.
1. Укажите насосы группы
Добавьте Cascade и заполните параметры. bGroupDemand — команда включения всей группы: TRUE — насосы нужны, FALSE — остановить автоматическую работу группы.
| Параметр | Значение для примера |
|---|---|
CasId |
K3 |
CasComment |
Группа циркуляционных насосов |
CasParent |
CabinetController_Inst |
CasEn |
bGroupDemand |
CasPV |
0.0 |
CasPVErr |
false |
CasUnitId1 |
K31 |
CasUnitId2 |
K32 |
CasUnitId3 — CasUnitId16 |
Пусто |
Места 3–16 оставьте пустыми, удалив _ID_, если оно там есть. Первый насос получит команду out_Unit1_bCmd, второй — out_Unit2_bCmd.
2. Задайте один рабочий насос
Минимальное и максимальное количество установите равными 1. Тогда каскад будет выбирать один насос независимо от давления.
| Настройка | Значение для примера | Назначение |
|---|---|---|
Conf.K3_Cascade_iWorkCount |
1 |
Один обязательный рабочий насос |
Conf.K3_Cascade_iMaxWorkCount |
1 |
Не более одного подключённого насоса |
Conf.K3_Cascade_fSP |
0.0 |
В этом примере измерение не используется |
Conf.K3_Cascade_fHys |
0.0 |
В этом примере измерение не используется |
Conf.K3_Cascade_diConnectionDelay |
5 |
Задержка обычного подключения, с |
Conf.K3_Cascade_diDisconnectionDelay |
5 |
Задержка обычного отключения, с |
Conf.K3_Cascade_bPowerControlEnable |
false |
Выбор без проверки мощности |
Conf.K3_Cascade_diSwitchPeriod |
24 |
Проверка необходимости чередования через 24 ч |
3. Как будет работать группа
После включения bGroupDemand каскад выберет исправный доступный насос с меньшей наработкой. Первый пуск выполняется сразу, без ожидания задержки подключения. Второй насос останется в резерве.
Если рабочий насос станет недоступен или сообщит об аварии, его команда пуска выключится. При наличии готового резерва каскад включит другой насос.
При bGroupDemand = FALSE обе автоматические команды пуска выключаются. Вручную насосами по-прежнему управляют через Engine.
Подробное подключение насосов
Если вы собираете группу из отдельных компонентов, задайте следующие связи. В готовом узле оборудования часть этих связей уже выполнена.
Что CascadeUnit получает от каждого насоса
| Параметр CascadeUnit | Насос K31 | Насос K32 |
|---|---|---|
CasUnitId |
K31 |
K32 |
CasUnitComment |
Насос 1 |
Насос 2 |
CasUnitParent |
CabinetController_Inst |
CabinetController_Inst |
CasUnitEn |
K31_Engine_Inst.out_bEnableAutoControl |
K32_Engine_Inst.out_bEnableAutoControl |
CasUnitMode |
K31_Engine_Inst.out_iMode = ENGINEMODEAUTO |
K32_Engine_Inst.out_iMode = ENGINEMODEAUTO |
CasUnitState |
K31_Engine_Inst.out_iState |
K32_Engine_Inst.out_iState |
CasUnitStateBool |
K31_Engine_Inst.out_bState |
K32_Engine_Inst.out_bState |
CasUnitFault |
K31_Engine_Inst.out_bFault |
K32_Engine_Inst.out_bFault |
CasUnitWorktime |
K31_Engine_Inst.out_diWorktime |
K32_Engine_Inst.out_diWorktime |
CasUnitPower |
0.0 |
0.0 |
CasUnitStartCmd |
K3_Cascade_Inst.out_Unit1_bCmd |
K3_Cascade_Inst.out_Unit2_bCmd |
CasUnitEn получает от Engine разрешение автоматической работы. Поэтому каскад не выберет насос, который переведён в ручной режим или заблокирован. CasUnitMode отдельно сообщает о режиме для отображения; одним этим полем готовность насоса не задаётся.
Как команда доходит до двигателя
| Параметр Engine | Насос K31 | Насос K32 |
|---|---|---|
EngParent |
K31_CascadeUnit_Inst |
K32_CascadeUnit_Inst |
EngStartCmd |
K31_CascadeUnit_Inst.out_bStart |
K32_CascadeUnit_Inst.out_bStart |
EngStopCmd |
NOT K31_CascadeUnit_Inst.out_bStart |
NOT K32_CascadeUnit_Inst.out_bStart |
Остальные подключения двигателя описаны в руководстве Engine. Команда от Cascade приходит в CascadeUnit, затем в Engine. Обратно Engine передаёт состояние и аварию.
Указать насос в списке Cascade недостаточно: нужно также подключить его команду пуска, как показано в таблицах.
Подключение дополнительных агрегатов по измерению
Чтобы менять число насосов по давлению, задайте минимум 1, максимум 2 и подключите измерение:
| Параметр или настройка | Значение для примера |
|---|---|
CasPV |
PT101_SensFilter_Inst.out_fY |
CasPVErr |
PT101_Sensor_Inst.out_bError |
Conf.K3_Cascade_iWorkCount |
1 |
Conf.K3_Cascade_iMaxWorkCount |
2 |
Conf.K3_Cascade_fSP |
4.5 |
Conf.K3_Cascade_fHys |
0.2 |
Sensor PT101 должен показывать давление в барах. Если оно упало ниже 4,3 бар и не восстановилось за время задержки, каскад добавит второй насос. Если давление поднялось выше 4,7 бар и сохраняется выше этой границы в течение задержки отключения, один насос будет отключён. Между этими границами число насосов не меняется, пока оно находится в заданных пределах.
Правила изменения количества
| Состояние группы | Действие |
|---|---|
| Подключено меньше минимума | Добавить агрегат независимо от измерения |
Подключено меньше максимума и CasPV < fSP − fHys |
Добавить агрегат |
| Подключено больше максимума | Отключить агрегат независимо от измерения |
Подключено больше минимума и CasPV > fSP + fHys |
Отключить агрегат |
| Количество в пределах, измерение равно границе | Измерение не создаёт нового запроса |
При обычном изменении нагрузки насосы включаются и выключаются по одному, с заданной задержкой. Минимум и максимум относятся к числу команд пуска. Если исправных доступных насосов не хватает, обеспечить минимум не получится.
Этот компонент добавляет агрегат при снижении измерения. Например, так можно добавлять насос при падении давления. Если в вашем процессе агрегат нужно добавлять при росте измерения, напрямую такая схема не подойдёт: для CasPV потребуется другой расчёт в программе.
Задавайте 0 ≤ iWorkCount ≤ iMaxWorkCount ≤ количество участников, гистерезис — неотрицательный. Для постоянного количества достаточно сделать минимум равным максимуму и оставить CasPV, fSP, fHys равными нулю.
Выбор агрегата и чередование
Когда нужен ещё один агрегат, каскад ищет готовый резерв с наименьшей наработкой. При одинаковой наработке выбирается тот, кто стоит раньше в списке. Если основной агрегат уже выбран, но ещё не запущен, он сохраняет очередь на пуск, пока его наработка не больше, чем у свободного резерва.
Последний включённый каскадом агрегат называется основным. Если нужно уменьшить число работающих, первым отключается он. Из оставшихся основным становится агрегат с наибольшей наработкой.
Через время diSwitchPeriod каскад сравнивает наработку включённых агрегатов с резервными. Замена имеет смысл, если готовый резерв работал меньше:
- Если основной наработал больше резерва и среди остальных включённых нет агрегата с ещё большей наработкой, каскад выключает его команду и сразу включает команду резервному.
- Если больше всех наработал другой включённый агрегат — больше и основного, и резерва — каскад сначала выключает его. Потом группа добавляет агрегат по обычным правилам: по минимальному количеству или по измерению.
- Если подходящего резерва с меньшей наработкой нет, замены не будет.
Период задаётся в часах. Значение 0 или отрицательное отключает периодическое чередование. Выход CasParent.out_bWorktimeReset начинает отсчёт чередования заново.
При замене прежний агрегат получает останов сразу. Каскад не ждёт, пока резервный подтвердит успешный пуск.
Дополнительный контроль мощности
По умолчанию контроль мощности выключен. Если включить bPowerControlEnable, каскад дополнительно проверяет мощность текущего основного агрегата, которому выдана команда:
| Действие | Дополнительное условие |
|---|---|
| Подключение следующего агрегата | Мощность основного не ниже fPowerHiLimit |
| Отключение основного агрегата | Мощность основного не выше fPowerLoLimit |
При включённом контроле мощности одного низкого давления для добавления насоса уже недостаточно: основной насос должен также достичь верхнего порога мощности. Для отключения он должен дойти до нижнего порога. Эти проверки действуют и при попытке набрать минимальное количество или уменьшить его до максимального.
Укажите в CasUnitPower, по какой величине оценивать нагрузку. Например, можно передавать частоту ПЧ в герцах. Тогда и нижний, и верхний пороги задаются в герцах. У всех агрегатов должна использоваться одна и та же шкала.
Для первого пуска ждать задержку и достижения мощности не требуется. Так же быстро каскад добавляет замену после аварии или потери готовности работающего основного агрегата. Периодическая замена по наработке тоже выполняется без проверки мощности.
Отключение группы и ошибки
Если выключить CasEn или включить ошибку измерения CasPVErr, каскад выключит все свои команды пуска и сбросит отсчёт времени. После восстановления разрешения он снова выберет и включит нужные агрегаты.
При ошибке датчика каскад прекращает автоматическую работу всей группы — даже поддержание минимального числа агрегатов. Если датчик в этой группе не используется, оставьте CasPVErr = false.
Если неисправен только один агрегат, снимается его команда. Пока он не готов, каскад его не выбирает. Сбрасывать аварию нужно в компоненте самого оборудования; отдельного сброса аварий у Cascade нет.
От родителя Cascade получает только команду начать отсчёт чередования заново. Группа включается через CasEn. Состояние каждого насоса — его режим, питание и авария — поступает через CascadeUnit.
Подключено и работает — разные показатели
У группы есть два разных счётчика. out_iConnectedCount показывает, скольким агрегатам дана команда пуска. out_iWorkingCount — сколько агрегатов уже подтвердили работу. Например, команда насосу уже выдана, но он ещё разгоняется: первый счётчик его учёл, второй ещё нет. Успешный запуск проверяет Engine.
Насос, включённый вручную, тоже может показываться в числе работающих, хотя каскад его не запускал. Минимум и максимум ограничивают только команды каскада — out_iConnectedCount.
Основной агрегат может быть выбран заранее, даже пока группа выключена. Поэтому признак «Основной» сам по себе не означает, что насос получил команду пуска.
Параметры компонента — Params
| Параметр | По умолчанию | Назначение |
|---|---|---|
$Cas |
Каскад |
Название группы параметров |
CasId |
_ID_ |
ID группы. Для K3 создаётся экземпляр K3_Cascade_Inst |
CasComment |
Комментарий |
Название группы оборудования |
CasParent |
CabinetController_Inst |
Родитель, предоставляющий out_bWorktimeReset для сброса периода чередования |
CasEn |
true |
Общее разрешение работы каскада |
CasPV |
0.0 |
Измерение процесса или вычисляемое выражение REAL |
CasPVErr |
false |
Ошибка измерения: TRUE запрещает работу каскада |
CasConf |
Пусто | ID набора настроек. Если пусто, используется CasId |
CasConfComment |
Пусто | Название набора настроек. Если пусто, комментарий составляется из CasComment и $Cas |
Участники
| Параметр | По умолчанию | Назначение |
|---|---|---|
CasUnitId1 |
_ID_ |
ID участника на месте 1; команда out_Unit1_bCmd |
CasUnitId2 |
_ID_ |
ID участника на месте 2; команда out_Unit2_bCmd |
CasUnitId3 |
_ID_ |
ID участника на месте 3; команда out_Unit3_bCmd |
CasUnitId4 |
_ID_ |
ID участника на месте 4; команда out_Unit4_bCmd |
CasUnitId5 — CasUnitId16 |
Пусто | ID участников на местах 5–16; команды с соответствующим номером |
Каждый указанный ID должен соответствовать существующему экземпляру <ID>_CascadeUnit_Inst. Например, CasUnitId1 = K31 подключает K31_CascadeUnit_Inst. Пустое место не подключается. Один агрегат указывайте только на одном месте.
Настройки во время работы — Conf
Полные имена приведены для CasId = K3 и пустого CasConf. В таблице указаны начальные значения компонента; значения примера задаются отдельно.
| Настройка | Тип | Начальное значение | Назначение |
|---|---|---|---|
Conf.K3_Cascade_iWorkCount |
INT |
1 |
Минимальное число подключённых агрегатов |
Conf.K3_Cascade_iMaxWorkCount |
INT |
1 |
Максимальное число подключённых агрегатов |
Conf.K3_Cascade_fSP |
REAL |
0.0 |
Уставка изменения состава, в единицах CasPV |
Conf.K3_Cascade_fHys |
REAL |
0.0 |
Отклонение от уставки до каждой границы изменения состава, в единицах CasPV |
Conf.K3_Cascade_diConnectionDelay |
DINT |
1 |
Выдержка обычного подключения, с |
Conf.K3_Cascade_diDisconnectionDelay |
DINT |
1 |
Выдержка обычного отключения, с |
Conf.K3_Cascade_bPowerControlEnable |
BOOL |
false |
Дополнительная проверка мощности основного агрегата при изменении количества |
Conf.K3_Cascade_fPowerLoLimit |
REAL |
0.0 |
Нижний порог мощности для отключения; в единицах CasUnitPower |
Conf.K3_Cascade_fPowerHiLimit |
REAL |
0.0 |
Верхний порог мощности для подключения; в единицах CasUnitPower |
Conf.K3_Cascade_diSwitchPeriod |
DINT |
36 |
Период чередования по наработке, ч; неположительное значение отключает чередование |
Нулевые или отрицательные задержки подключения и отключения означают отсутствие соответствующей выдержки.
При одинаковом CasConf несколько групп используют общий набор всех перечисленных настроек. Например, при CasConf = PumpGroup минимум называется Conf.PumpGroup_Cascade_iWorkCount, уставка — Conf.PumpGroup_Cascade_fSP. Состав, состояния и таймеры каждой группы остаются собственными.
Выходы компонента
Команды участникам
| Результат для примера | Тип | Назначение |
|---|---|---|
K3_Cascade_Inst.out_Unit1_bCmd |
BOOL |
Запрос работы насоса K31, указанного в CasUnitId1 |
K3_Cascade_Inst.out_Unit2_bCmd |
BOOL |
Запрос работы насоса K32, указанного в CasUnitId2 |
K3_Cascade_Inst.out_Unit1_bMaster |
BOOL |
Насос K31 выбран основным |
K3_Cascade_Inst.out_Unit2_bMaster |
BOOL |
Насос K32 выбран основным |
Для каждого места от 1 до 16 имеются отдельные out_UnitN_bCmd и out_UnitN_bMaster; N заменяется номером места. Например, команда последнего места — K3_Cascade_Inst.out_Unit16_bCmd.
Состояние группы
| Результат для примера | Тип | Назначение |
|---|---|---|
K3_Cascade_Inst.out_iReadyCount |
INT |
Число доступных исправных участников, включая уже подключённых |
K3_Cascade_Inst.out_iConnectedCount |
INT |
Число участников, которым выдана команда работы |
K3_Cascade_Inst.out_iWorkingCount |
INT |
Число участников с сигналом фактической работы |
K3_Cascade_Inst.out_iMinWorkTime |
INT |
Индекс свободного готового участника с наименьшей наработкой, исключая основного |
K3_Cascade_Inst.out_iMaxWorkTime |
INT |
Индекс подключённого готового участника с наибольшей наработкой, исключая основного |
K3_Cascade_Inst.out_iCurMaster |
INT |
Индекс текущего основного участника |
Индексы начинаются с 0: значение 0 соответствует CasUnitId1, значение 1 — CasUnitId2, значение 15 — CasUnitId16. Значение −1 означает, что подходящего участника нет. Поля out_iMinWorkTime и out_iMaxWorkTime содержат именно индексы, а не часы наработки.