Jump to content

    

Протокол для Rs-485

исходников на 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 символа - возможно нада подрихтовать!!!

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

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

Далее...

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this