Если запоминать просто фронта, а потом формировать импульс произвольной длины, то конечно массив булей не нужен.
Если запоминать просто фронта, а потом формировать импульс произвольной длины, то конечно массив булей не нужен.
Да и если надо прям повторить сигналы, то тоже самое - только время
А если 100-й спад затрётся 101-м фронтом? Что будет на выходе?
А если и он затрётся 102-м спадом?
Если время ещё не наступит для сдвига массива?
Так чел же написал, что задержка требуется 3 сек, а период импульсов 2 сек, так что здесь и массив как таковой не нужен. Можно и на квадратиках нарисовать
А вот, что он не написал, так требуется ли обрабатывать паузу, когда входящий импульс пришел и конвейер остановился до того как выход сработал
Чел написал что нужно повторить входное следование сигналов с задержкой а не создать независимую генерацию.
Предполагать что что-то механическое на входе имеет строгие 2 сек, насколько это принципиально, учесть банальное отсутствие одного (или.. ) изделий на ленте, колебания скорости конвейра прям в процессе - автор внятно не объяснил. Пока ясно только то, что нужны только передние фронты. Если это всё учесть, то на квадратиках и без массива-архива зае...тесь пыль глотать.
Допускаю что это всё вообще не нужно и есть какие-то принципиально другие решения, но это нужно знать полную технологию и итоговые задачи. Но "кушает" за это - автор.
Всех с Днем Великой Победы!
массив может быть и небольшим, если учесть, что на входе есть длительность сигнала, и следующий фронт сигнала всегда не меньше какого-то времени.
Но если смотреть на диаграмму, только первое включение имеет настройку задержки, далее должен быть повтор сигнала с нюансом настройки времени включения выхода.
Иначе на диаграмме везде было бы указано Т перед включением.
Последний раз редактировалось melky; 09.05.2026 в 19:59.
Спад не парит - автору не нужен. У вас массив на 101 значение)) т.к. 0..100.
Норм будет на выходе, как и хотели.
Так ранее вы сами же обозначали края.
Тот же вопрос: А если размер памяти для хранения необходимого окна архива будет больше наличной памяти?
Обычный ответ: Это проблема техники и/или того кто заявил свою хотелку.
Решение очевидное: Заменить технику и/или урезать осетра.
Здесь размер для массива ограничивает только память/синтаксис ОЛ. Ну и 2^32-1 мс таймера))
Тоже самое и если длина выходного импульса (по словам автора - какая-то константа) будет больше интервала между входными фронтами.
Обычное слипание.
Всё - выше. А сдвигать ничего не нужно. Индексы циклические и всего делов.
Последний раз редактировалось Валенок; 09.05.2026 в 21:01.
Счастья в жизни нет и не будет - у любого алгоритма есть ограничения и границы применимости. А также - структуры данных можно оптимизировать по разным критериям (размер, скорость доступа, простота и скорость написания).
Автор вопроса не привёл ограничения из ТЗ - обсуждать критерии нет оснований.
Думаю, что автор вопроса уже получил ответ об алгоритме и вполне может заняться реализацией, выявлением ограничений по памяти или быстродействию или собственным силам.
Так что, я бы подождал результатов осмысления советов.
Если больше 101, то писать снова с 1го. Вчера только такой алгоритм для ИИ в кодесисе задал, но не стал тут выкладывать. Он почти аналогичен приведённому выше, только с данным условием.
PS
Код:VAR xInput : BOOL; // Входящий сигнал tDelay : TIME := T#5S; // Желаемая задержка xOutput : BOOL; // Выходной сигнал // Структура для хранения события fbGetTime : GET_TIME; // Псевдокод (зависит от целевого устройства, обычно TIME()) tCurrentTime : TIME; // Очередь событий arrValues : ARRAY[0..100] OF BOOL; // Состояния arrTimestamps : ARRAY[0..100] OF TIME; // Когда выдать iWriteIdx : INT := 0; // Индекс записи iReadIdx : INT := 0; // Индекс чтения xLastInput : BOOL; // Для отслеживания изменений END_VAR tCurrentTime := TIME(); // Получаем текущее время системы (мс) // --- ЗАПИСЬ В FIFO --- // Если сигнал изменился, записываем новое состояние и время его выхода IF xInput <> xLastInput THEN arrValues[iWriteIdx] := xInput; arrTimestamps[iWriteIdx] := tCurrentTime + tDelay; // Сдвигаем индекс записи по кольцу iWriteIdx := (iWriteIdx + 1) MOD 101; xLastInput := xInput; END_IF // --- ЧТЕНИЕ ИЗ FIFO --- // Проверяем, не пора ли выдать сигнал, стоящий первым в очереди IF iReadIdx <> iWriteIdx THEN // Если текущее время больше или равно запланированному IF tCurrentTime >= arrTimestamps[iReadIdx] THEN xOutput := arrValues[iReadIdx]; // Сдвигаем индекс чтения по кольцу iReadIdx := (iReadIdx + 1) MOD 101; END_IF END_IF
Последний раз редактировалось МихаилГл; 10.05.2026 в 09:22.
Да не нужен здесь массив булей. Время истекло - инверсия