Русский
Русский
English
Статистика
Реклама

Блог компании directum

Перевод Диалоги подтверждения советы зарубежных коллег и собственный опыт

02.12.2020 14:12:13 | Автор: admin

Изображение из блога компании Miro

Киннерет Ифра, эксперт в разработке микротекстов для UI и автор книги Microcopy: The Complete Guide, в своей статье даёт рекомендации, как сделать диалоги подтверждения краткими, предельно ясными и не раздражающими, а значит более полезными для пользователя. Предлагаем вашему вниманию перевод статьи, а после него добавим пару идей из собственного опыта.

***

Перевод статьи Вы уверены, что хотите это сделать? Микротексты в диалогах подтверждения


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

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

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


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

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

Вот как выглядит всплывающее сообщение в Google Calendar. Оно появляется после удаления мероприятия, на которое не приглашены другие участники.


Такое сообщение пользователь видит в Google Photos при перемещении изображений в корзину:


А вот всплывающее сообщение в Dropbox:


Больше примеров можно найти в статье Керен Ридженски (Keren Rijensky), где она рассказывает о других вариантах интерфейса удаления.

Когда использовать диалог подтверждения, а когда возможность отмены?


Я задала этот вопрос в группе WE Women Experience в Facebook и получила замечательные ответы (спасибо, девушки!). На основе этих ответов я выделила четыре ключевых фактора, которые нужно принимать во внимание:

  1. Обратимость. Если пользователь собирается выполнить необратимое действие, нужно спросить, понимает ли он, что произойдёт дальше. Например, это уместно при попытке удалить элемент без возможности восстановления или отправить отчёт, который впоследствии нельзя будет изменить. Для обратимого действия, например, помещения элемента в корзину, откуда его можно легко восстановить, используется сообщение с отменой.
  2. Важность. Если действие приведёт к значительному и/или долгосрочному ущербу или иным серьёзным последствиям, обязательно добавьте диалог подтверждения. В результате пользователь остановится и ещё раз задумается, хочет ли он выполнить именно это действие. Если же действие рядовое, а его последствия краткосрочны, можно предоставить пользователю свободу, не создавая лишних преград.
  3. Сложность. Если пользователь собирается выполнить действие с комплексными последствиями, например, влияющее на настройки других устройств, нужно заранее предупредить об этом. Так пользователь сможет лучше понять, к чему приведёт такое действие. Если же результат очевидный, краткосрочный или незначительный, можно обойтись коротким всплывающим сообщением.
  4. Частотность. Если пользователь регулярно выполняет одни и те же действия, например, при работе с электронными письмами, запрос подтверждения на каждом шагу быстро ему надоест. К тому же, пользователь вряд ли случайно выполнит действие, с которым он работает каждый день. И наоборот: если пользователь редко выполняет какое-либо действие и мог подзабыть его особенности, лучше использовать диалог подтверждения, чем сообщение с отменой (которое, к тому же, легко пропустить).

Кроме этого, в некоторых продуктах пользователю предлагаются и дополнительные варианты действий, помимо полной отмены (спасибо за подсказку Эфри Элтан). Чуть ниже я приведу пару примеров.

Анатомия диалога подтверждения


Диалог подтверждения включает в себя два или три элемента:

  1. Заголовок.
  2. Пояснение в одну-две строки (необязательно).
  3. Кнопки.

Элемент 1. Заголовок


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

Заголовок должен быть максимально простым, а главное понятным и однозначным.

В большинстве случаев заголовок должен представлять собой вопрос с двумя взаимоисключающими вариантами ответа, которые легко различить и выбрать нужный: Да/Нет, Остаться/Выйти, Продолжить/Вернуться.

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

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

Назовите текущее действие чем конкретнее, тем лучше.

Избегайте вводных фраз, не несущих смысловой нагрузки. Например, Вы хотите, Это действие приведет к и всё то же пресловутое Вы действительно.

Сообщите главное с самого начала.




Вот отличный пример из Twitter простое и ясное сообщение:


Почему нужно убрать из сообщений избыточные вступления?

  1. Сообщения станут краткими, а язык простым и лёгким для восприятия. Мы и так вынуждаем пользователей тратить время на дополнительное действие. Фраза Вы действительно добавляет сообщению ненужной сложности, в том числе и на эмоциональном уровне.
  2. Ключевая идея будет более ясной и недвусмысленной. Действия пользователя могут привести к серьёзным последствиям, поэтому формулировать сообщение нужно четко и однозначно. Лишние слова все, кроме главного вопроса сделают сообщение расплывчатым и менее ясным.
  3. Мы не ставим под сомнение действия и знания пользователей. Лишние вопросы подрывают уверенность пользователей в своих знаниях о продукте и умении им пользоваться.
  4. Мы избавляемся от воды избыточные вступления не несут в себе никакой ценности.

Выполнить отмену


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

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

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

Элемент 2 (необязательный). Пояснение


Если вам нечего добавить к тому, что уже сказано в заголовке, добавлять пояснение не нужно.


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

Когда пояснение нужно


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

  • Удаление связанных элементов пользователь собирается удалить элемент, что приведёт к удалению связанных с ним элементов.

  • Удаление элементов из других учетных записей пользователь собирается удалить элемент в своей учётной записи, при этом элемент будет удалён и из учётных записей коллег.

  • Удаление элементов с других устройств пользователь собирается удалить элемент из облака, при этом элемент будет удалён и с других устройств, которые синхронизируются с облаком. (А если предупреждение будет не очень понятным, пользователь может с концами удалить фото из месячного отпуска в Испании, а также абсолютно все бэкапы. True story.)

  • Противоречащие друг другу действия пользователь хочет изменить настройки, и это действие противоречит другим настройкам и изменит и их тоже.


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

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


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

Вот хороший пример из Typeform:


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

Объединение заголовка и пояснения


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

  • Удалить папку и все ее содержимое?
  • Данные не будут сохранены. Все равно выйти?
  • Эти фотографии будут удалены из всех синхронизированных хранилищ, в том числе из галереи на вашем устройстве. Удалить фотографии без возможности восстановления?



Раз и навсегда, на веки вечные


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

Приведённый выше пример из Typeform как нельзя лучше демонстрирует этот принцип.

YouTube даже требует дополнительно подтвердить удаление видео: пока пользователь не установит специальный флажок, кнопка удаления остаётся недоступной.


Есть вариант получше? Самое время рассказать о нём


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

Вот пример из Facebook:


Элемент 3. Кнопки


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

  1. Сделайте кнопки легко отличимыми и как можно более понятными

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

    Вот пример из программы AVG, идеально демонстрирующий эту идею:

  2. Добавьте контекст

    Если на кнопках будет только Да и Нет или Продолжить и Отмена, то пользователи, которые прочли заголовок и/или пояснение, скорее всего, поймут, о чём речь. Однако для тех, кто предпочитает не вдаваться в детали (будем честны большинство из нас), такая формулировка может оказаться непонятной.

    Лучше добавить название действия, по крайней мере, для кнопки с подтверждением: Да, завершить парковку; Все равно выйти; Да, удалить; Перестать читать; Да, отправить и так далее.

    Если заголовок представляет собой вопрос, на который можно ответить Да или Нет, я предпочитаю добавлять перед глаголом Да (Да, отправить) или Всё равно (Всё равно отправить). Впрочем, можно использовать и один глагол (Отправить).



    Ниже приведён забавный диалог из Forest, расширения для Chrome. Это расширение предназначено для борьбы с прокрастинацией: пользователь может посадить дерево, которое растёт, пока он работает, но погибает, если перейти на сайт из чёрного списка.

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

    Контекст поможет и тем пользователям, которые хорошо знакомы с системой. Когда из текста на кнопке понятен контекст вопроса, пользователь не тратит время на чтение одних и тех же заголовков.

    Вот как выглядит диалог подтверждения, который появляется при попытке удалить изображение из галереи Galaxy. Достаточно прочитать текст на кнопке, чтобы понять, о чём идет речь:


    Третье преимущество контекста в том, что на словах, добавленных к привычным Да/Нет или Отмена/Подтвердить, пользователь притормаживает и задумывается над тем, что собирается сделать. Это хороший способ предотвратить непродуманные, интуитивные действия. Достаточно добавить Выйти на кнопку Да, и пользователь помедлит ещё долю секунды и задумается, действительно ли он хочет выйти.
  3. Используйте один и тот же глагол в заголовке и на кнопках, чтобы пользователю было легко проследить связь между ними

Следующий пример из Google Photos демонстрирует ещё два принципа разработки текстов для диалогов подтверждения:


  1. Будьте последовательны учитывайте надпись на кнопке, при нажатии на которую появится диалог подтверждения, и используйте ту же формулировку. В примере пользователь нажимает кнопку Очистить корзину, поэтому в диалоге подтверждения тоже используется слово корзина.
  2. Сообщайте о главном в этом действии главное не то, что корзина будет очищена, а то, что её содержимое будет удалено навсегда. Поэтому в тексте на кнопке важно обратить внимание пользователя на удаление данных, а не на очищение корзины. Возможно и ещё более элегантное решение: формулировки можно объединить и назвать кнопку не Очистить корзину, а Удалить содержимое корзины.

Подведём итоги


Ниже приведён итоговый пример, в котором доработаны все три элемента диалога подтверждения.

В новом заголовке мы задаём прямой вопрос о конкретном действии.

В новом пояснении мы сообщаем пользователю о последствиях этого действия.

В новых кнопках мы предлагаем легко различимые варианты с указанием контекста.

***

Применение на практике


Итак, какие лайфхаки по текстам в диалогах подтверждения можно вынести из этой статьи? Давайте обобщим:

Заголовок:

  • Сделайте заголовок коротким и простым, в идеале задайте вопрос с двумя взаимоисключающими вариантами ответа.
  • Убирайте вводные фразы вроде Вы действительно это ненужная вода.
  • Избегайте неоднозначности, называйте конкретное действие. Особенно осторожного обращения требуют слова Отмена и Продолжить.

Пояснение:

  • Не добавляйте пояснение, если вам нечего добавить к вопросу в заголовке.
  • Добавляйте пояснение для действий, которые вызовут другие действия, и для необратимых действий.
  • Если действие кажется неуместным, предложите другой вариант.
  • Используйте цвета и отступы, чтобы привлечь внимание к ключевой информации.
  • Пояснение можно объединить с заголовком. Всё равно многие их не читают.

Кнопки:

  • В текстах кнопок используйте ответы на вопрос, заданный в заголовке.
  • Добавьте на основную кнопку название действия например, Да, выйти. Лучше, если оно будет совпадать с глаголом в заголовке.

И ещё:

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

Эти советы перекликаются с теми принципами, которые используются при разработке UI для наших продуктов. Например, в Directum RX для удаления ссылок мы заменили диалог подтверждения на всплывашку:


А в одной из версий мы избавились от громоздких формулировок в диалогах:

Бонус: идеи из личного опыта


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

  • Если диалог подтверждения раздражает, его можно отключить. Эту возможность мы тоже добавили в RX 3.5. и теперь пользователи могут не подтверждать рутинные действия вроде отправки задач. При необходимости эти диалоги можно восстановить.


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


    Лучше, если тексты основной и дополнительной кнопок будут однотипными например, используйте два глагола.
  • Кстати, о глаголах. В диалогах подтверждения они предпочтительнее отглагольных существительных: вместо Выход лучше написать Выйти, вместо Отправка Отправить. Исключение составляет разве что старая добрая Отмена.
  • Старайтесь не использовать слова с отрицательной коннотацией:
    • вместо ошибка, проблема лучше использовать неполадка, неисправность или иные контекстные синонимы;
    • вместо abort, kill, terminate end;
    • вместо failed, unable cannot;
    • вместо bad incorrect;
    • вместо invalid is not valid.

    Избегайте и таких формулировок, которые звучат как обвинение: Вы неправильно заполнили лучше объяснить, что именно нужно исправить. Мы же не хотим, чтобы наш интерфейс огорчал пользователя?

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

А какими из перечисленных принципов пользуетесь вы? Может быть, вам есть что добавить к этому списку? Пишите комментарии, задавайте вопросы мы будем рады обменяться опытом.
Подробнее..

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

25.08.2020 02:16:19 | Автор: admin
Не так давно передо мной встала нетривиальная задачка собрать устройство, которое могло бы по линиям электропередач (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 и думать, что это полезный сигнал. И есть большая вероятность ложно считывать крайние значения типа 0x00 или 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) Совместимость технических средств электромагнитная. Передача сигналов по низковольтным электрическим сетям.
Подробнее..

Power-line communication. Часть 2 Основные блоки устройства

26.01.2021 02:10:54 | Автор: admin

Часть 1 Основы передачи данных по линиям электропередач

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

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

- Введение
- Мозги устройства микроконтроллер
- Основные требования к микроконтроллеру
- Выбор подходящего микроконтроллера
- Особенности питания устройства

Дисклеймер: статья не является руководством по созданию устройства и не является справочником по электронным компонентам. Это просто результаты моих экспериментов и некоторый накопленный практикой опыт, который, надеюсь, будет полезен тем, кто интересуется темой. Если есть какие-то замечания, интересные ссылки и книги, обязательно оставляй это в комментах.

Введение

Для начала кратко вспомним из части 1, как происходит передача данных. На изображении одна из фаз ЛЭП. Красное устройство передает, синие слушают. Биты данных один за одним передаются в виде синусоидальных сигналов различной частоты (FSK модуляция).

В мозге устройства микроконтроллере зашит протокол, по которому передаются/принимаются данные. Также в прошивке микроконтроллера для каждого передаваемого символа (или бита) задана соответствующая частота сигнала.

Для примера: если передается символ 0, то генерируется полезный сигнал в виде синусоиды 74 кГц. А если передается 1, то генерируется синусоида с частотой, например, 80 кГц. Номиналы частот не особо важны, просто выбираются любые из разрешенных диапазонов. Главное, чтобы приемник смог их различить.

В первой части статьи упоминалось про третий символ S, который означал начало кадра. Он также кодировался своей определенной частотой. Когда устройство получало символ S, входной буфер очищался. Для простоты в этой статье будут упоминаться только 0 и 1.

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

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

Физически это значит, что за один синхросигнал из ZC детектора генерируется один полезный сигнал определенной частоты. В нашем случае это синусоиды 74 кГц или 80 кГц.

Таким образом, бит за битом, передается кадр данных в PLC канал. Совместно с микроконтроллером генерацией сигналов будет заниматься отдельная часть схемы. Назовём её Выходная цепь.

Задача принимающих устройств каждый раз, по сигналу ZC детектора, оцифровывать полезный сигнал из PLC канала и узнавать, какой символ там был закодирован.

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

Чтобы не раздувать эту часть статьи, расскажу только про задачи, решаемые микроконтроллером и некоторые особенности питания устройства.

В следующей части рассмотрим как устройство можно согласовать с сетью 220 В, работу ZC детектора, а также про входную и выходную цепи.

Мозги устройства микроконтроллер

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

Микроконтроллер это такой мини-компьютер, который в одном корпусе содержит процессор (ЦПУ), память (ПЗУ и ОЗУ), ввод-вывод и периферийные устройства. По сути, внутри уже все есть для работы: подаем питание и поехали. Дальше все зависит уже от программы прошивки, которую мы в него записали.

Рисунок с сайта digikey.comРисунок с сайта digikey.com

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

На рынке огромное разнообразие микроконтроллеров с разной вычислительной мощностью и периферией. Обычно они группируются в серии и подходят под разные классы задач. Например, чтобы помигать светодиодом в миниатюрном устройстве, нам не нужен мощный камень, на котором можно запустить Linux, подойдет ATtiny. Но для нашего устройства его уже не хватит, так как нужны ЦАП, АЦП и быстрые вычисления в реальном времени.

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

Основные требования к микроконтроллеру

Производительность

Основной нагрузкой на ЦПУ будет обработка оцифрованного входного сигнала с помощью ДПФ для выяснения того, какой символ был закодирован в сигнале: 0 или 1. Далее этот символ будет отправляться в протокол на уровень выше. Больше всего вычислений будет происходить именно при подсчете гармоник в ДПФ.

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

Результат визуально можно представить в виде эквалайзера, на котором нарисованы полоски определенных частот разной высоты (амплитуды). Для подсчета высоты каждой отдельной полоски нужно сигнал прогонять через ДПФ.

После подсчета некоторого количества гармоник, делаются выводы о том, какой символ закодирован.

В самом простом случае можно просто сравнить амплитуды гармоник 74 и 80 кГц между собой. Если в сигнале преобладает гармоника с частотой 74 кГц, записываем в входной буфер бит 0.

Если в сигнале преобладает гармоника с частотой 80 кГц, записываем в входной буфер 1.

В таком случае, любой шум что-то означает: 0 либо 1, даже если ничего не передавалось. Отделением зерен от плевел будет заниматься отдельная подпрограмма уровнем выше которая будет проверять целостность кадра и прочие прелести.

Задача же этого уровня просто, как конвейер, подавать 0 и 1 наверх, а дальше из них будут складываться правильные целостные кадры данных. Или не будут.

Также можно заморочиться и дополнительно рассчитывать амплитуды смежных гармоник и узнавать уровень шума относительно полезного сигнала. Можно программно фильтровать сигнал и тд. Вариантов много.

Суть в том, что считать, возможно, придется много. Успевать считать нужно гарантированно, так как это реалтайм-конвейер.

Если разложить всю нагрузку на которую ЦПУ тратит время друг за другом, то получим примерно это:

  • оцифровка сигнала

  • подсчет амплитуд гармоник через ДПФ и анализ результата

  • прочая нагрузка (обработка прерываний из интерфейсов USB или CAN, обработчики таймеров, моргания светодиодами, работа с памятью, какие-то вычисления по протоколу и т.д.)

Это должно циклично выполняться каждые 10 миллисекунд снова и снова. ЦПУ никогда не должен быть загружен на 100%, иначе есть риск не успеть посчитать что-то важное. Поэтому всегда нужно оставлять запас по производительности.

Энергоэффективность

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

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

Должен быть достаточно быстрый АЦП

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

Частота дискретизации должна быть минимум в два раза больше частоты измеряемого сигнала [Теорема Котельникова].

Это значит, что для распознавания сигнала нужно сделать от двух точек измерения на период. А по-хорошему 4-5. Посмотрим на примере.

Представим, что мы измеряем сигнал, в котором есть нужная нам гармоника частотой 80 кГц. У сигнала с частотой 80 кГц период 1/80000 = 12,5 микросекунд. Чтобы оцифровать 5 точек на период нужно успевать делать измерение раз в 2.5 микросекунды для адекватного распознавания сигнала.

С пятью точками измерений на период уже выглядит неплохо. ДПФ с этим отлично справится.

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

А так будет выглядеть оцифрованный сигнал, если попасть в момент, когда сигнал в нуле.

Не похоже на синусоиду.

Если интересно посмотреть, что будет, если проводить измерения частотой меньше двух точек за период, то поищите в гугле картинки Эффект алиасинга.

Должен быть достаточно быстрый ЦАП

Для полезного сигнала нужно сгенерировать синусоиду большой частоты. Чем больше точек на период синусоиды успеет генерировать ЦАП, тем плавнее будет сигнал на выходе (меньше лесенка, которую затем сгладит конденсатор).

Представим на примере синусоиды с частотой 80 кГц, период 12.5 микросекунд. Возьмем для начала 4 точки на период. Генерация каждые 3.125 микросекунды.

Такой сигнал сложновато будет сгладить конденсатором, чтобы сделать его похожим на синус.

Увеличим количество точек вдвое. Генерация каждые 1.56 микросекунды.

Нужна достаточная скорость ЦАП для того, чтобы сигнал был хотя бы похож на синус. В нашем случае, с сигналом частотой до 80 кГц, будет достаточно чтобы ЦАП успевал менять уровень сигнала раз в 1.5 микросекунды. Если успеет быстрее, то еще лучше.

С выхода ЦАП этот угловатый сигнал проходит через пассивный фильтр нижних частот и в сглаженном виде идет на усилитель выходной цепи.

Если нет АЦП

Помню, в самом начале я проводил эксперименты на 8-битных AVR от Atmel серии ATmega8, и у них в распоряжении не было АЦП. Но на них было очень удобно начинать знакомство с миром микроконтроллеров. Низкий порог вхождения и никаких танцев с бубнами при запуске.

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

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

Если нет ЦАП

Аналогичная ситуация на ATmega8 была с ЦАП. Его там нет, и мне очень не хотелось заморачиваться с внешним ЦАП.

Оказалось, что можно пожертвовать логическими выходами микроконтроллера и подключить к ним резисторную матрицу R-2R. Таким образом из горстки резисторов собрать свой ЦАП с нужной разрядностью.

Картинка с сайта easyelectronics.ruКартинка с сайта easyelectronics.ru

Подавая 0 и 1 на выходы микроконтроллера, можно получать нужный уровень напряжения на выходе OUT. Чем больше выходов будет использовано, тем выше разрядность ЦАП. По схеме R-2R оставил ссылку в конце.

Выбор подходящего микроконтроллера

После экспериментов на ATmega8 мне захотелось улучшить то, что есть. Выбирая из разных вариантов, я положил глаз на STM32. А конкретно на STM32F103 это 32-битные микроконтроллеры на ядре ARM Cortex-M3 (до 72 MHz).

Эксперименты проводил на отладочной плате, которая, наверное, есть в любом магазине электроники. На отладочной плате сразу располагался программатор, с помощью которого прошивается на МК.

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

Производительность?

Схема тактирования позволяет работать ЦПУ на частоте 72 MHz, что после 8-битных на 20 MHz было с запасом. Хватало для более точных расчетов по алгоритму ДПФ.

Энергоэффективность?

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

Достаточно быстрый АЦП?

Разобрался, как разогнать до максимальной скорости АЦП при частоте ЦПУ 72 MHz. Так как ранее было сказано, что полезный сигнал будет частотой в районе 80 кГц, то будем считать исходя из этого.

В доках для STM32 нашел, как вычислять минимальное время преобразования: нужно к настраиваемому времени семплирования (минимум 1.5 цикла) прибавить 12.5 машинных циклов. Получается 14 машинных циклов на одну точку измерения.

При определенной настройке схемы тактирования на модуль АЦП приходится 14 MHz. Если перевести в секунды, то 14 циклов при частоте тактирования 14 MHz это одно измерение в 1 микросекунду.

Идеально! Даже если полезный сигнал будет частотой 100 кГц, я смогу измерить 10 точек за один период сигнала. С минимальной точностью, но быстро.

Примерно так будет выглядеть оцифровка синусоиды 80 кГц.

Достаточно быстрый ЦАП?

По той же логике нам нужно сгенерировать синусоиду частотой около 80 кГц. И если мы хотим, чтобы синусоида была похожа на синусоиду, а не на странную угловатую фигуру, нужно генерировать одну точку хотя бы раз в 1.5 микросекунды, как мы выяснили ранее.

Почитав документацию, я понял, что в ЦАП STM32F103 встроенный ОУ имеет ограничение в 1 MSPS. Получилось настроить генерацию каждой точки сигнала раз в 1 микросекунду.

Примерно так при этом будет выглядеть синусоида с частотой 80 кГц на выходе из ЦАП.

Периферия

Что еще мне понравилось в STM32F103 это наличие встроенного USB. Там есть режим эмуляции COM порта. Мне показалось это очень удобным, особенно после внешних преобразователей USB-UART.

Можно подключать устройство к ПК обычным шнурком от телефона и через терминал посылать на устройство какие-нибудь отладочные команды.

Для экспериментов подключал два PLC устройства к двум компам, и они посылали друг другу ASCII символы, вводимые с клавиатуры. Получилось что-то вроде чата через розетку 220 В.

Особенности питания устройства

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

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

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

Остальные потребители вроде усилителей входного сигнала во входной цепи, EEPROM памяти или какие-то UART конвертеры потребляют немного.

Стабильное питание микроконтроллера

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

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

Примерная картина потребления мощностиПримерная картина потребления мощности

При передаче кадра это происходит каждые 10 миллисекунд длиной в 1 миллисекунду.

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

Для тяжелых случаев есть пара советов, которые помогут уменьшить влияние скачков напряжения.

Совет 1 - Разделить землю на аналоговую и цифровую

Первый важный момент это обеспечение минимального влияния аналоговой части схемы на цифровую.

Для этого нужно разделить дорожки GND в самом начале схемы питания возле минуса блока питания. Ни в коем случае нельзя их пересекать или как-то замыкать в других частях схемы.

Для питания условно цифровых компонентов схемы (микроконтроллер, EEPROM память и т.д.) от самого блока питания должна идти отдельная линия, можно назвать её DGND.

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

Совет 2 - Не забыть про керамику

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

Картинка с сайта allexpress.comКартинка с сайта allexpress.com

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

С танталовыми осторожнее, они красиво взрываются :).

Еще надо не забыть защитить ножку Reset микроконтроллера, как указано в Datasheet. В противном случае микроконтроллер может внезапно перезагружаться. Если нет светодиодной индикации запуска программы микроконтроллера, то можно этого даже не заметить.

Совет 3 - Экранировать цифровые компоненты

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

Мне помогло расположение микроконтроллера на другой от ВЧ трансформатора стороне печатной платы и наличие земляного полигона под корпусом микроконтроллера.

Картинка с сайта caxapa.ru "Помехоустойчивые устройства, Алексей Кузнецов"Картинка с сайта caxapa.ru "Помехоустойчивые устройства, Алексей Кузнецов"

Подробнее можно почитать в статье по ссылке в конце.

Заключение

В этой части мы в общих чертах разобрали чем занимается микроконтроллер. Узнали некоторые особенности питания устройства и возможные проблемы.

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

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

У кого был/есть какой-либо опыт в PLC обязательно делитесь этим с остальными в комментариях :)

Полезные ссылки

https://nag.ru/articles/article/24485/strasti-po-plc.html - интересная статья по истории PLC
https://www.electronshik.ru/catalog/interfeys-modemy-plc - заводские PLC микросхемы с datasheet (там много схем и характеристик)
https://ru.wikipedia.org/wiki/Частотная_манипуляция - FSK модуляция
http://www.atmega8.ru/ - про ATmega8

STM32
https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html - STM32F103
https://themagicsmoke.ru/courses/stm32/led.html - Помигать светодиодом на stm32
https://blog.avislab.com/stm32-clock_ru - схема тактирования stm32
http://personeltest.ru/aways/habr.com/ru/post/312810/ - подробнее про ЦАП в stm32
https://blog.avislab.com/stm32-adc_ru/ - АЦП в stm32
https://blog.avislab.com/stm32-usb_ru/ - USB в stm32

Аналоговая часть
http://easyelectronics.ru/parallelnyj-cifro-analogovyj-preobrazovatel-po-sxeme-r-2r.html - преобразователь по схеме R-2R
http://caxapa.ru/lib/emc_immunity.html - "Помехоустойчивые устройства", Алексей Кузнецов
https://www.ruselectronic.com/passive-filters - пассивные фильтры

Подробнее..

Power-line communication. Часть 3 Основные блоки устройства

25.05.2021 00:13:35 | Автор: admin

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

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

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

Zero cross детектор

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

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

В электросетях с частотой 50 Гц, синусоида напряжения пересекает ноль 100 раз в секунду.

Есть несколько вариантов исполнения ZC детектора. Ниже я покажу пример реализации на оптопаре.

Начнём с конца схемы сначала представим, как сигнал с ZC детектора попадает на контроллер.

На картинке схема с подтягивающим pull-up резистором и ключом. При замыкании ключа, на вход МК будет подаваться логический 0, а при размыкании ключа, pull-up резистор будет подтягивать напряжение на входе МК до логической единицы.

На место ключа ставим оптрон. Оптрон (оптопара) это простой элемент, в котором с одной стороны светодиод, а с другой фототранзистор.

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

Остается только подавать на светодиод переменное напряжение из сети 220 В, но перед этим его необходимо выпрямить и уменьшить до приемлемого уровня, который выдержит светодиод оптопары.

Для выпрямления можно использовать smd мостовой выпрямитель.

После выпрямления на фотодиод пойдёт пульсирующее с удвоенной частотой напряжение от 0 до 310 В. Разумеется диод не выдержит такого размаха напряжения, поэтому после мостового выпрямителя поставим сопротивление.

Номинал сопротивления можно вычислить исходя из характеристик фотодиода в оптопаре

В datasheet на оптопару пишут максимальный ток, на который рассчитан фотодиод, исходя из этого нужно выбрать сопротивление с расчётом на 310 В. Чтобы резистор не перегрелся, можно вместо одного последовательно поставить несколько резисторов для эффективного отвода тепла (это особенно полезно если у вас SMD резисторы).

Из datasheet на PLC817Из datasheet на PLC817

На примере PC817 видно, что максимальный ток, который выдержит светодиод - 50 мА. Максимальный коэффициент передачи при 20 мА. И "замыкать ключ" он будет уже и при >1 мА.

SMD резисторы типоразмера 1210 выдерживают рассеивание до 0.5 Вт мощности. Максимальный постоянный ток, который мы может пропускать при 310 вольт равен 0.5/310 = 0.00161 А. С учетом, того что у нас пульсирующее напряжение, округлим до 0.002 А (2 мА). Этого тока достаточно, чтобы "ключ замыкался". Номинал сопротивления при этом равен 310/0.002 = 155000 Ом. Итог: ставим последовательно три SMD резистора, типоразмером 1210, номиналом 51 кОм каждый.

В итоге, схема ZC детектора выглядит примерно так.

Теперь микроконтроллеры PLC устройств, подключенных к одной фазе могут синхронизироваться между собой с помощью сигнала на ножке "ZC input" из такого ZC детектора.

Схема согласования сигнальных цепей с линией 220 В

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

Из электросети должны проходить только высокочастотные сигналы. Основная гармоника 50 Гц, на которой передаётся электроэнергия, не должна попасть в сигнальные цепи устройства. Также в этой схеме обычно располагается защита от скачков напряжения и перегрузок.

Эта часть схемы принимает различный вид в разных datasheet на готовые PLC микросхемы. Опишем минимально работоспособный вариант.

Для первых опытов

Можно взять ферритовое кольцо типа 17,5x8,2x5 М2000Н, есть в любом магазине электроники. Провод МГТФ наматываем сразу 3 обмотки в 20 витков.

Конденсатор плёночный из серии MKP или любой аналогичный, который выдерживает от 220 В переменки (с запасом).

Для отсечения ненужных низкочастотных гармоник ставится конденсатор, который выдержит 220 В. После него, для гальванической развязки и также фильтрации, высокочастотный трансформатор. Трансформатор можно сделать с отдельными обмотками для входной и выходной цепей (как на изображениях) или использовать одну обмотку на "вход"/"выход".

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

Варианты схемы согласования можно подглядеть в готовых решениях различных фирм, выпускающих PLC микросхемы. Каждая схема согласования разрабатывается под входные/выходные усилители, используемые в этих решениях.

Входная цепь измерение полезного сигнала

Входная цепь должна выполнить как минимум две задачи:

  • отфильтровать грубый входящий сигнал, срезав все лишнее;

  • после этого усилить сигнал до приемлемого уровня, подходящего для измерения и оцифровки с помощью ЦАП микроконтроллера.

Фильтрация

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

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

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

Усиление

У АЦП есть такая характеристика как разрешение. Оцифровка сигнала происходит с некоторой дискретностью. А после пассивной фильтрации входной сигнал заметно похудеет в амплитуде. И если подать на АЦП очень слабый сигнал, то его форма сильно исказится и потеряется большая часть информации о сигнале.

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

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

Бывает, что одного ОУ не хватает для усиления сигнала до приемлемого уровня. В этом случае можно сразу после первого ОУ поставить второй по аналогичной схеме. В продаже есть микросхемы сразу с двумя ОУ в одном корпусе.

Ссылки на статьи про операционные усилители и их про каскадное подключение оставил в конце статьи.

Выходная цепь генерация полезного сигнала

Задача выходной цепи фильтровать и усиливать сигнал из ЦАП микроконтроллера.

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

Далее сигнал сглаживается фильтром и отправляется в аналоговую часть схемы (усилитель и схема согласования с 220 В).

Можно подумать, что форма сигнала не особо важна при кодировании, так как преобразование Фурье всё равно может вычленить основную гармонику полезного сигнала, отбросив всё лишнее. Но чем сигнал ближе по форме к синусоиде, тем меньше энергии мы будем тратить в пустоту, просто добавляя высокочастотный шум в сеть. И выходной усилитель будет работать стабильнее. Как уже говорилось на входе важна лишь основная гармоника сигнала. Остальные гармоники это шум.

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

При выборе усилителя разбегаются глаза. Не буду рассказывать про всё многообразие, но подскажу вариант для ленивых, как я. Можно использовать одну из готовых микросхем для усиления аудио сигналов в аудиоплеерах. Мощность у них обычно не большая около 1W.

Гуглить их можно по фразе audio amplifier btl 1w. Но тут нужно учесть, что они обычно рассчитаны на аудио сигналы до 20 кГц, и производитель не рассчитывал, что их будут использовать в PLC модеме. Есть модели, которые хорошо усиливают частоты до 100-150 кГц, и обычно в datasheet об этом не пишут.

Плюсы:

  • они очень удобны тем что там встроенная стабилизация сигнала;

  • есть режим mute - мизерное потребление в режиме простоя;

  • хватает однополярного питания не надо париться с блоком питания.

Минусы:

  • во включенном состоянии из-за обратной связи съедают входящий сигнал, поэтому усилитель надо выключать, когда устройство в режиме прослушивания (приёма);

  • большой минус это их незащищённость от импульсных помех в электросети. Сгорают мгновенно. Но от этого можно спастись, поставив на выходе усилителя супрессоры, что-то наподобие P4SMAJ5.0A или аналогичный.

Примерно так выглядит усиление с однополярным питанием.

Также нужно не забыть на выходе усилителя ставить конденсатор, чтобы отсечь постоянную составляющую сигнала.

Итого

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

В следующей части статьи планировал на примерах показать, как можно программно генерировать синус нужной частоты для ЦАП в STM32. И заодно как обработать приходящий на АЦП сигнал и выяснить наличие в нём нужных гармоник (частот) полезного сигнала.


Полезные ссылки

Общее:

Фильтры:

Операционные усилители:

ZC детекторы:

Схемы согласования с 220 В в доках на PLC микросхемы:

Подробнее..

2.07 онлайн-митап про микросервисы и Unit-тесты

24.06.2020 20:23:04 | Автор: admin
В четверг 2 июля собираемся обсудить очередной опыт распила монолита и рассказать, как Unit-тестирование сокращает время разработки. Старт в 16:00 мск, в 17:00 по Ижевску.

Участие бесплатно, нужна регистрация.

Упрощаем себе жизнь с помощью Unit-тестирования


Юнит-тесты повышают скорость разработки согласны?

  • расскажу, почему нетестируемые проекты увеличивают сроки релизов;
  • приведу аргументы в пользу написания юнит-тестов. Рассмотрим, почему хороший дизайн тестируемый, а обратное неверно;
  • плохие юнит-тесты хуже, чем ничего. Поговорим про требования к юнит-тестам. Например, почему важна изолированность или скорость выполнения тестов;
  • расскажу про лучшие практики юнит-тестирования с примерами на NUnit.



Как отпилить часть монолита и не сойти с ума


Я расскажу о нашем опыте отделения части функциональности сервиса в отдельный микросервис:

  • неправильная оценка задачи и её последствия. Как избежать ситуации, когда задача распухает, сроки переносятся, и все нервничают;
  • что делать и чего не делать с зависимостями при разделении проектов;
  • компромиссы, на которые должен идти разработчик или как перестать искать идеальные решения и начать делать рабочие.


Вход свободный, не забудьте зарегистрироваться, чтобы получить ссылку. Если не хватило вводных welcome в комментарии.

А ещё смотрите там же на сайте анонс митапа по управлению проектами 9 июля.

И приходите, будем рады!
Подробнее..

Recovery mode 2.07 онлайн-митап про микросервисы и Unit-тесты

25.06.2020 00:10:20 | Автор: admin
В четверг 2 июля собираемся обсудить очередной опыт распила монолита и рассказать, как Unit-тестирование сокращает время разработки. Старт в 16:00 мск, в 17:00 по Ижевску.

