Здравствуйте!
Обнаружил следующую особенность поведения ПР200 с рабочей программой.
Экран периодически перестаёт выводить информацию с последующим восстановлением. Видео прилагаю. https://yadi.sk/i/6wBamgw73JVzeT
Умный человек - с лёгкостью решает любые проблемы. Мудрый - их не создаёт.
https://vk.com/a.matica
Нужен проект ,а не видео
электронщик до мозга костей и не только
Проект: https://yadi.sk/d/RYz75Xlz3JW6Ns
Умный человек - с лёгкостью решает любые проблемы. Мудрый - их не создаёт.
https://vk.com/a.matica
Проверил на живой ПР200: fDiv 0/0=0. Ничего не зависает.
По исходнику из CoDeSys - когда-то очень давно (лет 8 назад) скопировал из Util.lib себе в проект - нужна была только эта функция. Там тоже деление на ноль не проверялось. Вот:
K := (OUT_MAX - OUT_MIN) / (IN_MAX - IN_MIN);
IF (IN <= IN_MIN) THEN
LIN_TRAFO_FUN := OUT_MIN;
END_IF;
IF ((IN > IN_MIN) AND (IN < IN_MAX)) THEN
LIN_TRAFO_FUN := OUT_MIN + K * (IN - IN_MIN);
END_IF;
IF (IN >= IN_MAX) THEN
LIN_TRAFO_FUN := OUT_MAX;
END_IF;
Поскольку IN_MIN,IN_MAX,OUT_MIN,OUT_MAX у меня всегда задавались константой при программировании - никогда на деление на ноль не нарывался.
Сейчас глянул в Util.lib, котрорая вместе с текущей версией CoDeSys поставилась - там вообще все по другому, и деление на ноль проверяется, и выход ошибки появился..
Нашел еще - такой макрос уже на форуме пробегал, только для ПР114 - http://www.owen.ru/forum/showthread....l=1#post123611. Там тоже деление на 0 не проверяется.
Последний раз редактировалось Мамонов Михаил; 28.05.2017 в 00:05.
Как раз 0/0=0 проверять не надо, это и в симуляторе так. Интересен вариант чистого деления на ноль, например 100/0 для float и для целочисленных. Результат может оказаться разным и удивить. Уже то, что имеем противоречие показаний в симуляторе с описанием ОЛ при делении на "0" напрягает.
Проверил:
INT 100/0 в симуляторе =0, в живом контроллере =4294967295 (если ограничить вывод на экран в 3 знака, то покажет 999)
FLOAT 100/0 в симуляторе пишет "бесконечность", в живом контроллере 999999,9
Проверял через вывод на экран, кол-во знаков переменной ставил максимальное (11 для INT и 7 для FLOAT)
Ну результат как бы закономерный - живой контроллер пытается взять максимально большое число для данного типа, с эти можно согласиться при отсутствии в нем системы контроля таких ошибок, симулятор с FLOAT ведет себя тоже правильно, а вот с INT - как то странно..
Если в симуляторе у float из бесконечности вычесть бесконечность, то будет "nan", а если "nan"+100="nan". В реальном ПР очевидно будет не так, наверное будет "0" и "100" соответственно. Просьба разработчикам ОЛ обратить внимание не несоответствие работы симулятора и ПР200 в этих состояниях.
Последний раз редактировалось Серёга Букашкин; 29.05.2017 в 10:58.