Форум » » суммирование времени » Ответить

суммирование времени

kislez2015: подскажите, допустим есть какой-то датчик мгновенного действия, т е есть событие какое-то длящееся минуту - он выдает единицу на выходе минуту, нет события - он мгновенно выдает 0. Возможно ли как-то реализовать сохранение суммарного времени, которое выдавался единичный сигнал? ну допустим - датчик движения, нужно сохранить время, которое он суммарно выдавал единичный сигнал? как это можно сделать? Спасибо

Ответов - 19

Вячеслав: Вас там начальник муштрует что ли такими задачками? )) DIGITAL_INPUT input; ANALOG_OUTPUT time_per_second; CHANGE input { if(input=1){time_per_second=0;} while (input=1) { time_per_second=time_per_second+1; delay(100); } } Это если не более 65535с что чуть более 18ч. Если надо считать в годах, днях, и т.д. то придется повозиться, либо попытаться отмазаться выводя в сериальные выходы время начала и время окончания.

Вячеслав: Если на квадратиках: Осциллятор 1с на каскад RingCounter завести Первый считает секунды, с его 60 выхода на clock следующего который считает минуты и т.д. Потом как то свести воедино, ну и на reset входы заводить сигнал через one shot , а на gate осциллятора сигнал напрямую. Таким же образом и + можно модернизировать, считая до 60, потом +1 к минутам и сбросить секунды в 0 При 60 минутах +1 к часам и сбросить минуты в 0. При 24 часах +1 к дням и сбросить часы в 0. и т.д.

Игорь K.: Люди занимаются самообразованием на внезапных задачах. Это нормальный метод.


kislez2015: Вячеслав спасибо! щас поизучаю не)) я просто решил наделать на будущее разных мини-программок нестандартных)) вдруг пригодится - ну и узнаются функции разные

kislez2015: Игорь K. ну в принципе да часто используемое - это все понятно, а на чем-то таком и новые элементы и комманды всплывают обычно

Вячеслав: Самое ценный опыт распарсить какой нибудь фидбэк от устройства. Матрица типа Kramer и Extron для начала подойдет. Набора: If find while for byte chr ATOI ITOA wait RemoveByLength mid makestring break pulse delay len switch GetLastModifiedArrayIndex Time Function Integer_Function String_Function nonvolatile Достаточно для 95% программ на SIMPL+. Изучайте

kislez2015: Спасибо! Вячеслав пишет: CHANGE input { if(input=1){time_per_second=0;} а зачем это приравнивание нулю? и почему не push?))

Вячеслав: PUSH обнаруживает переход сигнала только в направлении от 0 к 1 (передний фронт), а CHANGE обнаруживает переход в обоих направлениях и от 0 к 1 и от 1 к 0. Если был PUSH цикл while никогда бы не завершился, даже при снятии внешнего сигнала. Приравнивание к нулю необходимо, если начинать при каждом новом удержании сигнала в единице заново отсчет времени. Если задача, накапливать интервалы последовательных удержаний сигнала то эту строку можно убрать. Учитывая что это выход, который по определению после загрузки равен 0, то первичной инициализации не потребуется. Либо сделайте отдельный вход для инициализации этой переменной по необходимости начинать отсчет заново.

kislez2015: Вячеслав спасибо но не пойму, разве while не завершится, когда input станет равен 0 при push?

Вячеслав: Наверное вы правы, можно и PUSH

gosha: kislez2015 пишет: но не пойму, разве while не завершится, когда input станет равен 0 при push? Я бы на это не закладывался.

eoulianov: Пример - как не надо) Нужно отжать и тут же нажать этот вход - тогда первый обработчик не успеет завершиться (потому что отжатие-нажатие попадёт в период delay(100), цикл while() продолжится), второй обработчик (по отжатию) тут же завершится ничего не сделав, а третий обработчик - по нажатию обнулит счётчик и начнёт работать в параллель с первым и они станут считать вместе один счётчик, но в два раза быстрее) Для этих изощрений с задержками нужно бы вкурить wait() и все эти cancelWait(), либо воспользоваться Simpl Timers или Analog Ramp))

Вячеслав: Старожилам палец в рот не клади ) Давайте взорвем мозг рекурсией: Function counter() { wait(100) { time_per_second=time_per_second+1; counter(); } } CHANGE input { if(input=1){time_per_second=0;}else{CancelAllWait();} counter(); }

eoulianov: Вячеслав, это к счастью не рекурсия: да, функция приводит к вызову самой себя, но в стеке вызовов не накапливаются копии её окружения - она каждый раз заканчивается и до следующей секунды живёт одно отложенное событие в очереди таймера, и это очень хорошо по сравнению с function count() { ... delay(100); count(); } Вот мой вариант) [pre2]digital_input timer; analog_output seconds; function tick() { // вызывается раз в секунду пока нажат timer seconds = seconds+1; wait( 100, tickWait ) tick(); } change timer { cancelWait( tickWait ); if( timer ) { seconds = -1; tick(); } } [/pre2]

Вячеслав: Так это же те же яйца только вид сбоку Давайте реабилитируем вариант номер 1: DIGITAL_INPUT input; ANALOG_OUTPUT time_per_second; THREADSAFE CHANGE input //исключаем повторный вызов { if(input=1){time_per_second=0;} while (input=1) { delay(100); if(input=1) {time_per_second=time_per_second+1;} //дыбы не округлять сигналы меньше секунды вверх } }

Courag1k: Добрый день! Не нашел модуль секундомера. Чтобы время в аналоге выдавал. SIMPL+ пока для меня далек, а в обычном SIMPl не вижу его.

Вячеслав: А какая задача? Можно нагромоздить oscillator+ring counter (c 60-тью выходами на 60с)+analog initialize Но это же беспредел. В примерах выше готовые программы. Одна из них в в виде модуля click here P.S. Это только до 65535с, один выход с абсолютным значением в секундах (нет минут часов и т.п.)

eoulianov: Добрый вечер) Можно записать Date(), Time() и GetHSeconds() на push и на release в S+ и посчитать разницу в 32-битное значение в сотых долях секунды, и складывать это счётчик с каждым новым нажатием. По идее можно побаловаться с Clock Driver, Serial to Analog, Analog 2's Offset Converter, Analog Sum - тоже увлекательно. Можно поставить Roomview, и там функцию подсчёта часов использования лампы)

Courag1k: SIMPL+ пока для меня темный лес) Вячеслав, спасибо, секундомер как мне нужно:)



полная версия страницы