PDA

Просмотр полной версии : Чтение FLOAT по Modbus



IvPoed
14.04.2024, 22:22
Здравствуйте

Имеется ТРМ-138.
Читаю регистры 3 и 4 (соответственно - младшее и старшее слово вещественного числа по измеренному значению).
Почему-то не получается обратно собрать два слова в вещественное число. Получается ерунда.
Местами менял :) Эффекта нет.

Подскажите пожалуйста, в чем тут хитрость?
Буду признателен за пример кода на любом языке.

Заранее спасибо!

Емельянов Кирилл
15.04.2024, 01:14
Вы сначала покажите как делаете, потом, возможно, кто-то укажет на вашу ошибку

Sergey666
15.04.2024, 08:07
Буду признателен за пример кода на любом языке...
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_Modbus_v3.2.pdf

Khedron
15.04.2024, 09:07
Чем читаете и как? Проверьте, что адресация у вас совпадает, может вы с единицы их считаете и считываются 2 и 3 регистр вместо 3 и 4.

kondor3000
15.04.2024, 18:22
Подскажите пожалуйста, в чем тут хитрость?
Буду признателен за пример кода на любом языке.
Заранее спасибо!

Тут пример функции, меняя входы и выходы, можно собирать, разбирать (переставлять) регистры и байты в любом типе переменных.
Можно переделать на ФБ - если нужно разобрать на 2-4 части.
https://owen.ru/forum/showthread.php?t=37645&page=3#30

IvPoed
15.04.2024, 20:49
Делаю запрос в адрес ТРМ-138:
08 04 00 03 00 02 81 52

Адрес - 8, читаю командой 04 регистры начиная с 03 в количестве 2-х штук, т.е. как раз 3 и 4.
По документации в них содержится младшее и старшее слово вещественного числа измеренного параметра.

Получаю в ответ:
08 04 04 41 9D 9F 35 4E B1

Последние два байта - CRC16.
Слово 1 = 419D
Слово 2 = 9F35

Дальше пытаюсь объединить их (использую Делфи), например так:
MakeLong(Слово1, Слово2)

Получаю хрень :(

kondor3000
15.04.2024, 21:24
Слово 1 = 419D
Слово 2 = 9F35
Получаю хрень :(

Слово 1 = 419D, это 16797 в DEC
Слово 2 = 9F35, это 40757 в DEC
При сборке получаем, если регистры переставлены -3.838251e-020, если регистры правильно, то 19.70274 Скрин 75205

Сергей0308
15.04.2024, 21:39
Может проще из первого регистра читать, там в INT-е, в смысле, ничего и тасовать не надо!

75206

AlexandrGr
15.04.2024, 21:40
Делаю запрос в адрес ТРМ-138:
Дальше пытаюсь объединить их (использую Делфи), например так:
MakeLong(Слово1, Слово2)

Получаю хрень :(

Вам же float надо а не long.

IvPoed
15.04.2024, 22:24
Все, разобрался.
В делфи есть побайтовый доступ. Примерно так:

var r: single;
r.Bytes[3] := $41;
r.Bytes[2] := $9d;
r.Bytes[1] := $9f;
r.Bytes[0] := $35;

Всё работает. Порядок получается обратный.

IvPoed
09.05.2024, 20:14
Появился новый вопрос.
Все работает при чтении по modbus, получаю 4 байта, перевожу во float.
А для чего есть регистр с положением десятичной точки?
У меня она на основании 4 полученных байт сама правильно выставляется...

МихаилГл
09.05.2024, 20:53
Это вроде для не флоат переменной.

Параметр: температура int, это для этого регистра кажется, а флоат, он и в Африке флоат...

Cs-Cs
10.05.2024, 10:46
А для чего есть регистр с положением десятичной точки? Это для другого варианта получения данных: когда данные отдаются в виде целого числа (например 2782) и их надо поделить на 10 в степени десятичной точки (например на 10^2 = 100), чтобы получить 27.82.
В общем, для тех случаев, когда то устройство, которое запрашивает данные, не может работать с FLOAT и читать два регистра для него.

Сергей0308
10.05.2024, 11:44
В ПР, например, изначально прописаны сетевые регистры аналоговых входов-выходов для обеих вариантов, то есть и во FLOAT-е и INTE-е, каждый может выбрать что хочет и обычно и INT-а хватает, в смысле, большинство проблем от недостатка элементарных знаний, хоть ликбезы возрождай!

IvPoed
10.05.2024, 22:38
Спасибо! Что-то такое и подозревал.