Страница 1 из 1

Буфер FIFO

Добавлено: 07 ноя 2019, 14:46
Dryundel
Буфер FIFO v1.1
Очередь обработки данных
.
FIFO V1.1.jpg
Буфер_FIFO_v1.1_(CODE).ubi
.

Обсуждение на форуме: viewtopic.php?p=78899#p78899

Буфер FIFO подобен СТЕК. Основное отличие в очереди извлечения данных. Если СТЕК работает по принципу "первый пришел - последний ушел", то у FIFO принцип работы - "первый пришел - первый ушел"


С помощью данного блока FIFO v1.1 осуществляется запись переменных в массив и извлечения этих переменных в порядке прямой очереди.

Ассоциативный пример применения
Первый сотрудник (группа сотрудников) вводит номер очередного заказа и кнопкой Insert ставит его в очередь.
Второй сотрудник в процессе отработки заказов, в соответствии с очередью, нажимает кнопку Extract получает номер следующего заказа.
Так же на табло (с помощью выхода Volum ) выводится количество клиентов находящихся в очереди.


Принцип и логика работы:

1. В настройках выставляем размер буфера (массива) - параметр size_fifo. Он определяет сколько переменных сможет вместить блок.
2. Подачей единицы на вход Insert записываем очередную переменную со входа In в буфер (в конец очереди)
3. Подачей единицы на вход Extract извлекаем первую по очереди переменную из буфера (очереди) на выход Out.
4. Подача единицы на вход Clean очищает буфер.
5. По умолчанию при очистке буфера, последняя переменная извлеченная из буфера остается на выходе Out.
6. Для обнуления выхода Out в момент очистки буфера надо установить параметр ResetOut в True.
7. Если в буфере пусто, то на выходе Empty - единица и больше ничего из очереди не извлекается.
8. Если буфер полон то на выходе Full - единица и ничего в очередь больше не ставится.
9. На выход Volum выводится текущее количество переменных хранящихся в буфере. С помощью этого выхода удобно следить за заполненностью буфера.
10. Тип данных буфера можно изменить на (int, long int, unsigned long int, float, char). Для этого требуется изменить тип данных в трех местах - вход In, выход Out, а также в SetupSection.

Входы блока:
Insert - Запись переменной In в буфер
Extract - Извлечение переменной из буфера на выход Out
Clean - Очистка буфера
In -Выход FIFO

Выходы блока:
Full - Индикатор полного буфера
Empty - Индикатор пустого буфера
Volum - Текущее количество переменных в буфере
Out - Выход FIFO

Параметры пользователя:
size_fifo - Размер буфера
ResetOut - Сброс выхода Out в "0" при очистке буфера: (True - сбрасывается, False - не сбрасывается.)

Данный блок не корректно работает с переменными типа String.
Для работы со строками рекомендую это: viewtopic.php?f=85&t=7884

Буфер FIFO

Добавлено: 07 ноя 2019, 17:13
tolochko
Здравствуйте
Уважаемый Dryundel а сколько максимально переменных int можно положить в буфер?

Буфер FIFO

Добавлено: 07 ноя 2019, 18:15
Dryundel
tolochko писал(а): 07 ноя 2019, 17:13 Здравствуйте
Уважаемый Dryundel а сколько максимально переменных int можно положить в буфер?
Сколько в параметре size_fifo выставите, столько и можно. Чем больше выставите тем больше памяти зарезервирует контроллер.

Отправлено спустя 40 минут 40 секунд:
Для экономии памяти изменяйте тип переменной "под себя" в редакторе блока.
К сожалению пока настройку такой опции редактор ПБ делать не позволяет.

Для понимания вот таблица.
.
Таблица типов данных.jpg

Буфер FIFO

Добавлено: 11 ноя 2019, 19:53
Dryundel
Буфер FIFO v2.1(массив)
.
FIFO V2.1(массив).jpg
Буфер_FIFO_v2.1(массив)_(CODE).ubi
.
С помощью данного блока FIFO v1.1(массив) осуществляется запись пяти-элементного массива int в массив(очередь) и извлечения этих элементов массива int в порядке прямой очереди.

В отличии от версии FIFO v1.1 данный блок создает и обрабатывает очередь 5-элементного массива.
Поданная на входы пятерка переменных в виде массива встает в очередь и извлекается из очереди в том же составе.

[spoiler=Описание:]Принцип и логика работы:
1. В настройках выставляем размер буфера (массива) - параметр size_fifo. Он определяет величину очереди.
2. Подачей единицы на вход Insert записываем очередной массив(№двигателя, время) со входов n_in в буфер (в конец очереди)
3. Подачей единицы на вход Extract извлекаем первый по очереди массив из буфера (очереди) на выходы out_n.
4. Подача единицы на вход Clean очищает буфер.
5. По умолчанию при очистке буфера, последние переменные извлеченные из буфера остается на выходах out_n.
6. Для обнуления выходов out_n в момент очистки буфера надо установить параметр ResetOut в True.
7. Если в буфере пусто, то на выходе Empty - единица и больше ничего из очереди не извлекается.
8. Если буфер полон то на выходе Full - единица и ничего в очередь больше не ставится.
9. На выход Volum выводится текущее количество массивов int хранящихся в буфере. С помощью этого выхода удобно следить за заполненностью буфера.

Входы блока:
Insert - Запись переменной In в буфер
Extract - Извлечение переменной из буфера на выход Out
Clean - Очистка буфера
n_in - Входы очереди

Выходы блока:
Full - Индикатор полного буфера
Empty - Индикатор пустого буфера
Volum - Текущее количество переменных в буфере
out_n - Выходы очереди

Параметры пользователя:
size_fifo - Размер буфера
ResetOut - Сброс выхода Out в "0" при очистке буфера: (True - сбрасывается, False - не сбрасывается.)
[/spoiler]

Буфер FIFO

Добавлено: 12 ноя 2019, 05:31
aidar_i
Жаль, что тип данных нельзя поставить строку. Пришлось сделать стек для строки.

Буфер FIFO

Добавлено: 12 ноя 2019, 19:47
Dryundel
aidar_i писал(а): 12 ноя 2019, 05:31 Жаль, что тип данных нельзя поставить строку. Пришлось сделать стек для строки.
Думаю что можно сделать и такой блок. Вот только контроль заполненности (Volum) скорее всего не получится в этом случае.

Буфер FIFO

Добавлено: 26 ноя 2019, 13:01
KulibinOrsk
[ref]Dryundel[/ref], а как записать в очередь 16 однобитовых значений ? В частности интересует отслеживать 16 нажатий кнопок и затем их воспроизведение. Может есть и такой блок ?

Буфер FIFO

Добавлено: 26 ноя 2019, 13:29
Dryundel
KulibinOrsk писал(а): 26 ноя 2019, 13:01 [ref]Dryundel[/ref], а как записать в очередь 16 однобитовых значений ? В частности интересует отслеживать 16 нажатий кнопок и затем их воспроизведение. Может есть и такой блок ?
Это как? :shok:
Если нажать на кнопку 16 раз то можно к примеру получить 16 единиц в очередь. И что это даст?

Или у Вас 16 кнопок?
Тогда можно зафиксировать их совместное состояние с помощью блоков бит->байт и вот это значение поставить в очередь. А потом обратной операцией восстановить биты.

Буфер FIFO

Добавлено: 26 ноя 2019, 14:36
KulibinOrsk
[ref]Dryundel[/ref], да думаю 16 кнопок поставить. Пока планировал делать просто последовательно обрабатывать все кнопки и смотреть была ли она ранее нажата (смотреть флаг)... была мысль использовать ваш блок. Но судя по всему проще будет делать так как ранее думал - с последовательной обработкой.

Буфер FIFO

Добавлено: 26 ноя 2019, 14:52
Dryundel
[ref]KulibinOrsk[/ref], Вы слегка путано объясняете что хотите сделать.
Исходя из всего сумбура сказанного, я понял что кнопки у вас не фиксирующиеся и требуется воспроизвести последовательность их нажатий.
Так?
Если да, возникает вопрос - требуется ли при воспроизведении соблюдать паузы и длительность нажатий? Или надо воспроизвести просто последовательность с максимальной скоростью?

Буфер FIFO

Добавлено: 27 ноя 2019, 09:42
KulibinOrsk
[ref]Dryundel[/ref], я Вам можно сказать и не объяснял что планирую попробовать, просто в "общем плане" озвучил без деталей.
Я планировал блок применить у себя, но уже понял что в моем случае лучше оставить как задумал изначально - перебор последовательно по платам и отработка по условиям внутри плат.
Пока вопрос снят, дабы не озадачивать Вас своими мыслями тем более, что рабочий вариант вроде есть в мыслях.

Буфер FIFO

Добавлено: 20 авг 2020, 22:02
uzer
Dryundel писал(а): 11 ноя 2019, 19:53 Буфер FIFO v2.1(массив)
.
Не этом блоке возможно реализовать проект бегущие огни из 16 светодиодов на 74hc595, включающиеся через 2 ?
Не могу найти не одного примера, как реализовать на вроде такого переключения, есть только банально простые бегущие в один раяд.
[spoiler]https://youtu.be/GbzrWfCa0vA[/spoiler]

Буфер FIFO

Добавлено: 21 авг 2020, 09:34
Dryundel
uzer писал(а): 20 авг 2020, 22:02 Не этом блоке возможно реализовать проект бегущие огни из 16 светодиодов на 74hc595, включающиеся через 2 ?
Нет. Этот блок Вам не поможет. Вам в другую тему.
А вообще, два рядом бегущих огня - это тройка умножаемая на 2 в цикле, в бинарном формате.
00000011 -3
00000110 -6
00001100 -12
00011000 - 24
и т.д.
Если задача только в этом, Вам помогут операции с битами.

Буфер FIFO

Добавлено: 05 фев 2022, 21:21
Dryundel
Данный блок не корректно работает с переменными типа String.
Для работы со строками рекомендую это: viewtopic.php?f=85&t=7884