Страница 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
    Пользователь
    Регистрация
    22.02.2012
    Адрес
    Челябинск
    Сообщений
    261

    По умолчанию

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

  10. #10
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,019

    По умолчанию

    Цитата Сообщение от starmos Посмотреть сообщение
    Добавить в Лоджик нужные людям типы данных - видимо неразрешимая задача? 8-, 16-бит, знаковые, беззнаковые, в чем проблема собственно?
    Наверное, потому что это, пусть и программируемое, но реле. А для задач малой автоматизации хватает того что есть

Страница 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

Ваши права

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