Как проверить шину rs485
Перейти к содержимому

Как проверить шину rs485

  • автор:

RS-485:Физическое подключение

Устройства RS-485 устанавливаются на общую шину. Шина использует две линии для данных (A и B) и одну для земли (общий провод). Общий провод нужен для выравнивая потенциалов устройств. Его можно не подключать, если устройства уже имеют общую землю и стоят в одном щите.

A и B обязательно должны быть проложены витой парой — это кабель, в котором оба провода шины свиты между собой с равным шагом на заводе. Если используется экранированный кабель, то экран заземлить в одной точке (неважно в какой).

Часто удобно иметь линию питания в том же кабеле, поэтому можно использовать кабель с двумя витыми парами: А/B и V+/GND. В этом случае обязательно рассчитать падение напряжение и выбрать кабель с жилами достаточного сечения.

По стандарту RS-485 шина должна быть проложена без ответвлений и на концах линии должны быть терминирующие резисторы (100-120 Ом). Топологии звезда или кольцо не допускаются.

Но если скорость передачи будет не выше 115200 бит/с, то переотражения от ответвлений и нетерминированых концов быстро затухают и на работу не влияют.

Наши рекомендации по тому, насколько можно отойти от стандарта RS-485 без потери работоспособности:

  • А и B витой парой — обязательно. Даже в щите на короткие расстояния лучше использовать витую пару — силовое оборудование может наводить помехи.
  • Общий провод (GND) — обязательно, если земли устройств разные (питаются от разных БП). Можно без него, если у устройства изолированный порт RS-485.
  • Экран — для небольших расстояний (10 м) при отсутствии источников помех экран можно не использовать.
  • Ответвления от шины — допустимы ответвления до 50 м при скорости не выше 115 200 бит/с.
  • Терминатор на концах линии — при скорости менее 115 200 бит/с можно обойтись, при скорости 115200 бит/с — хотя бы с одного конца должен быть. На длинных линиях и с низкой скоростью может даже ухудшать работу. Если контроллер подключен к середине шины, то терминатор нужно отключить.

Сигнал на линии с терминаторами. Желтая — линия А передатчика, голубая — А приемника, розовая — В приемника, синяя — разность А-B — т.е. сигнал. Длина кабеля 600 метров, частота 115200.

Сигнал без терминаторов в середине линии — ситуация плохая, однако ж работает.

Выбор кабеля

Используйте экранированный кабель парной скрутки: данные RS-485 (линии A и B) должны идти по витой паре, а экран уменьшит помехи от силовых цепей. При монтаже удобно использовать кабель с гибкими жилами. Также для прокладки шины можно использовать обычную витую пару CAT5 для Ethernet.

Пример распиновки кабеля 5 категории для прокладки шины RS-485, не является стандартом

Сигнал шины RS-485 Провод
данные A оранжевый
данные B бело-оранжевый
питание (12В или другое) синий
питание (12В или другое) бело-синий
не используется бело-зелёный
не используется зелёный
земля питания (GND) бело-коричневый
земля питания (GND) коричневый
Пример распиновки кабеля 2х2х0.35 мм кв. для прокладки шины RS-485 внутри щита, не является стандартом

Сигнал шины RS-485 Провод
данные A оранжевый
данные B бело-оранжевый
питание (12В или другое) бело-синий
земля питания (GND) синий

Падение напряжения на кабеле при пиковом потреблении устройств

При выборе кабеля питания (или общего кабеля для питания и данных), нужно обратить внимание на:

  • значение пикового потребления устройств,
  • сечение и длину кабеля,
  • напряжение блока питания.

При неправильном выборе кабеля и напряжения блока питания может произойти следующая ситуация: в момент пикового потребления на проводах питания случится бо́льшая, чем обычно, просадка напряжения; напряжение на самом устройстве станет меньше допустимого, и устройство отключится. Обычно после этого устройство само включается обратно, и в итоге возникает проблема, которую сложно диагностировать.

Пример расчета падения напряжения на кабеле

Дано: К кабелю КИС-В 2х2х0,60 общей длинной 50 метров подключено 5 шт датчиков MSW2 и 2 модуля реле MRM2-mini от блока питания 12В.

Пиковая потребляемая мощность (в момент включения реле) P = 5 * 0.5 W + 2* 2.5 W = 7.5 W., при этом средняя ~3W

Потребляемый средний ток I = P/U = 3 W/12 V =0.25 A и пиковый до 0.6А.

Сопротивление провода с d=0,6 mm составит R = 6 Ohm на 100 метров (туда и обратно).

Падение напряжения на кабеле (худший случай — все устройства на конце кабеля) будет V = I*R = 0.25*6 = 1.5 V в среднем и пиковое 3.6 V

На устройствах останется соответственно 10.5 V и 8.4 V, Но для питания нужно не менее 9V. Это приведет к нестабильной работе. В среднем все работает, но одновременное включение реле вызовет перезагрузку устройств.

Что можно сделать:

  • Взять кабель с большим сечением жил.
  • Использовать блок питания на 24V. Ток будет в два раза меньше (I = P/U = 0.3 A), падение напряжения на кабеле тоже меньше (1.8V), а запас по питанию будет очень большим (22V).

Примеры марок кабелей

Подключение устройств

Как обжимать наконечники НШВИ

Так как все устройства соединяются общей шиной, следите за качественным соединением всех узлов линии:

  • при обрыве линии устройства за обрывом не будут работать
  • при коротком замыкании не будут работать все устройства.

Рекомендуем использовать штыревые наконечники под обжимку (НШВИ). Это позволяет легко подключать-отключать устройства без потери работоспособности остальных устройств на шине.

Провод A на всех устройствах подключается к клеммнику с маркировкой А, провод B — всегда к B, а провода A и B должны быть перевиты между собой.

На контроллерах Wiren Board рядом с клеммниками А и В расположены клеммники GND и Vout — их лучше не использовать в больших инсталляциях, так как оба выхода Vout рассчитаны всего на 1А.

Клемма общего провода обозначается, в зависимости от оборудования, как SC, SG, G, GND, ground или reference. На контроллерах Wiren Board эта клемма обозначена как GND. При подключении к изолированному порту, нужно подключаться к изолированной земле данного порта (клеммы «GND iso»).

Лайфхак: так как внутри Wiren Board стоит растяжка линий, после подключения его к шине напряжение на линии A будет больше, чем на B примерно на 0.5 В. Поэтому, подключая периферийные устройства, вы легко можете определить линии шины вольтметром. Но, конечно, цветовое кодирование проводников более предпочтительно.

    Пример подключения устройств к шине внутри щита кабелем 2х2х0.35 мм кв.

Сканирование шины RS485

В электронике есть множество проводных полудуплексных асинхронных последовательных интерфейсов типа общая шина. Это 1-Wire, RS485, 10BASE2(thin Ethernet), LIN, K-Line , CAN, I2C, MIL-STD-1553, ARINC 429.

Во всех этих shared-bus интерфейсах так или иначе возникает задача сканирования шины.

Всем кто работал с i2c известна процедура сканирования шины. Там можно просто методом перебора просканировать шину. Так как длина адреса всего 7 бит, то можно просканировать шину просто за пару секунд.

Результат сканирования шины I2C1 в UART-CLI

В CAN задачи сканирования вообще не стоит так как там коллизии разруливаются на аппаратном уровне физических трансиверов или вовсе MAC периферии. В CAN достаточно подключится в любом месте и через мгновение в утилите CAN-Hacker будет понятно кто там живет на шине CAN. В CAN все ноды постоянно flood(дят) «Hello!» пакетами.

В Lin сеть узлов обычно полностью 100% статическая и прошивается во время производства. Это и понятно, ведь в автомобильной двери во время езды не появится новая кнопка. В салоне автобуса по маршруту не вырастет новый поручень с кнопкой остановки.

Как обстоят дела со сканированием в остальных проводных интерфейсах: 1-Wire, 10BASE2(thin Ethernet), K-Line, MIL-STD-1553, ARINC 429 я, честно, не знаю. Если кто в теме, то напишите, пожалуйста, в комментариях.

Как обычно выглядит сеть RS485?

шпаргалка по шине RS485

Надо отметить что RS-485 это фактически только труба для чисел (числопровод). Интерфейс физического уровня в модели OSI-7. Протокол канального уровня поверх RS485 может быть самым разнообразным: ModBus, Pelco-D, yModem, xModem, или любой другой проприетарных протокол. В 80% случаев в этом протоколе будет идентификатор устройства в сети. Это может быть MAC, ID, IP, SN или что-то ещё. Про то какими атрибутами обладает хороший канальный протокол есть вообще отдельный текст. https://habr.com/ru/articles/682292/

В чем трудность сканирования шины RS485?

1—Трудность в том что адреса устройств в протоколе канального уровня поверх физического интерфейса RS485 могут иметь существенно более высокую разрядность чем 8 бит, как правило это 32 бита (4байта) или даже MAC адреса по 48бит (6 байт) или 64бит(8-байт). Предположим в протоколе канального уровня узлы на интерфейсе RS485 имеют 32х битные адреса и если сканировать шину RS485 как это было в I2C то китайский калькулятор покажет что надо «подождать и потерпеть» 14 лет!

вычисления времени ожидания сканирования методом перебора

2—В шине RS485 нет аппаратного механизма разрешения коллизий подобно CAN(у). Если 2 ноды начнут передавать одновременно, то данные в витой паре исказятся и мастер прочитает мусорный пакет с поврежденной контрольной суммой.

3—Все устройства на шине RS485 могут вообще работать на разных битовых скоростях 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600 бит/c. Я работал в трех конторах и у каждой была своя стандартная битовая скорость шины RS485. И у всех разная! Если устройство работает на битовой скорости 460800 бит/c то оно не будет отвечать на пакеты которые ей посылают на битовой скорости 115200 бит/c.

Как же просканировать шину RS485?

Перед тем как приступить к объяснению сути алгоритма сканирования шины RS485 хочется привести аналогию из жизни. Аналогия эта про то как медвежатники отмычками взламывают навесные замки. Первой отмычкой создается момент силы, который фиксирует положение одного из пинов. Затем второй отмычкой находят пин, который движется туго и медленно и аккуратно подбирают положение упирающегося пина пока не услышат тихенький щелчок. Первая отмычка дрогнет. Затем начинает упираться другой пин. Аналогично двигают следующий пин до такого же щелчка. И так до тех пор пока все пины точно не встанут на нужные положения. Тогда замок откроется.

Тут ситуация аналогичная. Вместо пинов — биты, вместо щелчка — сигнал подтверждения.

Прежде чем двигаться дальше надо договориться о терминологии.

Терминология

—Адрес устройства — это либо MAC адрес, серийный номер (SN), либо аналог IP адреса или любой другой ID(шник) уникальный для каждого экземпляра устройства на шине RS485. Важен тот момент, что адрес широкий много битный. Пусть это, например, 32х битный адрес.

—Маска адреса — это часть адреса устройства, которая начинается с наименьшего значащего бита LSB и увеличивается в сторону старшего бита. Имеет смысл расширять маску от младших битов ибо младшие есть у всех адресов, а вот старших единичных битов может и не быть. Вот пример нескольких реальных масок:

Пример маски для адреса

Длина маски, [бит]

—Сигнал подтверждения— это когда ведомое устройство на RS485 берет пин UART_TX, переводит его в режим GPIO PUSH-PULL, устанавливает 0V, ждет T_ack секунд (например 10ms) и после этого снова подключает к пину UART_TX контроллер. Всё это и называется сигналом подтверждения. По сути устройство на время прижимает шину в ноль вольт. При этом совершенно не опасно, если несколько устройств одновременно прижмут шину в ноль. Эффект будет как от одного. То есть получается логическое ИЛИ. У мастера на UART_RX будет 0V.

—Пакет mute — это такой бинарный пакет получив который ведомое устройство перестает что- либо отправлять в общую шину RS485 и не будет даже испускать сигналы. Устройство будет только слушать шину. Mute пакет может содержать параметр включить или отключить Mute режим.

Словесное описание алгоритма сканирования шины RS485

1—Мастер устройство объявляет что сейчас все ведомые устройства переходят в режим сканирования.

2—мастер отправляет маску адреса, например Mx=xx. xx0 или Mx1=xx. xx1 и просит, чтобы откликнулись те устройства чей адрес совпадает с маской. То есть у кого нулевой бит равен нулю.

3—мастер переводит пин UART_RX в GPIO input, устанавливает подтяжку к питанию и непрерывно смотрит за напряжением на проводе UART_RX. Тут есть два исхода.

a) У мастера на проводе UART_RX появился 0.0 V. Значит, что на шине RS485 присутствует как минимум одно ведомое устройство у кого адрес совпадает с маской Mx.

b) У мастера на проводе UART_RX остался 3,3V. Значат что на шине RS485 нет ни одного устройства у кого бы адрес совпадал с маской Mx. Это значит, что дальше мы с этой маской Mx не работаем и просто отбрасываем её в сторону как заранее неправильный путь. Причем мастер ожидает не бесконечно, а строго определённой время таймаута, которое общее для всех устройств, например 20ms.

4—В случае 3.a) маска расширяется на 1 бит влево. Тут тоже есть два варианта. Либо мы к маске обнаруженного устройства приписываем префикс 0 либо 1. Надо идти по обоим путям: 1 и 2.

Маска

Пояснение

Пример

Тут прослеживается рекурсия или элементы динамического программирование. Каждый шаг порождает 2 шага: c префиксом 0 и с префиксом 1.

Далее шаги 2-3-4 можно повторять снова и снова пока маска не достигнет длинны 32 бита. Как только это произойдет это станет означать что найдено одно устройство на шине. Но как найти остальные N-1 устройство?

5—Как только маска будет совпадать с 32 битами то мастер устройство отправляет команду заглушить устройство по определённому адресу. Master отправляет mute пакет.

Шаги 2-3-4-5 это по сути одна итерация. На следующей итерации мастер обнаружит другое устройство. И так до тех пор пока все маски перестанут выдавать сигнал подтверждения. После этого шина RS485 будет полностью просканирована.

К слову, на маску длинной ноль (xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx) отвечают установкой сигнала подтверждения все не заглушенные узлы RS485 сети. Поэтому данный пакет установки маски может служить критерием окончания сканирования сети.

Справедливости ради можно добавить что надо проделать все то же самое для всех возможных битовых скоростей RS485: 9600, 115200, и проч. Однако как правило RS485 сеть собирают из устройств у которых уже прописана битовая скорость по умолчанию.

Время сканирования на одной битовой скорости займет

Вариант

Время

Пояснение

подтверждение при первом увеличении маски

подтверждение при втором увеличении маски

где dt — это время отклика на адресную маску

Алгоритм сканирования общей шины можно изобразить в виде вот этой диаграммы обмена пакетами

Вот лог сканирования для 32-х битных адресов

Лог сканирования для 32битных адресов

—>
—>rss
2.784 :I [RS485] Scan
2.786 :I [RS485] 1: IsAnyBodyWith x:0
2.788 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x:0
2.790 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x:0
2.792 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x:0
2.794 :I [RS485] 3: IsAnyBodyWith x1:1
2.796 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x1:1
2.798 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x1:1
2.800 :I [RS485] 4: IsAnyBodyWith x11:2
2.802 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x11:2
2.804 :I [RS485] 5: IsAnyBodyWith x111:3
2.806 :N [RS485] NoMask x111:3!
2.808 :I [RS485] 6: IsAnyBodyWith x011:3
2.810 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x011:3
2.812 :I [RS485] 7: IsAnyBodyWith x1011:4
2.814 :N [RS485] NoMask x1011:4!
2.816 :I [RS485] 8: IsAnyBodyWith x0011:4
2.818 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0011:4
2.820 :I [RS485] 9: IsAnyBodyWith x10011:5
2.822 :N [RS485] NoMask x10011:5!
2.824 :I [RS485] 10: IsAnyBodyWith x00011:5
2.826 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00011:5
2.828 :I [RS485] 11: IsAnyBodyWith x100011:6
2.830 :N [RS485] NoMask x100011:6!
2.832 :I [RS485] 12: IsAnyBodyWith x000011:6
2.834 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000011:6
2.836 :I [RS485] 13: IsAnyBodyWith x1000011:7
2.838 :N [RS485] NoMask x1000011:7!
2.840 :I [RS485] 14: IsAnyBodyWith x0000011:7
2.842 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000011:7
2.844 :I [RS485] 15: IsAnyBodyWith x10000011:8
2.846 :N [RS485] NoMask x10000011:8!
2.848 :I [RS485] 16: IsAnyBodyWith x00000011:8
2.850 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000011:8
2.852 :I [RS485] 17: IsAnyBodyWith x100000011:9
2.854 :N [RS485] NoMask x100000011:9!
2.856 :I [RS485] 18: IsAnyBodyWith x000000011:9
2.858 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000011:9
2.860 :I [RS485] 19: IsAnyBodyWith x1000000011:10
2.862 :N [RS485] NoMask x1000000011:10!
2.864 :I [RS485] 20: IsAnyBodyWith x0000000011:10
2.866 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000011:10
2.868 :I [RS485] 21: IsAnyBodyWith x10000000011:11
2.870 :N [RS485] NoMask x10000000011:11!
2.872 :I [RS485] 22: IsAnyBodyWith x00000000011:11
2.874 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000000011:11
2.876 :I [RS485] 23: IsAnyBodyWith x100000000011:12
2.878 :N [RS485] NoMask x100000000011:12!
2.880 :I [RS485] 24: IsAnyBodyWith x000000000011:12
2.882 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000000011:12
2.884 :I [RS485] 25: IsAnyBodyWith x1000000000011:13
2.886 :N [RS485] NoMask x1000000000011:13!
2.888 :I [RS485] 26: IsAnyBodyWith x0000000000011:13
2.890 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000000011:13
2.892 :I [RS485] 27: IsAnyBodyWith x10000000000011:14
2.894 :N [RS485] NoMask x10000000000011:14!
2.896 :I [RS485] 28: IsAnyBodyWith x00000000000011:14
2.898 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000000000011:14
2.900 :I [RS485] 29: IsAnyBodyWith x100000000000011:15
2.902 :N [RS485] NoMask x100000000000011:15!
2.904 :I [RS485] 30: IsAnyBodyWith x000000000000011:15
2.906 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000000000011:15
2.908 :I [RS485] 31: IsAnyBodyWith x1000000000000011:16
2.910 :N [RS485] NoMask x1000000000000011:16!
2.912 :I [RS485] 32: IsAnyBodyWith x0000000000000011:16
2.914 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000000000011:16
2.916 :I [RS485] 33: IsAnyBodyWith x10000000000000011:17
2.918 :N [RS485] NoMask x10000000000000011:17!
2.920 :I [RS485] 34: IsAnyBodyWith x00000000000000011:17
2.922 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000000000000011:17
2.924 :I [RS485] 35: IsAnyBodyWith x100000000000000011:18
2.926 :N [RS485] NoMask x100000000000000011:18!
2.928 :I [RS485] 36: IsAnyBodyWith x000000000000000011:18
2.930 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000000000000011:18
2.932 :I [RS485] 37: IsAnyBodyWith x1000000000000000011:19
2.934 :N [RS485] NoMask x1000000000000000011:19!
2.936 :I [RS485] 38: IsAnyBodyWith x0000000000000000011:19
2.938 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000000000000011:19
2.940 :I [RS485] 39: IsAnyBodyWith x10000000000000000011:20
2.942 :N [RS485] NoMask x10000000000000000011:20!
2.944 :I [RS485] 40: IsAnyBodyWith x00000000000000000011:20
2.946 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000000000000000011:20
2.948 :I [RS485] 41: IsAnyBodyWith x100000000000000000011:21
2.950 :N [RS485] NoMask x100000000000000000011:21!
2.952 :I [RS485] 42: IsAnyBodyWith x000000000000000000011:21
2.954 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000000000000000011:21
2.956 :I [RS485] 43: IsAnyBodyWith x1000000000000000000011:22
2.958 :N [RS485] NoMask x1000000000000000000011:22!
2.960 :I [RS485] 44: IsAnyBodyWith x0000000000000000000011:22
2.962 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000000000000000011:22
2.964 :I [RS485] 45: IsAnyBodyWith x10000000000000000000011:23
2.966 :N [RS485] NoMask x10000000000000000000011:23!
2.968 :I [RS485] 46: IsAnyBodyWith x00000000000000000000011:23
2.970 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000000000000000000011:23
2.972 :I [RS485] 47: IsAnyBodyWith x100000000000000000000011:24
2.974 :N [RS485] NoMask x100000000000000000000011:24!
2.976 :I [RS485] 48: IsAnyBodyWith x000000000000000000000011:24
2.978 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000000000000000000011:24
2.980 :I [RS485] 49: IsAnyBodyWith x1000000000000000000000011:25
2.982 :N [RS485] NoMask x1000000000000000000000011:25!
2.984 :I [RS485] 50: IsAnyBodyWith x0000000000000000000000011:25
2.986 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000000000000000000011:25
2.988 :I [RS485] 51: IsAnyBodyWith x10000000000000000000000011:26
2.990 :N [RS485] NoMask x10000000000000000000000011:26!
2.992 :I [RS485] 52: IsAnyBodyWith x00000000000000000000000011:26
2.994 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000000000000000000000011:26
2.996 :I [RS485] 53: IsAnyBodyWith x100000000000000000000000011:27
2.998 :N [RS485] NoMask x100000000000000000000000011:27!
3.000 :I [RS485] 54: IsAnyBodyWith x000000000000000000000000011:27
3.002 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000000000000000000000011:27
3.004 :I [RS485] 55: IsAnyBodyWith x1000000000000000000000000011:28
3.006 :N [RS485] NoMask x1000000000000000000000000011:28!
3.008 :I [RS485] 56: IsAnyBodyWith x0000000000000000000000000011:28
3.010 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000000000000000000000011:28
3.012 :I [RS485] 57: IsAnyBodyWith x10000000000000000000000000011:29
3.014 :N [RS485] NoMask x10000000000000000000000000011:29!
3.016 :I [RS485] 58: IsAnyBodyWith x00000000000000000000000000011:29
3.018 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x00000000000000000000000000011:29
3.020 :I [RS485] 59: IsAnyBodyWith x100000000000000000000000000011:30
3.022 :N [RS485] NoMask x100000000000000000000000000011:30!
3.024 :I [RS485] 60: IsAnyBodyWith x000000000000000000000000000011:30
3.026 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x000000000000000000000000000011:30
3.028 :I [RS485] 61: IsAnyBodyWith x1000000000000000000000000000011:31
3.030 :N [RS485] NoMask x1000000000000000000000000000011:31!
3.032 :I [RS485] 62: IsAnyBodyWith x0000000000000000000000000000011:31
3.034 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask:x0000000000000000000000000000011:31
3.036 :I [RS485] 63: IsAnyBodyWith :32
3.038 :N [RS485] NoMask :32!
3.040 :I [RS485] 64: IsAnyBodyWith :32
3.042 :W [RS485] ACK Addr 0x3=0000_0000_0000_0000_0000_0000_0000_0011 Mask::32
3.044 :W [RS485] SpotAddr 0x3!
3.046 :W [RS485] MuteAddr 0x3
3.048 :I [RS485] 65: IsAnyBodyWith x01:2
3.050 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x01:2
3.052 :I [RS485] 66: IsAnyBodyWith x101:3
3.054 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x101:3
3.056 :I [RS485] 67: IsAnyBodyWith x1101:4
3.058 :N [RS485] NoMask x1101:4!
3.060 :I [RS485] 68: IsAnyBodyWith x0101:4
3.062 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0101:4
3.064 :I [RS485] 69: IsAnyBodyWith x10101:5
3.066 :N [RS485] NoMask x10101:5!
3.068 :I [RS485] 70: IsAnyBodyWith x00101:5
3.070 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00101:5
3.072 :I [RS485] 71: IsAnyBodyWith x100101:6
3.074 :N [RS485] NoMask x100101:6!
3.076 :I [RS485] 72: IsAnyBodyWith x000101:6
3.078 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000101:6
3.080 :I [RS485] 73: IsAnyBodyWith x1000101:7
3.082 :N [RS485] NoMask x1000101:7!
3.084 :I [RS485] 74: IsAnyBodyWith x0000101:7
3.086 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000101:7
3.088 :I [RS485] 75: IsAnyBodyWith x10000101:8
3.090 :N [RS485] NoMask x10000101:8!
3.092 :I [RS485] 76: IsAnyBodyWith x00000101:8
3.094 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000101:8
3.096 :I [RS485] 77: IsAnyBodyWith x100000101:9
3.098 :N [RS485] NoMask x100000101:9!
3.100 :I [RS485] 78: IsAnyBodyWith x000000101:9
3.102 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000101:9
3.104 :I [RS485] 79: IsAnyBodyWith x1000000101:10
3.106 :N [RS485] NoMask x1000000101:10!
3.108 :I [RS485] 80: IsAnyBodyWith x0000000101:10
3.110 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000101:10
3.112 :I [RS485] 81: IsAnyBodyWith x10000000101:11
3.114 :N [RS485] NoMask x10000000101:11!
3.116 :I [RS485] 82: IsAnyBodyWith x00000000101:11
3.118 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000000101:11
3.120 :I [RS485] 83: IsAnyBodyWith x100000000101:12
3.122 :N [RS485] NoMask x100000000101:12!
3.124 :I [RS485] 84: IsAnyBodyWith x000000000101:12
3.126 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000000101:12
3.128 :I [RS485] 85: IsAnyBodyWith x1000000000101:13
3.130 :N [RS485] NoMask x1000000000101:13!
3.132 :I [RS485] 86: IsAnyBodyWith x0000000000101:13
3.134 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000000101:13
3.136 :I [RS485] 87: IsAnyBodyWith x10000000000101:14
3.138 :N [RS485] NoMask x10000000000101:14!
3.140 :I [RS485] 88: IsAnyBodyWith x00000000000101:14
3.142 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000000000101:14
3.144 :I [RS485] 89: IsAnyBodyWith x100000000000101:15
3.146 :N [RS485] NoMask x100000000000101:15!
3.148 :I [RS485] 90: IsAnyBodyWith x000000000000101:15
3.150 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000000000101:15
3.152 :I [RS485] 91: IsAnyBodyWith x1000000000000101:16
3.154 :N [RS485] NoMask x1000000000000101:16!
3.156 :I [RS485] 92: IsAnyBodyWith x0000000000000101:16
3.158 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000000000101:16
3.160 :I [RS485] 93: IsAnyBodyWith x10000000000000101:17
3.162 :N [RS485] NoMask x10000000000000101:17!
3.164 :I [RS485] 94: IsAnyBodyWith x00000000000000101:17
3.166 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000000000000101:17
3.168 :I [RS485] 95: IsAnyBodyWith x100000000000000101:18
3.170 :N [RS485] NoMask x100000000000000101:18!
3.172 :I [RS485] 96: IsAnyBodyWith x000000000000000101:18
3.174 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000000000000101:18
3.176 :I [RS485] 97: IsAnyBodyWith x1000000000000000101:19
3.178 :N [RS485] NoMask x1000000000000000101:19!
3.180 :I [RS485] 98: IsAnyBodyWith x0000000000000000101:19
3.182 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000000000000101:19
3.184 :I [RS485] 99: IsAnyBodyWith x10000000000000000101:20
3.186 :N [RS485] NoMask x10000000000000000101:20!
3.188 :I [RS485] 100: IsAnyBodyWith x00000000000000000101:20
3.190 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000000000000000101:20
3.192 :I [RS485] 101: IsAnyBodyWith x100000000000000000101:21
3.194 :N [RS485] NoMask x100000000000000000101:21!
3.196 :I [RS485] 102: IsAnyBodyWith x000000000000000000101:21
3.198 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000000000000000101:21
3.200 :I [RS485] 103: IsAnyBodyWith x1000000000000000000101:22
3.202 :N [RS485] NoMask x1000000000000000000101:22!
3.204 :I [RS485] 104: IsAnyBodyWith x0000000000000000000101:22
3.206 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000000000000000101:22
3.208 :I [RS485] 105: IsAnyBodyWith x10000000000000000000101:23
3.210 :N [RS485] NoMask x10000000000000000000101:23!
3.212 :I [RS485] 106: IsAnyBodyWith x00000000000000000000101:23
3.214 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000000000000000000101:23
3.216 :I [RS485] 107: IsAnyBodyWith x100000000000000000000101:24
3.218 :N [RS485] NoMask x100000000000000000000101:24!
3.220 :I [RS485] 108: IsAnyBodyWith x000000000000000000000101:24
3.222 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000000000000000000101:24
3.224 :I [RS485] 109: IsAnyBodyWith x1000000000000000000000101:25
3.226 :N [RS485] NoMask x1000000000000000000000101:25!
3.228 :I [RS485] 110: IsAnyBodyWith x0000000000000000000000101:25
3.230 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000000000000000000101:25
3.232 :I [RS485] 111: IsAnyBodyWith x10000000000000000000000101:26
3.234 :N [RS485] NoMask x10000000000000000000000101:26!
3.236 :I [RS485] 112: IsAnyBodyWith x00000000000000000000000101:26
3.238 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000000000000000000000101:26
3.240 :I [RS485] 113: IsAnyBodyWith x100000000000000000000000101:27
3.242 :N [RS485] NoMask x100000000000000000000000101:27!
3.244 :I [RS485] 114: IsAnyBodyWith x000000000000000000000000101:27
3.246 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000000000000000000000101:27
3.248 :I [RS485] 115: IsAnyBodyWith x1000000000000000000000000101:28
3.250 :N [RS485] NoMask x1000000000000000000000000101:28!
3.252 :I [RS485] 116: IsAnyBodyWith x0000000000000000000000000101:28
3.254 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000000000000000000000101:28
3.256 :I [RS485] 117: IsAnyBodyWith x10000000000000000000000000101:29
3.258 :N [RS485] NoMask x10000000000000000000000000101:29!
3.260 :I [RS485] 118: IsAnyBodyWith x00000000000000000000000000101:29
3.262 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x00000000000000000000000000101:29
3.264 :I [RS485] 119: IsAnyBodyWith x100000000000000000000000000101:30
3.266 :N [RS485] NoMask x100000000000000000000000000101:30!
3.268 :I [RS485] 120: IsAnyBodyWith x000000000000000000000000000101:30
3.270 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x000000000000000000000000000101:30
3.272 :I [RS485] 121: IsAnyBodyWith x1000000000000000000000000000101:31
3.274 :N [RS485] NoMask x1000000000000000000000000000101:31!
3.276 :I [RS485] 122: IsAnyBodyWith x0000000000000000000000000000101:31
3.278 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask:x0000000000000000000000000000101:31
3.280 :I [RS485] 123: IsAnyBodyWith :32
3.282 :N [RS485] NoMask :32!
3.284 :I [RS485] 124: IsAnyBodyWith :32
3.286 :W [RS485] ACK Addr 0x5=0000_0000_0000_0000_0000_0000_0000_0101 Mask::32
3.288 :W [RS485] SpotAddr 0x5!
3.290 :W [RS485] MuteAddr 0x5
3.292 :I [RS485] 125: IsAnyBodyWith x001:3
3.294 :N [RS485] NoMask x001:3!
3.296 :I [RS485] 126: IsAnyBodyWith x0:1
3.298 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0:1
3.300 :I [RS485] 127: IsAnyBodyWith x10:2
3.302 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x10:2
3.304 :I [RS485] 128: IsAnyBodyWith x110:3
3.306 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x110:3
3.308 :I [RS485] 129: IsAnyBodyWith x1110:4
3.310 :N [RS485] NoMask x1110:4!
3.312 :I [RS485] 130: IsAnyBodyWith x0110:4
3.314 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0110:4
3.316 :I [RS485] 131: IsAnyBodyWith x10110:5
3.318 :N [RS485] NoMask x10110:5!
3.320 :I [RS485] 132: IsAnyBodyWith x00110:5
3.322 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00110:5
3.324 :I [RS485] 133: IsAnyBodyWith x100110:6
3.326 :N [RS485] NoMask x100110:6!
3.328 :I [RS485] 134: IsAnyBodyWith x000110:6
3.330 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000110:6
3.332 :I [RS485] 135: IsAnyBodyWith x1000110:7
3.334 :N [RS485] NoMask x1000110:7!
3.336 :I [RS485] 136: IsAnyBodyWith x0000110:7
3.338 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000110:7
3.340 :I [RS485] 137: IsAnyBodyWith x10000110:8
3.342 :N [RS485] NoMask x10000110:8!
3.344 :I [RS485] 138: IsAnyBodyWith x00000110:8
3.346 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000110:8
3.348 :I [RS485] 139: IsAnyBodyWith x100000110:9
3.350 :N [RS485] NoMask x100000110:9!
3.352 :I [RS485] 140: IsAnyBodyWith x000000110:9
3.354 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000110:9
3.356 :I [RS485] 141: IsAnyBodyWith x1000000110:10
3.358 :N [RS485] NoMask x1000000110:10!
3.360 :I [RS485] 142: IsAnyBodyWith x0000000110:10
3.362 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000110:10
3.364 :I [RS485] 143: IsAnyBodyWith x10000000110:11
3.366 :N [RS485] NoMask x10000000110:11!
3.368 :I [RS485] 144: IsAnyBodyWith x00000000110:11
3.370 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000000110:11
3.372 :I [RS485] 145: IsAnyBodyWith x100000000110:12
3.374 :N [RS485] NoMask x100000000110:12!
3.376 :I [RS485] 146: IsAnyBodyWith x000000000110:12
3.378 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000000110:12
3.380 :I [RS485] 147: IsAnyBodyWith x1000000000110:13
3.382 :N [RS485] NoMask x1000000000110:13!
3.384 :I [RS485] 148: IsAnyBodyWith x0000000000110:13
3.386 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000000110:13
3.388 :I [RS485] 149: IsAnyBodyWith x10000000000110:14
3.390 :N [RS485] NoMask x10000000000110:14!
3.392 :I [RS485] 150: IsAnyBodyWith x00000000000110:14
3.394 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000000000110:14
3.396 :I [RS485] 151: IsAnyBodyWith x100000000000110:15
3.398 :N [RS485] NoMask x100000000000110:15!
3.400 :I [RS485] 152: IsAnyBodyWith x000000000000110:15
3.402 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000000000110:15
3.404 :I [RS485] 153: IsAnyBodyWith x1000000000000110:16
3.406 :N [RS485] NoMask x1000000000000110:16!
3.408 :I [RS485] 154: IsAnyBodyWith x0000000000000110:16
3.410 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000000000110:16
3.412 :I [RS485] 155: IsAnyBodyWith x10000000000000110:17
3.414 :N [RS485] NoMask x10000000000000110:17!
3.416 :I [RS485] 156: IsAnyBodyWith x00000000000000110:17
3.418 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000000000000110:17
3.420 :I [RS485] 157: IsAnyBodyWith x100000000000000110:18
3.422 :N [RS485] NoMask x100000000000000110:18!
3.424 :I [RS485] 158: IsAnyBodyWith x000000000000000110:18
3.426 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000000000000110:18
3.428 :I [RS485] 159: IsAnyBodyWith x1000000000000000110:19
3.430 :N [RS485] NoMask x1000000000000000110:19!
3.432 :I [RS485] 160: IsAnyBodyWith x0000000000000000110:19
3.434 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000000000000110:19
3.436 :I [RS485] 161: IsAnyBodyWith x10000000000000000110:20
3.438 :N [RS485] NoMask x10000000000000000110:20!
3.440 :I [RS485] 162: IsAnyBodyWith x00000000000000000110:20
3.442 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000000000000000110:20
3.444 :I [RS485] 163: IsAnyBodyWith x100000000000000000110:21
3.446 :N [RS485] NoMask x100000000000000000110:21!
3.448 :I [RS485] 164: IsAnyBodyWith x000000000000000000110:21
3.450 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000000000000000110:21
3.452 :I [RS485] 165: IsAnyBodyWith x1000000000000000000110:22
3.454 :N [RS485] NoMask x1000000000000000000110:22!
3.456 :I [RS485] 166: IsAnyBodyWith x0000000000000000000110:22
3.458 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000000000000000110:22
3.460 :I [RS485] 167: IsAnyBodyWith x10000000000000000000110:23
3.462 :N [RS485] NoMask x10000000000000000000110:23!
3.464 :I [RS485] 168: IsAnyBodyWith x00000000000000000000110:23
3.466 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000000000000000000110:23
3.468 :I [RS485] 169: IsAnyBodyWith x100000000000000000000110:24
3.470 :N [RS485] NoMask x100000000000000000000110:24!
3.472 :I [RS485] 170: IsAnyBodyWith x000000000000000000000110:24
3.474 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000000000000000000110:24
3.476 :I [RS485] 171: IsAnyBodyWith x1000000000000000000000110:25
3.478 :N [RS485] NoMask x1000000000000000000000110:25!
3.480 :I [RS485] 172: IsAnyBodyWith x0000000000000000000000110:25
3.482 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000000000000000000110:25
3.484 :I [RS485] 173: IsAnyBodyWith x10000000000000000000000110:26
3.486 :N [RS485] NoMask x10000000000000000000000110:26!
3.488 :I [RS485] 174: IsAnyBodyWith x00000000000000000000000110:26
3.490 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000000000000000000000110:26
3.492 :I [RS485] 175: IsAnyBodyWith x100000000000000000000000110:27
3.494 :N [RS485] NoMask x100000000000000000000000110:27!
3.496 :I [RS485] 176: IsAnyBodyWith x000000000000000000000000110:27
3.498 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000000000000000000000110:27
3.500 :I [RS485] 177: IsAnyBodyWith x1000000000000000000000000110:28
3.502 :N [RS485] NoMask x1000000000000000000000000110:28!
3.504 :I [RS485] 178: IsAnyBodyWith x0000000000000000000000000110:28
3.506 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000000000000000000000110:28
3.508 :I [RS485] 179: IsAnyBodyWith x10000000000000000000000000110:29
3.510 :N [RS485] NoMask x10000000000000000000000000110:29!
3.512 :I [RS485] 180: IsAnyBodyWith x00000000000000000000000000110:29
3.514 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x00000000000000000000000000110:29
3.516 :I [RS485] 181: IsAnyBodyWith x100000000000000000000000000110:30
3.518 :N [RS485] NoMask x100000000000000000000000000110:30!
3.520 :I [RS485] 182: IsAnyBodyWith x000000000000000000000000000110:30
3.522 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x000000000000000000000000000110:30
3.524 :I [RS485] 183: IsAnyBodyWith x1000000000000000000000000000110:31
3.526 :N [RS485] NoMask x1000000000000000000000000000110:31!
3.528 :I [RS485] 184: IsAnyBodyWith x0000000000000000000000000000110:31
3.530 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask:x0000000000000000000000000000110:31
3.532 :I [RS485] 185: IsAnyBodyWith :32
3.534 :N [RS485] NoMask :32!
3.536 :I [RS485] 186: IsAnyBodyWith :32
3.538 :W [RS485] ACK Addr 0x6=0000_0000_0000_0000_0000_0000_0000_0110 Mask::32
3.540 :W [RS485] SpotAddr 0x6!
3.542 :W [RS485] MuteAddr 0x6
3.544 :I [RS485] 187: IsAnyBodyWith x010:3
3.546 :N [RS485] NoMask x010:3!
3.548 :I [RS485] 188: IsAnyBodyWith x00:2
3.550 :N [RS485] NoMask x00:2!
—>

