Power-line communication. Часть 1 — Основы передачи данных по линиям электропередач

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

2d41klhectuj5-nlkhibkt8jf0s.png

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

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


Начнём с абстракций. Представим, что нужно передать порцию информации от одного человека другому. На изображении: красный человечек — это передатчик, а синий — приёмник.

oszauwtyayatbfxicwd8hjf90cu.png

Для передачи информации будем использовать голос. Информация — это какой-то текст в нашей голове. Текст можно разбить на буквы и каждую букву представить в виде звукового сигнала. Таким образом можно кодировать каждую букву каким-то соответствующим звуковым сигналом.

qbxldrcr5k80pk-ctwqkzc3--cy.png

Проводник


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

Полезный сигнал


baf4xbajogkptzpkgngpnecmc1y.png

К счастью, информацию из нашей головы мы не можем мысленно передать напрямую в голову собеседнику. Поэтому буквы из нашей головы на «аппаратном уровне» мы преобразуем (кодируем) в звуковые сигналы (наборы звуковых волн). Будем называть это «полезным сигналом».
Важно: каждая буква кодируется устойчивым набором звуковых волн. Из этих волн мы можем распознать определенную букву (если мы ее знаем, конечно же). Происходит преобразование из буквы в звук и обратно из звука в букву.

Шум


ijhyufnr31vukqndhblcvrucqhq.png


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

Протокол


andkdgghkfb0p779w-ewd4bovly.png


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

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

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


dyuvsmnbz36ahjf58065nozcgk4.png
Далее мы по шагам разберемся, как передавать данные по линиям электропередач, и по ходу дела придумаем свой велосипед протокол. Основные идеи из открытого промышленного стандарта X10.

Чтобы использовать линии электропередач в качестве канала связи, нужно понять, как они устроены, и какие физические процессы в них происходят.
Взглянем на схему доставки электроэнергии от подстанции до жилых домов. Электрические сети трехфазные, и от подстанции идут три «фазы» (A, B и С), которые электрически изолированы друг от друга.

yw_zews9-zap6sbrlba8vcflcle.png

Для простоты условимся, что каждая фаза — это отдельный канал связи. Устройства, подключенные к разным фазам, не слышат друг друга.
Сейчас на рынке есть устройства, которые умеют общаться между фазами, для них вся подстанция — это один канал связи. Но пока для понимания это не играет особой роли.
Далее на схемах будем рассматривать только фазу «А» (в других всё аналогично).

e-ewu5bxxxvmh6inoa8rjlwjxmm.png

При подключении нескольких приемо-передающих устройств к одной фазе образуется сетевая топология типа «общая шина». Сигнал, отправленный одним из устройств, получат все остальные устройства, находящиеся в пределах распространения сигнала.

srrjcuep8b3eozssnk0ltguprhy.png

Проводник


Подробнее изучим среду передачи сигнала. Для этого рассмотрим, в каком виде передается электрическая энергия, и узнаем, как через этот поток мы можем передать свой полезный сигнал.
Электроэнергия передается в виде переменного тока. Проводниками обычно выступают алюминиевый или медный кабели. Напряжение в электрической сети имеет форму синусоиды с периодом 20 миллисекунд (частота 50 Гц).

mzdvjtrugbgrs4saqhpvo7nqvtm.png

Так как ток переменный, он периодически меняет направление «течения», и в момент смены направления мощность практически не передается (если не учитывать сдвиг из-за сильной емкостной или индуктивной нагрузки). Наступают мгновения затишья. Это называется «zero cross» (далее ZC) — момент, в который напряжение равно нулю.

twp9m67_ps7dfewejjtzrzksd9y.png

В этот момент в сети также наблюдается наименьший уровень шума. Это самый благоприятный момент для генерации полезного сигнала.

В электрической сети с частотой 50 Гц (как в России) момент ZC происходит 100 раз в секунду. И если передавать по одному символу за один переход через ноль, то скорость соединения будет равна 100 бод/сек. Скорость передачи в байтах уже зависит от формата кадра, от того, сколько служебных бит, помимо самих данных, будет в кадре (о формате кадров ниже по тексту).

Синхронизация


Еще один немаловажный момент — это синхронизация момента передачи и приема между устройствами.
Для нашего нового протокола будем использовать «синхронную передачу данных», так как это проще в реализации.
Передатчику нужно знать, в какой конкретный момент надо включить ЦАП для генерации сигнала. Приемнику нужно понимать в какой конкретный момент надо включить АЦП для измерения и оцифровки входящего сигнала. Для этого кто-то должен подавать сигнал процессору.
Этим будет заниматься отдельная часть схемы устройства «Zero Cross Detector». Он просто дожидается, когда напряжение на линии будет 0 вольт, и подает об этом сигнал. В сетях с частотой 50 Гц, сигнал будет приходить каждые 10 миллисекунд.

v1nqhpq1lz0cn4tua6ekull57-s.png

Электрическое напряжение распространяется со скоростью света, и поэтому можем условно принять, что момент ZC во всех точках сети происходит одновременно.

В интернете можно найти примеры схем детектора под названиями «Детектора нуля» или «Zero Cross Detector».

Полезный сигнал


Существуют различные варианты кодирования информации для передачи по ЛЭП. Мы будем использовать узкополосную передачу с частотной модуляцией, т.к. она проще для понимания и надежнее. Минусом является низкая скорость передачи данных, но для нас это пока не играет особой роли.
Полезный сигнал — это обычная синусоида фиксированной амплитуды. Изменяется у только частота сигнала. Выберем пару частот и скажем, что сигнал с одной частотой — это »0», а сигнал с другой частотой — это »1».

o0qb5uu7ac6ygrovktrlxvi9hgo.png

Другой вариант: как в стандарте «X10», наличие сигнала означает »1», а его отсутствие »0».

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

kousnm0uqm_sqmmrykhdjs3bh-m.png


Подробнее о том, как эффективно генерировать синусоидальный сигнал, расскажу в следующей статье.

Шум


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

Для понимания, сравним выделенную линию передачи данных с ЛЭП.
Выделенная линия — это отдельный провод, по которому общается некоторое количество устройств. Можно сравнить с пустой комнатой, в которой можно комфортно общаться.

ijddgw2mfffd-bjrehhdpsbrz_e.png

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

df0nbxou-arnuwh5rrgrfqgagj8.png

Протокол


Кодирование очень простое — выбираем несколько символов и ставим в соответствие каждому какую-либо частоту сигнала. Для простоты сделаем три символа:

  • «Start» — по этому символу устройство поймёт, что началась передача кадра;
  • »0» — это символ бита 0;
  • »1» — это символ бита 1.


5dsnqdxln5xlnumjglevrstatxa.png


Передатчик по сигналу из ZC детектора на короткое время генерирует синусоиду нужной частоты. И таким образом передается по одному символу («S»,»0» или »1») за один переход напряжения сети через ноль (каждые 10 миллисекунд). Приемники измеряют этот сигнал, узнают его частоту и записывают соответствующий этой частоте символ («S»,»0» или »1») в буфер.

2xucpggchsgv9k7nfrugdrovnrg.png

Теперь мы умеем сообщать о начале кадра и передавать некоторый набор единиц и нулей. Далее из них будем складывать слова или «кадры». Целостные порции информации.

Формат кадра


Нужно ещё придумать формат кадра, который мы будет передавать с помощью этих символов. Есть несколько важных моментов, которые отразятся на формате данных: длина кадра, адресация, проверка целостности.

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

iorra7ga8fuxk1zwdhtwfblkxv8.png


При сильном увеличении длины кадра, вероятность передать хоть какие-то данные стремится к нулю.

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

-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


Целый кадр будем собирать по кусочку из приходящих символов »0» и »1» после символа «Start».

Опишем алгоритм приема кадра.
Изначально устройство находится в ожидании символа «Start». Буфер отключен, в него ничего не пишем.
Когда пришёл символ «Start», для удобства очищаем буфер приема и запускаем счетчик бит (по счетчику бит будем определять целый кадр).

kc8u-fpf8vwoot3gm05xx5df2mu.png

Каждый следующий символ (»0» или »1») последовательно пишем в буфер приема и инкрементируем счетчик бит.

efvck_1pqqkepjvgv26hk3ykrzy.png


Когда соберется нужное количество бит (полный кадр), проверяем целостность. Выделяем из кадра «Адрес» и «Данные». Подсчитываем по алгоритму «Концевик» и сравниваем с тем, что в кадре.

_7gqjytziyv4akag3vd3vsu2drq.png

Если значения сошлись, извлекаем из кадра данные и отправляем в вышестоящий протокол.

oihsmq1irffuxrla2348nkrkk0w.png

Если значения не сошлись, продолжаем ждать символ «Start». И всё заново.

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


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

Возможно кто-то в комментариях подкинет ещё идей. Буду рад обратной связи!


Ссылки и материалы по теме:
— Про шум в сетях
— Ещё про шум в сетях
— Один из вариантов «Детектора нуля»
— Wiki: Связь по ЛЭП
— Wiki: Трёхфазная система электроснабжения
— ГОСТ Р 51317.3.8–99 (МЭК 61000–3–8–97) Совместимость технических средств электромагнитная. Передача сигналов по низковольтным электрическим сетям.

© Habrahabr.ru