Power-line communication. Часть 1 — Основы передачи данных по линиям электропередач
Не так давно передо мной встала нетривиальная задачка — собрать устройство, которое могло бы по линиям электропередач (0,4 кВ), в сетях обычных бытовых потребителей, передавать некоторую информацию, а точнее — показания электросчетчиков.
Перед началом работы над созданием этого устройства, я мало понимал в цифровой обработке сигналов и в том, как работают компьютерные сети на физическом уровне. Нужно было быстро погрузиться в вопрос и выстроить план по созданию рабочего прототипа.
В процессе изучения я нашел очень много специализированной литературы по электронике, микроконтроллерам и цифровой обработке сигналов, которая очень помогла мне в этом. Но в самом начале пути для выбора направлений изучения мне бы пригодились обзорные статьи вроде этой.
Дальнейший материал — это выжимка из профессионального опыта в том виде, в котором я бы хотел это рассказать самому себе из прошлого. Многие факты сильно упрощены для лучшей читаемости.
Начнём с абстракций. Представим, что нужно передать порцию информации от одного человека другому. На изображении: красный человечек — это передатчик, а синий — приёмник.
Для передачи информации будем использовать голос. Информация — это какой-то текст в нашей голове. Текст можно разбить на буквы и каждую букву представить в виде звукового сигнала. Таким образом можно кодировать каждую букву каким-то соответствующим звуковым сигналом.
Проводник
Звук, как известно, распространяется в виде волн — колебаний частиц воздуха или иной среды. В нашем случае средой для распространения сигнала служит воздух. От красного человечка звуковые волны по воздуху распространяются во все стороны.
Полезный сигнал
К счастью, информацию из нашей головы мы не можем мысленно передать напрямую в голову собеседнику. Поэтому буквы из нашей головы на «аппаратном уровне» мы преобразуем (кодируем) в звуковые сигналы (наборы звуковых волн). Будем называть это «полезным сигналом».
Важно: каждая буква кодируется устойчивым набором звуковых волн. Из этих волн мы можем распознать определенную букву (если мы ее знаем, конечно же). Происходит преобразование из буквы в звук и обратно из звука в букву.
Шум
Шум — это такой же сигнал, но он не несёт в себе полезной информации. Шум искажает полезный сигнал и уменьшает дальность уверенного приема. Это может быть толпа людей, громко говорящих о чем-то своем, а может быть даже эхо или другие посторонние звуки, которые смешиваются с полезным сигналом. Шум обычно мешает прохождению полезного сигнала до приемника.
Протокол
В таком виде сигнал доходит до приемника. Приёмник из набора звуковых волн узнаёт (декодирует) буквы и собирает из них слова. Если ему кажется, что это бессмысленный набор звуков, то он их отбрасывает либо пытается восстановить исходный сигнал по сложному алгоритму. Отчасти, из-за этого мы иногда сначала переспрашиваем «Что?», а уже потом понимаем, что всё расслышали.
Протокол — это, по сути, набор правил и алгоритмов, по которым мы из полезного сигнала сможем вычленить информацию. В данном примере это наш язык, на котором мы общаемся с собеседником. По нему мы узнаем смысл переданных звуков. Всё это происходит неосознанно можно сказать «на аппаратном уровне».
Всё описанное выше в очень упрощенном виде показывает, как работает передача данных не только между людьми, но и между электронными устройствами. Только физическим воздействием у них будет, например, электрическое напряжение, а проводником — медный кабель. Информация, хранящаяся в устройстве, может быть передана с помощью различных физических сред передачи и протоколов, но суть примерно одна и та же: проводник, физическое воздействие, протокол.
Далее мы по шагам разберемся, как передавать данные по линиям электропередач, и по ходу дела придумаем свой велосипед протокол. Основные идеи из открытого промышленного стандарта X10.
Чтобы использовать линии электропередач в качестве канала связи, нужно понять, как они устроены, и какие физические процессы в них происходят.
Взглянем на схему доставки электроэнергии от подстанции до жилых домов. Электрические сети трехфазные, и от подстанции идут три «фазы» (A, B и С), которые электрически изолированы друг от друга.
Для простоты условимся, что каждая фаза — это отдельный канал связи. Устройства, подключенные к разным фазам, не слышат друг друга.
Сейчас на рынке есть устройства, которые умеют общаться между фазами, для них вся подстанция — это один канал связи. Но пока для понимания это не играет особой роли.
Далее на схемах будем рассматривать только фазу «А» (в других всё аналогично).
При подключении нескольких приемо-передающих устройств к одной фазе образуется сетевая топология типа «общая шина». Сигнал, отправленный одним из устройств, получат все остальные устройства, находящиеся в пределах распространения сигнала.
Проводник
Подробнее изучим среду передачи сигнала. Для этого рассмотрим, в каком виде передается электрическая энергия, и узнаем, как через этот поток мы можем передать свой полезный сигнал.
Электроэнергия передается в виде переменного тока. Проводниками обычно выступают алюминиевый или медный кабели. Напряжение в электрической сети имеет форму синусоиды с периодом 20 миллисекунд (частота 50 Гц).
Так как ток переменный, он периодически меняет направление «течения», и в момент смены направления мощность практически не передается (если не учитывать сдвиг из-за сильной емкостной или индуктивной нагрузки). Наступают мгновения затишья. Это называется «zero cross» (далее ZC) — момент, в который напряжение равно нулю.
В этот момент в сети также наблюдается наименьший уровень шума. Это самый благоприятный момент для генерации полезного сигнала.
В электрической сети с частотой 50 Гц (как в России) момент ZC происходит 100 раз в секунду. И если передавать по одному символу за один переход через ноль, то скорость соединения будет равна 100 бод/сек. Скорость передачи в байтах уже зависит от формата кадра, от того, сколько служебных бит, помимо самих данных, будет в кадре (о формате кадров ниже по тексту).
Синхронизация
Еще один немаловажный момент — это синхронизация момента передачи и приема между устройствами.
Для нашего нового протокола будем использовать «синхронную передачу данных», так как это проще в реализации.
Передатчику нужно знать, в какой конкретный момент надо включить ЦАП для генерации сигнала. Приемнику нужно понимать в какой конкретный момент надо включить АЦП для измерения и оцифровки входящего сигнала. Для этого кто-то должен подавать сигнал процессору.
Этим будет заниматься отдельная часть схемы устройства «Zero Cross Detector». Он просто дожидается, когда напряжение на линии будет 0 вольт, и подает об этом сигнал. В сетях с частотой 50 Гц, сигнал будет приходить каждые 10 миллисекунд.
Электрическое напряжение распространяется со скоростью света, и поэтому можем условно принять, что момент ZC во всех точках сети происходит одновременно.
В интернете можно найти примеры схем детектора под названиями «Детектора нуля» или «Zero Cross Detector».
Полезный сигнал
Существуют различные варианты кодирования информации для передачи по ЛЭП. Мы будем использовать узкополосную передачу с частотной модуляцией, т.к. она проще для понимания и надежнее. Минусом является низкая скорость передачи данных, но для нас это пока не играет особой роли.
Полезный сигнал — это обычная синусоида фиксированной амплитуды. Изменяется у только частота сигнала. Выберем пару частот и скажем, что сигнал с одной частотой — это »0», а сигнал с другой частотой — это »1».
Другой вариант: как в стандарте «X10», наличие сигнала означает »1», а его отсутствие »0».
Физически этот сигнал можно генерировать с помощью модуля ЦАП, который есть почти в любом современном микроконтроллере. На вход ЦАП принимает программным путем цифры (уровень сигнала), а на выходе выдает соответствующий этой цифре уровень напряжения. Таким нехитрым образом можно по таймеру подавать в модуль ЦАП массив чисел, а на выходе получать синусоиду с нужной нам частотой.
Подробнее о том, как эффективно генерировать синусоидальный сигнал, расскажу в следующей статье.
Шум
В ЛЭП изначально присутствует довольно мощный сигнал — это передаваемая электрическая энергия от подстанции до жилых домов. И при нагрузке появляется большое количество шума на широкой полосе частот. Бытовая техника, блок питания компьютера, зарядные устройства — они испускают широкий спектр частот в электрическую сеть.
Для понимания, сравним выделенную линию передачи данных с ЛЭП.
Выделенная линия — это отдельный провод, по которому общается некоторое количество устройств. Можно сравнить с пустой комнатой, в которой можно комфортно общаться.
А ЛЭП можно сравнить с коридором, в котором проводят работы перфоратором, и по середине едет поезд (очень шумно). В этих условиях передать информацию сложно, но реально.
Протокол
Кодирование очень простое — выбираем несколько символов и ставим в соответствие каждому какую-либо частоту сигнала. Для простоты сделаем три символа:
- «Start» — по этому символу устройство поймёт, что началась передача кадра;
- »0» — это символ бита 0;
- »1» — это символ бита 1.
Передатчик по сигналу из ZC детектора на короткое время генерирует синусоиду нужной частоты. И таким образом передается по одному символу («S»,»0» или »1») за один переход напряжения сети через ноль (каждые 10 миллисекунд). Приемники измеряют этот сигнал, узнают его частоту и записывают соответствующий этой частоте символ («S»,»0» или »1») в буфер.
Теперь мы умеем сообщать о начале кадра и передавать некоторый набор единиц и нулей. Далее из них будем складывать слова или «кадры». Целостные порции информации.
Формат кадра
Нужно ещё придумать формат кадра, который мы будет передавать с помощью этих символов. Есть несколько важных моментов, которые отразятся на формате данных: длина кадра, адресация, проверка целостности.
Длина кадра
Чем больше порция данных, тем меньше накладных расходов на передачу данных, так как помимо самих данных в кадре есть служебная информация вроде контрольной суммы и адреса назначения. Но чем меньше порция данных, тем больше вероятность успешной передачи. Тут важно найти золотую середину. Определяется это обычно опытным путем. Если взять пример из компьютерных сетей, то в Ethernet кадре было выбрано ограничение в 1500 байт данных (несмотря на то, что эта цифра быстро устарела, она используется до сих пор).
При сильном увеличении длины кадра, вероятность передать хоть какие-то данные стремится к нулю.
Адресация
Нужно ещё не забыть, что у нас топология сети «общая шина». Информацию, отправляемую в эту шину, будут получать все устройства. И чтобы общение у них хоть как-то заладилось, у них должны быть адреса.
Адрес добавим в самое начало кадра, чтобы принимающая сторона, для которой не предназначены эти данные, не тратила время на прослушивание и ожидание всего кадра, так мы немного освободим процессор от бесполезной работы.
Длина адреса выбирается исходя из максимального количества устройств, которые могут одновременно находится в одной области видимости. Например, 8 бит — это максимум 255 устройств (если 0 оставить как широковещательный).
Проверка целостности
При передаче информации по ЛЭП очень большая вероятность потерять часть данных. Поэтому обязательно должна быть проверка целостности. Для этих целей в кадр добавляется «концевик». Это некоторая избыточная информация, с помощью которой приёмник сможет убедиться в том, что данные не искажены.
Придумаем окончательный вид кадра. Пусть длина адреса будет 8 бит (255 устройств в канале + 1 широковещательный адрес). Затем идут данные 8 бит (1 байт).
Концевиком у нас будет просто результат сложения адреса и байта. Но есть один нюанс: устройство может стабильно ловить сильный шум на частоте наших символов »0» или »1» и думать, что это полезный сигнал. И есть большая вероятность ложно считывать крайние значения типа »0×00» или »0xFF». Для защиты от этого, при подсчете концевика, просто будем прибавлять число »42».
Примерно так будет выглядеть один кадр данных: отправляем число »110» на устройство с адресом »17», концевик »169» (110 + 17 + 42).
Целый кадр будем собирать по кусочку из приходящих символов »0» и »1» после символа «Start».
Опишем алгоритм приема кадра.
Изначально устройство находится в ожидании символа «Start». Буфер отключен, в него ничего не пишем.
Когда пришёл символ «Start», для удобства очищаем буфер приема и запускаем счетчик бит (по счетчику бит будем определять целый кадр).
Каждый следующий символ (»0» или »1») последовательно пишем в буфер приема и инкрементируем счетчик бит.
Когда соберется нужное количество бит (полный кадр), проверяем целостность. Выделяем из кадра «Адрес» и «Данные». Подсчитываем по алгоритму «Концевик» и сравниваем с тем, что в кадре.
Если значения сошлись, извлекаем из кадра данные и отправляем в вышестоящий протокол.
Если значения не сошлись, продолжаем ждать символ «Start». И всё заново.
Примерно таким образом мы можем медленно, но верно передавать байт за байтом от одного устройства другому. Приемник будет складывать эти байты в приемный буфер протокола на уровень выше физического и там уже будет решать, что делать: выполнить входящую команду или вернуть какие-то данные в ответ.
В этой статье я постарался общим и понятным языком ввести читателя в тему передачи данных по линиям электропередач. Надеюсь, кому-то это информация пригодится, возможно, не только в области PLC.
В следующей части хотелось бы рассказать про алгоритм быстрой генерации синуса, который я применял. И о том, как из массива чисел оцифрованного сигнала узнать его частоту (ДПФ). Немного расскажу про железки для всего этого.
Возможно кто-то в комментариях подкинет ещё идей. Буду рад обратной связи!
Ссылки и материалы по теме:
— Про шум в сетях
— Ещё про шум в сетях
— Один из вариантов «Детектора нуля»
— Wiki: Связь по ЛЭП
— Wiki: Трёхфазная система электроснабжения
— ГОСТ Р 51317.3.8–99 (МЭК 61000–3–8–97) Совместимость технических средств электромагнитная. Передача сигналов по низковольтным электрическим сетям.