После деления 30 на 1,2 получается целое число 25. Также как если 300 поделить на 1,2 получается 250, а не 249 как в макросе.
Вид для печати
После деления 30 на 1,2 получается целое число 25. Также как если 300 поделить на 1,2 получается 250, а не 249 как в макросе.
Так получится, но какие значения будут на выходе при изменениях переменной на входе?
Да и преобразовать вещественное 250 в целое и получить 249 на выходе это нелогично - вот в чем вопрос.
25/1,2=20,8 должно быть 20, а с +0,5 получится 21
А в железе такой-же результат?
Последовал Вашему совету, прибавил 0,001
я не советовал прибавлять 0.001
я предлагаю один из вариантов округления называющийся Округление до указанного кратного (https://alphapedia.ru/w/Rounding 3.1 Округление до указанного кратного)
Судя по всему, результат деления имеет вид 24.999999, хотя и отображается в отладке как 25. Ну а блок преобразования к udint не округляет, а просто отбрасывает дробную часть.
Где-то на форуме выкладывали макрос округления к ближайшему целому, похоже нужно в таких случаях перед блоком преобразования использовать что-то подобное.
Округление с нужным количеством знаков:
Код:function fRound : real;
var_input
rIn : real;
N : udint;
end_var
var
tmp : udint;
end_var
tmp := 10;
if N.0 then fRound := udint_to_real(tmp); else fRound := 1; end_if;
N := SHR(N,1);
while N > 0 do
tmp := tmp * tmp;
if N.0 then fRound := fRound * udint_to_real(tmp); end_if;
N := SHR(N,1);
end_while;
rIn := rIn * fRound;
fRound := (( rIn / abs(rIn) ) * udint_to_real(real_to_udint((abs(rIn) + 0.5)))) / fRound;
end_function
Ага, забил на вход 0.71 и получил на выходе 0.8. Офигенно просто))). Вложение 62083
Var1:=real_to_udint(rin * 10)/10.0 ; куда проще написать
Проверил - у меня все правильно:
Вложение 62082
А что дает "Var1:=real_to_udint(rin * 10)/10.0 ?