Так и будет 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
Всё! Сдаюсь!!![]()
А можно теперь простыми словами разъяснить суть дискуссии?
И каков правильный вариант.
Правильный вариант, когда в ветке 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 во время вращения назад - произойдет реверс без паузы, а это опасно в большинстве случаев.
Последний раз редактировалось EFrol; 17.10.2024 в 18:41.
Спасибо, оба варианта интересные.