Форум АО "ВЗЛЕТ"

Приборы ЗАО "Взлет" => Отдел программистов => Тема начата: vpzasu от 11.02.2014, 04:45:51



Название: Данные modbus
Отправлено: vpzasu от 11.02.2014, 04:45:51
Здравствуйте.
При запросе по rs-485 modbus, в прибор ТСРВ-022 отправляем следующее сообщение 02 03 С0 66 00 04 (контрольная сумма),получаем следующий ответ от прибора 02 03 72 93 117 64 104 33. Подскажите пожалуйста,что он отвечает,адрес функция и кол-во байт понятно,не могу понять остальное,я запрашиваю массу воды в канале 1,и значения не соответствуют,где ошибка?


Название: Re:Данные modbus
Отправлено: Дмитрий Пархоменко от 12.02.2014, 08:52:08
Судя по описанию протокола обмена ТСРВ-022, Вы спросили у прибора параметр F449159, т.е. "Тепло 1 (дробная часть) в теплосистеме 1, ГДж (ТДж)". Читайте, пожалуйста, документацию внимательнее.


Название: Re:Данные modbus
Отправлено: vpzasu от 12.02.2014, 09:43:15
Судя по адресу С066  это вообще то параметр 449254(449255) а это и есть полная масса воды в канале 1,я внимательно читал.


Название: Re:Данные modbus
Отправлено: Дмитрий Пархоменко от 12.02.2014, 11:29:20
Извиняюсь, Вы правы, я взял С0-06, вместо указанного Вами С0-66.

Помимо описания регистров, Вам еще нужен документ "Протокол Modbus(Стандарт данных).pdf" описывающий форматы передаваемых данных, вот ссылка на него: http://www.vzljot.ru/files/docs/145/prtkl_Modbus_standart_data.pdf


Название: Re:Данные modbus
Отправлено: vpzasu от 12.02.2014, 11:48:58
и его я прочитал,но всё дело в том что значения которые находятся в этом регистре изменяются при счёте,а вот преобразовать их в значение которое показывает сам прибор-нет,я не пойму в каком они формате,значение увеличивается при работающей установке,и должно быль 226552 тонн +\-20 тонн, а то, что приходит в ответ не совпадает,как бы я не конвертировал.


Название: Re:Данные modbus
Отправлено: Дмитрий Пархоменко от 12.02.2014, 13:03:44
Стандарт IEEE 754.
У вас есть ответ  - "72 93 117 64" что есть 0x485D7540, преобразовать это во float очень просто, вот пример на VC++:

unsigned __int32 dwValue = 0x485D7540;
float flValue = *((float *)&dwValue);

Результат: 226773.00

Обратите внимание что это только целая часть значения, дробная лежит рядом, считываете оба значения, их сумма и будет то что Вам нужно.