Передача данных Unsignet Lonr Integer , Fload по Modbus

Использование протоколов Modbus, SPI, I2c и прочих, проблемы и решения
Ответить
Аватара пользователя
Grafsaxar
Лейтенант
Сообщения: 361
Зарегистрирован: 06.09.2015{, 16:04}
Репутация: 4
Откуда: Маркс-Энгелс
Имя: Alexander

Передача данных Unsignet Lonr Integer , Fload по Modbus

#1

Сообщение Grafsaxar » 11.10.2015{, 12:43}

Всем привет. 

Пытаюсь понять как расшифровать данные 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

По какой формуле  можно получить передаваемое число?

Какая использована логика передачи?
Качество — это делать что-либо правильно, даже когда никто не смотрит

Strix
Рядовой
Сообщения: 25
Зарегистрирован: 06.09.2015{, 10:22}
Репутация: 0
Откуда: Соликамск
Имя: Валерий

Передача данных Unsignet Lonr Integer , Fload по Modbus

#2

Сообщение Strix » 06.01.2016{, 19:45}

Присоединяюсь к вопросу. пробовал привязать Arduino к Simp Lite Scada. С  типом Float непонятки возникли. Если считывать регистры как Word, то всё как описано выше. Если как Float32, то в первом регистре появляется отправляемое от Arduino число, а второй регистр не читается. Пока использую только первый, но всё таки интересно как правильно обрабатывать этот тип данных.

P.S. Я так понял, при чтении первого регистра как Float32 автоматически происходит чтение двух регистров (первого и следующего за ним), где первый является старшим. Поправьте если не так.
Последний раз редактировалось Strix 06.01.2016{, 20:02}, всего редактировалось 1 раз.

Аватара пользователя
Sancho
Полковник
Сообщения: 2764
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Передача данных Unsignet Lonr Integer , Fload по Modbus

#3

Сообщение Sancho » 12.01.2016{, 10:50}

Strix, всё правильно понимаешь - при чтении float переменных указывается их размерность (32/64), чередование байт (обычно старшим словом вперёд) и адрес первого регистра.

Grafsaxar, для вычисления float переменных необходимо, как минимум, собрать из двух наборов байт одно четырёх байтное слово - так называемую мантису (для float 23 бита), следующие 8 бит - экспонента(степень числа 2, заранее увеличенная на 127), и самый старший бит - знак числа S (1 это -, 0 это +).

А теперь формула:
9775167.jpg
Значение=(-1)в сепени S * 2 в степени (
экспонента -127) * (1 + ( мантису / 8388608))

ВСЁ!!!!
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Grafsaxar
Лейтенант
Сообщения: 361
Зарегистрирован: 06.09.2015{, 16:04}
Репутация: 4
Откуда: Маркс-Энгелс
Имя: Alexander

Передача данных Unsignet Lonr Integer , Fload по Modbus

#4

Сообщение Grafsaxar » 12.01.2016{, 12:36}

Наконец-то понял как шифруются данные 
Если кто хочет  на 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,

Вот в твой пример ну никак не могу врубиться.
Качество — это делать что-либо правильно, даже когда никто не смотрит

Аватара пользователя
Sancho
Полковник
Сообщения: 2764
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Передача данных Unsignet Lonr Integer , Fload по Modbus

#5

Сообщение Sancho » 12.01.2016{, 14:26}

Попробую объяснить на твоём вопросе

При передачи числа 2.235 = Fload в первый рег. записывает 16399 во второй 2621


3495618.jpg
Добавлено (12.01.2016, 14:26)
---------------------------------------------
Это касается просьбы формулы перевода....
В реальности так не делают, а поступают проще - 
Создаётся необходимая переменная float, затем вычисляется её адрес,
потом по четырём адресам (4 байта - два регистра) в ячейки записываются нужные значения.
Когда контроллер работает с этой переменной, он считывает значения по адресу переменной,
и уже сам вычисляет всё, что ему надо...
Вот как-то так...
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Strix
Рядовой
Сообщения: 25
Зарегистрирован: 06.09.2015{, 10:22}
Репутация: 0
Откуда: Соликамск
Имя: Валерий

Передача данных Unsignet Lonr Integer , Fload по Modbus

#6

Сообщение Strix » 12.01.2016{, 18:08}

Как всё запутано то. Спасибо что просветили. Теперь хоть уверен, что правильно всё настроил.
Последний раз редактировалось Strix 12.01.2016{, 18:09}, всего редактировалось 1 раз.

Аватара пользователя
Grafsaxar
Лейтенант
Сообщения: 361
Зарегистрирован: 06.09.2015{, 16:04}
Репутация: 4
Откуда: Маркс-Энгелс
Имя: Alexander

Передача данных Unsignet Lonr Integer , Fload по Modbus

#7

Сообщение Grafsaxar » 12.01.2016{, 23:26}

Sancho писал(а):Sancho
Спасибо за разжёвывание.

Попробую это всё дело на с или паскале  осуществить.

