Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Float to INT16

  1. #1

    По умолчанию Float to INT16 to Float

    Наткнулся на макрос по конвертации 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. Причина: Дополнил

  2. #2

    По умолчанию

    Цитата Сообщение от Sayland Посмотреть сообщение
    Наткнулся на макрос по конвертации 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...821#post429821
    Последний раз редактировалось kondor3000; 06.11.2024 в 18:54.

  3. #3

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    А так ещё компактней
    Код:
    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...821#post429821
    Да!!! Согласен... Но, если 0>in>-1, то включен 16бит на выходе.

  4. #4

    По умолчанию

    Цитата Сообщение от Sayland Посмотреть сообщение
    Да!!! Согласен... Но, если 0>in>-1, то включен 16бит на выходе.
    В переменной INT c 0 с 15 бит, 16 бит уже DINT

  5. #5

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    А так ещё компактней
    Функции FLOAT_TO_INT (DINT) и (DINT) INT_TO_FLOAT на ST____ https://owen.ru/forum/showthread.php...821#post429821
    Вот что получилось.
    Как то так.JPG

  6. #6

    По умолчанию

    Цитата Сообщение от Sayland Посмотреть сообщение
    Вот что получилось.
    Как то так.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.

  7. #7

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Вы забываете, что мы работаем со знаковыми целочисленными, типа 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
    Короче не получется.

  8. #8

    По умолчанию

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

  9. #9

    По умолчанию

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

  10. #10
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    9,435

    По умолчанию

    Цитата Сообщение от Sayland Посмотреть сообщение
    Это не спор, а поиск лучшего решения и устранения недочетов. А функция мне нужна для того, чтобы преобразовать переменную типа float к типу int16(В шапке так и написанно). У ПРок мало регистров для передачи, вот и приходится экономить.
    Для этого даже знаковый тип данных не нужен, в смысле, можно передавать в виде: (Х+100) х10, после передачи обратное преобразование, получится отрицательные значения передавать с точностью до десятых долей градуса, это же сотни раз обсуждалось, даже повторять как-то неудобно уже!
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Макрос перевода Float to INT16
    от Влад12 в разделе Среда программирования OWEN Logic
    Ответов: 0
    Последнее сообщение: 23.09.2021, 12:15
  2. ПР200 ... сетевые переменные в MODBUS , регистры 512 - 575 ( int16 )
    от Broka в разделе Сетевые технологии
    Ответов: 2
    Последнее сообщение: 28.02.2021, 16:31
  3. universal modbus divece и int16
    от lelik76 в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 13.09.2016, 20:30
  4. Переход от float (Nullable) к просто float
    от ASo в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 12.11.2014, 14:21
  5. МВА8. Вес младшего разряда результата измерения в int16?
    от Владимир Чекин в разделе Эксплуатация
    Ответов: 8
    Последнее сообщение: 05.06.2008, 12:06

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •