Цитата(zltigo @ Jul 11 2011, 00:58)

Требование протокола распространяется только на наличие silent interval.
Вот что написано про Modbus RTU в самом стандарте:
Нажмите для просмотра прикрепленного файлаПромежуток между фреймами, действительно, разделен интервалами молчания длительностью 3.5T. Однако не о них речь, речь идет о самом фрейме, который состоит из стартовой паузы 3.5Т, Модбас сообщения и завершающей паузы 3.5Т.
Черным по белому написано, что весь фрейм обязан передаваться непрерывно, как единый поток. Соответственно, согласно этому протоколу, передающей узел обязан включить свой передатчик заранее, не менее чем за 3.5Т до начала передачи сообщения, и держать его включенным еще не менее 3.5Т после передачи последнего символа сообщения.
С сожалением приходится констатировать, что некоторые даже такое более-менее прозрачное описание способны истолковать совершенно превратно. На рисунке внизу показано, когда правильно включать передатчик (сигнал TX_EN). А неправильный вариант, который отстаивают местные воинствующие невежды, применять ни в коем случае нельзя, поскольку он резко, на два порядка, ухудшает помехоустойчивость.
Нажмите для просмотра прикрепленного файлаЦитата(zltigo @ Jul 12 2011, 04:31)

про в 200 раз повышающий оставим на Вашей совести
Я объясню, откуда взялись цифры. Это будет полезно знать не только вам, но и другим начинающим.
Линия RS485 с двух сторон должна быть терминирована резисторами, равными волновому сопротивлению кабеля. Типично волновое сопротивление кабеля (витой пары) находится в диапазоне 100...150 Ом, наиболее часто встречается 120 Ом. Таким образом, два параллельно включенных терминирующих резистора имеют сопротивление 50...75 Ом.
Резисторы растяжки на линии RS485 обычно подвешиваются к земле и к питанию приемопередатчика RS485, т.е к +5В. Величина этих резисторов выбирается как компромисс между двумя противоречивыми требованиями. С одной стороны, чем меньше сопротивление резисторов растяжки, тем выше помехоустойчивость "висящей в воздухе" линии. Поскольку это именно тот уровень помехоустойчивости, который только и достижим с самопальными протоколами (а также в изделиях, где недотепы превратно понимают правильные протоколы), то, как правило, резисторы подтяжки стараются сделать как можно более низкоомными. С другой стороны, низкоомные резисторы подтяжки вносят неоднородность в линию, а также дополнительно нагружают передатчики, поэтому беспредельно их уменьшать нельзя. Чаще всего используют резисторы в диапазоне 470R...680R.
Замечу, что правильному протоколу для RS-485 вообще не нужны резисторы растяжки. Никакие. И это является хорошей проверкой "на вшивость" для протокола: убери резисторы растяжки или, еще лучше, загони через них в линию помеху от генератора - и тогда воочию увидишь, хорош ли протокол и правильно ли он реализован.
Итак, резисторы растяжки по 470R создадут на терминаторах 120R||120R смещение 300 мВ. Типичный RS485 приемник имеет входной гистерезис всего 50 мВ, а его дифф. порог срабатывания находится в диапазоне от +200мВ до -200мВ. Соответственно, не вдаваясь в ненужные мелочи, можно принять, что для получения ложного сигнала на входе приемника помехе достаточно преодолеть смещение в 300 мВ. Ток через резисторы растяжки равен 5 мА, напряжение 0.3В, а мощность помехи, которая их пересилит, соответственно, должна составить 1.5 мВт.
Когда в линии RS485 есть включенный передатчик, он обеспечивает на линии типично 2.5 В дифф напряжения. Выход драйвера обеспечивает ток не менее 60 мА. Таким образом, для преодоления включенного выхода помеха должна развить мощность 150 мВт. Учитывая, что ток короткого замыкания у драйвера существенно больше (порядка 150 мА), от помехи может потребоваться еще большая мощность.
Вот это и дает мне основания утверждать, что правильный (и правильно реализованный) протокол, такой как Modbus RTU, обеспечит в 100-200 раз большую помехоустойчивость, чем типичный самопал.
Цитата(aaarrr @ Jul 12 2011, 18:22)

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

Цитата(zltigo @ Jul 12 2011, 04:31)

В любом вменяемом базирующимся на ассинхронной передачи байтов протоколе это "долгое время" менее ОДНОГО байта. Один байт, который будучи принятым с ошибкой (paryty или frame) и/или НЕ будет соответствовать комбинации начала фрейма будет отброшен. Опасное, так сказать время (почему всю "помехоустойчивось" Вы сводите только к нему оставим на Вашей совести) за время которого помеха способна вызвать потерю всего фрейма это время менее передачи одного символа. В дебильнейшем даже с этой точки оценки Modbus RTU помеха в 1+1,5 символьном интервале перед началом фрейма вызывает облом со всем фреймом. Вот такой он оказывается "обеспечивающий максимально возможную для RS-485 помехоустойчивость" протокол. Абыдно, да....
Вы не понимаете. Никакая помеха, наведенная на свободную линию перед началом фрейма (т.е. до того, как будет включен передатчик) в Modbus RTU и не способна вызвать потерю фрейма. В течении стартового интервала фрейма, который длится 3.5Т, все помехи, наведенные ранее, будут отброшены приемниками. К началу прихода сообщения все UARTs будут готовы к приему, приемные буфера пусты. Фрейм будет принят без искажений.
Вот в Modbus ASCII - там помеха, наведенная на свободную линию, действительно, способна ложно запустить UARTы приемников и исказить стартовый символ ":", в результате чего весь фрейм будет потерян. Неважно, какой длительности этот критический интервал. Если протокол
имеет такой критический ("опасный") интервал, в течении которого слабая помеха может его испортить, то это никуда не годный протокол.
Правда, Modbus ASCII можно легко улучшить, сделать помехоустойчивым. Для этого достаточно, например, чтобы в начале фрейма передатчик выдавал символ ":" не один раз, а дважды. Первый символ может быть испорчен помехой, однако второй - очистит буфера приемников и весь фрейм будет принят правильно. Такой улучшенный вариант Modbus ASCII дает пример помехоустойчивого интерфейса, которому не нужны тайм-ауты. Учитесь, GetSmart, авось и правда поумнеете.

Цитата(Dog Pawlowa @ Jul 11 2011, 21:40)

Что касается стартовой последовательности бит... Как использовать это с помощью стандартного UARTа во всем диапазоне параметров передачи?
Пример "улучшенного Modbus ASCII" дает общую идею: среди всех возможных символов выделяется несколько, при помощи которых организуется управление потоком. Более изящная реализация этой идеи может быть обеспечена несколькими способами.
Простое решение получается при помощи байт-стаффинга. Выделяем, например, два символа специального назначения. Один называем "START", второй - "ESC". Если во входном потоке встречается "START", то все приемники обязаны выбросить текущий фрейм и очистить буфера приема. Если в потоке встречается "ESC", то следующий за ним символ интерпретируется особым образом, как команда. Команды могут быть такие:
- добавить в приемный буфер символ, код которого соответствует символу "START"
- добавить в приемный буфер символ, код которого соответствует символу "ESC"
- завершить прием фрейма
Понятное дело, что в том случае, когда в передаваемом пакете есть много символов "START" или "ESC", то передаваемое сообщение будет раздуваться, достигая в пределе (в наихудшем случае) примерно удвоенной исходной длины.
Несколько более трудное в реализации решение получается если использовать, например, кодирование
6b8b, зато сообщение раздуется всего на четверть, а заодно обеспечивается проверка на четность для каждого байта.