Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Тип данных FLOAT

    Тип данных FLOAT

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Тип данных FLOAT, RouterOS
     
    kp3928
    Guest
    #1
    0
    18.05.2022 11:19:00
    Я пытаюсь декодировать значение температуры с Bluetooth-метки TG-BT5-OUT. Шестнадцатеричное значение (знаковое) — 0x19a1. Реальная температура получается (0x19a1)/256 = 25,6 градусов Цельсия. Я хочу отправить точное значение температуры напрямую в тело MQTT-сообщения. Насколько я вижу, для таких операций доступна только функция TONUM(), но она работает только с целыми числами, и тогда будет указано 26 градусов. Есть ли у кого-нибудь идеи или какой-нибудь приём, чтобы имитировать функцию TOFLOAT()?
     
     
     
    germarsh
    Guest
    #2
    0
    13.07.2022 08:08:00
    Спасибо за это. У меня была похожая проблема при попытке отправить число с плавающей запятой через MQTT с интерфейса LTE1. Вот моё «примитивное» решение:

    :if ($rsrqLen > 2) do {
       :set $intpart ($rsrq/10)
       :set $decpart ($rsrq%10*-1)
       :set $rsrqvalue ($intpart . "." . $decpart)
    } else={
       :set $rsrqvalue $rsrq
    }
     
     
     
    rextended
    Guest
    #3
    0
    13.07.2022 09:21:00
    Спасибо за информацию, но это уже «другая» проблема. В случае с оригинальным постом мы имеем HEX Float значение, которое нужно преобразовать в десятичное (строку). В твоём случае у тебя целое число, которое, как я понимаю, в 10 раз больше значения??? И ты хочешь преобразовать его в float (строку)??? Не совсем понятно, как использовать этот фрагмент, потому что он вырван из контекста, где применяется.
     
     
     
    kreload
    Guest
    #4
    0
    31.03.2023 11:35:00
    Есть ли скрипт для 32-битного float, который будет работать с датчиками, где значение основано на длине в 2 слова? Пример: {:local output [/iot modbus read-holding-registers slave-id=0x21 num-regs=0x2 reg-addr=0x1000 as-value once]; :put [($output->“values”)]} 80500;31200
     
     
     
    rextended
    Guest
    #5
    0
    31.03.2023 14:21:00
    Я не понимаю, что вы имеете в виду. Приведите пример с одним значением и соответствующим ему истинным значением. 2 слова = 2 разных DWORD в одном массиве? 80500 = ? 31200 = ?
     
     
     
    Amm0
    Guest
    #6
    0
    31.03.2023 14:25:00
    Думаю, до модбас float to string можно добраться через скрипт. Но есть проблема: ты НИКОГДА не сможешь сравнивать их или делать с ними математические операции, если не преобразуешь в целые числа — ведь настоящих float просто нет. Так что важно, что именно ты хочешь сделать с этими float.
     
     
     
    Amm0
    Guest
    #7
    0
    31.03.2023 21:01:00
    Тебе ещё нужно знать порядок байтов, например, big endian или little endian, чтобы что-то вообще конвертировать.
     
     
     
    kreload
    Guest
    #8
    0
    03.04.2023 13:50:00
    Я новичок в модбасе, так что простите, если объясняю не очень хорошо. К тому же я в первом сообщении написал 80500 неправильно. У меня несколько счётчиков энергии, где каждое значение хранится, согласно инструкции производителя, на 2 регистрах, если использовать таблицу значений IEEE, начиная с 0x1000, или на 4 регистрах, начиная с 0x0000. То есть, чтобы прочитать напряжение системы, я опрашиваю 0x1000 (или 44097) с длиной 2 (или 4 для альтернативной таблицы). Я взял длину 2, потому что думал, что так проще. С помощью Mikrotik я получил такой результат: 18630;49152. Эти значения в шестнадцатеричном формате — 0x48C6;0xC000. Если объединить 0x48C6C000 и преобразовать через конвертер IEEE 754 в десятичное число, получится 402,944, что по инструкции соответствует милливаттам или 402,9 В. Так вот, блин, как мне преобразовать 18630;49152 сразу в 402944 прямо на Mikrotik?
     
     
     
    rextended
    Guest
    #9
    0
    03.04.2023 21:24:00
    0x48C6C000 из IEEE 754 в десятичное — это 407040, скорее всего это 407,04 мВт (почему V???). 402944 — это 0x48c4c000 и, вероятно, 402,944 мВт??? Ну серьёзно, как же преобразовать 18630;49152 в 402944 напрямую на Mikrotik?

    Шаг 1: преобразовать значение из массива целых чисел в одно шестнадцатеричное значение.

    {
    :local output {18630;49152} ; # имитация чтения
    # a = 18630 = 0x48C6
    # b = 49152 = 0xC000
    # (a * 0x10000) + b = (0x48C6 * 0x10000) + 0xC000 = 0x48C60000 + 0xC000 = 0x48C6C000 = 1220984832
    :local fullvalue ((($output->0) * 0x10000) + ($output->1))
    :put $fullvalue
    } 1220984832
     
     
     
    rextended
    Guest
    #10
    0
    03.04.2023 21:24:00
    search tag # rextended ieee754toint IEEE754 DWORD FLOAT в число Функции для преобразования DWORD FLOAT формата IEEE754 в число Эта функция не завершена. RouterOS не поддерживает числа больше 9223372036854775807 или меньше -9223372036854775808, а также не умеет делать десятичное деление. Поэтому получается только приближение, потому что тип float варьируется от (+/-)0,(поставьте здесь 45 нулей)140129846432481707092372958328991613128026194187651577175706­828388979108268586060148663818836212158203125 до (+/-)340282346638528859811704183484516925440, и его невозможно корректно представить в RouterOS. Поэтому эта функция в крайних случаях может выдавать неверное значение.

    :global ieee754toint do={
       :local input [:tonum "$1"]
       :local hack 0x3B9ACA00 ; # Хак, RouterOS не поддерживает десятичные числа...
       :local isneg ($input >> 31)
       :local exponent (($input >> 23) & 0xFF)
       :local powerof2 1
       :for x from=1 to=($exponent - 0x7F) step=1 do={:set powerof2 ($powerof2 * 2)}
       :set exponent $powerof2
       :local mantissa ($input & 0x7FFFFF)
       :set powerof2 $hack
       :local temp $hack
       :for x from=22 to=5 step=-1 do={ ; # 5, а не 0, потому что нет поддержки десятичных чисел в RouterOS
           :set powerof2 ($powerof2 / 2)
           :if ((($mantissa >> $x) & 1) = 1) do={
               :set temp ($temp + $powerof2)
           }
       }
       :set mantissa $temp
       :local total (($exponent * $mantissa) / $hack)
       :local decimal (($exponent * $mantissa) % $hack)
       :if ($decimal > 444444444) do={:set total ($total +1)}
       :if ($isneg = 1) do={:set total ($total * -1)}
       :return $total
    }

    {
       :local output {18630;49152} ; # имитируем чтение a = 18630 = 0x48C6 b = 49152 = 0xC000 (a * 0x10000) + b = (0x48C6 * 0x10000) + 0xC000 = 0x48C60000 + 0xC000 = 0x48C6C000 = 1220984832
       :local fullvalue ((($output->0) * 0x10000) + ($output->1))
       :set fullvalue [$ieee754toint $fullvalue]
       :local intmw ($fullvalue / 1000)
       :local decmw "00$($fullvalue % 1000)" ;
       :set decmw [:pick $decmw ([:len $decmw] - 3) [:len $decmw]]
       :put "$intmw,$decmw mW"
    }

    407,040 mW

    Далее преобразуем 407040,0 в его исходное значение: 407040,0 / 1000 = 407,040 mW
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры