Вход

Просмотр полной версии : FIFO для булевых переменных в CDS 3.5



B.S.V
30.03.2026, 16:11
Приветствую всех!
16 экструдеров. Пневмотранспортер ( точнее пневмопушка, но не суть) для загрузки приемных бункеров. 15 переключателей потока.

Нужно организовать очередь на загрузку бункеров по схеме FIFO. Понадобилась загрузка - встал в очередь. Загрузился - вылетел из очереди, не в конец встал, а вылетел.
Не получается красиво реализовать. Есть идеи ?

Заранее благодарен!

In_Da_Cher_A
30.03.2026, 19:53
Не получается красиво реализовать. Есть идеи ?реализуйте некрасиво

Понадобилась загрузка - встал в очередь. Загрузился - вылетел из очереди, не в конец встал, а вылетел.а что здесь от FIFO

Сергей0308
30.03.2026, 19:55
Приветствую всех!
16 экструдеров. Пневмотранспортер ( точнее пневмопушка, но не суть) для загрузки приемных бункеров. 15 переключателей потока.

Нужно организовать очередь на загрузку бункеров по схеме FIFO. Понадобилась загрузка - встал в очередь. Загрузился - вылетел из очереди, не в конец встал, а вылетел.
Не получается красиво реализовать. Есть идеи ?

Заранее благодарен!

Вот здесь в ОЛ очередь делали на FBD:

https://owen.ru/forum/showthread.php?t=36452&page=4&p=440735&viewfull=1#post440735

наверно можно повторить в кодесисе.

capzap
30.03.2026, 20:14
FIFO то может быть здесь и при чем, а вот как 16 экструдеров ставить в очередь булевой переменной, как узнать кому вылетать из очереди, если из значений только ложь и истина

B.S.V
30.03.2026, 21:39
Вот здесь в ОЛ очередь делали на FBD:

https://owen.ru/forum/showthread.php?t=36452&page=4&p=440735&viewfull=1#post440735

наверно можно повторить в кодесисе.

Благодарю! Натолкнул на идею.

B.S.V
30.03.2026, 21:40
FIFO то может быть здесь и при чем, а вот как 16 экструдеров ставить в очередь булевой переменной, как узнать кому вылетать из очереди, если из значений только ложь и истина

А что еще надо? Истина - в очереди, лож - вылетаешь.

Сергей0308
30.03.2026, 22:00
А что еще надо? Истина - в очереди, лож - вылетаешь.

У меня, кстати, так и сделано.
И, если надо расширить очередь, до 32(включительно) проблем не составляет!
Я об этом в теме по ссылке писал.

МихаилГл
30.03.2026, 22:54
А что еще надо? Истина - в очереди, лож - вылетаешь.

Ну как минимум ещё надо номер в очереди. Вы же хотите не только наличие устройства в очереди зафиксировать (эту информацию), но и запускать в нужной последовательности...

kondor3000
30.03.2026, 23:06
Вот накидал, 16 бит загрузки (кнопки без фиксации), очередь запоминается 88661
и выгрузка по биту выгрузки (каждое нажатие). Массивы сдвигаются автоматически. Все ФБ на ST.
Выгруженные биты стираются, последний бит стирается через 10 сек (можно изменить). Можно сделать выгрузку по таймеру или Блинком.
Версия OWEN Logic2.6.345
Можно в CDS 3.5 вывести массивом, в ОЛ нагляднее без массива.

Сергей0308
31.03.2026, 03:03
Вот накидал, 16 бит загрузки (кнопки без фиксации), очередь запоминается 88661
и выгрузка по биту выгрузки (каждое нажатие). Массивы сдвигаются автоматически. Все ФБ на ST.
Выгруженные биты стираются, последний бит стирается через 10 сек (можно изменить). Можно сделать выгрузку по таймеру или Блинком.
Версия OWEN Logic2.6.345
Можно в CDS 3.5 вывести массивом, в ОЛ нагляднее без массива.

А что за выгрузку по биту Вы придумали и зачем, в смысле, вроде товарищу такого не нужно, он только загрузку по очереди хотел, про выгрузку он вообще ничего не говорил, может её вручную делают?!
А вот сигнал загрузки бункера, что он полностью загрузился мне кажется просто необходим, по нему будет пропадать бит необходимости загрузки бункера, прекращаться загрузка текущего бункера и переход к загрузке следующего в очереди бункера.

B.S.V
31.03.2026, 07:52
А что за выгрузку по биту Вы придумали и зачем, в смысле, вроде товарищу такого не нужно, он только загрузку по очереди хотел, про выгрузку он вообще ничего не говорил, может её вручную делают?!
А вот сигнал загрузки бункера, что он полностью загрузился мне кажется просто необходим, по нему будет пропадать бит необходимости загрузки бункера, прекращаться загрузка текущего бункера и переход к загрузке следующего в очереди бункера.

На каждой линии два датчика уровня, два сигнала управления переключателем потока, два сигнала положения переключателя и сигнал, что линия в работе. FB обрабатывает их и взводит сигнал например x5DownloadRequired (пятой линии нужна загрузка), этот сигнал встает в очередь. Бункер загрузился - сигнал снялся - вылетел из очереди.

Cs-Cs
31.03.2026, 10:56
Массив сделать и в цикле его крутить. Я так очередь SMSок на приём и отправку делал.
У меня был массив структур (чтобы много данных хранить). А в структуре поле .Active. Если TRUE - элемент добавлен и не обработан. Если FALSE - обработан.

B.S.V
31.03.2026, 12:19
Массив сделать и в цикле его крутить. Я так очередь SMSок на приём и отправку делал.
У меня был массив структур (чтобы много данных хранить). А в структуре поле .Active. Если TRUE - элемент добавлен и не обработан. Если FALSE - обработан.

Интересно...

EFrol
31.03.2026, 19:26
Не уверен, что правильно понял задание. Предлагаю свою версию решения, если Вы сможете разобраться и перенести в CDS.
88668



function_block Queue

var_input
i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16 : bool; // true - нужна загрузка, false - уже не нужна
end_var

var_output
Q : udint; // Номер бункера под загрузкой, 0 - очередь пуста
end_var

var
In, Fix : udint; // Номер встающего в очередь c фиксацией
Dim : array [1..16] of udint; // Очередь в виде массива
Free : udint; // Свободное место
end_var

// Ставим в очередь запросившего загрузку
In := 0;
if i1 and not Fix.0 then In := 1; Fix.0 := true;
elsif i2 and not Fix.1 then In := 2; Fix.1 := true;
elsif i3 and not Fix.2 then In := 3; Fix.2 := true;
elsif i4 and not Fix.3 then In := 4; Fix.3 := true;
elsif i5 and not Fix.4 then In := 5; Fix.4 := true;
elsif i6 and not Fix.5 then In := 6; Fix.5 := true;
elsif i7 and not Fix.6 then In := 7; Fix.6 := true;
elsif i8 and not Fix.7 then In := 8; Fix.7 := true;
elsif i9 and not Fix.8 then In := 9; Fix.8 := true;
elsif i10 and not Fix.9 then In := 10; Fix.9 := true;
elsif i11 and not Fix.10 then In := 11; Fix.10 := true;
elsif i12 and not Fix.11 then In := 12; Fix.11 := true;
elsif i13 and not Fix.12 then In := 13; Fix.12 := true;
elsif i14 and not Fix.13 then In := 14; Fix.13 := true;
elsif i15 and not Fix.14 then In := 15; Fix.14 := true;
elsif i16 and not Fix.15 then In := 16; Fix.15 := true;
end_if

if In > 0 then // Есть очередной желающий
// Ищем свободное место в очереди и ставим его в очередь
for Free := 1 to 16 do
if Dim[Free] = 0 then
Dim[Free] := In; exit;
end_if
end_for
end_if

// Выбрасываем из очереди, если загрузка уже не требуется
In := 0;
if not i1 and Fix.0 then In := 1; Fix.0 := false;
elsif not i2 and Fix.1 then In := 2; Fix.1 := false;
elsif not i3 and Fix.2 then In := 3; Fix.2 := false;
elsif not i4 and Fix.3 then In := 4; Fix.3 := false;
elsif not i5 and Fix.4 then In := 5; Fix.4 := false;
elsif not i6 and Fix.5 then In := 6; Fix.5 := false;
elsif not i7 and Fix.6 then In := 7; Fix.6 := false;
elsif not i8 and Fix.7 then In := 8; Fix.7 := false;
elsif not i9 and Fix.8 then In := 9; Fix.8 := false;
elsif not i10 and Fix.9 then In := 10; Fix.9 := false;
elsif not i11 and Fix.10 then In := 11; Fix.10 := false;
elsif not i12 and Fix.11 then In := 12; Fix.11 := false;
elsif not i13 and Fix.12 then In := 13; Fix.12 := false;
elsif not i14 and Fix.13 then In := 14; Fix.13 := false;
elsif not i15 and Fix.14 then In := 15; Fix.14 := false;
elsif not i16 and Fix.15 then In := 16; Fix.15 := false;
end_if

if In > 0 then // Есть вышедший из очереди
// Ищем его место в очереди
for Free := 1 to 16 do
if Dim[Free] = In then exit; end_if
end_for
// Сдвигаем оставшуюся очередь
while Free < 16 do
Dim[Free] := Dim[Free + 1]; Free := Free + 1;
end_while
Dim[Free] := 0; // Последнее место в очереди освобождается точно
end_if

Q := Dim[1]; // Первый в очереди стоит под загрузкой

end_function_block

kondor3000
31.03.2026, 20:10
Не уверен, что правильно понял задание. Предлагаю свою версию решения, если Вы сможете разобраться и перенести в CDS.
Поленился дописать пару строк, чтоб сравнение EQ убрать )))
А так всё работает.

Валенок
02.04.2026, 00:35
FIFO для булевых переменных в CDS 3.5

А что еще надо? Истина - в очереди, лож - вылетаешь.
основное - что CDS.



FUNCTION_BLOCK ?? //обязательно FB...
VAR_INPUT
in1, ...., inXX: BOOL; //XX здесь и дальше - сами. Но и 254 можно запилить
END_VAR
VAR_OUTPUT
Out: BYTE; //номер того кто на выходе, 0 - никто
END_VAR
VAR
Pin: POINTER TO ARRAY[1..XX] OF BOOL; //.. потому что FB
P: POINTER TO BYTE;
Str1: STRING(1) := '*';
Очередь: STRING(XX);
Pos: INT;
END_VAR
-------------------------------------------
Pin := ADR(in1);
P := ADR(Str1);
FOR P^ := 1 TO XX DO
Pos := FIND(Очередь, Str1);
IF Pos <> 0 AND NOT Pin^[P^] THEN //был и лож - вылетаешь (жопу поднял - место потерял)
Str := DELETE(Очередь, 1, Pos);
ELSIF Pos = 0 AND Pin^[P^] THEN //не был, но Истина - в очереди(ь)
Str := CONCAT(Очередь, Str1); //но FIFO
END_IF
END_FOR
P := ADR(Очередь);
Out := P^;

всё

B.S.V
06.04.2026, 09:53
Всем привет.
Пока использовал идею от EFroL, для моих мозгов самая понятная оказалась. Остальные идеи изучаю.
Благодарю за помощь.