У меня почему то во встроенном Simplelite модбасе принимает данные только с Slave  1  , с адресом 2 никаких данных не получает .
Качество — это делать что-либо правильно, даже когда никто не смотрит

Аватара пользователя
Sancho
Полковник
Сообщения: 2764
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Передача данных Unsignet Lonr Integer , Fload по Modbus

#8

Сообщение Sancho » 13.01.2016{, 10:07}

Я для проверок корректной работы модбас слэйвов пользусь отличным, на мой взгляд, Universal Modbus Server от инсат.
Он бесплатен на 32 тега. Поддерживает все типы соединений.
Можно проверить как чтение, так и запись любых переменных, правильность адресов и т.д. и т. п.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pwal1969
Рядовой
Сообщения: 5
Зарегистрирован: 28.01.2018{, 13:12}
Репутация: 0
Имя: Валерий

Передача данных Unsignet Lonr Integer , Fload по Modbus

#9

Сообщение pwal1969 » 19.02.2019{, 15:16}

Честно говоря я так и не понял алгоритм передачи длинного числа :smile37: :smile37: :smile37:
Подскажи , плз, как дешифровать например число 999999 ?? Спасибо!

Аватара пользователя
Sancho
Полковник
Сообщения: 2764
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Передача данных Unsignet Lonr Integer , Fload по Modbus

#10

Сообщение Sancho » 19.02.2019{, 15:21}

pwal1969, Отправляйте такое целое число просто через Holding Registr.
Или что именно у Вас не выходит?
Приложите проект - будет намного понятнее...
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pwal1969
Рядовой
Сообщения: 5
Зарегистрирован: 28.01.2018{, 13:12}
Репутация: 0
Имя: Валерий

Передача данных Unsignet Lonr Integer , Fload по Modbus

#11

Сообщение pwal1969 » 19.02.2019{, 15:26}

Мне нужно передать число 999999(максимально возможное число на электросчетчике) через Holding Registr.
Оно занимает 2 ячейки, на мастер приходит число 16959 и 15
как их "слепить" в 999999 не могу понять :smile37: :smile37:

Аватара пользователя
Sancho
Полковник
Сообщения: 2764
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Передача данных Unsignet Lonr Integer , Fload по Modbus

#12

Сообщение Sancho » 19.02.2019{, 15:37}

pwal1969, А кто мастер?

Отправлено спустя 2 минуты 58 секунд:
Самый простой, но не совсем правильный вариант :
15/второе умножаете на const 65536 и прибавляете первое
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pwal1969
Рядовой
Сообщения: 5
Зарегистрирован: 28.01.2018{, 13:12}
Репутация: 0
Имя: Валерий

Передача данных Unsignet Lonr Integer , Fload по Modbus

#13

Сообщение pwal1969 » 19.02.2019{, 15:40}

Sancho писал(а):
19.02.2019{, 15:37}
pwal1969, А кто мастер?
qModMaster
но так то будет считывать данные деймон , а он только инт понимает

Аватара пользователя
Sancho
Полковник
Сообщения: 2764
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Передача данных Unsignet Lonr Integer , Fload по Modbus

#14

Сообщение Sancho » 19.02.2019{, 15:43}

pwal1969 писал(а):
19.02.2019{, 15:40}
но так то будет считывать данные деймон
Не знаю, можно ссылку или поподробнее?
Но в таких случаях - укажите размерность числа 32 и адрес первой ячейки.

Отправлено спустя 48 секунд:
32 в ардуино - это типы long
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pwal1969
Рядовой
Сообщения: 5
Зарегистрирован: 28.01.2018{, 13:12}
Репутация: 0
Имя: Валерий

Передача данных Unsignet Lonr Integer , Fload по Modbus

#15

Сообщение pwal1969 » 19.02.2019{, 15:48}

деймон написан индивидуально для опроса слейвов,и складывает данные в mysql сервер под линуксом
получается что он считывает 2 ячейки у слейва заносит их в таблицу sql вопрос - как дешифровать их обратно????

Отправлено спустя 1 минуту 33 секунды:
вот скрин, стрелками указаны число https://yadi.sk/i/0JyGUxCc8-oIeQ

Аватара пользователя
Sancho
Полковник
Сообщения: 2764
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 337
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Передача данных Unsignet Lonr Integer , Fload по Modbus

#16

Сообщение Sancho » 19.02.2019{, 15:50}

pwal1969 писал(а):
19.02.2019{, 15:48}
как дешифровать их обратно?
Sancho писал(а):
19.02.2019{, 15:40}
15/второе умножаете на const 65536 и прибавляете первое
Отправлено спустя 2 минуты 8 секунд:
rezult = a * 65536 + b // rezult - 32 битный тип
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

pwal1969
Рядовой
Сообщения: 5
Зарегистрирован: 28.01.2018{, 13:12}
Репутация: 0
Имя: Валерий

Передача данных Unsignet Lonr Integer , Fload по Modbus

#17

Сообщение pwal1969 » 19.02.2019{, 15:54}

Спасибо огромное!!!!

Ответить

Вернуться в «Протоколы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость