Перейти к содержанию
    

исходников на Code vision нету, но алгоритм рассказать могу.

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

Итак канал MODBUS RTU (со стороны приема кадра- режим слейв)

1) Задействую таймер прерывание на время в 1,5 символа (например OCx CTC mode)

2) UART RX работает всегда, при возникновению прерывания по UARTв любом случае обнуляем таймер.

3) Проверяем принятый байт на четность или 2й стоп, если ок помещаем в буфер но неболее N байт в буфере (256).

4) При появлении прерывания по таймеру (считаем что прошло 1,5 символа) начинаем разбор кадра...

смотрим адрес в первом байте буфера если сходится с адресом слейва разбираем кадр далее - считаем CRC, если не совпал адрес слейв или CRC16 -- вектор буфера на начало и ждем след перрывания по таймеру.

Вроде все!!

Насчет 1,5 символа - возможно нада подрихтовать!!!

Как уважаемые коллеги этот вариант?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4) При появлении прерывания по таймеру (считаем что прошло 1,5 символа) начинаем разбор кадра...
Неверно! Если пауза между символами больше 1,5-кратного интервала, но меньше 3,5-кратного, то данный фрейм нужно "фтопку". Об этом в стандарте явно прописано. Разбор фрейма нужно проводить, только если пауза тишины превысит 3,5-кратный интервал.

Начало фрейма тоже по 3,5-кратной паузе тишины ловится. А прием в буфер имеет смысл начинать, только если сетевой ID совпал с собственным (для slave) или с тем, что был в запросе (для master). Зачем нужно "чужие" пакеты принимать/разбирать-то? :07: Исключение составляет только broadcast ID, который всеми slave должен приниматься.

Кстати, постоянный прием с линии можно оставлять, только если локальное "эхо" отсутствует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да это все верно.. Именно поэтому и был выбран интервал 1,5

1) 1,5 символа взято из соображений ускорения синхронизации, выставив паузу в 3,5 нужно дополнительно стаховаться что я не попаду (например в момент включения) в середину передачи символа на уарт.. Можно поставить больше 1,5 - например даже лучше 1,75 тогда проблем в реализации 3,5 интервала для передатчика вообще не будет..

Далее...

Почему разбирать чужие пакеты?

после детекта IDLE я по прерыванию смотрю только на совпадение адреса ВСЁ!!!

CRC считаю только если адрес совпал - вы просто несовсем внимательно прочитали...

Вся перелесть - в том что алгоритм весит всего нескольо строк на АSМ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помашу после драки кулаками:

 

Протокол серии ADAM-4000 - это страшный сон разработчика!!! Для каждой команды - свой формат. В том числе, разный символ-заголовок пакета!!! Очень много команд, у которых все различие подвариантов "на чтение" и "на запись" - только по длине! Форматы ответов тоже разные на разные команды! В отличие от MODBUS ASCII, сплошь и рядом всякие "левые" - не шестнадцатеричные - символы внутри пакета, так что скормить его целиком в процедурку типа "HEX2BIN" не выйдет!

 

А уж "контрольная сумма", представляющая собой просто сумму размером в 1 байт - это просто прелес-с-сть!

 

Уж простите, что я вот так вот "криком" - наболело...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендую ознакомиться с дискуссией, где обсуждается связь между подтяжками, протоколом обмена и помехоустойчивостью. Modbus ASCII для RS-485 непригоден из-за низкой помехоустойчивости, oн предназначен для RS-232.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...