PDA

Просмотр полной версии : Ротация 4ёх насосов



high_roll
11.10.2024, 17:13
Доброго времени суток всем!
появилась следующая задача:
сделать программу для ротации 4ёх насосов
Имеется 4 уровня (1ый включает первый насос, 2ой - второй, и т.д., отключение всех работающих насосов - по отключению 1ого уровня)
Если поднялся 1ый уровень включился насос №1, отработал. Затем по 1ому уровню включился насос №2, отработал. Затем по 1ому - насос №3, поднялся 2ой уровень - включается насос №4.
Надеюсь суть понятна, по приложенным файлам несложно будет разобраться (также может/не может включится насос определяет состояние его аварии, и произошло ли включение насоса после сигнала на его запуск)

За основу я взял макрос https://owen.ru/forum/member.php?u=14862 Василия Кашубы, который был выполнен им на 3 насоса.
И видоизменял уже непосредственно его (его прикрепляю - ротация на 3 насоса)

Немного помудрив, я получил следующий вариант *2ой прикреплённый файл - ротация на 4 насоса)
В принципе, работает. Есть одно но:
например, если 1ый насос в аварии, по ротации по 1ому уровню включается насос №4, по 2ому уровню должен включится насос №1 НО он же в аварии, и должен включится насос №2
а по факту включается насосы №2 и №3, а насос №4 просто выключается

так происходит с каждым насосом:
если в аварии насос №2: по ротации по 1ому уровню включается насос №1, по 2ому уровню должен включится насос №3 (т.к. №2 в аварии), а по факту включаются насосы №3 и №4, а насос №1 просто выключается
если в аварии насос №3: по ротации по 1ому уровню включается насос №2, по 2ому уровню должен включится насос №4 (т.к. №3 в аварии), а по факту включаются насосы №4 и №1, а насос №2 просто выключается
если в аварии насос №4: по ротации по 1ому уровню включается насос №3, по 2ому уровню должен включится насос №1 (т.к. №4 в аварии), а по факту включаются насосы №1 и №2, а насос №3 просто выключается

Помогите, пожалуйста, разобраться где я ошибся с битами и можно ли это исправить?

Постарался описать понятно. Думаю, если пошагово протыкать макрос, то будет понятно о чём я.

kondor3000
11.10.2024, 17:56
Посмотрите пока это
4 насоса_Нараб_Ротация по времени_____ https://owen.ru/forum/showthread.php?t=38920&page=2#13
Каскадное управл. 8 котлами_____ https://owen.ru/forum/showthread.php?t=38608&p=420341#post420341
Управл. 12 насосами_12 аварий_ET_Включение по Уровню_____ https://owen.ru/forum/showthread.php?t=38891#6

Сергей0308
11.10.2024, 18:38
Доброго времени суток всем!
появилась следующая задача:
сделать программу для ротации 4ёх насосов
Имеется 4 уровня (1ый включает первый насос, 2ой - второй, и т.д., отключение всех работающих насосов - по отключению 1ого уровня)
Если поднялся 1ый уровень включился насос №1, отработал. Затем по 1ому уровню включился насос №2, отработал. Затем по 1ому - насос №3, поднялся 2ой уровень - включается насос №4.
Надеюсь суть понятна, по приложенным файлам несложно будет разобраться (также может/не может включится насос определяет состояние его аварии, и произошло ли включение насоса после сигнала на его запуск)

За основу я взял макрос https://owen.ru/forum/member.php?u=14862 Василия Кашубы, который был выполнен им на 3 насоса.
И видоизменял уже непосредственно его (его прикрепляю - ротация на 3 насоса)

Немного помудрив, я получил следующий вариант *2ой прикреплённый файл - ротация на 4 насоса)
В принципе, работает. Есть одно но:
например, если 1ый насос в аварии, по ротации по 1ому уровню включается насос №4, по 2ому уровню должен включится насос №1 НО он же в аварии, и должен включится насос №2
а по факту включается насосы №2 и №3, а насос №4 просто выключается

так происходит с каждым насосом:
если в аварии насос №2: по ротации по 1ому уровню включается насос №1, по 2ому уровню должен включится насос №3 (т.к. №2 в аварии), а по факту включаются насосы №3 и №4, а насос №1 просто выключается
если в аварии насос №3: по ротации по 1ому уровню включается насос №2, по 2ому уровню должен включится насос №4 (т.к. №3 в аварии), а по факту включаются насосы №4 и №1, а насос №2 просто выключается
если в аварии насос №4: по ротации по 1ому уровню включается насос №3, по 2ому уровню должен включится насос №1 (т.к. №4 в аварии), а по факту включаются насосы №1 и №2, а насос №3 просто выключается

Помогите, пожалуйста, разобраться где я ошибся с битами и можно ли это исправить?

Постарался описать понятно. Думаю, если пошагово протыкать макрос, то будет понятно о чём я.

Посмотрите это, здесь ротация: https://owen.ru/forum/showthread.php?t=36564
здесь каскад: https://owen.ru/forum/showthread.php?t=32428&page=4

И, если надо, можно это совместить, в смысле, каскадное управление определяет сколько насосов будет в работе, а алгоритм ротации производит ротацию, включает насос на замену насоса ушедшего в аварию и т.п.

Мой вариант с перспективой расширения до 8 насосов:

79353

79354

EFrol
11.10.2024, 19:55
Не претендуя на оригинальность предложу решение к вашему ТЗ:
79350



function_block Rotate4 //Блок ротации 4 насосов

var_input
E1, E2, E3, E4 : bool; // Разрешение на запуск двигателя
W1, W2, W3, W4 : bool; // Насосы в работе
L1, L2, L3, L4 : bool; // Определяет число запрашиваемых насосов
end_var

var_output
Q1, Q2, Q3, Q4 : bool; // Насосы в пуске
A1, A2, A3, A4 : bool; // Насосы в аварии
end_var

var
NextStart : udint; // Указатель на следующий насос для запуска
NextStop : udint; // Указатель на следующий насос для останова
T1, T2, T3, T4 : SYS.TON; // Таймеры для определения исправности насосов
CountWork : udint; // Количество насосов в работе
CountQuery : udint; // Требуемое кол-во
end_var

// Определяем кол-во в работе
CountWork := 0;
if Q1 then CountWork := CountWork + 1; end_if
if Q2 then CountWork := CountWork + 1; end_if
if Q3 then CountWork := CountWork + 1; end_if
if Q4 then CountWork := CountWork + 1; end_if

// Требуемое кол-во
CountQuery := 0;
if L1 then CountQuery := CountQuery + 1; end_if
if L2 then CountQuery := CountQuery + 1; end_if
if L3 then CountQuery := CountQuery + 1; end_if
if L4 then CountQuery := CountQuery + 1; end_if

// Если нужно больше - запускаем следующий
if CountQuery > CountWork then // Нужно запустить следующий
case NextStart of // Запускаем при условии, что работа разрешена и нет аварии
0: Q1 := E1 and NOT A1;
1: Q2 := E2 and NOT A2;
2: Q3 := E3 and NOT A3;
3: Q4 := E4 and NOT A4;
end_case
NextStart := NextStart + 1; if NextStart > 3 then NextStart := 0; end_if
end_if

// Если нужно меньше - останавливаем следующий
if CountWork > CountQuery then // Нужно выключить следующий
case NextStop of
0: Q1 := false;
1: Q2 := false;
2: Q3 := false;
3: Q4 := false;
end_case
NextStop := NextStop + 1; if NextStop > 3 then NextStop := 0; end_if
end_if

// Сбросим аварию при запрете запуска и остановим насос
if not E1 then A1 := false; Q1:=false; end_if
if not E2 then A2 := false; Q2:=false; end_if
if not E3 then A3 := false; Q3:=false; end_if
if not E4 then A4 := false; Q4:=false; end_if

// Следим за таймером и фиксируем аварию с остановкой насоса
T1(I:=Q1, T:=T#1s); if T1.Q and not W1 then A1 := true; Q1:=false; end_if
T2(I:=Q2, T:=T#1s); if T2.Q and not W2 then A2 := true; Q2:=false; end_if
T3(I:=Q3, T:=T#1s); if T3.Q and not W3 then A3 := true; Q3:=false; end_if
T4(I:=Q4, T:=T#1s); if T4.Q and not W4 then A4 := true; Q4:=false; end_if

end_function_block