Я похоже тут назначен крайним за косяки МЭК стандарта. Давайте будем реалистами. Вы требуете слишком много от простых инструментов. Ну не написано инструкции к пиле, сколько кубов земли ей можно вырыть. Такой вот ужасный косяк авторов пилы
Тема поднята непростая, за раз не осилим, давайте постепенно.
1. Тип TIME – это не время, а длительность. Название в МЭК выбрали неудачно, но так уж сложилось исторически Бывает. Cо страной ‘Гондурас’ тоже промашка вышла
С TIME можно делать вычисления и сравнения. Внутри это обычный целый тип DWORD со всеми вытекающими. Операции вычислений и сравнений, которые умеет делать сам микропроцессор с целыми без знака, тут подходят. В ассемблер компилируется без вопросов. Остается только сделать преобразование в человеческое представление в компиляторе, отладчике и визуализации.
Человеческое представление – это дни, часы, минуты и пр. В хелпе есть замечание (*Старший компонент может выходить за свой предел*). Это вполне логично. Например, можем думать в минутах и писать 10 минут, 10.5 (десять с половиной) минут или 1000 минут. Вполне удобно. Можем работать в часах, но тогда уж минут должно быть не больше 59. Можем ввести секунды, но тогда не используем доли минут. Логично. Иначе человек сломает голову при разборе.
К хелпу есть базовое требование чтобы букв было минимум при максимуме пользы. Стоит ли по TIME писать в нем подробнее, чем есть сейчас?
2. Займемся TOD - время дня. Название хорошее. В хелпе написано: ‘Диапазон значений TOD от: 00:00:00 до 23:59:59.999.’ Попробуем ввести TOD1 := TOD#26:00:00; Компилятор дает ошибку. Правильный компилятор. Проверка делается на ПК и не напрягает проц. ПЛК. Пусть она будет.
Тип TOD обычно нужен чтобы получить время из некоего места, например аппаратных часов, и выполнить нужную операцию в нужное время. Например, так:
IF TOD1 > TOD#17:00 THEN bLight := FALSE END_IF
Можно применять сравнения. Можно выполнять преобразования. Можно вычитать и получать длительность. Можно добавлять длительность. Дополняет TOD тип DATA. Можем сделать структуру с датой и точным, до мс, временем. Нормально.
Остается вопрос о контроле переполнения TOD. Стоит ли в каждую вычислительную операцию вводить обрезание по суткам? Хорошо, будет защита от дурака. Но, это дополнительный процессорный код на каждую операцию, он однозначно даст тормоза всех вычислений. Я бы не стал даже только поэтому. Кроме того, после добавления к времени дня интервалов может получиться новый день. Может быть нужда его поймать и перенести в дату. С обрезанием получим большой облом. Итого, просится не водить контроль, а считать что программист умный и понимает что делает. ИМХО CoDeSys хорош быстрым кодом и расширениями МЭК, рассчитанными на умных пользователей. Значит все гармонично.
В ключе этих мыслей TIME_TO_TOD( T#1d1s ) должно дать TOD#24:00:01. Оно и дает.
Пока не вижу никакого криминала с TOD в CoDeSys. Можем поменять в хелпе фразу c ‘Диапазон значений TOD от: 00:00:00 до 23:59:59.999.’ на: ‘Диапазон значений констант TOD от: 00:00:00 до 23:59:59.999.’ Будет точнее. Меняем?