Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проблема передачи данных (modbus rtu)


Автор: gorillka 1.11.2010, 09:56
Может быть кто-нибудь сталкивался с подобной проблемой...
Передаю данные в порт 
char bufwr[256]={0x01,0x05,0x80,0x00,0x01,0x00,LOBYTE(crc16),HIBYTE(crc16)};
WriteFile(port, bufwr, 7, &temp, NULL);

Устройство, вместо того чтобы принять всю строчку целиком, принимает первые 3 байта, последние 4 байта считает следующим сообщением
Затем я еще раз через какой-то время отправляю тоже самое, устройство к 4 предыдущим байтам добавляет новые 3 первых байта.

Вообщем вот как принимает данные устройство:
1 сообщение - 0x01,0x05,0x80 принято 3 байта время мс 0
2 сообщение - 0x00,0x01,0x00,LOBYTE(crc16),HIBYTE(crc16),0x01,0x05,0x80 - принято 7 байт время мс 2012.

P.S. Тайм-ауты какие только не выставлял, не чего не меняется и сами данные тоже менял аналогично

Добавлено через 8 минут и 37 секунд
Проблему решил!
вместо
WriteFile(port, bufwr, 7, &temp, NULL);
написал
WriteFile(port, bufwr, 8, &temp, NULL);

просто поменял на угад и заработало. Если кто-нибдь объяснит в чем здесь дело был бы очень благодарен

Автор: gorillka 1.11.2010, 10:14
блин все равно как то не так работает. Устройство как будто бы ждет 8-байта а его все нет smile 
то есть первый раз отправляю данные все ок. 
второй раз отправляю не чего не происходит.
отправляю третий раз приходит то что должно прийти но пишет время то которое было между двумя нажатиями кнопками(когда отправлял 2 и 3 раз)
Вообщем очень нужно разъяснение специалиста, я что то не очень понимаю как это все работает...

Автор: casey 1.11.2010, 11:09
А что за устройство? Сдается мне что-то самодельное.
Modbus-слэйв устройство должно после некоего таймаута игнорировать запрос, если он недошел. И ожидать запрос сначала.
Таймаут можно посмотреть в спецификации, но не больше 200-300 мс.  

А что работает 

WriteFile(port, bufwr, 8, &temp, NULL); - так тут очевидно, тебе ж 8 байт надо отправить.

Автор: gorillka 1.11.2010, 11:19
блин я слегка прогнал smile просто в массиве символов они с 0 идут вот я и написал что 7 smile
Устройство - это пока эмулятор
Но вопрос остается открытый почему этот эмулятор через рас сообщения принимает???
P.S. сейчас попробую других эмуляторов накачать. может посоветуете какой нибудь хороший?

Автор: casey 1.11.2010, 11:32
Когда-то использовал Modsim32
Демо-версия здесь http://www.win-tech.com/html/demos.htm
В чем ограничения уже не помню.

Автор: gorillka 1.11.2010, 11:34
Спасибо попробую smile 

Автор: xvr 1.11.2010, 12:27
Win не очень дружит с realtime'ом, а для modbus rtu он в некоторой степени нужен. Видимо отправка в порт была прервана более приоритетной задачей. До некоторой степени лечится вынесением обмена с портом в отдельную нить и назначением этой нити и всему процессу REALTIME приоритета.
Но судя по уровню ваших вопросов я бы вам не советовал с этим связываться - повесите все систему (REALTIME процессы это могут сделать легко и непринужденно  smile )
Поищите готовые библиотеки, они есть  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)