НПО Тепловизор. Теплосчетчики и расходомеры К вершинам эволюции теплосчетчика
Продукция Поддержка Форум Контакты
     
Пользователь    Пароль  
Регистрация | Пароль?  
Главное меню
НовостиПродукцияФайлы/ДокументыСтатьиФорумОпросыФотогалереяО компанииРекламодателям
Потребители о нас
"ГУП ДЕЗ района «Текстильщики» рекомендует привлечь ЗАО «Сервисная Компания «Тепловизор» для выполнения работ по сервисному обслуживанию узлов учета тепловой энергии на других объектах г. Москвы."

Н.Н. Елисеева, Главный инженер ГУП ДЕЗ «Текстильщики»
Наши партнёры
Свернуть/Развернуть ТЕПЛОСЧЕТЧИКИ • ВОДОСЧЕТЧИКИ • РАСХОДОМЕРЫ • ВИС.Т Свернуть/Развернуть
/  Список форумов
   /  Оборудование производства НПО "Тепловизор"
/  Modbus
 «  1  2 
«  Предыдущая тема    Следующая тема  »
Тема:  Modbus    

Konstantin Re: протокол гидра

Новенький


Пишу программу под DOS, так что скоре всего dll не подойдет. Если только нет исходных алгоритмов разбора данных (если есть, то был бы очень благодарен)
В руководстве сказано:
…при использовании команды без параметра прибор отвечает посылкой,
содержащей значения всех доступных параметров…
Открываю приложение “С” руководства и смотрю на полную информационную часть ответного пакета команды “mon c”, считаю байты, получаю 66 байт информации. Даю команду “mon c” без параметров и собираюсь разобрать пакет, а у меня величина всей ответной посылки для команды “mon c” равна 45 байт. И как же мне теперь его разбирать, что тут есть, а чего нет? Действительно, в руководстве ничего не сказано о том, что разным устройствам соответствует свои пакеты данных, и уж тем более не сказано о том какому прибору соответствует какой пакет данных. Возможно у Вас все-таки есть руководство, применимое к устройству ВИС.Т? Или примеры работы с разбором данных?
» 5.7.06 15:59 Профайл Посетить веб-сайт

CH Re: протокол гидра

Администратор


Цитата:

Konstantin пишет:
В руководстве сказано:
…при использовании команды без параметра прибор отвечает посылкой, содержащей значения всех доступных параметров…

"Доступных" в данном контексте означает тех, которые доступны прибору (не сказано же просто "всех"). Если у прибора нет датчика температуры T3, так он её и не передаст, сократив структуру на соотвеоствующие 3 байта.

Цитата:

Открываю приложение “С” руководства и смотрю на полную информационную часть ответного пакета команды “mon c”, считаю байты, получаю 66 байт информации. Даю команду “mon c” без параметров и собираюсь разобрать пакет, а у меня величина всей ответной посылки для команды “mon c” равна 45 байт. И как же мне теперь его разбирать, что тут есть, а чего нет?

В пакете передаётся маска параметров(4 байта). Первый бит 1 - есть подающий расход (и его точка), второй бит 1 - есть обратный расход (и его точка) итд по структуре:
typedef struct { long v1;
unsigned char v1point;
long v2;
unsigned char v2point;
long v3;
unsigned char v3point;
long g1;
unsigned char g1point;
long g2;
unsigned char g2point;
long g3;
unsigned char g3point;
short t1;
unsigned char t1point;
short t2;
unsigned char t2point;
short t3;
unsigned char t3point;
short t4;
unsigned char t4point;
unsigned char p1;
unsigned char p1point;
unsigned char p2;
unsigned char p2point;
unsigned char p3;
unsigned char p3point;
long q;
unsigned char qpoint;
unsigned long err32;
unsigned char err32point;
} HCMONITORCURRENT;

Вот пример в досовской манере (надеюсь не напутал):

void swapper(unsigned char* dest, unsigned char* src, int num)
{
unsigned char* temp = new unsigned char[num];

memcpy(temp, src, num);

while(num--)
{
*(dest++) = *(temp+num);
}

delete temp;
}

void UnpackCPacket(unsigned char* dest, unsigned char* src, unsigned long mask)
{
const int
HcMonCurrSize[] = { sizeof(long) + 1, /* V1 */
sizeof(long) + 1, /* V2 */
sizeof(long) + 1, /* V3 */
sizeof(long) + 1, /* G1 */
sizeof(long) + 1, /* G2 */
sizeof(long) + 1, /* G3 */
sizeof(short) + 1, /* T1 */
sizeof(short) + 1, /* T2 */
sizeof(short) + 1, /* T3 */
sizeof(short) + 1, /* T4 */
sizeof(char) + 1, /* P1 */
sizeof(char) + 1, /* P2 */
sizeof(char) + 1, /* P3 */
sizeof(long) + 1, /* Q */
sizeof(unsigned long) + 1 /* e32*/
};

for(int i = 0; i < (sizeof(HcMonCurrSize)/sizeof(HcMonCurrSize[0])); i++)
{
if( mask & 0x00000001 )
{
// Распаковываем сразу с переворотом
swapper(dest, src, HcMonCurrSize[i]-1);
dest[HcMonCurrSize[i]-1] = src[HcMonCurrSize[i]-1];
src += HcMonCurrSize[i];
}
else memset(dest, 0, HcMonCurrSize[i]);

mask >>= 1;

/* Сдвинуть указатель неупакованной записи */
dest += HcMonCurrSize[i];
}
}

//Теперь, dann - инф. часть пакета данных команды /MON C
unsigned long mask = *((unsigned long*)((unsigned char*)dann + 1));

swapper((unsigned char*)&mask, (unsigned char*)&mask, sizeof(mask));

HCMONITORCURRENT m;

// Распаковать параметры из пакета в структуру
UnpackCPacket((unsigned char*)(&m), dann + 5, mask);

// Что было, распаковано в ПОЛНУЮ структуру m.

Цитата:

Действительно, в руководстве ничего не сказано о том, что разным устройствам соответствует свои пакеты данных, и уж тем более не сказано о том какому прибору соответствует какой пакет данных.

Надеюсь, прочтя предыдущий абзац вы поняли, что все необходимые для интерпретации пакета данные присутствуют в самом пакете. Это не SA94, в котором одному богу известно, как интерпретировать его массивы данных.

Цитата:

Возможно у Вас все-таки есть руководство, применимое к устройству ВИС.Т? Или примеры работы с разбором данных?


см. выше.

--
Виктор В. Жданов
NegaSoft Co. FAE
НПО "Тепловизор", Главный инженер-программист
» 5.7.06 18:40 Профайл Посетить веб-сайт

Konstantin Re: протокол гидра

Новенький


Большое спасибо за поддержку, теперь все понятно.
» 5.7.06 19:25 Профайл Посетить веб-сайт
Распечатать топик 
 «  1  2 
«  Предыдущая тема    Следующая тема  »


Поиск

Ключевые слова:    
[ Расширенный поиск ]

Права

Вы не можете начинать темы.
Вы не можете редактировать свои сообщения.
Вы не можете создавать опросы.
Вы не можете вкладывать файлы в сообщения.
Вы не можете отвечать на сообщения.
Вы не можете удалять свои сообщения.
Вы не можете голосовать.