Да, но даже в этом случае, когда t станет = Tmax, и на следующем цикле OnOff станет true, а get_time() обнулится - 0-й State будет просто пропущен!!!
Вид для печати
Так и будет 1 сек если
Код:else
... t := get_time();
а если
то будет 1 цикл, не смотря наКод:else
... t := t#0s;
точнее - практически никогда не будет шага 0Код:0: // Пауза 1 сек перед пуском вперед
if get_time() - t >= T#1s then
State := 1; FW := true; t := get_time(); // Пуск вперед
end_if
Ok. Давайте точнее.Цитата:
Код:else
t := get_time(); // и это значение равно Tmax(1.5мес)
t := udint_to_time(FFFFFFFFh), на калькуляторе можно десятичный вид посмотреть
НеаЦитата:
тогда на следующем цикле get_time() := 0 и:
Код:0 - Tmax > T#1s // Истина в этом же цилк и State := 1 тоже в этом же цикле
0 - FFFFFFFFh = 1, мс => false
1 - FFFFFFFFh = 2, мс => false
....
1000 - FFFFFFFFh = 1001, мс => true
Всё! Сдаюсь!! :rolleyes:
А можно теперь простыми словами разъяснить суть дискуссии?
И каков правильный вариант.
Правильный вариант, когда в ветке else стоит:
Т.е. на каждом цикле когда OnOff = false ФБ будет t := get_time() для того, чтобы в тот момент, когда OnOff станет true, нормально отработала первая пауза.Код:else
t := get_time();
Дискуссия возникла из-за недопонимания того, что в беззнаковой арифметике Xmax = 0 - 1,
а значит пауза отработает правильно даже при обнулении get_time() через 4294967296 мс (или примерно через 50 суток).
Если оставить t := T#0s, то в момент когда переполнится get_time() и будет выполняться State = 3 - произойдет реверс без паузы.
Попробуйте быстро выключить и включить OnOff во время вращения назад - произойдет реверс без паузы, а это опасно в большинстве случаев.
Спасибо, оба варианта интересные.