TraceMode 6.08: значение -0.0 | ПЛК и АСУТП

tm1-1Представим себе проект в ТМ, на экране которого отображается единственное значение- показание с датчика. Например, температура воздуха. Значение выдается с одним знаком после запятой: 15.6 ºC, 33.8 ºC, -0.7 ºC и т.д.
И вот, в один прекрасный момент вы видите на экране значение -0.0 ºC…

Суть проблемы.
Все мы знаем, что ноль отрицательным не бывает. Положительным тоже не бывает. Ноль число беззнаковое.
Потому вывод на экран значения -0 или -0.0 или -0.00 это признак непрофессионализма, если не глупости:

minus_0_tm

 

ТМ выводит на ГЭ «Текст» значение «-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();

}
//===========================

minus_0_c

 

Видим, что старый добрый Си++ тоже радует нас смешным числом -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.

В нашем случае делаем программу:

1-01

 

Программа округляет до нуля все данные, которые меньше нуля и больше -0.05.

В свойствах канала ставим вызов на программу:

1-02

 

Привязываем атрибуты канала:

1-03

 

Запускаем программу, и проверяем:

1-04

 

Все работает, больше неудобного значения «-0.0» мы не увидим.

Добавить комментарий

Ваш e-mail не будет опубликован.

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой:
Confirm that you are not a bot - select a man with raised hand:

Подпишитесь на нашу рассылку


Copyright © 2016. Перцух Алексей

Индекс цитирования