Самодельный плк. Принцип работы и основы программирования плк. ПЛК Ace в домашней автоматизации

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

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

Как-бы то ни было, иногда возникает ситуация, что ПЛК выходят из строя и ремонт возможен только у производителя. Ведь простая замена ПЛК на точно такой же ничего не дает, поскольку отсутствует управляющая программа. Хорошо, если производитель в такой ситуации может оказать помощь. А если нет? Брать другой ПЛК и программировать его самостоятельно? Но если уж приходится самостоятельно программировать, то почему обязательно ПЛК? Не будет ли проще и дешевле запрограммировать систему на базе микроконтроллера? Ведь, как отмечалось выше, в ПЛК заложено много избыточных функций и вычислительных возможностей, за которые приходится платить.

Именно из соображений, изложенных выше, была разработана схема простого ПЛК для замены вышедшего из строя ПЛК KUAX667 на швейном автомате VS3005 - AMF Reece S 2000. Не будем останавливаться на описании данного швейного автомата, тем более, что рассматриваемая здесь схема повторно использовалась на другом станке в мебельном производстве. При разработке ПЛК ставилась задача создать схему максимально дешевую, из доступных деталей, с возможностью диагностики даже с учетом отсутствия дисплея. Также было принято решение отказаться от гальванической развязки входных цепей, поскольку датчиками служили кнопки, концевики и переключатели, осуществляющие простой механической контакт.

Схема устройства и принцип работы аналогичны построению большинства промышленных ПЛК. Есть центральный микроконтроллер и есть порты ввода-вывода.

За основу взят микроконтроллер фирмы PIC12F629. Этот микроконтроллер выбран исходя из доступности и дешевизны. Входа и выходы реализованы с помощью сдвиговых регистров. Логически они разбиты на две группы по 8 контактов. Передача данных происходит в последовательном виде. Протокол передачи данных идентичен протоколу SPI, однако он полностью реализован программно и на 16 бит. Цепи для входных данных и выходных данных сделаны раздельными. Это, на мой взгляд, облегчает понимание работы и упрощает контроль. Кроме того это позволило использовать ранее написанные модули для приема-передачи данных в сдвиговые регистры. Ну и все-равно эти выводы остались бы неиспользованными, так зачем пропадать добру:) . Входными элементами являются концевики, кнопки, переключатели с коммутацией на общий провод. Поэтому входа реализованы без использования оптопар. Конечно, это снижает надежность схемы. Но, как показала практика, ПЛК работает стабильно. При использовании регистров 155ИР9 или 555ИР9 подтягивающие резисторы к +5 В можно не устанавливать (именно этот вариант представлен на фото ниже). При использовании регистров 74HC165 наличие подтягивающих резисторов обязательно. Особо следует отметить вход 1.0. Этот вход реализован с использованием оптопары и расширителем импульсов на микросхеме 155ЛА3. В одном из станков датчиком вырабатывался импульс +24 Вольта и длительностью около 1 мксек. Поскольку реальная частота опроса входов составляла около 1 кГц, то был риск, что импульс будет пропущен. Для исключения этого в схему был введен расширитель импульсов, увеличивающий время импульса примерно до 0,1 сек. Время импульса определяется элементами C1, R4. Перестановкой джамперов на плате (на схеме джамперы не указаны, их можно отследить по печатной плате) возможна коммутация входа 1.0 минуя оптопару, минуя расширитель импульсов или минуя оптопару и расширитель импульсов. Благодаря встроенным в регистры триггерам, фиксирующим входные уровни по сигналу строба, исключена возможная неопределенность уровней логический "0" или "1". Это, а также последовательный опрос входных цепей микроконтроллером, позволило не учитывать явление "дребезга", характерное для механических датчиков. Исполнительными механизмами являются обмотки пневмоклапанов и реле, которые подсоединены к сдвиговым регистрам 74HC595 через микросхемы-драйвера ULN2803. Питание осуществляется от источника постоянного напряжения +24 Вольта, имеющегося в станке для питания обмоток реле и пневмоклапанов, через импульсный стабилизатор напряжения на LM2576 (микросхема в корпусе TO-263 для поверхностного монтажа, расположена со стороны фольги, фольга же служит и радиатором), включенной по типовой схеме.

Вся схема собрана на плате 100*130 мм. Рядом с каждой микросхемой по питанию стоит конденсатор, емкостью по 0,1 mkF (на схеме не показаны). Как уже выше отмечалось, в устройстве использовались микросхемы 555ИР9, не требующие подтягивающих резисторов. Тем не менее, для использования 74HC165, на плате предусмотрена возможность установки подтягивающих резисторов, которые могут быть от 1 до 10 кОм. В качестве подтягивающих резисторов хорошо использовать сборки сопротивлений типа 9A472J (неиспользуемые выводы просто обкусываются), которые широко применялись в компьютерах на базе 286-486 процессоров.

Программа для микроконтроллера написана в среде PIC Simulator IDE, которая использует диалект языка BASIC. Использование BASIC позволяет легко разрабатывать программы не особо погружаясь в архитектуру микроконтроллеров. Кроме того, так или иначе, с реализациями языка BASIC приходится сталкиваться начиная со школьной скамьи и у большинства непрофессиональных разработчиков он не вызывает почтительного опасения. Рассмотрим программу и остановимся на тех местах, где непосредственно происходит настройка на тот или иной станок.

Программа прилагается в полной версии для швейного автомата. Сначала идет секция описания переменных и символов. При переделке программы под другое оборудование неизменными будут строки с 7 по 11, здесь объявляются переменные для полученных/передаваемых данных и служебная переменная и с 18 по 28, относящиеся к описанию контактов для протокола приема/передачи данных. Далее в программе с 50-й по 96-ю строки идет проверка на включение режима "Тест" и реализация тестового режима. Режим "Тест" включается установкой перемычки между выводом GP2 (5-й вывод) и общей шиной (кнопка "Test" по схеме) до подачи питания на схему. При подаче питания микроконтроллер устанавливает вывод GP2 как вход (строка 54), включаем подтягивающие резисторы (стоки 64,65), производит опрос состояния вывода GP2 (строка 76). Если режим тестирования установлен, то после снятия перемычки начинается бесконечный цикл (стоки 81-95), в котором состояние выходов напрямую зависит от состояния входов. Таким образом последовательно замыкая входа мы можем проверить срабатывание исполнительных элементов, подсоединенных к выходам, т.е. произвести тестирование оборудования от датчиков до исполнительных механизмов.

При подаче питания без установленной перемычки микроконтроллер перейдет к участку программы, где запрограммирован непосредственно рабочий режим станка (в данной программе это строки 98-261). Эта часть программы оставлена для примера и, поскольку она привязана непосредственно к оборудованию, то особо ее рассматривать не будем. Остановимся только на общих принципах работы и подпрограммах приема-посылки данных. В простейшем случае при работе оборудования производится опрос входов (подпрограмма data_input, используемая в ней подпрограмма sinchro_input). Состояние входов в программе сохраняется в переменных data_in1 и data_in2. В зависимости от алгоритма работы оборудования в программе анализируется состояние входов, принимается решение об изменении состояния выходов и это решение записывается в данные data_out1 и data_out2. После этого производится вывод данных (подпрограмма data_out, используемая в ней подпрограмма sinchro_out). И так цикл повторяется до прекращения подачи питания. В случае необходимости возможна организация программы с использованием прерываний микроконтроллера. К примеру, это может понадобится при осуществлении операций на оборудовании, ограниченных по времени.

При программировании микроконтроллера необходимо установить слово конфигурации в &h31С4. Расшифровку можно посмотреть на рисунке ниже.

P.S. Этот абзац специально для критиков. Как уже выше отмечалось, программа писалась не "с нуля", а с использованием уже готовых наработок. Поэтому в программе много комментариев от предыдущих программ, в том числе имеются и комментарии, касательно использования прерываний по таймеру. Я специально не стал их убирать, поскольку считаю, что они могут помочь другим людям при модификации программы. Если же данную программу переписать заново, то наверняка можно достичь более оптимального кода и более высокой частоты опроса входных элементов. Как говориться "нет такой программы, которую нельзя сократить хотя бы на одну команду". Но даже в таком виде программа занимает менее 700 байт и станок, под управлением данной программы, работает стабильно.

Ну и напоследок фотографии собранной и установленной в станок платы.

В архиве:
1. PLC 12F629 - исходный файл и HEX файл.
2. Проект в .
3. Печатная плата в

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК PIC 8-бит

PIC12F629

1 В блокнот
U2, U3 Сдвиговый регистр

SN74HC595

2 В блокнот
U4, U5 Сдвиговый регистр

SN74HC165

2 В блокнот
U6 Вентиль

SN7400

1 В блокнот
U7 Оптопара

Я занимаюсь разработкой программ для программируемых логических контроллеров(ПЛК) в промышленных автоматизированных системах управления технологическими процессами(АСУ ТП).

Для тех, кто сталкивается с этим словом впервые, поясню. ПЛК это специальный мини-компьютер, который работает так:
1. Принимает входные дискретные (Di) или аналоговые (Ai) сигналы;
2. Обрабатывает эти сигналы по заданной программистом программе;
3. Выдает управляющий сигнал через дискретные (DO) или аналоговые (AO) выхода.

Дискретный - когда у сигнала может быть только 2 состояния: 0 или 1, «да» или «нет». Например, кнопка нажата или отжата, лампочка включена или выключена.
Аналоговый - когда значение параметра зависит от уровня электрического сигнала. Например, чем выше уровень сигнала (вольт или миллиампер) от датчика температуры, тем больше измеряемая температура.

Применяются ПЛК в основном в промышленности, станках, системах домашней автоматизации «умный дом» и т.д.

Естественно, в силу профессии меня интересует все, что касается ПЛК и другого оборудования, применяемого в АСУ ТП. Как-то, бродя по сети, я зашел на сайт американской компании Velocio , которая производит ПЛК серий Ace, Branch, Embeded.

Главные фишки этих контроллеров - маленький размер, всего 2.5"" x 2.5"", питание 5 вольт и цена от 49$ за модель с 6 дискретными входами и 6 дискретными выходами. Особенно впечатлил размер, такого маленького ПЛК я еще не встречал:

ПЛК меня заинтересовал, я связался с компанией Velocio и мне прислали контроллер модели Ace 3090v5. Хотелось бы вкратце рассказать об этом ПЛК и более широкой аудитории Хабра. Забегая вперед скажу, что ПЛК компании Velocio лучше всего подходят для «умных домов» и прочих систем домашней автоматизации.

Вот ко мне пришла посылочка с контроллером прям из города Хантсвилл, штат Алабама:

Состав посылки:
1. ПЛК Velocio Ace 3090v5, $179
2. Крепление на DIN-рейку, $5
3. Коннекторы сигнальных линий (3,4,8 pin, шаг 2.5 мм), 6 шт., $6*3
4. Отвертка плоская, жало 1.5 мм, бесплатно
5. Коннектор питания (2 pin, шаг 2.5 мм), $2
6. Кабель USB Am-miniB, $5

Кабель USB для программирования Ace не обязательно покупать в Velocio, это обычный кабель USB Am-miniB, который продается в любом компьютерном магазине. Коннекторы тоже можно поискать в другом месте, но крепление на DIN-рейку уникально и его нужно покупать вместе с контроллером.

Ожидания Ace 3090v5 оправдал, он действительно очень маленький:

Характеристики:

Название Velocio Ace 3090v5
Назначение ПЛК для домашней и промышленной автоматизации
Кол-во DI 6
Кол-во DO 18, транзисторные
AI Кол-во, всего 7
Кол-во AI 16 бит/ тип 4/ Термопары J, K, T, N;
±0.256 V, ±0.512 V, ±1.024 V, ±2.048 V
Кол-во AI 12 бит/ тип 3/ 0…+5 V
Порты связи Mini USB(может работать по Modbus), RS-232
Протоколы передачи данных Modbus RTU slave
Скорость передачи данных, bps 9600, 19200, 38400, 57600
Крепление DIN-рейка
Питание 5 V DC
Габариты 63.5х63.5х12.7 мм
Температура эксплуатации -40… 85°С
Степень защиты IP IP65
Среда программирования Velocio vBuilder, бесплатная
Цена 179 $

Конструкция

При своих размерах, контроллер в общей сумме имеет 31 вход и выход, порт последовательной связи RS-232 и порт Mini USB для загрузки программ и связи с внешними устройствами.

Спереди на корпусе видны светодиоды индикации питания и состояния дискретных входов и выходов:

Сзади на корпусе имеются выемки для монтажа крепления на DIN-рейку:


На боковых стенках корпуса находятся порты для подключения всех сигналов через разъемы. Порты маркируются литерами A, B, C, D, E, F:


Подключение проводов происходит через коннекторы COMBICON PTSM Series фирмы Phoenix Contact с шагом ножек 2.5 мм (0.098""):

Вставляются провода в коннектор с помощью идущей в комплекте с ПЛК отверткой так:

Дискретные выхода- транзисторные, на то есть такие причины:

  • реле в корпус контроллера все равно не поместится
  • для обеспечения большого быстродействия, например при управлении шаговыми двигателями
Естественно, для коммутации электрической сети 220 В транзисторные выхода не подходят и нужно после них ставить промежуточные реле. Можно купить модули с промежуточными реле там же у Velocio, при покупке ПЛК. А можно сэкономить и купить на ебее аналогичные китайские платы , как сделал я:

Аналоговые входа (Ai) в Ace 3090v5 разделены на 2 группы:

  • 3 Ai с общей землей в порту A, диапазон входных сигналов 0… 5 V
  • 4 Ai дифференциальных в порту F, подключение датчиков температуры(термопар) типа J, K, T, N, а так же милливольтных сигналов
Вот я подключил на вход Ai F1 термопару типа «К» от китайского тестера и вывел значение температуры на ноутбук:

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

Ace отличается маленьким энергопотреблением: 5 В при макс. силе тока до 0.3 А. То есть, в качестве блока питания можно использовать 5-вольтную зарядку для мобильника.

Программирование

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

Изучение vBuilder лучше начать с просмотра видеоуроков . Есть так же полная документация на английском языке под названием «vBuilder Manual» в несколько сотен страниц.

Разработка программ возможна на двух графических языках: языке релейной логики(Ladder Logic) и языке блок-схем(Flow Chart).

Язык релейной логики (Ladder Logic) это хорошо известный всем программистам ПЛК язык , который является одним из стандартизированных по стандарту IEC 61131-3 промышленным языком.
LD придумали специально для того, что бы на нем писали программы не только программисты, но и обычные электрики. Программа на LD и выглядит, как электрическая схема:

Это легкий для изучения и работы язык.

Язык блок-схем (Flow Chart) это графический язык, на котором программа создается в виде блок-схем :

Блок-схемы и принципы их построения многие помнят еще со времен информатики в школе. Например, я закончил 11 класс в 1999 году, в мрачные времена постсоветского компьютерного средневековья. Тогда фирма «Интел» уже торговала процессорами Pentium-II, Билл Гейтс продавал Windows 98, а в нашей школе стояли советские компы «Электроника» с черно-белыми экранами. Большую часть урока мы сидели за партой и рисовали программы в тетрадях именно блок-схемами. Потом переводили их на бейсик, садились за «Электронику» (по 4 человека на машину) и уже после вводили в компьютер. А в других школах вообще компьютеров не было.

Так что для начинающих язык Flow Chart даже легче, чем LD. При этом, по моему мнению, он нагляднее и позволяет создавать более сложные программы. Кстати, блок-схемы я часто использую и сейчас, работая с различными ПЛК. Когда мне нужно продумать какой-нибудь сложный алгоритм, я сначала рисую блок-схемы на листике, а потом уже перевожу их в программу на конкретном языке.

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

  • сравнение(<, >,= и др.)
  • присваивание с возможностью ввода формул
  • копирование
  • счетчик
  • таймер
  • часы реального времени
  • цифровой фильтр
  • чтение энкодеров
  • управление шаговым двигателем
  • ПИД-регулятор
  • плавный пуск/останов
  • масштабирование
  • побитовый сдвиг и «переворот» числа
  • статистика
  • управление com-портом для реализации собственных протоколов передачи данных
  • вызов подпрограмм
В качестве «быстрого хэлпа» по программным блокам используется та же страница загрузки vBulder . Просто жмешь по пиктограммам соответствующих блоков vBuilder справа на странице и читаешь, как они работают:

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

Доступные возможности при программировании:

  • создание собственных переменных (тэгов) типа bit, unsigned int 8/16 bit, signed int 16/32 bit, float;
  • создание массивов;
  • создание подпрограмм;
  • причем, подпрограммы здесь это объекты по типу FB как в Step-7 и Codesys;
  • каждому входу/выходу и тэгам можно назначить адрес для передачи их значений по Modbus;
  • cвязь по Modbus с ПК, сенсорными панелями и др. по Modbus в режиме slave; возможно подключение по Modbus к 2-м мастер-устройствам одновременно;
  • возможность реализовывать собственные протоколы передачи данных по RS-232;
  • отладка программы по шагам.

Подключение Ace к компьютеру и сенсорным панелям

Для связи с внешними устройствами по сети в Ace 3090v5 имеется 2 порта: RS-232 и USB. Оба этих порта могут передавать данные по протоколу Modbus RTU slave. Одновременно к Ace могут быть подключены 2 мастер устройства. Например, компьютер по USB, а сенсорная панель по RS-232. Для управления с компьютера применяются специальные программы типа SCADA , но можно и на каком-нибудь визуал бейсике программу написать.

RS-232 это старый добрый COM-порт компьютера. Раньше в него мыши подключались. Для подключения компьютера к Ace я и нашел старую комовскую мышь с шариком, отрезал от нее хвост и подключил его к 3-пиновому разъему RS-232 Aсe вот по такой схеме:

Если в компьютере нет COM-порта, нужно купить любой преобразователь USB/RS-232 по цене около $8.

Варианты реализации обмена данными Ace с внешними устройствами:

  • по внутреннему протоколу Ace для связи с компьютером, на котором установлена бесплатная SCADA vFactory;
  • по универсальному протоколу передачи данных Modbus RTU для связи с компьютерами, сенсорными панелями и другими ПЛК;
  • по собственному протоколу, реализованному программным путем в контроллере.
Бесплатная СКАДА vFactory работает только с ПЛК компании Velocio, потому что использует не Modbus, а внутренний закрытый протокол контроллеров. Документации на vFactory нет, чтобы ей овладеть, достаточно одного видеоурока . Очень простая СКАДА без скриптового языка и возможности ведения архивов. Панель инструментов невелика:

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

Если возможностей vFactory маловато, можно подключить по протоколу Modbus RTU любую другую SCADA. Например, в ролике с термопарой, я применил SCADA Trace Mode 6 Base.

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

ПЛК Ace в домашней автоматизации

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

Если контроллер Ace понравился, но 6 дискретных входов маловато, можно присмотреться к серии Branch - тот же Ace, только с возможностью подключения модулей расширения (до 450 входов/выходов). Впрочем, это уже без меня - мне пока хватит поиграться Ace.

Теги: Добавить метки

Уже не просто контроллер солнечных систем…

Включить, если T2>40C и выкл если T2<30.5

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

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

Мой контроллер стал более гибким. Теперь, по вашему желанию, вы можете запрограммировать логику работы 4-х или 8-и выходов. Если вы используете одну из стандартных схем, то выходы в ней уже заняты – как правило 1 – 4, и тогда вы можете программировать выходы 5, 6, 7, 8. А если вы выбрали схему Custom (пользовательская) тогда для настройки доступны все 8 выходов с первого по восьмой.

Как же программировать?

Контроллер поддерживает 3 типа условий. Обычные – это условие для нагрева или охлаждения. Дифференциальные - не пугайтесь этого слова, это обычная разница между двумя датчиками температуры. Такие условия служат для перекачки тепла или холода из одного места в другое. И третье условие – блокировка выхода, если температура перешагнула через заданный порог.

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

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

[+]P1: T1 19.8C On < 21.0C Off > 23.0C [+]P2: T2 19.5C On < 20.0C Off > 22.0C 19.8C и 19.5C - это просто текущее зачение датчик T1 и Т2 соответственно.

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

Для второго этажа все аналогично, выход P2 включится, когда на втором этаже температура упадет ниже 20 градусов, и выключится, когда этаж нагреется до 22 градусов. Обычно, на втором этаже (спальном) допускается меньшая температура, чем на первом.

Разумеется, что вы можете выставлять любую желаемую для вас температуру, но помните: устанавливайте комнатную температуру ровно такой, чтобы обеспечить чувство комфорта. Увеличение на каждый градус обозначает увеличение расхода энергии приблизительно на 6 %. При задании температуры учитывайте назначение помещения. Так, например, обычно не требуется нагревать до 20 °C спальню или редко используемые помещения. Vaillant

На схеме изображено как контроллер может поддерживать постоянную температуру в доме. Он снимает показания с датчиков Т1 и Т2 (первый и второй этаж) и при этом перекрывает или открывает батареи (радиаторы) с помощью релейных выходов P1, P2 которые подключены к сервоприводам.

Замечательно то, что если вместо выхода P1 и Р2 использовать P5 и P6 а вместо датчика T2, к примеру T5, то контроллер при этом сможет управлять солнечными коллекторами, и так же отслеживать температуру в вашем доме.

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

Рассмотрим более сложный пример, но очень похожий…