Modbus на Си |
Ответить |
Автор | |
Новичок Присоединился: 07 Август 2006 Online Status: Offline Публикации: 17 |
Опубликовано: 11 Сентябрь 2006 10:21 |
Кто нибудь писал сам протокол ModBus на Си, поделитесь опытом: Slave контроллер отвечает на команду чтения регистров, но что он отвечает понять не могу, т.е. считываю отклик комады чтения функцией unsigned char = ReadCom(ModPort) ; как и должно быть получаю пакет байтов, но определить формат отклика не получается, (т.е. не могу поймать адрес слейва, и.т.д.) идет какой то произвольный набор байтов, что там где непоймешь может кто подскажет как нормально считать пакет байтов с Сом порта, и главное определить что пришло с откликом. |
|
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Писал (только на C++).
Киньте на пейджер свою почту, вышлю исходники. |
|
Новичок Присоединился: 20 Сентябрь 2006 Online Status: Offline Публикации: 11 |
|
Рекомендую скачать протокол modbus и программные средства от modicon http://sysavt.h11.ru/docs/inter/modbus.html Имитатор мастера - modscan32 позволяет просматривать запросы от себя и ответы слэйва - это поможет в реализации протокола
|
|
Новичок Присоединился: 07 Август 2006 Online Status: Offline Публикации: 17 |
|
Спасибо,за помощь но уже стало немного получаться))))))) Получилось прочитать отклик по формату. Но буду рад любой информации. Мой мейл Rolando81@mail.ru
|
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Новичок Присоединился: 19 Июль 2005 Категория: Ukraine Online Status: Offline Публикации: 39 |
|
Я в свое время делал так. Конечно это не идеальный код, но работает. Главный плуг в этом коде - Sleep между запросом и ответом. В идеале интервалы должны устанавливаться структурой comtimeouts, но я почему-то так и не подобрал их. Еще одно: функции IEEE754.... нужны для приведения порядка байт в нужный (порядок байт в контроллере и компьютере могут отличатся). Если увидишь ситуацию, при которой ответ есть, но числа бредовые - скорее всего у тебя другой порядок байт. //описание структур запроса и ответов 4,6 и 8 байт union crc_union{ struct { struct otvet4{ struct otvet6{ struct otvet8{ //псевдонимы функций //описание переменных
int IntEditTimeout=500; BYTE MBadr;
//--------------------------------------------------------------------------- const unsigned short CRC16_tbl[ 256 ] = { unsigned short CRC16 = 0xffff; for (int i=0; i < Buffer_Length; i++) if (Comport!=INVALID_HANDLE_VALUE) GetCommState(Comport, &dcb1);
comtimeouts.ReadIntervalTimeout=0; return true;
float ReadFloat(BYTE mbadr,BYTE addr_hi,BYTE addr_lo) crc_float.integ=0; zapros._1addr=mbadr; crc_float.integ=CRC16(&zapros._1addr,6); zapros._7crc1=crc_float.bytes[0]; for(p=0;p<3;p++) PurgeComm(Comport,PURGE_TXCLEAR); if (WriteFile( ClearCommError(Comport,NULL,&statistic);
//------------------------------------------------------------------------- //--------------------------------------------------------------------------- long ReadLong(BYTE mbadr,BYTE addr_hi,BYTE addr_lo) crc_long.integ=0; zapros._1addr=mbadr; crc_long.integ=CRC16(&zapros._1addr,6); zapros._7crc1=crc_long.bytes[0]; for(p=0;p<3;p++) ZeroMemory(&otvet4l,sizeof(otvet4l)); PurgeComm(Comport,PURGE_TXCLEAR); if (WriteFile( Comport, &zapros, sizeof(zapros), ClearCommError(Comport,NULL,&statistic); crc_otv_lng.integ=CRC16(&otvet4l._1from_addr,7);
long __fastcall IEEE754long(BYTE src[4]) if (BoolInvertedBytes) aaa=src[1]; aaa=src[2]; aaa=src[3]; _wmemcpy(&ddouble,src,8); crc_double.integ=0; zapros._1addr=mbadr; crc_double.integ=CRC16(&zapros._1addr,6); zapros._7crc1=crc_double.bytes[0]; for(p=0;p<3;p++) PurgeComm(Comport,PURGE_TXCLEAR); if (WriteFile (Comport, &zapros,sizeof(zapros), ClearCommError(Comport,NULL,&statistic); crc_otv_dbl.integ=CRC16(&otvet8d._1from_addr,11); |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Новичок Присоединился: 19 Июль 2005 Категория: Ukraine Online Status: Offline Публикации: 39 |
|
После этих объявлений читать из устройства следует так: int main() { } |
|
Новичок Присоединился: 07 Август 2006 Online Status: Offline Публикации: 17 |
|
casey, вот спасибо за вспомогательные функции преобразования чисел, очень помогло - взял некоторые части |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Новичок Присоединился: 19 Июль 2005 Категория: Ukraine Online Status: Offline Публикации: 39 |
|
Рад, что помог
|
|
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |