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

Приборы ЗАО "Взлет" => Отдел программистов => Тема начата: pritqwet от 08.06.2009, 14:57:35



Название: связь по Ethernet с устройством поддерживающим протокол ModBus
Отправлено: pritqwet от 08.06.2009, 14:57:35
Здравствуйте, сталкнулся со следующей проблемой: имеется "ВЗЛЁТ ЭМ ЭКСПЕРТ-911И", на нём подключена линия Ethernet для связи. Прибор нормально пингуется, программа "Универсальный просмоторщик" тоже работает, но была поставлена задача общение с прибором посредством собственной программы,  в связи с чем изучив имеющуюся у вас на сайте документацию: prtkl_Modbus.pdf и т.д., а также воспользовавшись другими Интернет-источниками, принялся писать программу UDP-сервера, но возникла следующая проблема - прибор не отвечает, а вернее такое ощущение, что не может распознать посланное ему сообщение! Прибор настроен на режим RTU, адрес прибора - 1, программа посылает следующее сообщение: [01][03][00][6B][00][03][74][17], где [01] - адрес устройства, с которым хотим общаться, [03] - запрашиваемая функция, [00][6B][00][03] - её пораметры и [74][17] - контрольная сумма.....Ответа не приходит и в Статистике не отмечается то, что какой либо запрос получен... Может у кого есть идею из-за чего енто может быть?


Название: Re: связь по Ethernet с устройством поддерживающим протокол ModBus
Отправлено: Dekir от 10.06.2009, 11:01:09
при работе через Ethernet модуль запрос упаковывается в tftp пакет.
Все во вложениях


Название: Re: связь по Ethernet с устройством поддерживающим протокол ModBus
Отправлено: pritqwet от 18.06.2009, 13:05:51
Спасибо за информацию! Упокавал modBus-пакет в TFTP! То ли  я где-то что-то пропустил, вообщем работать от этого лучше не стало. Решил поступить драконовским методом: поставил программу wireshark-win32-1.2.0.exe, поймал пакеты, проанализировал их, только после этого нашёл что нужно есчё сделать с пакетом перед тем как отправить, всё заработало!  :)
Вот какое преобразование нужно совершить с modBus пакетом перед тем как упаковывать его в tftp-фрейм:
Код:
int tftp_pack(unsigned char *query, unsigned char *pack, int query_sz)
{
int len = 0;
pack[len++] = 0;
pack[len++] = 1;
pack[len++] = '=';
for (int i=0; i<query_sz; i++) {
pack[len++] = (query[i]>>4)>0x09?(query[i]>>4)-0x09+0x40:(query[i]>>4)+0x30;
pack[len++] = (query[i]&0x0F)>0x09?(query[i]&0x0F)-0x09+0x40:(query[i]&0x0F)+0x30;
}

pack[len++] = 0;
pack[len++] = 'o';
pack[len++] = 'c';
pack[len++] = 't';
pack[len++] = 'e';
pack[len++] = 't';
pack[len++] = 0;
return len;
}
может кому пригодится!  ;)