Представим себе проект в ТМ, на экране которого отображается единственное значение- показание с датчика. Например, температура воздуха. Значение выдается с одним знаком после запятой: 15.6 ºC, 33.8 ºC, -0.7 ºC и т.д.
И вот, в один прекрасный момент вы видите на экране значение -0.0 ºC…
Суть проблемы.
Все мы знаем, что ноль отрицательным не бывает. Положительным тоже не бывает. Ноль число беззнаковое.
Потому вывод на экран значения -0 или -0.0 или -0.00 это признак непрофессионализма, если не глупости:
ТМ выводит на ГЭ «Текст» значение «-0.0» в случае когда:
1.1. Есть канал float
1.2. Канал привязан к ГЭ «Текст»
1.3. В ГЭ «Текст» свойство формат= float, %.1f (Выводим на экран значение с одним знаком после запятой)
1.4. 0 > Канал.In >-0.05 , (для простоты считаем, что канал без обработки)
Кто виноват?
В ходе изучения проблемы оказалось, что вина в подобном баге не столько на разработчиках ТМ, сколько на стандарте Си, откуда в ТМ6 взят формат представления чисел.
Давайте посмотрим, как в старом досовском Borland C++ 3.0 сработает отображение числа -0.01 в формате «%.1f»:
//===========================
#include
#include
void main()
{
clrscr();
printf(«\n\n»);
printf(«%.1f»,-0.01);
getch();
}
//===========================
Видим, что старый добрый Си++ тоже радует нас смешным числом -0.0.
И что с того, чем опасен этот глюк?
В обычных условиях этот глюк будет проявляться редко. Я о нем даже понятия не имел, хотя разрабатывал и тестировал программу несколько месяцев.
Однако он проявился на объекте при аттестации измерительных каналов.
Представьте- сидите за компом вы и с вами специалист по аттестации. Аттестируем канал 4…20 мА = -50…50 ºC:
Даем на модуль 4 мА, видим -50 ºC;
Даем на модуль 8 мА, видим -25 ºC;
Даем на модуль 12 мА, видим -0.0 ºC…. Просто потому, что модуль аналоговых входов видит не четко 12.000 мА, а 12.002 мА или 11.998 мА. В последнем случае реальное значение температуры не 0.000 ºC а -0.001 ºC. А после форматирования %.1f показывает -0.0 ºC.
Дальнейшие последствия зависят от благожелательности приёмщиков вашей работы. Не говоря о том, что самому стыдно будет.
Что делать?
В РП том 1, стр. 174 описана функция «Трансляция» у канала. Т.е. при отработке канала можно вставить свою программу, которая повлияет на результаты преобразования атрибута А в атрибут R.
В нашем случае делаем программу:
Программа округляет до нуля все данные, которые меньше нуля и больше -0.05.
В свойствах канала ставим вызов на программу:
Привязываем атрибуты канала:
Запускаем программу, и проверяем:
Все работает, больше неудобного значения «-0.0» мы не увидим.
Добавить комментарий