Плюсы этого метода

1++Алгоритм сканирования RS485 простой. Его может реализовать даже программист-микроконтроллеров с экстремально низкой квалификацией.

3++Быстрота работы в сравнении с перебором всех адресов.

4++Нет нужды в дополнительных проводах. Всё что надо это одна витая пара интерфейса RS485.

Минусы

1—Master устройство должно быть микроконтроллером с полноценным драйвером GPIO и UART. Не получится просто взять первый попавшийся китайский переходник USB-RS485, подключить его к PC и написать консольное Windows приложение, которое выполнит сканирование RS485 шины. Надо чтобы была не просто возможность читать\писать байты в RS485, но и переключать функции пинов с GPIO на UART и обратно. Причем надо переключать функции пинов быстро чтобы успеть принять сигналы от Slave nodes.

2—Нужна программная поддержка этого простенького протокола сканирования RS485 как на стороне master так и на стороне slave устройств.

3—Если Ваш мастер RS485 это embedded Linux SoC то очень трудно сделать в run-time переключение пина из UART_RX в GPIO-in. Как правило, low level API в Linux такого не позволяет, так как Linux — это не RTOS. Linux может вообще после отправки маски начать 20 мин обновлять антивирус. Однако, на самом деле не обязательно переключать функции GPIO c UART на GPIO. Если у Slave(ва) адрес совпал с маской, то он может прижать шину просто отправив несколько раз 0x00. Мастер в RS485 увидит это как принятие пакета с неправильной контрольной суммой или UART периферия выдаст прерывание по over-run и так мастер поймет, что поступил ACK сигнал. Нам главное хоть какой-то отклик на маску, будь до нулевой байт, либо оver-run прерывание.

Вывод

Теперь и вы умеете сканировать шину RS485 и можете учить других. Этот простой алгоритм сканирования адресов на общей шине подойдет не только для RS485. Его можно реализовать для любого другого интерфейса с топологией «общая шина». Это может быть интерфейс 1-wire, LIN или даже вовсе беспроводные интерфейсы типа GFSK, LoRa или UWB.

Словарь

Форум АСУТП

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Диагностика сети RS-485

Сообщение igor22 » 22 сен 2015, 13:06

Здравствуйте!
Уважаемые профессионалы, подскажите новичку.
Проложена сеть RS-485 (600-800м приблизительно). Протокол ModBus RTU. Преобразователь USB/RS-485. Скорость 9600. На концах линии стоят терминаторы 120 Ом. Есть скрученные разрывы витой пары, штук 5-6.
В сети 14 приборов, идет опрос половины приборов, по остальным ошибка таймаута и недостоверность данных при использовании встроенного ОРС сервера в SCADA (обновление происходит раз в 2 минуты).
При использовании OPC сервера все контроллеры опрашиваются нормально, однако эти данные могут браться из какого-нибудь буфера ОРС и так же могут быть недостоверны.

С чего начать диагностику сети и как можно определить помеха это или плохое согласование, OPC сервер или что-то еще?

igor22

почётный участник форума

Ryzhij почётный участник форума
Сообщения: 5581 Зарегистрирован: 07 окт 2011, 09:12 Имя: Гаско Вячеслав Эриевич Страна: Россия город/регион: Рязань Благодарил (а): 533 раза Поблагодарили: 698 раз

Re: Диагностика сети RS-485

Сообщение Ryzhij » 22 сен 2015, 13:28

Начните с кабеля.
Убедитесь в том, что используемый Вами кабель соответствует спецификации RS485.
Измерьте сопротивление линии. Возьмите калькулятор, проверьте расчётами замеры и убедитесь с качестве сросток и кабеля.
Не забудьте проверить сопротивление изоляции и замыкания на «землю».
Проверьте качество заземления и выравнивания потенциалов, особенно если у Вас нет гальванической развязки на портах каких-либо устройств.
Возьмите комп с установленной программой МодбасПул и с помощью неё опросите все устройства. Если «молчуны» собрались где-то на одном сегменте кабеля, то возможно произошла переполюсовка.
Рассогласование видно осциллографом по дроблению фронтов импульсов.
Удачи!

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

Ryzhij

Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 22 сен 2015, 13:42

1. Кабель использую UTP Cat5, не экранированный.
2. Сопротивление линии я измерю, а вот на счет расчетов поподробнее можете написать что вычислить и что проверить?
3. Выравнивания потенциалов в сети нет, так как использую преобразователи TTL\ RS-485 для каждого отдельного устройства где отсутствует клемма GND и в руководстве на эти приборы по поводу организации сети сказано:
• Не заземляйте экран.
• Не подключайте разъем “Gnd (ground)”.(имеется ввиду к разъему прибора)
4. Не совсем понял про дробление импульсов. Как именно видно рассогласование?

igor22

осмотрелся

Alex question осмотрелся
Сообщения: 144 Зарегистрирован: 20 янв 2015, 10:13 Имя: Алексей Страна: Россия Поблагодарили: 10 раз

Re: Диагностика сети RS-485

Сообщение Alex question » 22 сен 2015, 14:26

Мне кажется что для модбаса данный кабель не совсем подходит, т.к. нужен кабель с волновым сопротивлением 120 ом (и терминатор соответствующий равный волновому сопротивлению линии), а у вас 100 омный. Но если половина устройств на линии отвечает значит по параметрам влазит более или менее.

Дробление импульсов это значит что у вас передний фронт будет не близким к идеальным, а с шумами типа. Сложно словами объяснить. Короче на переднем фронте видно будет расколбас сигнала.

А вообще я бы временно отключил от линии те устройства что отвечают на начал бы оставшиеся по одному опрашивать. Сел бы на линию какой нить моксой и смотрел есть ли запрос и что идет в ответ. и пытался бы добиться работоспособности по очереди для каждой железки.

Alex question

почётный участник форума

rwg почётный участник форума
Сообщения: 1030 Зарегистрирован: 29 апр 2014, 09:57 Имя: Рыбкин Владимир Геннадьевич Страна: Россия город/регион: Тверь Благодарил (а): 53 раза Поблагодарили: 125 раз

Re: Диагностика сети RS-485

Сообщение rwg » 22 сен 2015, 14:28

Случайно нет чередования, когда нечётные отвечают, а чётные нет? Если есть, то это не настроен таймаут между получением ответа и следующим запросом, slave не успевают подготовиться к приёму запроса.

почётный участник форума

Ryzhij почётный участник форума
Сообщения: 5581 Зарегистрирован: 07 окт 2011, 09:12 Имя: Гаско Вячеслав Эриевич Страна: Россия город/регион: Рязань Благодарил (а): 533 раза Поблагодарили: 698 раз

Re: Диагностика сети RS-485

Сообщение Ryzhij » 22 сен 2015, 14:32

Ну-у-у, началось.
У кабеля UTP Cat5 волновое сопротивление не 120, а 100 Ом. И если уж Вы решили его «приколхозить», то и нагрузочные резисторы ставьте на концах такие же — по 100 Ом.

Расчёт должен подтвердить исправность линии или указать на места плохого контакта. Берёте справочник и по марке кабеля смотрите погонное сопротивление жилы. Можете прикинуть сами по сечению и материалу (медь).

Про экран я ничего не говорил. Я говорил про опасность паразитных токов уравнивания потенциалов по сигнальному кабелю.
Короче, убедитесь, что между кабелем шины и отключенным от него портом устройства нет потенциала более 3 VAC. Все остальные устройства шины должны быть при этом подключены к шине.

