Power-line communication. Часть 1 — Основы передачи данных по линиям электропередач
Не так давно передо мной встала нетривиальная задачка — собрать устройство, которое могло бы по линиям электропередач (0,4 кВ), в сетях обычных бытовых потребителей, передавать некоторую информацию, а точнее — показания электросчетчиков.
Перед началом работы над созданием этого устройства, я мало понимал в цифровой обработке сигналов и в том, как работают компьютерные сети на физическом уровне. Нужно было быстро погрузиться в вопрос и выстроить план по созданию рабочего прототипа.
В процессе изучения я нашел очень много специализированной литературы по электронике, микроконтроллерам и цифровой обработке сигналов, которая очень помогла мне в этом. Но в самом начале пути для выбора направлений изучения мне бы пригодились обзорные статьи вроде этой.
Дальнейший материал — это выжимка из профессионального опыта в том виде, в котором я бы хотел это рассказать самому себе из прошлого. Многие факты сильно упрощены для лучшей читаемости.
Начнём с абстракций. Представим, что нужно передать порцию информации от одного человека другому. На изображении: красный человечек — это передатчик, а синий — приёмник.
![oszauwtyayatbfxicwd8hjf90cu.png](https://habrastorage.org/webt/os/za/uw/oszauwtyayatbfxicwd8hjf90cu.png)
Для передачи информации будем использовать голос. Информация — это какой-то текст в нашей голове. Текст можно разбить на буквы и каждую букву представить в виде звукового сигнала. Таким образом можно кодировать каждую букву каким-то соответствующим звуковым сигналом.
![qbxldrcr5k80pk-ctwqkzc3--cy.png](https://habrastorage.org/webt/qb/xl/dr/qbxldrcr5k80pk-ctwqkzc3--cy.png)
Проводник
Звук, как известно, распространяется в виде волн — колебаний частиц воздуха или иной среды. В нашем случае средой для распространения сигнала служит воздух. От красного человечка звуковые волны по воздуху распространяются во все стороны.
Полезный сигнал
![baf4xbajogkptzpkgngpnecmc1y.png](https://habrastorage.org/webt/ba/f4/xb/baf4xbajogkptzpkgngpnecmc1y.png)
К счастью, информацию из нашей головы мы не можем мысленно передать напрямую в голову собеседнику. Поэтому буквы из нашей головы на «аппаратном уровне» мы преобразуем (кодируем) в звуковые сигналы (наборы звуковых волн). Будем называть это «полезным сигналом».
Важно: каждая буква кодируется устойчивым набором звуковых волн. Из этих волн мы можем распознать определенную букву (если мы ее знаем, конечно же). Происходит преобразование из буквы в звук и обратно из звука в букву.
Шум
![ijhyufnr31vukqndhblcvrucqhq.png](https://habrastorage.org/webt/ij/hy/uf/ijhyufnr31vukqndhblcvrucqhq.png)
Шум — это такой же сигнал, но он не несёт в себе полезной информации. Шум искажает полезный сигнал и уменьшает дальность уверенного приема. Это может быть толпа людей, громко говорящих о чем-то своем, а может быть даже эхо или другие посторонние звуки, которые смешиваются с полезным сигналом. Шум обычно мешает прохождению полезного сигнала до приемника.
Протокол
![andkdgghkfb0p779w-ewd4bovly.png](https://habrastorage.org/webt/an/dk/dg/andkdgghkfb0p779w-ewd4bovly.png)
В таком виде сигнал доходит до приемника. Приёмник из набора звуковых волн узнаёт (декодирует) буквы и собирает из них слова. Если ему кажется, что это бессмысленный набор звуков, то он их отбрасывает либо пытается восстановить исходный сигнал по сложному алгоритму. Отчасти, из-за этого мы иногда сначала переспрашиваем «Что?», а уже потом понимаем, что всё расслышали.
Протокол — это, по сути, набор правил и алгоритмов, по которым мы из полезного сигнала сможем вычленить информацию. В данном примере это наш язык, на котором мы общаемся с собеседником. По нему мы узнаем смысл переданных звуков. Всё это происходит неосознанно можно сказать «на аппаратном уровне».
Всё описанное выше в очень упрощенном виде показывает, как работает передача данных не только между людьми, но и между электронными устройствами. Только физическим воздействием у них будет, например, электрическое напряжение, а проводником — медный кабель. Информация, хранящаяся в устройстве, может быть передана с помощью различных физических сред передачи и протоколов, но суть примерно одна и та же: проводник, физическое воздействие, протокол.
Далее мы по шагам разберемся, как передавать данные по линиям электропередач, и по ходу дела придумаем свой велосипед протокол. Основные идеи из открытого промышленного стандарта X10.
Чтобы использовать линии электропередач в качестве канала связи, нужно понять, как они устроены, и какие физические процессы в них происходят.
Взглянем на схему доставки электроэнергии от подстанции до жилых домов. Электрические сети трехфазные, и от подстанции идут три «фазы» (A, B и С), которые электрически изолированы друг от друга.
![yw_zews9-zap6sbrlba8vcflcle.png](https://habrastorage.org/webt/yw/_z/ew/yw_zews9-zap6sbrlba8vcflcle.png)
Для простоты условимся, что каждая фаза — это отдельный канал связи. Устройства, подключенные к разным фазам, не слышат друг друга.
Сейчас на рынке есть устройства, которые умеют общаться между фазами, для них вся подстанция — это один канал связи. Но пока для понимания это не играет особой роли.
Далее на схемах будем рассматривать только фазу «А» (в других всё аналогично).
![e-ewu5bxxxvmh6inoa8rjlwjxmm.png](https://habrastorage.org/webt/e-/ew/u5/e-ewu5bxxxvmh6inoa8rjlwjxmm.png)
При подключении нескольких приемо-передающих устройств к одной фазе образуется сетевая топология типа «общая шина». Сигнал, отправленный одним из устройств, получат все остальные устройства, находящиеся в пределах распространения сигнала.
![srrjcuep8b3eozssnk0ltguprhy.png](https://habrastorage.org/webt/sr/rj/cu/srrjcuep8b3eozssnk0ltguprhy.png)
Проводник
Подробнее изучим среду передачи сигнала. Для этого рассмотрим, в каком виде передается электрическая энергия, и узнаем, как через этот поток мы можем передать свой полезный сигнал.
Электроэнергия передается в виде переменного тока. Проводниками обычно выступают алюминиевый или медный кабели. Напряжение в электрической сети имеет форму синусоиды с периодом 20 миллисекунд (частота 50 Гц).
![mzdvjtrugbgrs4saqhpvo7nqvtm.png](https://habrastorage.org/webt/mz/dv/jt/mzdvjtrugbgrs4saqhpvo7nqvtm.png)
Так как ток переменный, он периодически меняет направление «течения», и в момент смены направления мощность практически не передается (если не учитывать сдвиг из-за сильной емкостной или индуктивной нагрузки). Наступают мгновения затишья. Это называется «zero cross» (далее ZC) — момент, в который напряжение равно нулю.
![twp9m67_ps7dfewejjtzrzksd9y.png](https://habrastorage.org/webt/tw/p9/m6/twp9m67_ps7dfewejjtzrzksd9y.png)
В этот момент в сети также наблюдается наименьший уровень шума. Это самый благоприятный момент для генерации полезного сигнала.
В электрической сети с частотой 50 Гц (как в России) момент ZC происходит 100 раз в секунду. И если передавать по одному символу за один переход через ноль, то скорость соединения будет равна 100 бод/сек. Скорость передачи в байтах уже зависит от формата кадра, от того, сколько служебных бит, помимо самих данных, будет в кадре (о формате кадров ниже по тексту).
Синхронизация
Еще один немаловажный момент — это синхронизация момента передачи и приема между устройствами.
Для нашего нового протокола будем использовать «синхронную передачу данных», так как это проще в реализации.
Передатчику нужно знать, в какой конкретный момент надо включить ЦАП для генерации сигнала. Приемнику нужно понимать в какой конкретный момент надо включить АЦП для измерения и оцифровки входящего сигнала. Для этого кто-то должен подавать сигнал процессору.
Этим будет заниматься отдельная часть схемы устройства «Zero Cross Detector». Он просто дожидается, когда напряжение на линии будет 0 вольт, и подает об этом сигнал. В сетях с частотой 50 Гц, сигнал будет приходить каждые 10 миллисекунд.
![v1nqhpq1lz0cn4tua6ekull57-s.png](https://habrastorage.org/webt/v1/nq/hp/v1nqhpq1lz0cn4tua6ekull57-s.png)
Электрическое напряжение распространяется со скоростью света, и поэтому можем условно принять, что момент ZC во всех точках сети происходит одновременно.
В интернете можно найти примеры схем детектора под названиями «Детектора нуля» или «Zero Cross Detector».
Полезный сигнал
Существуют различные варианты кодирования информации для передачи по ЛЭП. Мы будем использовать узкополосную передачу с частотной модуляцией, т.к. она проще для понимания и надежнее. Минусом является низкая скорость передачи данных, но для нас это пока не играет особой роли.
Полезный сигнал — это обычная синусоида фиксированной амплитуды. Изменяется у только частота сигнала. Выберем пару частот и скажем, что сигнал с одной частотой — это »0», а сигнал с другой частотой — это »1».
![o0qb5uu7ac6ygrovktrlxvi9hgo.png](https://habrastorage.org/webt/o0/qb/5u/o0qb5uu7ac6ygrovktrlxvi9hgo.png)
Другой вариант: как в стандарте «X10», наличие сигнала означает »1», а его отсутствие »0».
Физически этот сигнал можно генерировать с помощью модуля ЦАП, который есть почти в любом современном микроконтроллере. На вход ЦАП принимает программным путем цифры (уровень сигнала), а на выходе выдает соответствующий этой цифре уровень напряжения. Таким нехитрым образом можно по таймеру подавать в модуль ЦАП массив чисел, а на выходе получать синусоиду с нужной нам частотой.
![kousnm0uqm_sqmmrykhdjs3bh-m.png](https://habrastorage.org/webt/ko/us/nm/kousnm0uqm_sqmmrykhdjs3bh-m.png)
Подробнее о том, как эффективно генерировать синусоидальный сигнал, расскажу в следующей статье.
Шум
В ЛЭП изначально присутствует довольно мощный сигнал — это передаваемая электрическая энергия от подстанции до жилых домов. И при нагрузке появляется большое количество шума на широкой полосе частот. Бытовая техника, блок питания компьютера, зарядные устройства — они испускают широкий спектр частот в электрическую сеть.
Для понимания, сравним выделенную линию передачи данных с ЛЭП.
Выделенная линия — это отдельный провод, по которому общается некоторое количество устройств. Можно сравнить с пустой комнатой, в которой можно комфортно общаться.
![ijddgw2mfffd-bjrehhdpsbrz_e.png](https://habrastorage.org/webt/ij/dd/gw/ijddgw2mfffd-bjrehhdpsbrz_e.png)
А ЛЭП можно сравнить с коридором, в котором проводят работы перфоратором, и по середине едет поезд (очень шумно). В этих условиях передать информацию сложно, но реально.
![df0nbxou-arnuwh5rrgrfqgagj8.png](https://habrastorage.org/webt/df/0n/bx/df0nbxou-arnuwh5rrgrfqgagj8.png)
Протокол
Кодирование очень простое — выбираем несколько символов и ставим в соответствие каждому какую-либо частоту сигнала. Для простоты сделаем три символа:
- «Start» — по этому символу устройство поймёт, что началась передача кадра;
- »0» — это символ бита 0;
- »1» — это символ бита 1.
![5dsnqdxln5xlnumjglevrstatxa.png](https://habrastorage.org/webt/5d/sn/qd/5dsnqdxln5xlnumjglevrstatxa.png)
Передатчик по сигналу из ZC детектора на короткое время генерирует синусоиду нужной частоты. И таким образом передается по одному символу («S»,»0» или »1») за один переход напряжения сети через ноль (каждые 10 миллисекунд). Приемники измеряют этот сигнал, узнают его частоту и записывают соответствующий этой частоте символ («S»,»0» или »1») в буфер.
![2xucpggchsgv9k7nfrugdrovnrg.png](https://habrastorage.org/webt/2x/uc/pg/2xucpggchsgv9k7nfrugdrovnrg.png)
Теперь мы умеем сообщать о начале кадра и передавать некоторый набор единиц и нулей. Далее из них будем складывать слова или «кадры». Целостные порции информации.
Формат кадра
Нужно ещё придумать формат кадра, который мы будет передавать с помощью этих символов. Есть несколько важных моментов, которые отразятся на формате данных: длина кадра, адресация, проверка целостности.
Длина кадра
Чем больше порция данных, тем меньше накладных расходов на передачу данных, так как помимо самих данных в кадре есть служебная информация вроде контрольной суммы и адреса назначения. Но чем меньше порция данных, тем больше вероятность успешной передачи. Тут важно найти золотую середину. Определяется это обычно опытным путем. Если взять пример из компьютерных сетей, то в Ethernet кадре было выбрано ограничение в 1500 байт данных (несмотря на то, что эта цифра быстро устарела, она используется до сих пор).
![iorra7ga8fuxk1zwdhtwfblkxv8.png](https://habrastorage.org/webt/io/rr/a7/iorra7ga8fuxk1zwdhtwfblkxv8.png)
При сильном увеличении длины кадра, вероятность передать хоть какие-то данные стремится к нулю.
Адресация
Нужно ещё не забыть, что у нас топология сети «общая шина». Информацию, отправляемую в эту шину, будут получать все устройства. И чтобы общение у них хоть как-то заладилось, у них должны быть адреса.
Адрес добавим в самое начало кадра, чтобы принимающая сторона, для которой не предназначены эти данные, не тратила время на прослушивание и ожидание всего кадра, так мы немного освободим процессор от бесполезной работы.
![-u5hidcfzemda_gh0z_2vf0s-ho.png](https://habrastorage.org/webt/-u/5h/id/-u5hidcfzemda_gh0z_2vf0s-ho.png)
Длина адреса выбирается исходя из максимального количества устройств, которые могут одновременно находится в одной области видимости. Например, 8 бит — это максимум 255 устройств (если 0 оставить как широковещательный).
Проверка целостности
При передаче информации по ЛЭП очень большая вероятность потерять часть данных. Поэтому обязательно должна быть проверка целостности. Для этих целей в кадр добавляется «концевик». Это некоторая избыточная информация, с помощью которой приёмник сможет убедиться в том, что данные не искажены.
Придумаем окончательный вид кадра. Пусть длина адреса будет 8 бит (255 устройств в канале + 1 широковещательный адрес). Затем идут данные 8 бит (1 байт).
Концевиком у нас будет просто результат сложения адреса и байта. Но есть один нюанс: устройство может стабильно ловить сильный шум на частоте наших символов »0» или »1» и думать, что это полезный сигнал. И есть большая вероятность ложно считывать крайние значения типа »0×00» или »0xFF». Для защиты от этого, при подсчете концевика, просто будем прибавлять число »42».
Примерно так будет выглядеть один кадр данных: отправляем число »110» на устройство с адресом »17», концевик »169» (110 + 17 + 42).
![9a-wxilt9cuf-hr0kijv42gm7dg.png](https://habrastorage.org/webt/9a/-w/xi/9a-wxilt9cuf-hr0kijv42gm7dg.png)
Целый кадр будем собирать по кусочку из приходящих символов »0» и »1» после символа «Start».
Опишем алгоритм приема кадра.
Изначально устройство находится в ожидании символа «Start». Буфер отключен, в него ничего не пишем.
Когда пришёл символ «Start», для удобства очищаем буфер приема и запускаем счетчик бит (по счетчику бит будем определять целый кадр).
![kc8u-fpf8vwoot3gm05xx5df2mu.png](https://habrastorage.org/webt/kc/8u/-f/kc8u-fpf8vwoot3gm05xx5df2mu.png)
Каждый следующий символ (»0» или »1») последовательно пишем в буфер приема и инкрементируем счетчик бит.
![efvck_1pqqkepjvgv26hk3ykrzy.png](https://habrastorage.org/webt/ef/vc/k_/efvck_1pqqkepjvgv26hk3ykrzy.png)
Когда соберется нужное количество бит (полный кадр), проверяем целостность. Выделяем из кадра «Адрес» и «Данные». Подсчитываем по алгоритму «Концевик» и сравниваем с тем, что в кадре.
![_7gqjytziyv4akag3vd3vsu2drq.png](https://habrastorage.org/webt/_7/gq/jy/_7gqjytziyv4akag3vd3vsu2drq.png)
Если значения сошлись, извлекаем из кадра данные и отправляем в вышестоящий протокол.
![oihsmq1irffuxrla2348nkrkk0w.png](https://habrastorage.org/webt/oi/hs/mq/oihsmq1irffuxrla2348nkrkk0w.png)
Если значения не сошлись, продолжаем ждать символ «Start». И всё заново.
Примерно таким образом мы можем медленно, но верно передавать байт за байтом от одного устройства другому. Приемник будет складывать эти байты в приемный буфер протокола на уровень выше физического и там уже будет решать, что делать: выполнить входящую команду или вернуть какие-то данные в ответ.
В этой статье я постарался общим и понятным языком ввести читателя в тему передачи данных по линиям электропередач. Надеюсь, кому-то это информация пригодится, возможно, не только в области PLC.
В следующей части хотелось бы рассказать про алгоритм быстрой генерации синуса, который я применял. И о том, как из массива чисел оцифрованного сигнала узнать его частоту (ДПФ). Немного расскажу про железки для всего этого.
Возможно кто-то в комментариях подкинет ещё идей. Буду рад обратной связи!
Ссылки и материалы по теме:
— Про шум в сетях
— Ещё про шум в сетях
— Один из вариантов «Детектора нуля»
— Wiki: Связь по ЛЭП
— Wiki: Трёхфазная система электроснабжения
— ГОСТ Р 51317.3.8–99 (МЭК 61000–3–8–97) Совместимость технических средств электромагнитная. Передача сигналов по низковольтным электрическим сетям.