PDA

Просмотр полной версии : Переменная REAL ведет себя как Int при вычислениях



lomtik
25.12.2012, 10:54
Здравствуйте, пожалуйста, помогите, не могу разобраться.
В программе на ПЛК-100 есть переменная REAL (energy), в цикле к ней добавляется 0.001, действие типа energy:=energy+0.001 при замыкании входа 0-1 (счетчик импульсов электроэнергии)
Так вот, действие выполняется до значения переменной energy равной 32767.999, далее значение переменной останавливается на 32768 и не меняется. Но 32768 это же верхний предел переменной типа Int. В чем может быть дело. :(

Amko
25.12.2012, 15:12
Код программы приведите.

lomtik
27.12.2012, 15:28
вот, пожалуйста
вычисления переменных происходят в момент замыкания входов 0-1, 0-2 или 0-3

пробовал и на живом ПЛК-100 и в режиме эмуляции - все одно и тоже. Может дело в какой-нибудь лицензии. Очень жду ответа. Спасибо.

lomtik
29.12.2012, 11:35
ну как, никто не проверил?

BETEP
29.12.2012, 17:13
А чё будет если к большому числу в формате REAL прибавить очень маленькое число в формате REAL?
Зачем проверять код, если вы на грабли студента наступили?:)

lara197a
29.12.2012, 17:34
Суммируйте импульсы до 1000 в одном счетчике и прибавляйте импульс к другому.
В одном счетчике у Вас будут "до запятой", в другом "после". "После" можете вообще назначить DWORD.
А так-то все правильно, он и не будет у Вас считать больше. Плавающая запятая, не повод для записи большего числа, чем позволяет размер переменной.

lomtik
29.12.2012, 21:41
lara197a, благодарю за идею,
и прошу отнестись снисходительно, все мы когда-то учились, ну виноват.

BETEP
30.12.2012, 12:30
размер REAL позволяет записать в него число намного больше, просто кол-во знаков для мантисы ограничено. Если при сложении у вас получается мантиса длиннее чем это возможно, лишние знаки теряются.
REAL нужно использовать только там где это действительно необходимо, действия с этими числами кушают больше времени, и возможны некоторые неприятности, о которых нужно знать.
http://ru.wikipedia.org/wiki/IEEE_754

BETEP
30.12.2012, 17:31
Равенство будет верным на Овеновском ПЛК?


VAR
aa: REAL:= 0.1;
bb: REAL;
cc: BOOL;
END_VAR

bb := 1.1-1;
cc:= aa=bb;

lomtik
16.01.2013, 12:50
Суммируйте импульсы до 1000 в одном счетчике и прибавляйте импульс к другому.
В одном счетчике у Вас будут "до запятой", в другом "после".

подскажите, пожалуйста, как склеить потом полученные числа - целое и число после запятой.