Фронты и спады импульса представляете? Так вот, если увидите, что один импульс раскрошился на несколько — согласования нет.

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

Ryzhij

почётный участник форума

rwg почётный участник форума
Сообщения: 1030 Зарегистрирован: 29 апр 2014, 09:57 Имя: Рыбкин Владимир Геннадьевич Страна: Россия город/регион: Тверь Благодарил (а): 53 раза Поблагодарили: 125 раз

Re: Диагностика сети RS-485

Сообщение rwg » 22 сен 2015, 15:23

https://ru.wikipedia.org/wiki/RS-485 :
На практике номинал терминатора может выбираться и бóльшего номинала, чем волновое сопротивление кабеля, поскольку омическое сопротивление того же кабеля может оказаться настолько велико, что амплитуда сигнала на приёмной стороне окажется слишком мала для устойчивого приёма. В этом случае ищут компромисс между резонансными и амплитудными искажениями сигнала, уменьшая скорость интерфейса и увеличивая номинал терминатора. На скоростях 9600 бит/с и ниже волновые, резонансные явления в масштабах, способных ухудшить качество связи, не проявляются, и вопроса согласовании линии не возникает. Даже более того, при низких скоростях передачи (менее 9600 бит/с) терминальный резистор не улучшает, а ухудшает надежность передачи.

почётный участник форума

Ryzhij почётный участник форума
Сообщения: 5581 Зарегистрирован: 07 окт 2011, 09:12 Имя: Гаско Вячеслав Эриевич Страна: Россия город/регион: Рязань Благодарил (а): 533 раза Поблагодарили: 698 раз

Re: Диагностика сети RS-485

Сообщение Ryzhij » 22 сен 2015, 15:50

Не надо путать импеданс, омическое и волновое сопротивление линии, хорошо?
В статье на википедии исхитряются оперировать с разными по физической природе величинами.

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

Ryzhij

Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 23 сен 2015, 04:54

rwg писал(а): Случайно нет чередования, когда нечётные отвечают, а чётные нет? Если есть, то это не настроен таймаут между получением ответа и следующим запросом, slave не успевают подготовиться к приёму запроса.

Кстати, как раз чередование некое я наблюдаю, приборы опрашиваются через один не четко конечно , но практически через один — два.

igor22

Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 23 сен 2015, 08:24

Вообщем на данный момент проделал следующие действия:
1.Отключил устройство от порта RS-485. Измерил напряжение, показания довольно непонятные, показывает то 0 то 1, вообщем решил что это меньше 3 VAC и успокоился на этом.
2.Отключил все устройства которые благополучно отвечали мне по ModBus и оставил ту половину, которая плохо опрашивалась. Опрос прошел удачно, все «капризные» приборы нормально отвечали на запросы, переменные имели признак достоверности.
3.Сопротивление кабеля мереть не стал, т.к. длину общей сети точно не знаю, могу только догадываться, плюс минус 200 метров.

Когда все приборы на линии, опрашиваются они через одного.
Если имеет место ошибка по таймауту, то :
Увеличивал таймаут ответа slave устройства, но это ничего не дало. Обмен происходил в том же духе, только медленнее.

igor22

Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 23 сен 2015, 08:27

PS:
1. Напряжение мерил между линией RS-485 и отключенным портом RS-485.

igor22

почётный участник форума

Ryzhij почётный участник форума
Сообщения: 5581 Зарегистрирован: 07 окт 2011, 09:12 Имя: Гаско Вячеслав Эриевич Страна: Россия город/регион: Рязань Благодарил (а): 533 раза Поблагодарили: 698 раз

Re: Диагностика сети RS-485

Сообщение Ryzhij » 23 сен 2015, 08:37

igor22 писал(а): Если имеет место ошибка по таймауту, то :
Увеличивал таймаут ответа slave устройства, но это ничего не дало. Обмен происходил в том же духе, только медленнее.

Тут надо по-играться с таймаутом мастера.
Мастер за слэйвами успевает, а вот слейвы за ним, возможно, нет.

—————————————————
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
«Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить.» (святитель Николай Сербский)

Ryzhij

Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 23 сен 2015, 10:00

Какой бы таймаут я не ставил, все равно не получается добиться нормально стабильности ответов.
Может дело не только в таймауте?

igor22

почётный участник форума

rwg почётный участник форума
Сообщения: 1030 Зарегистрирован: 29 апр 2014, 09:57 Имя: Рыбкин Владимир Геннадьевич Страна: Россия город/регион: Тверь Благодарил (а): 53 раза Поблагодарили: 125 раз

Re: Диагностика сети RS-485

Сообщение rwg » 23 сен 2015, 10:28

igor22 писал(а): Увеличивал таймаут ответа slave устройства, но это ничего не дало. Обмен происходил в том же духе, только медленнее.

Нужно увеличить таймаут между запросами мастера. Когда однажды не нашёл такой настройки, вставил через один запросы к несуществующим slave. Все существующие начали отвечать без сбоев.

частый гость

VaBo частый гость
Сообщения: 440 Зарегистрирован: 21 июл 2013, 19:32 Имя: Вадим город/регион: Северодвинск Благодарил (а): 12 раз Поблагодарили: 38 раз

Re: Диагностика сети RS-485

Сообщение VaBo » 23 сен 2015, 10:29

igor22 писал(а): Какой бы таймаут я не ставил, все равно не получается добиться нормально стабильности ответов.
Может дело не только в таймауте?

Дулирования адресов-то точно нет?
И еще, вы используете CAT-5E. Пару раз сталкивался с тем, что подобные кабели изготовлены из железа с омедненными жилами. Погонное сопротивление у такого кабеля раза в три выше, чем у медного. При вашей длине может сильно повлиять.

VaBo

Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 23 сен 2015, 11:00

VaBo писал(а): Дублирования адресов-то точно нет?
Нет, адреса нигде не дублируются.

rwg писал(а): Нужно увеличить таймаут между запросами мастера. Когда однажды не нашёл такой настройки, вставил через один запросы к несуществующим slave. Все существующие начали отвечать без сбоев.

В настройках порта есть параметр «Tаймаут». Но это я так понимаю время ожидания ответа от slave. Еще есть такие настройки:
-Задержка (в мс) между тарнзакциями.
-Задержка (в мс) начала передачи данных после включения передатчика.

Какая из этих них увеличивает таймаут м\у запросами?

igor22

почётный участник форума

rwg почётный участник форума
Сообщения: 1030 Зарегистрирован: 29 апр 2014, 09:57 Имя: Рыбкин Владимир Геннадьевич Страна: Россия город/регион: Тверь Благодарил (а): 53 раза Поблагодарили: 125 раз

Re: Диагностика сети RS-485

Сообщение rwg » 23 сен 2015, 11:11

Похоже «Задержка (в мс) между транзакциями».
Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 23 сен 2015, 11:17

rwg писал(а): Похоже «Задержка (в мс) между транзакциями».
И какой ее установить?

igor22

почётный участник форума

rwg почётный участник форума
Сообщения: 1030 Зарегистрирован: 29 апр 2014, 09:57 Имя: Рыбкин Владимир Геннадьевич Страна: Россия город/регион: Тверь Благодарил (а): 53 раза Поблагодарили: 125 раз

Re: Диагностика сети RS-485

Сообщение rwg » 23 сен 2015, 11:47

igor22 писал(а): И какой ее установить?

Для устройств, соответствующих стандарту Modbus, 3 мсек, для ТРМов Овена может хватить 5 -10 мсек, для неизвестно каких может не хватить и 100 мсек.

Автор темы

здесь недавно

igor22 здесь недавно
Сообщения: 85 Зарегистрирован: 05 июн 2015, 12:15 Имя: Murzin Страна: Россия город/регион: Алтайский край

Re: Диагностика сети RS-485

Сообщение igor22 » 23 сен 2015, 12:38

Установил следующие настройки:
Таймаут ответа 600 мс
Задержка между транзакциями 9мс
Пака полет нормальный, какой и нужен был.
Нашел в интернете такую статейку для диагностики сети RS-485, там сказано:

В большинстве сетей RS-485 заглушка (согласование волнового сопротивления линии передачи сигналов) создает больше проблем, чем решает. Чтобы проверить, заглушен ли узел, нужно отключить его от сети и обесточить. Далее, с помощью омметра измерить сопротивление между линиями A и B (или + и -) приемника. На заглушенной линии сопротивление обычно менее 200 Ом, в то время как на незаглушенной – более 4000 Ом.

Как я понимаю «Узел» в данной статье это некий прибор. Для проверки согласования нужно этот узел отключить от сети 485 и обесточить.
Задам вопрос дурацкий, прошу не кидаться камнями: «отключить его от сети и обесточить»
Имеется ввиду обесточить — отключить от питания, отключить от сети — отключить от линии RS485, верно?
Тогда зачем обесточивать если мы итак отключаем от сети измеряем сопротивление м\у А и В ?

Статьи и обзоры систем автоматизации и безопасности

Как следует из названия, статья эта — попытка объяснить начинающим что к чему и помочь обойти грабли, на которые уже кто-то наступал. Если кто-нибудь, потратив 15 минут на прочтение, сэкономит пару дней на отладке системы, я буду считать свою задачу выполненной.

Столкнувшись с необходимостью организовать связь между несколькими устройствами на базе микроконтроллеров, я стал собирать информацию по этой теме. Из конструктивных соображений определился с методом связи — последовательный канал и линия связи на основе интерфейса RS-485. Затем последовал отсев излишних теоретических рассуждений и отбор практических рекомендаций по наладке линии связи. Особое внимание я уделял описанию различных «подводных камней». На бумаге, как известно, всегда все работает, а вот на практике вскрываются неприятные особенности, притом нигде не описанные. Так и оказалось — сделали все по инструкции, а потом не одну неделю отлавливали глюки.

В этой статье я попытался собрать начальную информацию об устройствах, полезные добытые сведения (с ссылками) и собственный опыт.

1. Универсальный асинхронный приемопередатчик (UART)

Возможно, связь через асинхронный последовательный порт уходит в прошлое, однако сложно найти контроллер, не имеющего в составе своей периферии UART. Поэтому хоронить его, думаю, рановато. Раз так, то будет нелишним сказать пару слов о том, как оно работает. Описание конкретной реализации последовательного порта есть в datasheet на каждый контроллер, поэтому опишу общее для всех.

UART можно разделить на приемник (Receiver) и передатчик (Transmitter). В состав UART входят: тактовый генератор связи (бодрейт-генератор), управляющие регистры, статусные регистры, буферы и сдвиговые регистры приемника и передатчика. Бодрейт-генератор задает тактовую частоту приемопередатчика для данной скорости связи. Управляющие регистры задают режим работы последовательного порта и его прерываний. В статусном регистре устанавливаются флаги по различным событиям. В буфер приемника попадает принятый символ, в буфер передатчика помещают передаваемый. Сдвиговый регистр передатчика — это обойма, из которой в последовательный порт выстреливаются биты передаваемого символа (кадра). Сдвиговый регистр приемника по биту накапливает принимаемые из порта биты. По различным событиям устанавливаются флаги и генерируются прерывания (завершение приема/отправки кадра, освобождение буфера, различные ошибки).

UART — полнодуплексный интерфейс, то есть приемник и передатчик могут работать одновременно, независимо друг от друга. За каждым из них закреплен порт — одна ножка контроллера. Порт приемника обозначают RX, передатчика — TX. Последовательной установкой уровней на этих портах относительно общего провода («земли») и передается информация. По умолчанию передатчик устанавливает на линии единичный уровень. Передача начинается посылкой бита с нулевым уровнем (старт-бита), затем идут биты данных младшим битом вперед (низкий уровень — «0», высокий уровень — «1»), завершается посылка передачей одного или двух битов с единичным уровнем (стоп-битов).

Электрический сигнал кадра посылки выглядит так:

