Если запоминать просто фронта, а потом формировать импульс произвольной длины, то конечно массив булей не нужен.
Вид для печати
Если запоминать просто фронта, а потом формировать импульс произвольной длины, то конечно массив булей не нужен.
Да и если надо прям повторить сигналы, то тоже самое - только время
А если 100-й спад затрётся 101-м фронтом? Что будет на выходе?
А если и он затрётся 102-м спадом?
Если время ещё не наступит для сдвига массива?
Так чел же написал, что задержка требуется 3 сек, а период импульсов 2 сек, так что здесь и массив как таковой не нужен. Можно и на квадратиках нарисовать
А вот, что он не написал, так требуется ли обрабатывать паузу, когда входящий импульс пришел и конвейер остановился до того как выход сработал
Чел написал что нужно повторить входное следование сигналов с задержкой а не создать независимую генерацию.
Предполагать что что-то механическое на входе имеет строгие 2 сек, насколько это принципиально, учесть банальное отсутствие одного (или.. ) изделий на ленте, колебания скорости конвейра прям в процессе - автор внятно не объяснил. Пока ясно только то, что нужны только передние фронты. Если это всё учесть, то на квадратиках и без массива-архива зае...тесь пыль глотать.
Допускаю что это всё вообще не нужно и есть какие-то принципиально другие решения, но это нужно знать полную технологию и итоговые задачи. Но "кушает" за это - автор.
Всех с Днем Великой Победы!
массив может быть и небольшим, если учесть, что на входе есть длительность сигнала, и следующий фронт сигнала всегда не меньше какого-то времени.
Но если смотреть на диаграмму, только первое включение имеет настройку задержки, далее должен быть повтор сигнала с нюансом настройки времени включения выхода.
Иначе на диаграмме везде было бы указано Т перед включением.
Спад не парит - автору не нужен. У вас массив на 101 значение)) т.к. 0..100.
Норм будет на выходе, как и хотели.
Так ранее вы сами же обозначали края.
Тот же вопрос: А если размер памяти для хранения необходимого окна архива будет больше наличной памяти?
Обычный ответ: Это проблема техники и/или того кто заявил свою хотелку.
Решение очевидное: Заменить технику и/или урезать осетра.
Здесь размер для массива ограничивает только память/синтаксис ОЛ. Ну и 2^32-1 мс таймера))
Тоже самое и если длина выходного импульса (по словам автора - какая-то константа) будет больше интервала между входными фронтами.
Обычное слипание.
Всё - выше. А сдвигать ничего не нужно. Индексы циклические и всего делов.
Если больше 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
Да не нужен здесь массив булей. Время истекло - инверсия