Страница 1 из 1
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 11.10.2015{, 12:43}
Grafsaxar
Всем привет.
Пытаюсь понять как расшифровать данные Unsignet Lonr Integer , Fload по Modbus
Данные передаются по 2 регистрам.
При передачи числа 200000 = Unsignet Lonr Integer в первый рег. записывает 3 во второй 3392
При передачи числа 131070 = Unsignet Lonr Integer в первый рег. записывает 1 во второй 65534
Fload
При передачи числа 2.235 = Fload в первый рег. записывает 16399 во второй 2621
При передачи числа 3.659 = Fload в первый рег. записывает 16490 во второй 11534
При передачи числа 4.1 = Fload в первый рег. записывает 16515 во второй 13107
При передачи числа 5.324 = Fload в первый рег. записывает 16554 во второй 24117
При передачи числа 1 = Fload в первый рег. записывает 16256 во второй 0
При передачи числа 5 = Fload в первый рег. записывает 16544 во второй 0
При передачи числа 10 = Fload в первый рег. записывает 16672 во второй 0
По какой формуле можно получить передаваемое число?
Какая использована логика передачи?
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 06.01.2016{, 19:45}
Strix
Присоединяюсь к вопросу. пробовал привязать Arduino к Simp Lite Scada. С типом Float непонятки возникли. Если считывать регистры как Word, то всё как описано выше. Если как Float32, то в первом регистре появляется отправляемое от Arduino число, а второй регистр не читается. Пока использую только первый, но всё таки интересно как правильно обрабатывать этот тип данных.
P.S. Я так понял, при чтении первого регистра как Float32 автоматически происходит чтение двух регистров (первого и следующего за ним), где первый является старшим. Поправьте если не так.
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 12.01.2016{, 10:50}
Sancho
Strix, всё правильно понимаешь - при чтении float переменных указывается их размерность (32/64), чередование байт (обычно старшим словом вперёд) и адрес первого регистра.
Grafsaxar, для вычисления floa
t переменных необходимо, как минимум, собрать из двух наборов байт одно четырёх байтное слово - так называемую
мантису (для float 23 бита), следующие 8 бит -
экспонента(степень числа 2, заранее увеличенная на 127), и самый старший бит - знак числа
S (1 это -, 0 это +).
А теперь формула:
Значение=(-1)в сепени
S * 2 в степени (
экспонента -127) * (1 + (
мантису / 8388608))
ВСЁ!!!!
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 12.01.2016{, 12:36}
Grafsaxar
Наконец-то понял как шифруются данные
Если кто хочет на Scada передавать большие числа.
Вот пример Unsignet Lonr Integer
65535= reg 1=0, reg2=65535 65536=reg1=1,reg2=0
65537=reg1=1,reg2=1 65538=reg1=1,reg2=2
131070=reg1=1,reg2=65534 = 65535*2+(1+65534)
131080=reg1=2,reg2=8 = 65535*2+(2+8)
200000=reg1=3,reg2=3392 = 65535*3+(3+3392)
250000=reg1=3,reg2=53392 = 65535*3+(3+53392)
Формула : Reg1=A; Reg2=B 65535*A+(A+B)
Sancho,
Вот в твой пример ну никак не могу врубиться.
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 12.01.2016{, 14:26}
Sancho
Попробую объяснить на твоём вопросе
При передачи числа 2.235 = Fload в первый рег. записывает 16399 во второй 2621
Добавлено (12.01.2016, 14:26)
---------------------------------------------
Это касается просьбы формулы перевода....
В реальности так не делают, а поступают проще -
Создаётся необходимая переменная float, затем вычисляется её адрес,
потом по четырём адресам (4 байта - два регистра) в ячейки записываются нужные значения.
Когда контроллер работает с этой переменной, он считывает значения по адресу переменной,
и уже сам вычисляет всё, что ему надо...
Вот как-то так...
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 12.01.2016{, 18:08}
Strix
Как всё запутано то. Спасибо что просветили. Теперь хоть уверен, что правильно всё настроил.
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 12.01.2016{, 23:26}
Grafsaxar
Sancho писал(а):Sancho
Спасибо за разжёвывание.
Попробую это всё дело на с или паскале осуществить.
У меня почему то во встроенном Simplelite модбасе принимает данные только с Slave 1 , с адресом 2 никаких данных не получает .
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 13.01.2016{, 10:07}
Sancho
Я для проверок корректной работы модбас слэйвов пользусь отличным, на мой взгляд, Universal Modbus Server от инсат.
Он бесплатен на 32 тега. Поддерживает все типы соединений.
Можно проверить как чтение, так и запись любых переменных, правильность адресов и т.д. и т. п.
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:16}
pwal1969
Честно говоря я так и не понял алгоритм передачи длинного числа
Подскажи , плз, как дешифровать например число 999999 ?? Спасибо!
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:21}
Sancho
pwal1969, Отправляйте такое целое число просто через Holding Registr.
Или что именно у Вас не выходит?
Приложите проект - будет намного понятнее...
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:26}
pwal1969
Мне нужно передать число 999999(максимально возможное число на электросчетчике) через Holding Registr.
Оно занимает 2 ячейки, на мастер приходит число 16959 и 15
как их "слепить" в 999999 не могу понять
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:37}
Sancho
pwal1969, А кто мастер?
Отправлено спустя 2 минуты 58 секунд:
Самый простой, но не совсем правильный вариант :
15/второе умножаете на const 65536 и прибавляете первое
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:40}
pwal1969
Sancho писал(а): ↑19.02.2019{, 15:37}
pwal1969, А кто мастер?
qModMaster
но так то будет считывать данные деймон , а он только инт понимает
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:43}
Sancho
pwal1969 писал(а): ↑19.02.2019{, 15:40}
но так то будет считывать данные деймон
Не знаю, можно ссылку или поподробнее?
Но в таких случаях - укажите размерность числа 32 и адрес первой ячейки.
Отправлено спустя 48 секунд:
32 в ардуино - это типы long
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:48}
pwal1969
деймон написан индивидуально для опроса слейвов,и складывает данные в mysql сервер под линуксом
получается что он считывает 2 ячейки у слейва заносит их в таблицу sql вопрос - как дешифровать их обратно????
Отправлено спустя 1 минуту 33 секунды:
вот скрин, стрелками указаны число
https://yadi.sk/i/0JyGUxCc8-oIeQ
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:50}
Sancho
pwal1969 писал(а): ↑19.02.2019{, 15:48}
как дешифровать их обратно?
Sancho писал(а): ↑19.02.2019{, 15:40}
15/второе умножаете на const 65536 и прибавляете первое
Отправлено спустя 2 минуты 8 секунд:
rezult = a * 65536 + b // rezult - 32 битный тип
Передача данных Unsignet Lonr Integer , Fload по Modbus
Добавлено: 19.02.2019{, 15:54}
pwal1969
Спасибо огромное!!!!