Участие бесплатно, нужна регистрация.

Упрощаем себе жизнь с помощью Unit-тестирования


Юнит-тесты повышают скорость разработки согласны?

  • расскажу, почему нетестируемые проекты увеличивают сроки релизов;
  • приведу аргументы в пользу написания юнит-тестов. Рассмотрим, почему хороший дизайн тестируемый, а обратное неверно;
  • плохие юнит-тесты хуже, чем ничего. Поговорим про требования к юнит-тестам. Например, почему важна изолированность или скорость выполнения тестов;
  • расскажу про лучшие практики юнит-тестирования с примерами на NUnit.


Как отпилить часть монолита и не сойти с ума


Я расскажу о нашем опыте отделения части функциональности сервиса в отдельный микросервис:

  • неправильная оценка задачи и её последствия. Как избежать ситуации, когда задача распухает, сроки переносятся, и все нервничают;
  • что делать и чего не делать с зависимостями при разделении проектов;
  • компромиссы, на которые должен идти разработчик или как перестать искать идеальные решения и начать делать рабочие.


Вход свободный, не забудьте зарегистрироваться, чтобы получить ссылку. Если не хватило вводных welcome в комментарии.

А ещё смотрите там же на сайте анонс митапа по управлению проектами 9 июля.

И приходите, будем рады!
Подробнее..

Записи онлайн-митапов из глубинки

01.10.2020 22:19:19 | Автор: admin

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

И мы тут как тут. За изоляцию мы сделали 6 онлайн-митапов, сегодня делимся материалами с трёх, организованных при участии коллег из EPAM и Контура. На каждом рассматривали по две темы:

Backend

  • Публичные контракты как обеспечить их согласованность.

  • ElasticSearch, и для чего его НЕ надо использовать.

Мобильная разработка

  • Навигация в Android-приложении, её кроссплатформенная реализация.

  • Как и зачем писать свой фреймворк на iOS. Создали в прямом эфире. (EPAM)

AI Meetup

  • Аугментация текстов: как сделать из мухи слона.

  • Сокращение длительности чатов техподдержки с помощью машинного обучения. (Контур)

Далее ссылки на записи и подробности о каждом.


Backend Meetup

https://youtu.be/3NLzI4L-diA

Публичные контракты как обеспечить их согласованность:

  • к каким проблемам приводит недостаточное внимание к публичным контрактам;

  • инструменты (Swagger, OpenAPI, gRPC) и подходы для работы с контрактами на всех этапах разработки ПО;

  • опыт применения OpenAPI в нашей платформе Sungero;

  • способы версионирования и тестирования контрактов (CDC).

ElasticSearch, и для чего его НЕ надо использовать:

  • для чего нужен и из чего состоит ES;

  • про опыт его использования в Directum: сборка и анализ логов, полнотекстовый поиск;

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

+наши наработки на GitHub: плагин морфологии для качественной быстрой лемматизации и модификация библиотеки Tika (что меняли, смотри в докладе). Пригодится, если делаете поиск на русском языке.

Мобильная разработка

Доклад про iOS представил приглашённый разработчик из Минского EPAM Игорь Набоков.

Это скрин для красотыЭто скрин для красоты

Запись лежит в вк и на гугл-диске.

Навигация в Android-приложении:

  • как работает навигация, её кроссплатформенная реализация и проблемы, с которыми столкнулись при рефакторинге навигации в Directum Solo ECM-приложении;

  • как выделять новые объекты навигации, как строить диплинки, как их вообще реализовать, как сделать версии iOS и Android максимально похожими;

  • посмотрели фреймворки, разобрали решения на С#, Xamarin с дополнительным коротким экскурсом в среду поймут все.

Свой фреймворк на iOS:

  • Игорь доказал, что написать свой фреймворк может оказаться простым приятным делом и крутой строчкой в резюме: open-source, автоматизация разработки. Да и разработка для разработчиков это интересно.

  • Рассказал про свой опыт, объяснил, зачем, как, чем может создаваться iOS-фреймворк, какие возникают проблемы, как их решать. Разобрали на примере библиотеки телематики.

  • Для практики взяли такую ситуацию: есть набор классов, который нужно собрать в библиотеку, допустим, какой-то логер. Посмотрели, как из этого сделать бинарный фреймворк, как добавить в fastlane нужные сценарии, как создать репозиторий в CocoaPods, как опубликовать CocoaPods, как залить бинарную часть, например, на s3, как потом создать новое приложение и подключить этот самый свежеопубликованный фреймворк.

AI Meetup

Тему машинного обучения для чатов техподдержки раскрыл Константин Фролов из Контура.

На пару минут позже включили запись.

https://youtu.be/DuRVIn1BGAg

Аугментация текстов: как сделать из мухи слона

Работаете с NLP? Отметьте галочкой, где болит:

  • мало размеченных данных;

  • данные одинаковые, и модель заучивается только на них, не понимая, что делать, когда встречает что-то другое;

  • мало сил и времени, чтобы разметить больше данных.

Мы столкнулись со всем этим при решении задачи из области NER. И решили их с помощью аугментации.

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

Константин Фролов рассказал, как в Контуре разрабатывали оптимальное ML-решение.

Обычно у оператора в работе несколько обращений параллельно. Часто чаты, в которых неожиданно прекратилась активность, например, пользователь ушёл, остаются открытыми. Такой чат продолжает занимать слот оператора и мешает продвижению очереди обращений.

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


Судя по ситуации, тема с онлайн-митапами в Directum продолжается. Все следующие события будем освещать на https://meetup.directum.ru/.

Если есть предложения по темам и желание присоединиться в качестве докладчика - пишите по любым каналам @stalyonka или официально на strelkova_aa@directum.ru.

Надеюсь, были вам полезны! И будем.

Подробнее..

Мы решили внедрить Agile-Lean принципы в процесс разработки на ходу и вот что из этого получилось

19.06.2021 12:05:20 | Автор: admin

Термин бережливого производства (Lean) в настоящее время на слуху. Мы все знаем результаты применения данной идеи в компании Toyota, которые позволили выпускать малые партии комплектующих точно в срок (Just-In-Time, JIT).

В книге Microsoft Secrets (1995 года) авторы (Кузумано и Ричард Селби) описали подходы контроля качества схожие с Lean применяемым в Toyota.

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

В нашем случае было все наоборот: небольшая команда из 5 разработчиков разного уровня, сокращенные сроки и многоэтапная задача внедрения нового программного продукта в крупной организации.

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

Также сказался разный уровень опыта разработчиков, кто-то выполнял поставленные задачи быстро, кто-то медленно, периодически возникали простои в разработке у более опытных сотрудников.

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

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

Отправная точка

Изначально в команде применялась несколько упрощенная методология Scrum. Ниже приведу ее описание.

Набор артефактов:

  1. Project backlog журнал требований, реализуемых в рамках проекта, обнаруженные в процессе эксплуатации инциденты. Обычно требования оформляются в виде User Story. В качестве инструмента для верхнеуровневого планирования использовали Excel. Там же, для удобства, чтобы все было в одном месте, на отдельной странице сделали диаграмму Ганта и диаграмму сгорания.

  2. Sprint backlog журнал требований и инцидентов реализуемых за спринт.

  3. Scrum-доска. В качестве инструмента использовали доску Trello с расширением Plus For Trello для контроля трудоемкости.

Роли в команде:

  1. Руководитель проекта сотрудник, который планирует процесс реализации требований, координирует действия всех участников, вплоть до завершения проекта.

  2. Scrum-мастер обычно тимлид группы разработки, занимается управлением процесса разработки, несет ответственность за конечный результат работы разработчиков.

  3. Команда разработчиков состоит из опытных разработчиков и новичков, которые повышают свои компетенции в процессе участия на проекте.

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

Совещания:

  1. Ежедневный митинг команды.

  2. Ретроспектива в конце спринта.

  3. Ежеквартальные ретроспективы.

Параметры спринта:

  1. Продолжительность: 1 месяц.

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

Данный подход использовался на большинстве проектов, динамика при использовании была положительная.

Во время локдауна подход дал сбой. Удаленная работа наложила свой отпечаток на эффективность работы команды, столкнулись со сложностями, которые необходимо было решить.

Хьюстон, у нас проблемы

Явные проблемы заметили на втором месяце этапа ОПЭ (опытно-промышленной эксплуатации), когда новые требования по дефектам начали закрывать время затраченное на запланированные дефекты и пожелания. Фактически мы стояли на месте. Вероятность успеха сделать все вовремя стремилась к 0.

Для исправления ситуации было решено провести экстренную ретроспективу и собрать все существующие проблемы.

Удалось выявить следующие точки улучшения:

  1. Сильный перегруз разработчиков. Стабильное превышение 8-часового рабочего дня, выход на работу в выходные. Снижена мотивация, нарастает напряжение в команде.

  2. Недостаточное качество итогового кода, требуется повысить контроль качества.

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

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

  5. Много времени уходит на разработку и доработку, консультанты простаивают.

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

А что думает заказчик? Заказчик недоволен динамикой реализации требований. Но готов рассмотреть вариант с четким и прогнозируемым планом.

Именно в этот момент появилась идея использовать подход JIT для улучшения текущей ситуации.

Какие преимущества Agile-Lean мы попробуем использовать в нашем проекте

Основываясь на описании бережливого производства, можно выделить не только сильные, но и слабые стороны для бережливой разработки.

Сильные стороны:

  1. Получение результата в ограниченное время.

  2. Устранение ненужных действий, которые могут снизить стоимость.

  3. Расширение прав и возможностей команды разработчиков, помогающих им принимать решения.

  4. Гибкость проекта, возможность его корректировки под требования заказчика.

Слабые стороны:

  1. Большие требования к вовлеченности команды в процесс.

  2. Строгая документация, что несколько противоречит принципам Agile, когда продукт важнее документации.

  3. Необходимость детального планирования перед каждым спринтом.

  4. Необходимо выделять сотрудников, которые будут следить за процессом, при этом не будут участвовать в производстве, что ослабит команду.

  5. Продолжительность процесса разработки может вырасти, необходимо быть к этому готовым.

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

Адаптируем 7 принципов Lean

Согласно методологии Lean для разработки программных продуктов, выделяется 7 основных принципов:

  • Исключение потерь. Потерями считается все, что не добавляет ценности для потребителя: излишняя функциональность; ожидание (паузы) в процессе разработки; нечеткие требования; бюрократизация; медленное внутреннее сообщение.

  • Акцент на обучении. Короткие циклы разработки, раннее тестирование, частая обратная связь с заказчиком.

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

  • Предельно быстрая доставка заказчику. Короткие итерации.

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

  • Интегрирование. Передать целостную информацию заказчику. Стремиться к целостной архитектуре. Рефакторинг.

  • Целостное видение. Стандартизация, установление отношений между разработчиками. Разделение разработчиками принципов бережливости. Мыслить широко, делать быстро, ошибаться мало; учиться стремительно.

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

1. Убрать ненужное

Под ненужным будем понимать следующее:

  1. Все, что не приносит пользы конечным пользователям. Сюда относятся непонятные и несрочные требования, редко проявляющиеся дефекты. Мы их откладываем или отказываемся вовсе после согласования с заказчиком.

  2. Ненужный код, дублирование кода.

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

  4. Программные дефекты. Любые дефекты появляются, когда код не проходит достаточную проверку качества.

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

Что мы сделали, чтобы решить задачу:

  1. Детальная проработка требований и согласование описания требований с тимлидом разработки, дополнительная расшифровка требований тимлидом на понятный для разработчиков язык.

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

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

  4. Формирование задач из набора требований в рамках одного реализуемого процесса. Расчет: разработчик загружен на одну задачу не менее 8 часов.

2. Создавать знания и обмениваться ими

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

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

3. Повышение качества кода

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

Для повышения качества были приняты следующие предложения:

  1. Парное программирование. Непосредственное взаимодействие тимлида с разработчиками, совместный анализ требований, проектирование, решение сложных задач.

  2. Степень готовности (Definition of Done, DoD). Задача считается завершенной только в том случае, когда разработчик обсудил реализацию с тимлидом и провел демонстрацию разработанной функциональности консультанту, который закреплен за данной задачей.

  3. Максимальное количество задач в работе (Work In Progress, WIP) каждого разработчика. У разработчика в работе и в тестировании суммарно не может быть больше 3-ех задач. Если разработчик отправил на тестирование все 3 задачи, то он обязан довести эти задачи до публикации в продуктивную систему, для этого активно взаимодействует с консультантами, отвечает на возникающие вопросы, помогает в процессе тестирования.

4. Сокращение спринтов

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

Поэтому решили сделать ряд ограничений на спринт:

  1. Спринт длится 1 рабочую неделю.

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

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

  4. Публикация на продуктивный стенд выполняется только один раз в последний день спринта.

  5. После каждого спринта собирается сокращенная ретроспектива на 30 минут для сбора фидбека с команды.

5. Расширение полномочий команды

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

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

Для реализации данного принципа проводятся встречи ответственных лиц проекта 1 на 1 с каждым участником команды, выявляются конфликтные ситуации, и затем выносятся на очередную ретроспективу, как общая точка улучшения.

6. Не торопиться с принятием решений

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

Решение принятое под воздействием эмоций может породить к большому числу проблем.

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

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

Для улучшения процесса разработки необходимо выделить роль, которая будет этим заниматься.

Для реализации данного принципа с тимлида команды разработки были сняты все задачи по разработке и переданы команде, объем задач на спринт был сокращен, т.к. команда разработки фактически ослабла.

Тимлид команды теперь выступает в качестве наставника:

  1. Организует периодическое обучение, разбор сложных ситуаций.

  2. Инициирует передачу опыта между разработчиками.

  3. Помогает консультантам в формировании требований, а разработчикам в реализации этих требований.

  4. Занимается развитием разработчиков и расширением их компетенций.

  5. Занимается подбором и развитием инструментария, повышающего эффективность процесса разработки.

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

Основная проблема бережливого производства отодвигание сроков

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

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

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

Итоги

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

Методология Lean Agile представляет собой ориентированную на клиента, адаптированную и гибкую систему, не предлагает жестких правил, которые потребуется выполнять. Всегда потребуется адаптировать эту методологию к своим существующим процессам, требованиям проекта, особенностям заказчика.

Но в любом случае необходимо взрастить эксперта среди ваших сотрудников. Он будет сосредоточен на улучшении процесса разработки и мотивирован в повышении своих навыков и навыков команды разработки.

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

  1. Обеспечить единую общую среду общения и обмена знаниями.

  2. Организовывать совместные видеоконференции, желательно с камерой, чтобы видеть эмоции участников.

  3. Не пренебрегать неформальным общением.

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

По итогам внедрения Lean получили следующие количественные изменения:

  1. Скорость разработки стала прогнозируемой и составила примерно 4 крупные задачи (до 6 часов на задачу в среднем) на сотрудника в неделю, ранее мощность команды в среднем составляла до 2-3 завершенных задач в неделю на сотрудника. Да, задачи крупные и это не совсем по Agile, но это помогло в нашей ситуации.

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

  3. Уменьшилось вдвое количество задач, возвращаемых на доработку.

  4. Еженедельно закрывалось по 3 крупные задачи из техдолга.

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

Данный опыт планируется транслировать на другие проекты компании.

Спасибо за внимание, коллеги! Хотелось бы увидеть в комментариях ваш опыт использования Agile-Lean (или их адаптации) на ваших проектах.

Подробнее..

Выбор инструмента безвозвратного уничтожения документов в электронном архиве

27.07.2020 22:10:16 | Автор: admin
Уничтожение документов, срок архивного хранения которых истек, и дальнейшее хранение которых не требуется один из элементов работы архива любой организации. Для уничтожения документов на бумажных носителях применяются методы физического уничтожения сжигание, химическая обработка, шредирование, гарантирующие невозможность восстановления информации. Для документов, хранящихся в электронном виде, применяются иные методы: уничтожение данных на носителе либо уничтожение самого носителя данных. Инструментов уничтожения данных существует предостаточно, но далеко не все они оказались применимыми для автоматизации уничтожения документов в архиве.

Задача


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

Поскольку процесс удаления документов реализован тоже на IS-Builder, то и средство уничтожения файлов мы искали такое, работой которого можно управлять из кода на встроенном языке программирования системы Directum. С точки зрения быстродействия, к инструменту предъявлялось требование: инструмент должен тратить не более одной секунды на уничтожение файла размером один мегабайт. Что касается алгоритма, применяемого инструментом для уничтожения данных, то обязательно соответствие ГОСТ Р 50739-95, и приветствуется поддержка нескольких алгоритмов для возможности выбора. Также инструмент должен быть свободно распространяемым и бесплатным для коммерческого использования.

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

  • утилита SDelete из набора Sysinternals;
  • Eraser утилита с интересным подходом к уничтожению;
  • ну и на реализацию инструмента прямо на IS-Builder мы тоже возложили надежду.


Как мы тестировали


Для тестирования мы подготовили на жестком диске небольшой раздел, чтобы было проще окинуть взглядом наш театр военных действий. На этом диске мы создавали файлы, уничтожали их разными способами и затем смотрели, что от них осталось. Уничтожение считается успешным, если выполнено со скоростью не ниже требуемой, и не удается найти ни одного фрагмента исходного файла. А чтобы сравнение инструментов было честным, для уничтожения файлов во всех инструментах был применен один и тот же алгоритм, поддерживаемый ими всеми DOD 5220.22-M, формально удовлетворяющий и требованиям ГОСТ.

Для контроля результатов уничтожения мы использовали следующие инструменты:

  • WinHex условно бесплатная утилита, получающая доступ к содержимому носителя на низком уровне, позволяющая искать данные по фрагменту содержимого и восстанавливать их;
  • DiskView еще одна утилита от Sysinternals. Она использовалась скорее в процессе, чем для контроля результатов с ее помощью мы наблюдали географию расположения фрагментов файлов в кластерах на диске.

Инструмент на IS-Builder


Суть алгоритма DOD 5220.22-M достаточно простая, и мы реализовали его на встроенном языке программирования системы Directum. На вход алгоритм получает имя файла и запрашивает у файловой системы его размер в байтах. Затем три раза генерируется буфер вычисленного размера, который записывается в указанный файл. Красота подхода в том, что алгоритм уничтожения может быть реализован совершенно любой, с любым количеством проходов и самыми немыслимыми шаблонами перезаписи. Кроме того, поскольку инструмент реализуется на IS-Builder без зависимостей от внешнего ПО, со встраиванием его в прикладную разработку системы Directum не возникает совершенно никаких сложностей. И работает-то он быстро. Вот только не уничтожает данные! WinHex обнаружил на диске не просто фрагменты исходного файла, а весь файл целиком и успешно его восстановил. Выяснилось, что в момент записи первого же буфера на диск местоположение файла на диске меняется: исходный файл располагался в начале раздела, а оказался посередине или в конце. Это мы выяснили с помощью DiskView. Исходные же кластеры хоть и помечены свободными, но все еще содержат в себе данные. Это, разумеется, никуда не годится. Способы записи в файл использовали разные, результат везде одинаковый, данные можно найти и восстановить. Получается, мы можем генерировать буфер для перезаписи, но не можем правильно записать его на диск. И поскольку рабочих схем найти не удалось, пришлось попрощаться с идеей обойтись встроенными в Directum средствами.

SDelete


docs.microsoft.com/en-us/sysinternals/downloads/sdelete

В утилите SDelete от Sysinternals реализован всего один алгоритм удаления (DOD 5220.22-M), но можно указать количество проходов перезаписи, уничтожить дерево каталогов со всем содержимым и даже выполнить зачистку незанятого места на диске. SDelete является утилитой командной строки и имеет всего несколько ключей, так что вызвать ее из вычислений IS-Builder несложно:
SDelete = "C:\Sysinternals\SDelete\sdelete.exe"Command = Format('"%s" -p 1 "%s"'; ArrayOf(SDelete; Filename))ExecuteProcess(Command; smNormal; wmYes)

В результате применения утилиты файлы исчезли с диска практически бесследно: с помощью WinHex удалось обнаружить только следы перезаписи имени файла, но содержимое найти и восстановить не удалось. При этом работала утилита довольно быстро (удаление файла размером 1 мегабайт = 0,2 секунды) и заслуженно вырвалась в лидеры.

Eraser


eraser.heidi.ie

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

  • об объекте уничтожения это может быть конкретный файл или каталог, содержимое Корзины пользователя, незанятое место на диске. Это также может быть безопасное перемещение файлов или папок или полная очистка раздела на жестком диске;
  • об алгоритме уничтожения Eraser знает несколько готовых алгоритмов перезаписи, а также предлагает возможность создать свои собственные, настроив необходимое количество проходов и указав для каждого из них свой шаблон данных для перезаписи;
  • о времени старта задача может быть выполнена непосредственно после помещения в очередь, по расписанию, при загрузке операционной системы или вручную.


Работающий в фоне процесс Eraser занимается обработкой очереди и выполнением задач. Таким образом, уничтожение данных в Eraser это всегда асинхронный процесс, очень напоминающий серверные события в Directum.

Управление утилитой с помощью ключей командной строки тоже работает, причем давно, хотя работа в командной строке до сих пор официально не заявлена и находится в статусе разрабатываемой функциональности:
Eraser = "C:\Program Files\Eraser\Eraser.exe"Command = Format('"%s" erase /method="ecbf4998-0b4f-445c-9a06-23627659e419" /quiet file="%s"'; ArrayOf(Eraser; Filename))ExecuteProcess(Command; smNormal; wmYes)

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

Результаты


Если бы не досадный фэйл с записью буфера на диск, реализация на IS-Builder выглядела бы на миллион, но, увы, до финиша она не дошла. Два других инструмента показали себя гораздо лучше, при этом наиболее выигрышно выглядит утилита SDelete. Она не требует установки, обладает хотя и минимальным, но достаточным функционалом и хорошим быстродействием.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru