Наткнулся на макрос по конвертации float в int16 от Влад12.
0001.jpg
https://owen.ru/forum/showthread.php?t=35375
У меня получилось более компактно.
Может, кому-то пригодится.
Макрос.JPG
На ST.
Функция.JPG
И обратно
м.JPG
Ф.JPG
Fl_TO_INT_TO_Fl.owle
Наткнулся на макрос по конвертации float в int16 от Влад12.
0001.jpg
https://owen.ru/forum/showthread.php?t=35375
У меня получилось более компактно.
Может, кому-то пригодится.
Макрос.JPG
На ST.
Функция.JPG
И обратно
м.JPG
Ф.JPG
Fl_TO_INT_TO_Fl.owle
Последний раз редактировалось Sayland; 09.11.2024 в 11:24. Причина: Дополнил
А так ещё компактнейФункции FLOAT_TO_INT (DINT) и (DINT) INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php...821#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
Последний раз редактировалось kondor3000; 06.11.2024 в 18:54.
Вот что получилось.
Как то так.JPG
Вы забываете, что мы работаем со знаковыми целочисленными, типа 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
Последний раз редактировалось kondor3000; 06.11.2024 в 22:01.
Интересно... Как термометру сопротивления объяснить что он должен показывать только целые числа.
У нас на входе переменная типа 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
Для этого даже знаковый тип данных не нужен, в смысле, можно передавать в виде: (Х+100) х10, после передачи обратное преобразование, получится отрицательные значения передавать с точностью до десятых долей градуса, это же сотни раз обсуждалось, даже повторять как-то неудобно уже!
Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.