Просмотр полной версии : Float to INT16
Наткнулся на макрос по конвертации 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
А так ещё компактней
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
А так ещё компактней
Функции 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
Вы забываете, что мы работаем со знаковыми целочисленными, типа 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. Я не где не ошибся?
Если я не ошибся, значит блок называется правильно.
Спор бестолковый, не термометр виноват, а программист, не понимающий для чего нужен этот блок.
Спор бестолковый, не термометр виноват, а программист, не понимающий для чего нужен этот блок.
Это не спор, а поиск лучшего решения и устранения недочетов. А функция мне нужна для того, чтобы преобразовать переменную типа float к типу int16(В шапке так и написанно). У ПРок мало регистров для передачи, вот и приходится экономить.
Сергей0308
06.11.2024, 22:58
Это не спор, а поиск лучшего решения и устранения недочетов. А функция мне нужна для того, чтобы преобразовать переменную типа float к типу int16(В шапке так и написанно). У ПРок мало регистров для передачи, вот и приходится экономить.
Для этого даже знаковый тип данных не нужен, в смысле, можно передавать в виде: (Х+100) х10, после передачи обратное преобразование, получится отрицательные значения передавать с точностью до десятых долей градуса, это же сотни раз обсуждалось, даже повторять как-то неудобно уже!
Для этого даже знаковый тип данных не нужен, в смысле, можно передавать в виде: (Х+100) х10, после передачи обратное преобразование, получится отрицательные значения передавать с точностью до десятых долей градуса, это же сотни раз обсуждалось, даже повторять как-то неудобно уже!
Я делал такие костыли! Но как быть с облаком овна? Как там преобразовать? Там нет возможности прибавить или вычесть, есть только умножитель.
Добавить в Лоджик нужные людям типы данных - видимо неразрешимая задача? 8-, 16-бит, знаковые, беззнаковые, в чем проблема собственно?
Существует очень широкая граница между программистом и электриком. Изначально OL создавался чтобы и тех и тех не обидеть. Я еще не встречал электрика, который бы с удовольствием пытался разобраться в битности и знаковости представления даже целых чисел. Давайте не будем их обижать - отбирать возможность имитировать простые электрические схемы.
Добавить в Лоджик нужные людям типы данных - видимо неразрешимая задача? 8-, 16-бит, знаковые, беззнаковые, в чем проблема собственно?
Наверное, потому что это, пусть и программируемое, но реле. А для задач малой автоматизации хватает того что есть
EFrol для имитации простых электрических схем есть BOOL и этого достаточно. При чем тут остальные блоки и типы переменных? Они электриков и не волнуют, кроме задания задержек на таймерах.
А так, откровенная глупость, что нельзя вывести -100/10 в целочисленном виде и для этого приходится городить огород из блоков. Ну с ST проще стало. Но ведь должны быть такие вещи изначально.
Наверное, потому что это, пусть и программируемое, но реле. А для задач малой автоматизации хватает того что есть
Если это всего лишь программируемое реле и это принципиальная позиция, то оно не должно 20 тыс. стоить. Потому что полноценные контроллеры стоят 25. Разница является слишком небольшой и указывает, что ПР205 переоценен заметно. А вот был бы он контроллером, такое соотношение было бы нормально, учитывая еще и разницу в возможностях и качестве исполнения. Поэтому конечно ситуация сейчас - "или крест, или трусы", или цену снизить, или функционал расширить. Мое мнение конечно. Каждый раз вспоминаю про это, когда натыкаюсь на очередное предложение "костыля".
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot