Здравствуйте!
Подскажите, как читать данные формата FloatInv прибора МСД-100? Связь ПК - МСД-100 по протоколу Modbus RTU. На запрос прибор отвечает, но как интерпретировать полученные байты не знаю.
Спасибо.
Здравствуйте!
Подскажите, как читать данные формата FloatInv прибора МСД-100? Связь ПК - МСД-100 по протоколу Modbus RTU. На запрос прибор отвечает, но как интерпретировать полученные байты не знаю.
Спасибо.
Здравствуйте!
Уточняю, что я делаю и в чем проблема.
Прибор МСД-100 настроен как надо. Мастером. Формат ячеек для считывания компьютером FloatInv. В ячейках содержатся значения температур и уставок с приборов Овен ТРМ201 и ТРМ202 с десятыми долями градуса.
Далее, я пишу программу на Delphi, которая считывает значения этих ячеек по протоколу Modbus. Это необходимо, поскольку по этому же интерфейсу RS-485 опрашиваются другие приборы по протоколу Modbus. Код команды запроса - "4". Количество запрашиваемых переменных допустим 60. CRC считаю табличным методом. В ответ получаю: адрес прибора МСД-100 (200), код команды (4), количество переданных байт (120), а дальше пары типа 255-255, 0-0, 65-120, 65-144 и в конце CRC. Интерпретировать пары байт как Знаковое число с односторонней десятичной точкой, которое считается : (-1)^S * 10^(-Exponent) * Mantissa не получается. Как ещё расшифровывать формат FloatInv я не знаю, поэтому и спрашиваю. Конфигуратор отображает так как надо.
Как работать с FloatInv?
Спасибо.
Последний раз редактировалось Friencis; 22.08.2012 в 07:17. Причина: Уточнение
Не нужно рассматривать эти байты по отдельности. Просто обращайтесь к ним через указатель как к float. Т.к. Дельфи я не знаю, то приведу пример на Си:То же самое для двухбайтовых регистров Modbus:Код:unsigned char raw[4] = { 0xDA, 0x0F, 0x49, 0x40 }; float f = *((float*)raw); // f = 3.141593Может оказаться, что байты стоят не в том порядке.Код:unsigned short raw[4] = { 0x0FDA, 0x4049 }; float f = *((float*)raw);
Поиграться с форматом IEEE754 можно в онлайне: http://www.h-schmidt.net/FloatConverter/IEEE754.html
Последний раз редактировалось Yegor; 22.08.2012 в 07:47.
Кто-нибудь, просто скажите, что из себя представляет формат FloatInv, и всё!
Спасибо.
То же, что Single в этом вашем Дельфи. Ох уж эти дельфийщики... Не надо ничего парсить-интерпретировать-пересчитывать — просто берёте четыре байта и ставите их по адресу переменой типа Single.
Здравствуйте!
Спасибо, Yegor, за советы. Попробовал через указатель на приемный буфер с разными значениями смещения. Всё равно фигня какая-то. А число 3,14 нормально получается из Ваших чисел (0xDA, 0x0F, 0x49, 0x40). Может правда, байты в слове переставлены? А возвращаются именно слова, хотя тип single 4-х байтовый.
что значит может правда, в вики прочитайте про модбас, при передаче ответа в области данных порядок байт меняется.
Начните с одной переменной, а не с 60. Так как флоат здесь 32-битный, а модбас-регистры по 16, то одна переменная передётся двумя регистрами. Вот и пробуйте считывать два регистра в один Single. В руководстве к МСД-100 я вижу помимо FloatInv ещё и просто Float — вероятно, этим можно воспользоваться.
Уже попробовал в обратной последовательности, всё равно ерунда. Накропал тестовую программульку и там перебираются все возможные варианты. Ни один не похож на правду.
И почему бы производителю-разработчику просто не описать этот тип данных, как STORED_DOT, например, с которой я раньше работал?..
Кто разработал формат STORED_DOT? А кто разработал формат IEEE754? Ответьте на эти вопросы, и вам станет ясно, что «разработчик просто описал этот тип данных» ещё в прошлом веке.И почему бы производителю-разработчику просто не описать этот тип данных, как STORED_DOT, например
Давайте сюда несколько пакетов и расскажите, что вы ожидаете увидеть. Возможно, я определю, какие требуются перестановки.
Последний раз редактировалось Yegor; 24.08.2012 в 08:50.