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

В.Н.Ярков, Директор Предприятия №4 ТсиС ГУП «МОСТЕПЛОЭНЕРГО»
Наши партнёры
Свернуть/Развернуть ТЕПЛОСЧЕТЧИКИ • ВОДОСЧЕТЧИКИ • РАСХОДОМЕРЫ • ВИС.Т Свернуть/Развернуть
/  Список форумов
   /  Оборудование производства НПО "Тепловизор"
/  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 
«  Предыдущая тема    Следующая тема  »


Поиск

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

Права

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