Перед началом связи между двумя устройствами необходимо настроить их приемопередатчики на одинаковую скорость связи и формат кадра.

Скорость связи или бодрейт (baudrate) измеряется в бодах — число передаваемых бит в секунду (включая старт и стоп-биты). Задается эта скорость в бодрейт-генераторе делением системной частоты на задаваемый коэффициент. Типичный диапазон скоростей: 2400 … 115200 бод.

Формат кадра определяет число стоп-битов (1 или 2), число бит данных (8 или 9), а также назначение девятого бита данных. Все это зависит от типа контроллера.

Приемник и передатчик тактируются, как правило, с 16-кратной частотой относительно бодрейта. Это нужно для смплирования сигнала. Приемник, поймав падающий фронт старт-бита, отсчитывает несколько тактов и следующие три такта считывает (семплирует) порт RX. Это как раз середина старт-бита. Если большинство значений семплов — «0», старт-бит считается состоявшимся, иначе приемник принимает его за шум и ждет следующего падающего фронта. После удачного определения старт-бита, приемник точно также семплирует серединки битов данных и по большинству семплов считает бит «0» или «1», записывая их в сдвиговый регистр. Стоп-биты тоже семплируются, и если уровень стоп-бита не «1» — UART определяет ошибку кадра и устанавливает соответствующий флаг в управляющем регистре.

Поскольку бодрейт устанавливается делением системной частоты, при переносе программы на устройство с другим кварцевым резонатором, необходимо изменить соответствующие настройки UART.

2. Интерфейс RS-485

Интерфейс RS-485 (другое название — EIA/TIA-485) — один из наиболее распространенных стандартов физического уровня связи. Физический уровень — это канал связи и способ передачи сигнала (1 уровень модели взаимосвязи открытых систем OSI).

Сеть, построенная на интерфейсе RS-485, представляет собой приемопередатчики, соединенные при помощи витой пары — двух скрученных проводов. В основе интерфейса RS-485 лежит принцип дифференциальной (балансной) передачи данных. Суть его заключается в передаче одного сигнала по двум проводам. Причем по одному проводу (условно A) идет оригинальный сигнал, а по другому (условно B) — его инверсная копия. Другими словами, если на одном проводе «1», то на другом «0» и наоборот. Таким образом, между двумя проводами витой пары всегда есть разность потенциалов: при «1» она положительна, при «0» — отрицательна.

Именно этой разностью потенциалов и передается сигнал. Такой способ передачи обеспечивает высокую устойчивость к синфазной помехе. Синфазной называют помеху, действующую на оба провода линии одинаково. К примеру, электромагнитная волна, проходя через участок линии связи, наводит в обоих проводах потенциал. Если сигнал передается потенциалом в одном проводе относительно общего, как в RS-232, то наводка на этот провод может исказить сигнал относительно хорошо поглощающего наводки общего («земли»). Кроме того, на сопротивлении длинного общего провода будет падать разность потенциалов земель — дополнительный источник искажений. А при дифференциальной передаче искажения не происходит. В самом деле, если два провода пролегают близко друг к другу, да еще перевиты, то наводка на оба провода одинакова. Потенциал в обоих одинаково нагруженных проводах изменяется одинаково, при этом информативная разность потенциалов остается без изменений.

Аппаратная реализация интерфейса — микросхемы приемопередатчиков с дифференциальными входами/выходами (к линии) и цифровыми портами (к портам UART контроллера). Существуют два варианта такого интерфейса: RS-422 и RS-485.

RS-422 — полнодуплексный интерфейс. Прием и передача идут по двум отдельным парам проводов. На каждой паре проводов может быть только по одному передатчику.

RS-485 — полудуплексный интерфейс. Прием и передача идут по одной паре проводов с разделением по времени. В сети может быть много передатчиков, так как они могут отключаются в режиме приема.

  • D (driver) — передатчик;
  • R (receiver) — приемник;
  • DI (driver input) — цифровой вход передатчика;
  • RO (receiver output) — цифровой выход приемника;
  • DE (driver enable) — разрешение работы передатчика;
  • RE (receiver enable) — разрешение работы приемника;
  • A — прямой дифференциальный вход/выход;
  • B — инверсный дифференциальный вход/выход;
  • Y — прямой дифференциальный выход (RS-422);
  • Z — инверсный дифференциальный выход (RS-422).

Остановлюсь поподробнее на приемопередатчике RS-485. Цифровой выход приемника (RO) подключается к порту приемника UART (RX). Цифровой вход передатчика (DI) к порту передатчика UART (TX). Поскольку на дифференциальной стороне приемник и передатчик соединены, то во время приема нужно отключать передатчик, а во время передачи — приемник. Для этого служат управляющие входы — разрешение приемника (RE) и разрешения передатчика (DE). Так как вход RE инверсный, то его можно соединить с DE и переключать приемник и передатчик одним сигналом с любого порта контроллера. При уровне «0» — работа на прием, при «1» — на передачу.

Приемник, получая на дифференциальных входах (AB) разность потенциалов (UAB) переводит их в цифровой сигнал на выходе RO. Чувствительность приемника может быть разной, но гарантированный пороговый диапазон распознавания сигнала производители микросхем приемопередатчиков пишут в документации. Обычно эти пороги составляют ± 200 мВ. То есть, когда UAB > +200 мВ — приемник определяет «1», когда UAB < -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Все устройства подключаются к одной витой паре одинаково: прямые выходы (A) к одному проводу, инверсные (B) — к другому.

Входное сопротивление приемника со стороны линии (RAB) обычно составляет 12 КОм. Так как мощность передатчика не беспредельна, это создает ограничение на количество приемников, подключенных к линии. Согласно спецификации RS-485 c учетом согласующих резисторов передатчик может вести до 32 приемников. Однако есть ряд микросхем с повышенным входным сопротивлением, что позволяет подключить к линии значительно больше 32 устройств.

Максимальная скорость связи по спецификации RS-485 может достигать 10 Мбит/сек. Максимальное расстояние — 1200 м. Если необходимо организовать связь на расстоянии большем 1200 м или подключить больше устройств, чем допускает нагрузочная способность передатчика — применяют специальные повторители (репитеры).Стандартные параметры интерфейсов RS-422 RS-485:

Допустимое число передатчиков / приемников

Максимальная длина кабеля

Максимальная скорость связи

Диапазон напряжений «1» передатчика

Диапазон напряжений «0» передатчика

Диапазон синфазного напряжения передатчика

Допустимый диапазон напряжений приемника

Пороговый диапазон чувствительности приемника

Максимальный ток короткого замыкания драйвера

Допустимое сопротивление нагрузки передатчика

Входное сопротивление приемника

Максимальное время нарастания сигнала передатчика

3. Согласование и конфигурация линии связи

При больших расстояниях между устройствами, связанными по витой паре и высоких скоростях передачи начинают проявляться так называемые эффекты длинных линий. Причина этому — конечность скорости распространения электромагнитных волн в проводниках. Скорость эта существенно меньше скорости света в вакууме и составляет немногим больше 200 мм/нс. Электрический сигнал имеет также свойство отражаться от открытых концов линии передачи и ее ответвлений. Грубая аналогия — желоб, наполненный водой. Волна, созданная в одном конце, идет по желобу и, отразившись от стенки в конце, идет обратно, отражается опять и так далее, пока не затухнет. Для коротких линий и малых скоростей передачи этот процесс происходит так быстро, что остается незамеченным. Однако, время реакции приемников — десятки/сотни нс. В таком масштабе времени несколько десятков метров электрический сигнал проходит отнюдь не мгновенно. И если расстояние достаточно большое, фронт сигнала, отразившийся в конце линии и вернувшийся обратно, может исказить текущий или следующий сигнал. В таких случаях нужно каким-то образом подавлять эффект отражения.

Наука Электротехника предлагает решение этой проблемы. У любой линии связи есть такой параметр, как волновое сопротивление Zв. Оно зависит от характеристик используемого кабеля, но не от длины. Для обычно применяемых в линиях связи витых пар Zв=120 Ом. Оказывается, что если на удаленном конце линии, между проводниками витой пары включить резистор с номиналом равным волновому сопротивлению линии, то электромагнитная волна дошедшая до «тупика» поглощается на таком резисторе. Отсюда его названия — согласующий резистор или «терминатор».

Большой минус согласования на резисторах — повышенное потребление тока от передатчика, ведь в линию включается низкоомная нагрузка. Поэтому рекомендуется включать передатчик только на время отправки посылки. Есть способы уменьшить потребление тока, включая последовательно с согласующим резистором конденсатор для развязки по постоянному току. Однако, такой способ имеет свои недостатки. Для коротких линий (несколько десятков метров) и низких скоростей (меньше 38400 бод) согласование можно вообще не делать. Подробнее можно почитать в статье «Обрежьте жирок с RS-485».

Эффект отражения и необходимость правильного согласования накладывают ограничения на конфигурацию линии связи.

Линия связи должна представлять собой один кабель витой пары. К этому кабелю присоединяются все приемники и передатчики. Расстояние от линии до микросхем интерфейса RS-485 должно быть как можно короче, так как длинные ответвления вносят рассогласование и вызывают отражения.

В оба наиболее удаленных конца кабеля (Zв=120 Ом) включают согласующие резисторы Rt по 120 Ом (0.25 Вт). Если в системе только один передатчик и он находится в конце линии, то достаточно одного согласующего резистора на противоположном конце линии.

4. Защитное смещение

Как уже упоминалось, приемники большинства микросхем RS-485 имеют пороговый диапазон распознавания сигнала на входах A-B — ±200мВ. Если |Uab| меньше порогового (около 0), то на выходе приемника RO могут быть произвольные логические уровни из-за несинфазной помехи. Такое может случиться либо при отсоединении приемника от линии, либо при отсутствии в линии активных передатчиков, когда никто не задает уровень. Чтобы в этих ситуациях избежать выдачи ошибочных сигналов на приемник UART, необходимо на входах A-B гарантировать разность потенциалов Uab > +200мВ. Это смещение при отсутствии входных сигналов обеспечивает на выходе приемника логическую «1», поддерживая, таким образом, уровень стопового бита.

Добиться этого просто — прямой вход (А) следует подтянуть к питанию, а инверсный (B) — к «земле». Получается делитель:

Rвх — входное сопротивление приемника (обычно 12 кОм);

Rc — согласующие резисторы (120 Ом);

Rзс — резисторы защитного смещения.

Величины сопротивлений для резисторов защитного смещения (Rзс) нетрудно рассчитать по делителю. Необходимо обеспечить Uab > 200мВ. Напряжение питания — 5В. Сопротивление среднего плеча — 120Ом//120Ом//12КОм на каждый приемник — примерно 57 Ом (для 10 приемников). Таким образом, выходит примерно по 650 Ом на каждый из двух Rзс. Для смещения с запасом — сопротивление Rзс должно быть меньше 650 Ом. Традиционно ставят 560 Ом.

Обратите внимание: в расчете номинала Rзс учитывается нагрузка. Если на линии висит много приемников, то номинал Rзс должен быть меньше. В длинных линиях передачи необходимо так же учитывать сопротивление витой пары, которое может «съедать» часть смещающей разности потенциалов для удаленных от места подтяжки устройств. Для длинной линии лучше ставить два комплекта подтягивающих резисторов в оба удаленных конца рядом с терминаторами.

Многие производители приемопередатчиков заявляют о функции безотказности (failsafe) своих изделий, заключающейся во встроенном смещении. Следует различать два вида такой защиты:

Безотказность в открытых цепях. (Open circuit failsafe.) В таких приемопередатчиках применяются встроенные подтягивающие резисторы. Эти резисторы, как правило, высокоомные, чтобы уменьшить потребление тока. Из-за этого необходимое смещение обеспечивается только для открытых (ненагруженных) дифференциальных входов. В самом деле, если приемник отключен от линии или она не нагружена, тогда в среднем плече делителя остается только большое входное сопротивление, на котором и падает необходимая разность потенциалов. Однако, если приемопередатчик нагрузить на линию с двумя согласующими резисторами по 120 Ом, то в среднем плече делителя оказывается меньше 60 Ом, на которых, по сравнению с высокоомными подтяжками, ничего существенного не падает. Поэтому, если в нагруженной линии нет активных передатчиков, то встроенные резисторы не обеспечивают достаточное смещение. В этом случае, остается необходимость устанавливать внешние резисторы защитного смещения, как это было описано выше.

Сразу виден минус внешнего защитного смещения — через делитель постоянно будет протекать ток, что может быть недопустимо в системах малого потребления. В таком случае можно сделать следующее:

а). Уменьшить потребление тока, увеличив сопротивления Rзс. Хотя производители приемопередатчиков и пишут о пороге распознавания в 200мВ, на практике вполне хватает 100мВ и даже меньше. Таким образом, можно сразу увеличить сопротивления Rзс раза в два-три. Помехозащищенность при этом несколько снижается, но во многих случаях это не критично.

б). Использовать true failsafe приемопередатчики со смещенными порогами распознавания. Например, у микросхем MAX3080 и MAX3471 пороги: -50мВ / -200мВ, что гарантирует единичный уровень на выходе приемника при отсутствии смещения (Uab=0). Тогда внешние резисторы защитного смещения можно убрать или значительно увеличить их сопротивление.

в). Не применять без необходимости согласование на резисторах. Если линия не будет нагружена на 2 по 120 Ом, то для обеспечения защитного смещения хватит подтяжек в несколько килоом в зависимости от числа приемников на линии.

Для опторазвязанной линии подтягивать следует к питанию и «земле» изолированной линии. Если не применяется опторазвязка, подтягивать можно к любому питанию, так как делитель создаст лишь небольшую разность потенциалов между линиями A и B. Нужно только помнить о возможной разности потенциалов между «землями» устройств, расположенных далеко друг от друга.

5. Исключение приема при передаче в полудуплексном режиме

При работе с полудуплексным интерфейсом RS-485 (прием и передача по одной паре проводов с разделением по времени) можно забыть, что UART контроллера — полнодуплексный, то есть принимает и передает независимо и одновременно.

Обычно во время работы приемопередатчика RS-485 на передачу, выход приемника RO переводится в третье состояние и ножка RX контроллера (приемник UART) «повисает в воздухе». В результате, во время передачи на приемнике UART вместо уровня стопового бита («1») окажется неизвестно что, и любая помеха будет принята за входной сигнал. Поэтому нужно либо на время передачи отключать приемник UART (через управляющий регистр), либо подтягивать RX к единице. У некоторых микроконтроллеров это можно сделать программно — активировать встроенные подтяжки портов.

Примечание: у микроконтроллера AT90S8535 (AVR Atmel) есть глючок — при отключенном UART он все равно принимает, и после включения на прием первый принятый байт может быть испорчен. Так что активировать подтяжку RX ему нужно обязательно.

6. «Горячее» подключение к линии связи

Насколько я знаю, спецификацией RS-485 не предусмотрено «горячее» подключение — включение новых приемопередатчиков в линию связи во время работы системы. Тем не менее, подобную операцию система переносит практически безболезненно, если учесть один нюанс. Это важно, когда питание на устройство подается в момент подключения, например, когда плата в виде кассеты вставляется в разъем. Дело в том, что во время любого сброса: по включению питания, по сигналу на входе «Reset», по срабатыванию сторожевого таймера — контроллеру требуется время на инициализацию, которое может составлять до нескольких десятков миллисекунд. Пока контроллер находится в состоянии сброса, он принудительно настраивает все порты на вход. Получается ситуация, при которой питание на микросхему приемопередатчика RS-485 уже подано, но входы разрешения приемника /RE и передатчика DE «висят в воздухе». В результате, приемопередатчик может по помехе открыться на передачу и все время пока микроконтроллер в отключке пускать в работающую линию мусор. Избежать этого легко — достаточно через резистор в несколько килоом подтянуть вход разрешения приемника /RE к нулю. Этим приемопередатчик сразу по включении питания настраивается на прием и не лезет на линию.

7. Рекомендации по организации протокола связи

На физическом уровне линия связи готова к работе, однако, нужен еще и протокол — договоренность между устройствами системы о формате посылок.

По природе интерфейса RS-485 устройства не могут передавать одновременно — будет конфликт передатчиков. Следовательно, требуется распределить между устройствами право на передачу. Отсюда основное деление: централизованный (одномастерный) обмен и децентрализованный (многомастерный).

В централизованной сети одно устройство всегда ведущее (мастер). Оно генерирует запросы и команды остальным (ведомым) устройствам. Ведомые устройства могут передавать только по команде ведущего. Как правило, обмен между ведомыми идет только через ведущего, хотя для ускорения обмена можно организовать передачу данных от одного ведомого к другому по команде ведущего.

В децентрализованной сети роль ведущего может передаваться от устройству к устройству либо по некоторому алгоритму очередности, либо по команде текущего ведущего к следующему (передача маркера ведущего). При этом ведомое устройство может в своем ответе ведущему передать запрос на переход в режим ведущего и ожидать разрешения или запрета.

Последовательный канал по меркам контроллера — штука медленная. На скорости 9600 бод передача одного символа занимает больше миллисекунды. Поэтому, когда контроллер плотно загружен вычислениями и не должен их останавливать на время обмена по UART, нужно использовать прерывания по завершению приема и передачи символа. Можно выделить место в памяти для формирования посылки на передачу и сохранения принятой посылки (буфер посылки), а также указатели на позицию текущего символа. Прерывания по завершению приема или передачи символа вызывают соответствующие подпрограммы, которые передают или сохраняют очередной символ со сдвигом указателя и проверкой признака конца сообщения, после чего возвращают управление основной программе до следующего прерывания. По завершению отправки или приема всей посылки либо формируется пользовательский флаг, отрабатываемый в основном цикле программы, либо сразу вызывается подпрограмма обработки сообщения.

В общем случае посылка по последовательному каналу состоит из управляющих байтов (синхронизация посылки, адресов отправителя и получателя, контрольной суммы и пр.) и собственно байтов данных.

Протоколов существует множество и можно придумать еще больше, но лучше пользоваться наиболее употребительными из них. Одним из стандартных протоколов последовательной передачи является MODBUS, его поддержку обеспечивают многие производители промышленных контроллеров. Но если Вам нужно буквально «два байта переслать» или просто освоить методы связи и не хочется из-за этого изучать систему команд модбаса и писать для него драйвер, предлагаю варианты относительно простых протоколов. (И все-таки в дальнейшем стоит ориентироваться именно на MODBUS.)

Основная задача в организации протокола — заставить все устройства различать управляющие байты и байты данных. К примеру, ведомое устройство, получая по линии поток байтов, должно понимать, где начало посылки, где конец и кому она адресована.

1). Часто встречаются протоколы на основе ASCII-кода. Управляющие символы и данные передаются в виде обыкновенных ASCII символов. Посылка может выглядеть так:

В HEX виде: 3Ah 31h 32h 52h 53h 34h 38h 35h 0Dh

В ASCII виде: «:» «1» «2» «R» «S» «4» «8» «5» /ПС/

В начале управляющий символ начала посылки «:», следующие две цифры — адрес получателя (12), затем символы данных (RS485) и в конце — управляющий символ конца посылки 0Dh (перевод строки). Все устройства на линии, приняв символ «:», начинают записывать в память посылку до символа конца строки 0Dh. Затем сравнивают адрес из посылки со своим адресом. Устройство с совпавшим адресом обрабатывает данные посылки, остальные — игнорируют посылку. Данные могут содержать любые символы, кроме управляющих («:», 0Dh).

Достоинство этого протокола в удобстве отладки системы и простоте синхронизации посылок. Можно через преобразователь RS485-RS232 подключить линию к COM-порту компьютера и в любой терминалке увидеть всю проходящую информацию «на человеческом языке». Недостатки — относительно большой размер посылки при передаче большого количества двоичной информации, ведь на передачу каждого байта нужно два ASCII символа (7Fh — «7», «F»). Кроме того, надо преобразовывать данные из двоичного вида в ASCII и обратно.

2). Можно организовать протокол с непосредственной передачей двоичных данных. При этом управляющие символы и байты данных различаются с помощью настройки дополнительного девятого бита в UART. Для управляющих символов этот бит устанавливается в «1». Первым в посылке передается управляющий символ с единичным девятым битом — остальные его «нормальные» биты могут содержать адрес устройства-получателя, признак начала/конца посылки и что-нибудь еще. Затем передаются байты данных с нулевым девятым битом. Все принимающие устройства узнают по девятому биту управляющий символ и по содержанию его остальных битов определяют, кому адресованы последующие данные. Адресуемое устройство принимает данные, а все остальные игнорируют их до следующего управляющего символа.

UART некоторых контроллеров, например C167 (Infineon) может в особом режиме (wakeup) автоматически распознавать в полученном байте девятый бит и генерировать прерывание при получении только управляющего символа. Адресуемое устройство при этом нужно переключить в режим обычного приема до следующего управляющего символа. Это позволяет остальным устройствам сэкономить время на обработке прерываний при получении байтов данных, адресованных не им.

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

3) Протокол может быть «чисто» двоичным, то есть без выделения специальных управляющих символов. Синхронизация посылок в этом случае может осуществляться за счет отслеживания паузы между принятыми байтами. Принимающее устройство отсчитывает время с момента последнего приема байта до следующего, и если эта пауза оказывается больше какой-то величины (например, 1.5 — 3.5 байта), делается вывод о потере предыдущей посылки и начале новой. Даже если предыдущая посылка была незакончена — приемный буфер сбрасывается. Можно также синхронизировать посылки по уникальной стартовой последовательности байтов (по аналогии со стартовым символом в ASCII протоколе). В таких протоколах надо принимать особые меры для защиты от приема ложной посылки, начатой из-за помехи.

8. Программные методы борьбы со сбоями

Для повышения надежности связи обязательно нужно предусмотреть программные методы борьбы со сбоями. Их можно условно разделить на две группы: защита от рассинхронизации и контроль достоверности.

1). Защита от рассинхронизации. Несмотря на защитное смещение, сильная помеха может пробиться в линию без активных передатчиков и нарушить правильную последовательность приема посылок. Тогда возникает необходимость первой же нормальной посылкой вразумить принимающие устройства и не дать им принять помеху за посылку. Делается это с помощью синхронизации кадров (активная пауза) и синхронизации посылок (преамбула).

Защита от рассинхронизации кадров. Обязательная мера! Все последующие меры синхронизации посылок имеют смысл только совместно с этой. Помеха ложным старт-битом может сбить правильный прием кадров последующей посылки. Чтобы вернуться к верной последовательности, нужно сделать паузу между включением приемопередатчика на передачу и посылкой данных. Все это время передатчик удерживает в линии высокий уровень, через который помехе трудно пробиться (активная пауза). Паузы длительностью в 1 кадр на данной скорости связи (10-11 бит) будет достаточно для того, чтобы любое устройство, принимавшее помехи приняло стоп-бит. Тогда следующий кадр будет приниматься с нормального старт-бита.

Того же эффекта можно добиться передачей символа FFh перед первым байтом посылки, так как кроме старт-бита, все его биты — «1». (Если старт-бит символа FFh попадет на стоп-бит ложного кадра, будет просто засчитана ошибка кадра).

Защита от рассинхронизации посылок. Применяется совместно с предыдущей защитой! Особо подлая помеха может замаскироваться под управляющий символ и сбить принимаемую затем посылку. Кроме того предыдущая посылка может быть прервана. Из-за этого крайне желательно в подпрограмме приема и сохранения данных предусмотреть меры по опознанию настоящего начала посылки и сбросу приемного буфера посылки (области памяти, куда сохраняются принимаемые байты). Для этого служит преамбула — предварительный признак начала посылки.

