FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Суббота, 03.12.2016, 05:27
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » Передача данных Unsignet Lonr Integer , Fload по Modbus
Передача данных Unsignet Lonr Integer , Fload по Modbus
Grafsaxar
Дата: Воскресенье, 11.10.2015, 12:43 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 67
Награды: 1
Репутация: 1
Статус: Offline
Всем привет. 

Пытаюсь понять как расшифровать данные 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 Дата: Среда, 06.01.2016, 19:45 | Сообщение # 2
Рядовой
Группа: Проверенные
Сообщений: 27
Награды: 1
Репутация: 0
Статус: Offline
Присоединяюсь к вопросу. пробовал привязать Arduino к Simp Lite Scada. С  типом Float непонятки возникли. Если считывать регистры как Word, то всё как описано выше. Если как Float32, то в первом регистре появляется отправляемое от Arduino число, а второй регистр не читается. Пока использую только первый, но всё таки интересно как правильно обрабатывать этот тип данных.

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


Сообщение отредактировал Strix - Среда, 06.01.2016, 20:02
 
Sancho Дата: Вторник, 12.01.2016, 10:50 | Сообщение # 3
Лейтенант
Группа: Проверенные
Сообщений: 91
Награды: 1
Репутация: 2
Статус: Offline
Strix, всё правильно понимаешь - при чтении float переменных указывается их размерность (32/64), чередование байт (обычно старшим словом вперёд) и адрес первого регистра.

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

А теперь формула:

Значение=(-1)в сепени S * 2 в степени (
экспонента -127) * (1 + ( мантису / 8388608))

ВСЁ!!!!
Прикрепления: 9775167.jpg(11Kb)


Если не получится на контроллере - сделаю на тразисторах и 155/176...
 
Grafsaxar Дата: Вторник, 12.01.2016, 12:36 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 67
Награды: 1
Репутация: 1
Статус: Offline
Наконец-то понял как шифруются данные 
Если кто хочет  на 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 Дата: Вторник, 12.01.2016, 14:26 | Сообщение # 5
Лейтенант
Группа: Проверенные
Сообщений: 91
Награды: 1
Репутация: 2
Статус: Offline
Попробую объяснить на твоём вопросе

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



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

Прикрепления: 3495618.jpg(167Kb)


Если не получится на контроллере - сделаю на тразисторах и 155/176...
 
Strix Дата: Вторник, 12.01.2016, 18:08 | Сообщение # 6
Рядовой
Группа: Проверенные
Сообщений: 27
Награды: 1
Репутация: 0
Статус: Offline
Как всё запутано то. Спасибо что просветили. Теперь хоть уверен, что правильно всё настроил.

Сообщение отредактировал Strix - Вторник, 12.01.2016, 18:09
 
Grafsaxar Дата: Вторник, 12.01.2016, 23:26 | Сообщение # 7
Лейтенант
Группа: Проверенные
Сообщений: 67
Награды: 1
Репутация: 1
Статус: Offline
Цитата Sancho ()
Sancho
Спасибо за разжёвывание.

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

У меня почему то во встроенном Simplelite модбасе принимает данные только с Slave  1  , с адресом 2 никаких данных не получает .
 
Sancho Дата: Среда, 13.01.2016, 10:07 | Сообщение # 8
Лейтенант
Группа: Проверенные
Сообщений: 91
Награды: 1
Репутация: 2
Статус: Offline
Я для проверок корректной работы модбас слэйвов пользусь отличным, на мой взгляд, Universal Modbus Server от инсат.
Он бесплатен на 32 тега. Поддерживает все типы соединений.
Можно проверить как чтение, так и запись любых переменных, правильность адресов и т.д. и т. п.


Если не получится на контроллере - сделаю на тразисторах и 155/176...
 
Форум » Основной » Спросить у знатоков » Передача данных Unsignet Lonr Integer , Fload по Modbus
Страница 1 из 11
Поиск:

FLProg © 2016
Яндекс.Метрика