Нужен проект ,а не видео
Нужен проект ,а не видео
электронщик до мозга костей и не только
Проект: 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.
Господа разработчики и знатоки ПР200!
Прыгающее значение измеренного, стабильного сопротивления это нормально? В преобразовании в градусы цельсия, температура прыгает в пределах 1-го градуса. При этом при выводе на экран цифры смазываются от такого количества разных значений. И как с этим бороться?
На аналоговый вход подключен датчик температуры Pt100, перемычки и параметры выставлены для измерения сопротивления, для преобразования используется макрос из он-лайн библиотеки. время фильтра 0,1.
Последний раз редактировалось Project M; 29.05.2017 в 12:25.
Умный человек - с лёгкостью решает любые проблемы. Мудрый - их не создаёт.
https://vk.com/a.matica
Если не критично время реакции на изменение показаний, попробуйте увеличить время фильтрации до 1с.
Инерционность самого термосопротивления не позволит получать реальные показания со скоростью на порядок выше, чем раз в секунду. С применением модуля МВ110-8А уже привык к тому, что самое быстрое обновление показаний температуры при нагруженном приборе ~0,8 с.
А что за фильтр используется в макросе? Если просто среднее значение за заданный период, то можно смело и 2с поставить.
Ещё идея: использовать для отображения и для обработки сигнала 2 разных переменных. Например, для отображения - среднее значение за 5с, для обработки можете оставить 0,1с. Плюс не забываем, что флюктуации на уровне 1° - это всего лишь 0,5% для датчика, работающего в диапазоне от -50 до 150°.
Последний раз редактировалось HappyLuckyMan; 29.05.2017 в 13:04.