Стартовый символ. В ASCII протоколе роль преамбулы играет специальный управляющий символ начала посылки. По каждому приему такого символа нужно сбрасывать буфер: обнулять число принятых байт, перемещать указатель на начало буфера и т.п. То же самое нужно делать при переполнении буфера. Это позволит настоящему управляющему символу сбросить предыдущую «посылку», начатую ложным символом.

Пример. Последний управляющий символ «:» сбросит предыдущую ложную посылку:

____ : ) ____ : 1 2 R S 4 8 5 /ПС/ ____

Стартовая пауза. В двоичном протоколе, где не предусмотрен уникальный управляющий символ, и синхронизация посылок идет по заданной паузе между байтами, достаточно увеличить активную паузу, описанную в синхронизации кадров, до длительности паузы между байтами, по которой начинается прием новой посылки. То есть, между включением приемопередатчика на передачу и отправкой первых байтов посылки нужно сделать паузу длительностью в 1.5 — 3.5 кадра UART. При активном передатчике во время такой преамбулы помехе трудно будет прорваться к приемникам, они зафиксируют нужную паузу, сбросят буфер посылки и настроятся на прием новой посылки. Этот метод применяется, в частности, для протокола MODBUS RTU.

Стартовая последовательность. Если в двоичном протоколе синхронизация осуществляется лишь по корректному началу посылки, то отфильтровать ложную посылку можно только по логике ее структуры. Преамбула в данном случае — некоторая стартовая последовательность символов, которая не может встретиться в данных посылки, и которую вряд ли сформирует помеха. Преамбула отсылается перед основной посылкой. Принимающее устройство отслеживает в поступающих данных эту стартовую последовательность. Где бы она не состоялась, принимающее устройство сбрасывает буфер посылки и начинает принимать новую.

Вариант 1. Посылка начинает заново приниматься после приема «go!» (вместо символов могут быть любые 8-битные данные):

____ : — Ь ___ g o ! 1 2 R S 4 8 5 ____

Вариант 2. Посылка начинает заново приниматься после приема не менее трех «E» подряд и стартового байта «:» (вместо символов могут быть любые 8-битные данные):

____ > : — E ___ E E E : 1 2 R S 4 8 5 ____

Даже если до стартовой последовательности было два таких символа подряд, посылка начнет сохраняться только за последовательностью из не менее чем трех подряд (лишние игнорируются) и стартового символа. Если вместо «Е» использовать байт FFh — можно совместить синхронизацию кадров и посылок. Для этого посылаются четыре FFh, а принимающее устройство ожидает не менее трех, с учетом того, что первый байт FFh может уйти на синхронизацию кадров.
2). Контроль достоверности. Особо сильная помеха может вклиниться в посылку, исказить управляющие символы или данные в ней, а то и вовсе уничтожить ее. Кроме того, одно из подключенных к линии устройств (абонент) может выйти из строя и перестать отвечать на запросы. На случай такой беды существуют контрольная сумма, тайм-ауты и квитирование.
Контрольная сумма — в общем случае 1-2 байта кода, полученного некоторым преобразованием из данных посылки. Самое простое — «исключающее или» всем байтам данных. Контрольная сумма рассчитывается и включается в посылку перед отправкой. Принимающее устройство производит ту же операцию над принятыми данными и сверяет рассчитанную контрольную сумму с полученной. Если посылка была повреждена, то, скорее всего, они не совпадут. В случае применения ASCII протокола — код контрольной суммы также передается ASCII-символами.
Тайм-аут — максимальное время ожидания ответа от запрашиваемого устройства. Если посылка была повреждена или запрашиваемое устройство вышло из строя, то ведущее устройство не повиснет в ожидании ответа, а по истечении определенного времени признает наличие сбоя. После чего можно еще пару раз повторить запрос и, если сбой повторяется, перейти на отработку аварийной ситуации. Тайм-аут отсчитывается с момента завершения передачи запроса. Его длительность должна с небольшим запасом превышать максимальное время ответной передачи плюс время, необходимое на обработку запроса и формирование ответа. Ведомому устройству тоже не помешает отработка тайм-аутов. Особенно в ситуациях, когда отсутствие регулярного обновления данных или новых команд от ведущего устройства критично для работы устройств системы. Самая простая реализация для ведомого — сброс сторожевого таймера по приему посылки. Если по какой-либо причине данные перестали поступать — устройство сбросится по переполнению сторожевого таймера. После сброса устанавливается безопасный режим до приема первой команды.
Квитирование — подтверждение доставки (квитанция). Когда важно, чтобы ведомый обязательно получил данные или команду, возникает необходимость проконтролировать получение им посылки. Ведущее устройство, отправив ведомому данные, ждет ответа с подтверждением. Ведомое устройство, получив данные, в случае их корректности посылает ответ, подтверждающий доставку. Если по истечении тайм-аута ведущее устройство не получает подтверждение, делается вывод о сбое в связи или в ведомом устройстве. Дальше обычные меры — повтор посылки. Но тут есть нюанс: повреждена и не получена может быть сама квитанция. Ведущее устройство, не получив квитанцию, повторяет посылку, и ведомое отрабатывает ее повторно. Не всегда это существенно, но если перепосылалась команда типа «увеличить параметр на 1» это может привести к незапланированному двойному увеличению параметра. В таком случае надо предусмотреть что-нибудь типа циклической нумерации посылок, чтобы ведомое устройство отличало повторные посылки от новых и не отрабатывало их.

9. Защита устройств от перенапряжений в линии связи

Разность потенциалов между проводниками линии и между линией и «землей» приемопередатчика, как правило, не должна выходить за пределы -7. +12 В. Следовательно, может потребоваться защита от разности потенциалов между «землями» и от перенапряжений из-за замыкания на высоковольтные цепи.

Разность потенциалов между «землями». При организации сети на основе интерфейса RS-485 следует учитывать неявное присутствие третьего проводника — «земли». Ведь все приемопередатчики имеют питание и «землю». Если устройства расположены недалеко от начального источника питания, то разность потенциалов между «землями» устройств в сети невелика. Но если устройства находятся далеко друг от друга и получают местное питание, то между их «землями» может оказаться существенная разность потенциалов. Возможные последствия — выход из строя приемопередатчика, а то и всего устройства. В таких случаях следует применять гальваническую развязку или дренажный провод.
Гальваническая развязка линии и устройств осуществляется либо опторазвязкой цифровых сигналов (RO, DI, RE, DE) с организацией изолированного питания микросхем приемопередатчиков, либо применением приемопередатчиков со встроенной гальванической развязкой сигналов и питания (например, MAX1480). Тогда вместе с дифференциальными проводниками прокладываются провод изолированной «земли» (сигнальной «земли») и, возможно, провод изолированного питания линии.
Дренажный провод — провод, прокладываемый вместе с витой парой и соединяющий «земли» удаленных устройств. Через этот провод уравниваются потенциалы «земель». При включении устройства в линию дренажный провод следует подсоединять первым, а при отключении — отсоединять последним. Для ограничения тока через дренажный провод его заземляют в каждом устройстве через резистор в 100 Ом (0.5 Вт).

Замыкание на высоковольтные цепи. Если существует опасность попадания на линию или одну из местных «земель» высокого напряжения, следует применять опторазвязку или шунтирующие ограничители напряжения. А лучше и то и другое.
Напряжение пробоя опторазвязанного интерфейса составляет сотни и даже тысячи вольт. Это хорошо защищает устройство от перенапряжения, общего для всех проводников линии. Однако, при дифференциальных перенапряжениях, когда высокий потенциал оказывается на одном из проводников, сам приемопередатчик будет поврежден.
Для защиты от дифференциальных перенапряжений все проводники линии, включая изолированный общий, шунтируются на локальные «земли» при помощи ограничителей напряжения. Это могут быть варисторы, полупроводниковые ограничители напряжения и газоразрядные трубки. Физический принцип их действия разный, но суть одна — при напряжении выше порогового их сопротивление резко падает, и они шунтируют линию. Газоразрядные трубки могут шунтировать очень большие токи, но имеют высокий порог пробоя и низкое быстродействие, поэтому их лучше применять по трехступенчатой схеме вместе с полупроводниковыми ограничителями. Когда заземление линии невозможно, проводники линии шунтируют ограничителями между собой. Но это защитит только от дифференциальных перенапряжений — защиту от общего должна взять на себя опторазвязка.

Защита ограничителями напряжения действенна при кратковременных перенапряжениях. При длительных — токи короткого замыкания могут вывести ограничители из строя, и устройства на линии окажутся без защиты. Для защиты от коротких замыканий в линию можно последовательно включить плавкие предохранители. Подробнее о защите от перенапряжений можно прочитать в руководстве B&B Electronics «RS-422 and RS-485 Application Note» (англ.).

10. Дополнительные меры защиты от помех

Диагностика. Если есть возможность выбора маршрута прокладки кабеля с замером уровня помех — не стоит ей пренебрегать. Даже если программная коррекция ошибок успешно справляется со сбоями, нужно сделать все, чтобы физически снизить уровень помех в линии. Полезно предусмотреть в программе диагностический режим, в котором накапливалась бы статистика сбоев, отрабатываемых программной коррекцией (провал по контрольной сумме или тайм-ауту). Если сбоев слишком много, желательно поработать над поиском и устранением их причины. Снижение скорости связи (бодрейта) во многих случаях повышает помехоустойчивость. Не имеет смысла устанавливать скорость обмена больше, чем необходимо для нормальной работы системы, если только не требуется запас на модификацию.
Прокладка кабеля. По возможности не следует проводить витую пару вдоль силовых кабелей, тем более в общей оплетке, так как существует опасность наводок от силовых токов через взаимную индуктивность. Силовое оборудование, коммутирующее большие токи, также является источником помех. Сигнальные цепи питания оптоизолированной линии лучше не использовать для питания чего-либо еще, так как протекающие по сигнальной «земле» лишние токи могут вносить в линию дополнительный шум. Некачественная витая пара с асимметричными характеристиками проводников — еще один источник проблем. Чем меньше шаг витой пары (чаще перевиты провода) — тем лучше. Даже если не применяется опторазвязанная линия или дренаж, стоит сразу провести кабель с запасной витой парой — на случай, если произойдет обрыв первой или все же понадобится провести сигнальную землю.
Экранирование и заземление. В промышленных условиях, тяжелых в плане электромагнитного шума, рекомендуется применять экранированный кабель с витой парой. Экран, охватывающий проводники линии, защищает их от паразитных емкостных связей и внешних магнитных полей. Экран следует заземлять только в одной из крайних точек линии. Заземление в нескольких точках недопустимо: из-за разности потенциалов местных «земель» по экрану могут протекать существенные токи, которые будут создавать наводки на сигнальные проводники. Некоторые разработчики рекомендуют для защиты от радиопомех дополнительно включать в нескольких местах между экраном и заземлением специальные высокочастотные конденсаторы емкостью 1. 10 нФ.
Индуктивные фильтры. Если в линию все же попадают высокочастотные помехи, их можно отсеять индуктивными фильтрами. Существуют специальные индуктивные фильтры, предназначенные для подавления высокочастотных помех в линиях связи. Они последовательно включаются в линию непосредственно у приемников. Например, B82790-S**** фирмы Epcos, выполненный в виде четырехполюсника, через который витая пара подсоединяется к приемнику.

Заключение

Я не претендую на полноту сведений о физических и программных тонкостях связи по интерфейсу RS-485. Однако, полагаю, что еще одно изложение темы, немного по другому сформулированное, и к тому же дополненное личным опытом не будет лишним для разработчиков, только начинающих разбираться в этой области. Надеюсь, приведенная информация поможет Вам в организации беспроблемной и надежной связи.

(c) 2003 Евгений Александрович Бень

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *