Форум : Оборудование производства НПО "Тепловизор"Название : ВИС.Т MODBUS - Чтение нараст. итогов без "файловых" функций |
Ramil : |
10.4.15 13:51 |
Добрый день,
Возникла сложность со считыванием архивного файла со стороннего оборудования по протоколу ModBus RTU (оборудование не поддерживает функцию READ FILE RECORD)
Нам требуется отобразить накопленный итог по Гкал за все время (Отображается на дисплее в меню ГЛАВНОЕ)
Прошу Вас указать какой функцией и из какаих ячеек (регистров) можно считать данную информацию.
Данная информация описана на странице 8 инструкции, но она очень трудна для понимания.
В 654 ячейке функции 3, находится адрес первого бита (у меня 4096)..... но что делать дальше чтобы считать 14 Пункт.
Спасибо. | |
|
CH : |
13.4.15 11:10 |
При невозможности воспользоваться "файловыми" функциями протокола модбас, можно использовать ту же функцию 4. При этом все архивы прибора доступны начиная с регистра с адресом 0x1000 (непосредственно с адреса 0x1000 доступен заголовок архива первой теплосистемы).
Параметры (спеификации) архивов, описанные на стр.8, не являются собственно данными архивов. Нужно ли их использовать для каких-то целей следует решать в зависимости от стоящей задачи.
Структура заголовка архива первой теплосистемы (48 модбас-регистров, читаемых функцией 4 начиная с адреса 0x1000) описана на странице 15+ руководства.
Алгоритм получения нарастающего итога объёма/массы/тепловой энергии выглядит так: 1. Чтение заголовка архива (или только непосредственно регистров, содержащих значение нарастающего итога нужного параметра на начало текущего часа). 2. Чтение значения того же параметра, накопленного с начала часа до текущего момента времени. 3. Приведение двух считанных значений к одной размерности и их сложение - текущее значение нарастающего итога получено. | |
|
Ramil : |
13.4.15 15:35 |
Добрый день, Виктор.
Исходя из инструкции Гкал лежат в 1050, 1051, 1052, 1053 регистрах (точность для тепловой энергии 1061) но это в HEX
если в DEC то 4176, 4177, 4178, 4179 (точность 4193) соответственно.
ФОРМУЛА перевода Y = X *10^(-ТОЧНОСТЬ), но как получить Х из четырех ячеек???
Если не сложно приведите исчерпывающий пример считывания Гкал для первой теплоситсемы. | |
|
CH : |
14.4.15 12:10 |
На самом деле, гкал лежат в регистрах с 0x1019 по 0x101C, поскольку описание структуры архивного заголовка в руководстве содержит байтовые смещения и размеры полей. Так удобнее при использовании файловых функций модбаса. Стандартные же модбас-функции чтения оперируют 16-битными регистрами, поэтому для получения адреса регистра следует байтовое смещение делить пополам. Возможность что-либо делать с целочисленным значением, хранящимся в 4х последовательных регистрах, зависит от оборудования, которое их читает. В случае с полноценной ОС, например при чтении данных некой программой из под windows, эти последовательные регистры просто понимаются как 64-битное целое. Что касается вашего специфического оборудования, скорее настраиваемого, чем программируемого, с его возможностями вам следует разбираться самостоятельно.
Исчерпывающего примера я вам не приведу, особенно с учётом того, что мы используем только файловые функции для чтения архива. Если я скопирую фрагменты каких-то наших программ, это может ещё больше запутать ситуацию. Вот пример общего плана, для понимания.
// Для чтения значений регистров __int16 reg[4];
// Читаем 4 последовательных 16-битных регистра с адреса 0x1019 (теловая энергия на начало текущего часа из заголовка архива первой теплосистемы) ModbusReadInputRegs(reg, 0x1019, 4);
// Эти 4 последовательных регистра можно считать одним 64-битным целым значением тепловой энергии. __int64 teplo_int = *((__int64*)reg);
// Читаем 2 последовательных регистира с адреса 0x0434 (тепловая энергия с начала текущего часа для первой теплосистемы) ModbusReadInputRegs(reg, 0x0434, 2);
// Cкладываем для получения полного целого значения нарастающего итога тепловой энергии на текущий момент времени teplo_int += *((__int32*)reg) / 1200;
// Тепло в виде числа с плавающей точкой с двойной точностью получаем из целого с учётом "точности" (qpoint, пример чтения не приведён, читается из того же заголовка архива или регистра 0x0405, для прибора без переключаемых диапазонов они совпадают) double teplo_double = ((double)teplo_int / pow(10, qpoint)); | |
|
© NegaSoft co., 2005 http://www.teplovizor.ru
URL этой темы
http://www.teplovizor.ru/forum/viewtopic.php?topic_id=410&forum=1
|