PDA

Просмотр полной версии : Вывод FLOAT на экран



Elka
14.02.2011, 13:15
Задача: вывести температуру, полученную с аналогового выхода на экран в виде двух цифр. Собственно кусок функции:
VAR
FormatTemp: STRING(10):='%+02.0f';
t_r: REAL;

...
END_VAR

t:=ShowString(z, col, 0, 't');

... (здесь учитывается вывод ошибочных величин и 0, далее)

собственно вывод температуры (3 позиции)
t:=ShowReal(z, col+1, 0, FormatTemp, t_r);
вывод символа "градус" (спасибо за поддержку в ПЛК63! ;-) и обозначения используемой шкалы - "по цельсию"
t:=ShowString(z, col+4, 0, '$9BC');

Исходил из формата printf, и если мне не изменяет память, то во времена оные указанное выше представление на сишных компиляторах давало следующий вывод:

при t_r=-14 (<-10)
-14
при t_r=-3 (>-10, но <0)
-03
при t_r=0
+00
при t_r=4 (>0, но <10)
+04
при t_r=12 (>10)
+12

Проблема: сейчас на контроллере ПЛК63 температура +3 выводится как +30. Я где-то неправ?

Эксперементы шли то дома, то в тёплом коттедже, где температура ниже +10 не падала, а на объекте такой облом :-(

brat
14.02.2011, 15:23
Проверьте правельность выбора датчика.
Вывод текста и значения Float на экран буде выглядеть следующим образом:
ShowString(0, 0, 0, 'Темп.:');
ShowReal(0,11,0,'%2.2f',t); (*вывод измеренного значения*)
Чтобы не учитывался вывод ошибочных величин воспользуйтесь функцией DIG_FLTR из библеотеки PID_Regulators.lib

Elka
14.02.2011, 17:21
brat, датчик выбран правильно. Значение измеряется также правильно (что можно увидеть через конфигурацию - значение аналогового входа - или как-то так называется или через debugger). Блок планирую внедрить чуть позже (сейчас на исходе ресурсы контроллера, поэтому такой оптимизации пока не проводил, а аппетит, как известно возрастает во время еды: и то хочу, и это, и вон то ещё до кучи). Проблема именно в выводе на экран. Как обходным путём это победить, я знаю: если температура <10 но >=1 - перед значимой цифрой выводим символ 0 и, аналогично, для отрицательных температур. Мне не понравилось, как ShowReal отработал формат %+02.0f. Мне показалось, что он не прав, и C-шный printf это делал иначе (а про соответствие строки формата С-шному printf - я где-то вычитал). Но однозначно грешить на ShowReal не могу - что я первый, что ли, его использую? Посему есть предположение, что результат сей - работа рук, чья линейность далека от идеала, но сходу причину найти не могу.

PS. И единственный ПЛК63 на объекте остался - поэксперементировать не на чем...