Буфер FIFO

Очередь обработки данных

Пользовательские блоки не подходящее под другие разделы
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Ответить
Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#1

Сообщение Dryundel » 07.11.2019{, 14:46}

Буфер FIFO v1.1
Очередь обработки данных
.
FIFO V1.1.jpg
FIFO V1.1.jpg (7.25 КБ) 2131 просмотр
Буфер_FIFO_v1.1_(CODE).ubi
(181.88 КБ) 198 скачиваний
.

Обсуждение на форуме: 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

tolochko
Сержант
Сообщения: 247
Зарегистрирован: 30.11.2016{, 16:58}
Репутация: 7
Откуда: Днепропетровск

Буфер FIFO

#2

Сообщение tolochko » 07.11.2019{, 17:13}

Здравствуйте
Уважаемый Dryundel а сколько максимально переменных int можно положить в буфер?

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#3

Сообщение Dryundel » 07.11.2019{, 17:34}

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

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

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

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#4

Сообщение Dryundel » 11.11.2019{, 19:53}

Буфер FIFO v2.1(массив)
.
FIFO V2.1(массив).jpg
FIFO V2.1(массив).jpg (14.88 КБ) 2001 просмотр
Буфер_FIFO_v2.1(массив)_(CODE).ubi
(234.2 КБ) 180 скачиваний
.
С помощью данного блока FIFO v1.1(массив) осуществляется запись пяти-элементного массива int в массив(очередь) и извлечения этих элементов массива int в порядке прямой очереди.

В отличии от версии FIFO v1.1 данный блок создает и обрабатывает очередь 5-элементного массива.
Поданная на входы пятерка переменных в виде массива встает в очередь и извлекается из очереди в том же составе.
Описание:Показать
Принцип и логика работы:
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 - не сбрасывается.)

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

Буфер FIFO

#5

Сообщение aidar_i » 12.11.2019{, 05:31}

Жаль, что тип данных нельзя поставить строку. Пришлось сделать стек для строки.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#6

Сообщение Dryundel » 12.11.2019{, 19:47}

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

KulibinOrsk
Лейтенант
Сообщения: 515
Зарегистрирован: 25.02.2018{, 08:48}
Репутация: 21
Откуда: Оренбург
Имя: Александр

Буфер FIFO

#7

Сообщение KulibinOrsk » 26.11.2019{, 13:01}

Dryundel, а как записать в очередь 16 однобитовых значений ? В частности интересует отслеживать 16 нажатий кнопок и затем их воспроизведение. Может есть и такой блок ?

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#8

Сообщение Dryundel » 26.11.2019{, 13:29}

KulibinOrsk писал(а):
26.11.2019{, 13:01}
Dryundel, а как записать в очередь 16 однобитовых значений ? В частности интересует отслеживать 16 нажатий кнопок и затем их воспроизведение. Может есть и такой блок ?
Это как? :shok:
Если нажать на кнопку 16 раз то можно к примеру получить 16 единиц в очередь. И что это даст?

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

KulibinOrsk
Лейтенант
Сообщения: 515
Зарегистрирован: 25.02.2018{, 08:48}
Репутация: 21
Откуда: Оренбург
Имя: Александр

Буфер FIFO

#9

Сообщение KulibinOrsk » 26.11.2019{, 14:36}

Dryundel, да думаю 16 кнопок поставить. Пока планировал делать просто последовательно обрабатывать все кнопки и смотреть была ли она ранее нажата (смотреть флаг)... была мысль использовать ваш блок. Но судя по всему проще будет делать так как ранее думал - с последовательной обработкой.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#10

Сообщение Dryundel » 26.11.2019{, 14:52}

KulibinOrsk, Вы слегка путано объясняете что хотите сделать.
Исходя из всего сумбура сказанного, я понял что кнопки у вас не фиксирующиеся и требуется воспроизвести последовательность их нажатий.
Так?
Если да, возникает вопрос - требуется ли при воспроизведении соблюдать паузы и длительность нажатий? Или надо воспроизвести просто последовательность с максимальной скоростью?

KulibinOrsk
Лейтенант
Сообщения: 515
Зарегистрирован: 25.02.2018{, 08:48}
Репутация: 21
Откуда: Оренбург
Имя: Александр

Буфер FIFO

#11

Сообщение KulibinOrsk » 27.11.2019{, 09:42}

Dryundel, я Вам можно сказать и не объяснял что планирую попробовать, просто в "общем плане" озвучил без деталей.
Я планировал блок применить у себя, но уже понял что в моем случае лучше оставить как задумал изначально - перебор последовательно по платам и отработка по условиям внутри плат.
Пока вопрос снят, дабы не озадачивать Вас своими мыслями тем более, что рабочий вариант вроде есть в мыслях.

uzer
Рядовой
Сообщения: 91
Зарегистрирован: 30.06.2019{, 14:50}
Репутация: 0
Имя: igor

Буфер FIFO

#12

Сообщение uzer » 20.08.2020{, 22:02}

Dryundel писал(а):
11.11.2019{, 19:53}
Буфер FIFO v2.1(массив)
.
Не этом блоке возможно реализовать проект бегущие огни из 16 светодиодов на 74hc595, включающиеся через 2 ?
Не могу найти не одного примера, как реализовать на вроде такого переключения, есть только банально простые бегущие в один раяд.
СпойлерПоказать

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#13

Сообщение Dryundel » 21.08.2020{, 09:34}

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

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Буфер FIFO

#14

Сообщение Dryundel » 05.02.2022{, 21:21}

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

Ответить

Вернуться в «Другое»