|
Modbus RTU подобный протокол, проблема реализации, Может есть готовый с описанием. |
|
|
|
 |
Ответов
|
Jul 30 2007, 20:15
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Alex ma @ Jul 29 2007, 20:34)  Вся фишка в проблеме определения стартовой последовательности, в Modbus – это пауза 3,5 кадра вроде.... Да, но на PC таймер под Windows только 1 мс дискретность. Ну не знаю как в PC (и надо ли оно вообще делать Modbus slave на PC). На МК я поступаю так: Приняв любой байт по УАРТу взвожу таймер, на интервал равный 4-м кадрам. И продолжаю прием. По прерыванию таймера - взвожу флажек "Таймаут". В этом же обработчике таймера, отцепляю буфер текущего пакета, и подставляю вместо него новый. Цитата(bodja74 @ Jul 30 2007, 14:35)  Делать задержки на таймере не самое лучшее решение,используйте API функцию SLEEP из KERNEL32. Типа так обьявляем RTU-Мастер не обязан выдерживать точные паузы. Если скорость обмена некритична, то и таймером можно пользоваться, и Sleep'ом, чем угодно ;> Самое плохое это то, что винда может втавлять непредсказуемые паузы внутри пакетов, что слейвом воспринимается однозначно - как куча битых пакетов.
|
|
|
|
|
Jul 31 2007, 04:15
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377

|
Цитата(defunct @ Jul 30 2007, 23:15)  На МК я поступаю так: Приняв любой байт по УАРТу взвожу таймер, на интервал равный 4-м кадрам. И продолжаю прием. По прерыванию таймера - взвожу флажек "Таймаут". В этом же обработчике таймера, отцепляю буфер текущего пакета, и подставляю вместо него новый. А как вы сделали, «Приняв любой байт по УАРТу взвожу таймер», в это время по юарту идут байты, таймер тикает, и переполняется, устанавливается флаг переполнения, или вы по приему байта с юарта сбрасываете счетчик таймера?
|
|
|
|
|
Jul 31 2007, 10:15
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(_Алекс @ Jul 31 2007, 07:15)  или вы по приему байта с юарта сбрасываете счетчик таймера? Именно так. Только не сбрасываю, а запускаю заново (если таймер был запущен, то он будет перезапущен). Этот код у меня в конце обработчика прерывания RX: Код // initialize timeout timer TCCR2 = 0; // stop mb timeout timer TCNT2 = 0; // reset timeout timer TIMSK |= (1 << OCIE2); OCR2 = QuadCharInterval; // <-- вычисляется при инициализации UART'a TCCR2 = (1 << WGM21)|(1 << CS22)|(1 << CS20); // set prescaler to 1024 and run timer Цитата(oran-be @ Jul 31 2007, 07:55)  Я прпробовал на двум мамках - на одной оказался 91 байт, на другой - 173. Если длина пакета менее длины ФИФО, паузы не будет. Вот оно оказывается что... Спасибо за информацию! Цитата(ALexx @ Jul 31 2007, 09:53)  Порой приходится делать... Делал девайс, который работал под управлением процессорной платы ICOP (одноплатный 386-й) Так вот задачей было сгородить на нем Слейв Модбаса для связи со СКАДой. Плата работает под ДОС-ом, поэтому сказанное ниже некоторый оффтоп, но может кому пригодится идея... Знаю эти платы, на M6117. Неплохой вариант для быстрых решений если под рукой нет более подходящего железа.. Пока девайс на M6117 проходит стадию показухи, есть время чтобы сделать более подходящий девайс. Ну а по поводу программирования MB слейва под DOS, дык сложностей никаких не вижу, однозадачка как никак, настроил таймер на частоту кратную символам UART'a и все под контролем. В серийке M6117 чрезмерно дорого получается, особенно если брать готовые платы. Девайс на базе AVR'ки (напр m128) по возможностям (производительности) будет то же самое, по надежности и потреблению - лучше, плюс быстрее стартует (перестартует), и дешевле в разы.
|
|
|
|
Сообщений в этой теме
Alex ma Modbus RTU подобный протокол, проблема реализации Jul 29 2007, 17:34 SasaVitebsk Цитата(Alex ma @ Jul 29 2007, 20:34) Вся ... Jul 29 2007, 18:18 oran-be А разве в спецификации MODBUS RTU есть определение... Jul 29 2007, 19:23 Alex ma У ведущего МК два USART один мастер второй слейв, ... Jul 29 2007, 19:55 rezident При реализации RTU-ных протоколов в контроллере на... Jul 29 2007, 20:10 upc2 Это все условно.Никто на практике паузу в 3,5 сим... Jul 30 2007, 06:46 SasaVitebsk Цитата(upc2 @ Jul 30 2007, 09:46) Это все... Jul 30 2007, 10:58  upc2 Цитата(SasaVitebsk @ Jul 30 2007, 13:58) ... Jul 30 2007, 13:06 ALexx Один из вариантов - в приложении. Представляет соб... Jul 30 2007, 07:38 bodja74 Делать задержки на таймере не самое лучшее решение... Jul 30 2007, 11:35 singlskv Цитата(bodja74 @ Jul 30 2007, 15:35) Дела... Jul 30 2007, 13:26  bodja74 Цитата(singlskv @ Jul 30 2007, 16:26) Sle... Jul 30 2007, 16:16   singlskv Цитата(bodja74 @ Jul 30 2007, 20:16) ГЫ ,... Jul 30 2007, 16:27    bodja74 Цитата(singlskv @ Jul 30 2007, 19:27) Ну ... Jul 30 2007, 20:44     singlskv Цитата(bodja74 @ Jul 31 2007, 00:44) Ей б... Jul 30 2007, 21:04 Maddy Ну Sleep как-то не кошерно для _таких_ задержек по... Jul 30 2007, 17:41 singlskv Цитата(Maddy @ Jul 30 2007, 21:41) Ну Sle... Jul 30 2007, 18:01  SasaVitebsk Цитата(singlskv @ Jul 30 2007, 21:01) Mil... Jul 30 2007, 18:44   upc2 Цитата(SasaVitebsk @ Jul 30 2007, 21:44) ... Jul 31 2007, 04:49 singlskv Цитата(defunct @ Jul 31 2007, 00:15) Ну н... Jul 30 2007, 22:45 ALexx Цитата(defunct @ Jul 30 2007, 23:15) Ну н... Jul 31 2007, 06:53 oran-be Тема получения точных задержек в виндозе очень бла... Jul 30 2007, 20:23 rezident oran-be, когда вы цитируете кого-то, то указывайте... Jul 30 2007, 20:47 oran-be Цитата(rezident)когда вы цитируете кого-то, то ука... Jul 31 2007, 04:55 _Алекс МК Slave:
Скажем есть функция обработки принятого... Jul 31 2007, 05:46 upc2 To _Алекс
Прикрепил документ, где хорощо распиcа... Jul 31 2007, 09:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|