Просмотр полной версии : Чтение FLOAT по Modbus
Здравствуйте
Имеется ТРМ-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
Чем читаете и как? Проверьте, что адресация у вас совпадает, может вы с единицы их считаете и считываются 2 и 3 регистр вместо 3 и 4.
kondor3000
15.04.2024, 18:22
Подскажите пожалуйста, в чем тут хитрость?
Буду признателен за пример кода на любом языке.
Заранее спасибо!
Тут пример функции, меняя входы и выходы, можно собирать, разбирать (переставлять) регистры и байты в любом типе переменных.
Можно переделать на ФБ - если нужно разобрать на 2-4 части.
https://owen.ru/forum/showthread.php?t=37645&page=3#30
Делаю запрос в адрес ТРМ-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.
Все, разобрался.
В делфи есть побайтовый доступ. Примерно так:
var r: single;
r.Bytes[3] := $41;
r.Bytes[2] := $9d;
r.Bytes[1] := $9f;
r.Bytes[0] := $35;
Всё работает. Порядок получается обратный.
Появился новый вопрос.
Все работает при чтении по modbus, получаю 4 байта, перевожу во float.
А для чего есть регистр с положением десятичной точки?
У меня она на основании 4 полученных байт сама правильно выставляется...
МихаилГл
09.05.2024, 20:53
Это вроде для не флоат переменной.
Параметр: температура int, это для этого регистра кажется, а флоат, он и в Африке флоат...
А для чего есть регистр с положением десятичной точки? Это для другого варианта получения данных: когда данные отдаются в виде целого числа (например 2782) и их надо поделить на 10 в степени десятичной точки (например на 10^2 = 100), чтобы получить 27.82.
В общем, для тех случаев, когда то устройство, которое запрашивает данные, не может работать с FLOAT и читать два регистра для него.
Сергей0308
10.05.2024, 11:44
В ПР, например, изначально прописаны сетевые регистры аналоговых входов-выходов для обеих вариантов, то есть и во FLOAT-е и INTE-е, каждый может выбрать что хочет и обычно и INT-а хватает, в смысле, большинство проблем от недостатка элементарных знаний, хоть ликбезы возрождай!
Спасибо! Что-то такое и подозревал.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot