PDA

Просмотр полной версии : Float to INT16



Sayland
06.11.2024, 18:03
Наткнулся на макрос по конвертации float в int16 от Влад12.
79878
https://owen.ru/forum/showthread.php?t=35375

У меня получилось более компактно.
Может, кому-то пригодится.
79942
На ST.
79943
И обратно
79944

79945

79946

kondor3000
06.11.2024, 18:49
Наткнулся на макрос по конвертации float в int16 от Влад12.

У меня получилось более компактно.


А так ещё компактней

function FLOAT_TO_INT: udint; //имя функции и тип данных выхода
VAR_INPUT
in : REAL;
END_VAR

if In >= 0 then
FLOAT_TO_INT := real_to_udint(In);
else
FLOAT_TO_INT:= 65536 - real_to_udint(-In); // Для INT
end_if

end_function

Функции FLOAT_TO_INT (DINT) и (DINT) INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php?t=22915&page=311&p=429821#post429821

Sayland
06.11.2024, 20:14
А так ещё компактней

function FLOAT_TO_INT: udint; //имя функции и тип данных выхода
VAR_INPUT
in : REAL;
END_VAR

if In >= 0 then
FLOAT_TO_INT := real_to_udint(In);
else
FLOAT_TO_INT:= 65536 - real_to_udint(-In); // Для INT
end_if

end_function

Функции FLOAT_TO_INT (DINT) и (DINT) INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php?t=22915&page=311&p=429821#post429821

Да!!! Согласен... Но, если 0>in>-1, то включен 16бит на выходе.

kondor3000
06.11.2024, 21:02
Да!!! Согласен... Но, если 0>in>-1, то включен 16бит на выходе.

В переменной INT c 0 с 15 бит, 16 бит уже DINT

Sayland
06.11.2024, 21:02
А так ещё компактней
Функции FLOAT_TO_INT (DINT) и (DINT) INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php?t=22915&page=311&p=429821#post429821

Вот что получилось.
79883

kondor3000
06.11.2024, 21:20
Вот что получилось.
79883

Вы забываете, что мы работаем со знаковыми целочисленными, типа INT. Перевод во Float, нужен только для задания знака целочисленной, так как данного типа нет в Лоджике.
А у целочисленных как известно нет дробей. По факту ФБ должен называться INT_TO_WORD, а не FLOAT_TO_INT.
Если же нужна дробь, то умножаете на 10, передаёте и по получении делите на 10. Только это уже не имеет отношения к ФБ, а только к уму применяющего данный блок.
А уж если с защитой от дурака делать, то будет например так

VAR_INPUT
in : REAL;
END_VAR
VAR
K : udint;
X: REAL;
END_VAR

K:=dc32(15);
x:=Round(fLimit((In),udint_to_real(K)*-1,udint_to_real(K-1)),0);
FLOAT_TO_INT:=Sel(abs(x)>x,real_to_udint(abs(x)), K-real_to_udint(abs(x))+K);

end_function

Sayland
06.11.2024, 22:17
Вы забываете, что мы работаем со знаковыми целочисленными, типа INT. Перевод во Float, нужен только для задания знака целочисленной, так как данного типа нет в Лоджике.
А у целочисленных как известно нет дробей. По факту ФБ должен называться INT_TO_WORD, а не FLOAT_TO_INT.
Если же нужна дробь, то умножаете на 10, передаёте и по получении делите на 10. Только это уже не имеет отношения к ФБ, а только к уму применяющего данный блок.
А уж если с защитой от дурака делать, то будет например так

VAR_INPUT
in : REAL;
END_VAR
VAR
K : udint;
X: REAL;
END_VAR

K:=dc32(15);
x:=Round(fLimit((In),udint_to_real(K)*-1,udint_to_real(K-1)),0);
FLOAT_TO_INT:=Sel(abs(x)>x,real_to_udint(abs(x)), K-real_to_udint(abs(x))+K);

end_function


Интересно... Как термометру сопротивления объяснить что он должен показывать только целые числа.
У нас на входе переменная типа float (совсем не целочисленная), а на выходе типа UDINT, которя бинарно эметирует переменную типа int16. Я не где не ошибся?
Если я не ошибся, значит блок называется правильно?

function FLOAT_TO_INT: udint; //имя функции и тип данных выхода
VAR_INPUT
in : REAL;
END_VAR
FLOAT_TO_INT := real_to_udint(In);
if In < 0 then
FLOAT_TO_INT:= SHR (SHL (65536 - real_to_udint(-In), 16), 16) ; // Для INT
end_if
end_function

Короче не получется.

kondor3000
06.11.2024, 22:24
Интересно... Как термометру сопротивления объяснить что он должен показывать только целые числа.
У нас на входе переменная типа float (совсем не целочисленная), а на выходе типа UDINT, которя бинарно эметирует переменную типа int16. Я не где не ошибся?
Если я не ошибся, значит блок называется правильно.

Спор бестолковый, не термометр виноват, а программист, не понимающий для чего нужен этот блок.

Sayland
06.11.2024, 22:44
Спор бестолковый, не термометр виноват, а программист, не понимающий для чего нужен этот блок.

Это не спор, а поиск лучшего решения и устранения недочетов. А функция мне нужна для того, чтобы преобразовать переменную типа float к типу int16(В шапке так и написанно). У ПРок мало регистров для передачи, вот и приходится экономить.

Сергей0308
06.11.2024, 22:58
Это не спор, а поиск лучшего решения и устранения недочетов. А функция мне нужна для того, чтобы преобразовать переменную типа float к типу int16(В шапке так и написанно). У ПРок мало регистров для передачи, вот и приходится экономить.

Для этого даже знаковый тип данных не нужен, в смысле, можно передавать в виде: (Х+100) х10, после передачи обратное преобразование, получится отрицательные значения передавать с точностью до десятых долей градуса, это же сотни раз обсуждалось, даже повторять как-то неудобно уже!

Sayland
06.11.2024, 23:12
Для этого даже знаковый тип данных не нужен, в смысле, можно передавать в виде: (Х+100) х10, после передачи обратное преобразование, получится отрицательные значения передавать с точностью до десятых долей градуса, это же сотни раз обсуждалось, даже повторять как-то неудобно уже!

Я делал такие костыли! Но как быть с облаком овна? Как там преобразовать? Там нет возможности прибавить или вычесть, есть только умножитель.

starmos
07.11.2024, 08:13
Добавить в Лоджик нужные людям типы данных - видимо неразрешимая задача? 8-, 16-бит, знаковые, беззнаковые, в чем проблема собственно?

EFrol
07.11.2024, 08:52
Существует очень широкая граница между программистом и электриком. Изначально OL создавался чтобы и тех и тех не обидеть. Я еще не встречал электрика, который бы с удовольствием пытался разобраться в битности и знаковости представления даже целых чисел. Давайте не будем их обижать - отбирать возможность имитировать простые электрические схемы.

Dimensy
07.11.2024, 08:52
Добавить в Лоджик нужные людям типы данных - видимо неразрешимая задача? 8-, 16-бит, знаковые, беззнаковые, в чем проблема собственно?

Наверное, потому что это, пусть и программируемое, но реле. А для задач малой автоматизации хватает того что есть

melky
07.11.2024, 09:43
EFrol для имитации простых электрических схем есть BOOL и этого достаточно. При чем тут остальные блоки и типы переменных? Они электриков и не волнуют, кроме задания задержек на таймерах.
А так, откровенная глупость, что нельзя вывести -100/10 в целочисленном виде и для этого приходится городить огород из блоков. Ну с ST проще стало. Но ведь должны быть такие вещи изначально.

starmos
07.11.2024, 09:48
Наверное, потому что это, пусть и программируемое, но реле. А для задач малой автоматизации хватает того что есть

Если это всего лишь программируемое реле и это принципиальная позиция, то оно не должно 20 тыс. стоить. Потому что полноценные контроллеры стоят 25. Разница является слишком небольшой и указывает, что ПР205 переоценен заметно. А вот был бы он контроллером, такое соотношение было бы нормально, учитывая еще и разницу в возможностях и качестве исполнения. Поэтому конечно ситуация сейчас - "или крест, или трусы", или цену снизить, или функционал расширить. Мое мнение конечно. Каждый раз вспоминаю про это, когда натыкаюсь на очередное предложение "костыля".