а это тогда что
Вид для печати
Не могу понять, что происходит с расчётами. Прикладываю скрин эмуляции, где разные значения обратных вычислений.
Вложение 26233
Не понимаю, то лыжи не едут, то ли я идиот. Перепробовал уже кучу вариантов, с переприсвоениями промежуточными и т.п. в итоге результат неправильный. Вплоть до формулы c:=a-b, где a и b REAL переменные. В режиме эмуляции присваиваю им соответственно 90916050086-90916000000, получаю с=50112 вместо 50086. Это как так может быть?
Ну Вы даете!
Если диапазон представления чисел для REAL от -3.4028E+38 до 3.4028E+38, то это вовсе не означает, что можно одиннадцати разрядные числа использовать!
Ведь для мантиссы отводится всего 23 бита из 32. В стандарте IEEE 754 несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения NaN (Not a Number, «не число») и +/-INF (Infinity, бесконечность), получающихся в результате операций деления на ноль или при превышении числового диапазона. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы.
В любом случае числа REAL то приблизительные и точность ограничена разрядной сеткой процессора.
Для обычного REAL число десятичных знаков д.б. не более семи, а Вы пытаетесь скормить кодесису одиннадцать. Не знаю, как компилятор округляет, например, 90916050086 может так 9.0916052992E10?
https://ru.wikipedia.org/wiki/%D0%A7...82%D0%BE%D0%B9
Вложение 26236
TIME()-old>=T#10s - условие: если прошло не меньше 10 секунд, то выражение будет TRUE иначе будет FALSE.
BOOL_TO_INT преобразует тип BOOL в тип INT. То есть если значение выло true, то в результате будет 1, а если false, то будет 0.
Аналогично можно было записать так:
...
1: IF TIME()-old>=T#10s THEN
state:=2;
END_IF
...
Petera, спасибо за ликбез. В общем суть понял. Что осталось непонятным, это то,что на скриншоте вычисления с 1 по 9-ю строку и с 12 по 14-ю выполняются правильно. Вообще, я пытался обработать ваше гениальное решение по преобразованию времени в одну переменную для ПР200. И если значение даты удалось обработать, то на времени получается то что на скрине ((
+100500%
Не надо заниматься ерундой, в кодесис переменные DATA_AND_TIME или DT уже упакованы в 32-х битную величину, которая не что иное как время UNIX или другое название - POSIX. Это число секунд с 0 часов 1 января 1970г. Дискретность в 1 секунду считается достаточной для большинства практических задач.
Осталось только передать в ПР значение DWORD в двух соседних регистрах и "склеит" их в ПР в одну переменную.
Для извлечения отдельных значений года, дня, месяца и т.д. нужно будет делать макросы. Вроде я где-то показывал, как в кодесисе их извлекать.
Для расширения кругозора почитайте статью И.Петрова Программируем временные сложности