Научная статья на тему 'IPC@CHIP + CoDeSys или маленькие ядра для большой артиллерии. Часть 3'

IPC@CHIP + CoDeSys или маленькие ядра для большой артиллерии. Часть 3 Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
360
333
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Пастушенков Дмитрий

Итак, мы делаем большой шаг и переходим в мир CoDeSys, как и было обещано во второй части нашей статьи (см. КиТ № 6'2005). Именно в мир CoDeSys, а не IPC@CHIP, потому что работа в этой системе программирования практически одинакова для любого контроллера — в этом и заключается цель CoDeSys и стандарта МЭК 61131-3. Недаром лозунгом организации CoDeSys Automation Alliance (рис. 1), объединяющей изготовителей оборудования для промышленной автоматизации, является фраза «One world. One tool» («Один мир. Один инструмент»). Но все-таки у BECK IPC@CHIP есть одна очень важная особенность, о которой мы поговорим в этой статье.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «IPC@CHIP + CoDeSys или маленькие ядра для большой артиллерии. Часть 3»

IPC@CHIP + CoDeSys,

или Маленькие ядра для большой артиллерии-3

Дмитрий ПАСТУШЕНКОВ

prolog@sci.smolensk.ru

Итак, мы делаем большой шаг и переходим в мир CoDeSys, как и было обещано во второй части нашей статьи (см. КиТ № 62005). Именно в мир CoDeSys, а не IPC@CHIP, потому что работа в этой системе программирования практически одинакова для любого контроллера — в этом и заключается цель CoDeSys и стандарта МЭК 61131-3. Недаром лозунгом организации CoDeSys Automation Alliance (рис. 1), объединяющей изготовителей оборудования для промышленной автоматизации, является фраза «One world. One tool» («Один мир. Один инструмент»).

Но все-таки у BECK IPC@CHIP есть одна очень важная особенность, о которой мы поговорим в этой статье.

Идеология CoDeSys

CoDeSys состоит из двух частей: системы программирования и системы исполнения. Система программирования — это приложение Windows, которое позволяет создавать и отлаживать приложения на языках МЭК. Первая — это программа, которая выполняется в целевом устройстве и поддерживает базовые функции системы программирования, отладку, визуализацию и, самое главное, процесс выполнения МЭК-приложения. В случае c BECK IPC@CHIP связь между системой программирования и системой исполнения осуществляется по RS-232 или Ethernet.

Проект, созданный с помощью CoDeSys, в принципе, может выполняться на любом контроллере, поддерживающем CoDeSys. Но как система программирования узнает, на каком контроллере будет выполняться приложение? Ведь разные ПЛК имеют разные процессоры, разный набор входов/выходов и т. д.

Для этого используется так называемый Target support package (TSP) — набор конфигурационных файлов, которые дают системе программирования полную информацию о контроллере. В системе программирования CoDeSys может быть установлено сразу несколько TSP для контроллеров различных производителей. Таким образом, один раз написав приложение на языках МЭК, мы можем загружать его в разные контроллеры, используя при этом разные TSP. Далее в статье приводится пример приложения для управления движением на перекрестке с помощью контроллера BECK IPC@CHIP. Но ничто не мешает запустить этот пример на любом другом контроллере с CoDeSys.

Итак, что такое CoDeSys для конечного пользователя? Пользователь покупает контроллер, ему в придачу дают диск с CoDeSys и соответствующим TSP, пользователь устанавливает систему программирования и TSP, пишет программы для ПЛК и тем самым решает свои прикладные задачи. Все достаточно просто. Система программирования бесплатна и доступна для обновления.

Что такое CoDeSys для производителя контроллера? Тут все несколько сложнее. Производитель контроллера должен сначала купить систему исполнения в исходных текстах, адаптировать ее под свое «железо», подготовить TSP и только после этого отдать контроллер, уже с поддержкой CoDeSys, конечному пользователю. Процесс адаптации недешев и требует привлечения высококвалифицированных специалистов. В итоге реализовать поддержку CoDeSys в своих контроллерах могут только достаточно крупные компании, имеющие значительный годовой объем производ-

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

В данной ситуации решение фирмы BECK выглядит революционным. Вместе с IPC@CHIP фирма BECK IPC GmbH бесплатно поставляет специальную программу IEC Platform Builder, которая позволяет создать систему исполнения CoDeSys и набор конфигурационных TSP-файлов под конкретное оборудование, построенное на базе BECK IPC@CHIP (рис. 2).

Часть системы исполнения, отвечающая за работу с внешними аппаратными средствами, поставляется в исходных текстах на языке С. В результате мы получаем возможность дооснастить IPC@CHIP любыми устройствами (внешние АЦП, счетчики, удаленные модули ввода и т. п.) и включить их поддержку в CoDeSys. Наш пользователь получит контроллер с готовой системой программирования. Никаких дополнительных драйверов или специальных библиотек ему не нужно. Поддержка «железа» уже реализована.

Такое решение фирмы BECK открывает возможность даже небольшим фирмам создать собственное устройство с полноценной поддержкой CoDeSys.

Рис. 2. Архитектура CoDeSys для BECK IPC@CHIP

Подробно изучать IEC Platform Builder мы не будем — это выходит за рамки данной статьи, Рассмотрим по шагам работу CoDeSys с уже готовыми устройствами на базе IPC@CHIP, В качестве примера возьмем оценочную плату DK50 производства фирмы BECK IPC GmbH, Мы постараемся дать первое представление о базовых возможностях CoDeSys, которые будут полезны при работе с BECK IPC@CHIP, Желательно, чтобы читатель был знаком со второй частью данного цикла статей (см, КиТ № 6'2005), где описаны первые шаги по использованию файловой системы BECK IPC@CHIP и настройке основных параметров,

Шаг первый. Установка файлов целевой платформы на ПК

Первое, что нужно сделать, установить систему программирования CoDeSys, Ее можно найти на диске, который поставляется вместе с чипом или на сайте http://www.3s-software.ru, Убедитесь, что устанавливаемая версия не ниже, чем 23,4,1,

Теперь приступим к установке конфигурационных файлов целевой платформы, Для этого нам понадобиться TSP для BECK IPC@CHIP, Установка каждого такого TSP одинакова, Мы будем использовать пример TSP DK51_WV, поставляемый в комплекте с платой DK50, Данный TSP включает поддержку Ethernet и веб-визуализации, Его можно найти на диске из комплекта DK51, либо скачать с сайта http://www.beck-ipc.com/codesys,

Установка TSP очень проста — достаточно запустить командный файл install.bat из папки tsp,

Шаг второй. Установка системы исполнения для BECK IPC@CHIP

Система исполнения CoDeSys — это программа, которая выполняется в контроллере (целевом устройстве), Она отвечает за связь с системой программирования, управляет МЭК-приложением, созданным с помощью CoDeSys, и всей периферией устройства на базе IPC@CHIP,

Пример системы исполнения для DK50 называется достаточно легкомысленно — myrts.exe — и находится в том же пакете разработчика, что и TSP,

Скопируйте этот файл на диск а: или b: IPC@CHIP, Использование внешнего flash-диска (b:) позволит работать с веб-визуализацией CoDeSys,

Затем нужно прописать запуск myrts.exe в autoexec.bat, Например, если вы используете внешний диск, то autoexec.bat должен выглядеть следующим образом:

Таким образом, система исполнения будет запущена после включения питания IPC@CHIP. Так как система исполнения выполняется под управлением многозадачной операционной системы RTOS, то параллельно с системой исполнения могут выполняться и другие программы.

Шаг третий. Создание приложения для BECK IPC@CHIP

Теперь перейдем к самому важному шагу — созданию приложения для BECK IPC@CHIP. Сначала рассмотрим простой пример управления движением на перекрестке. Возможно, вам будет удобнее иметь исходные тексты данного примера. Их можно скачать с сайта, посвященного CoDeSys — www.3s-software.ru.

Постановка задачи

Есть перекресток двух дорог. Движение автомобилей на нем управляется двумя светофорами, каждый из которых разрешает или запрещает движение по одной из дорог. Светофоры работают в противофазе — то есть когда светофор A разрешает движение, светофор B запрещает.

Обычно интенсивность движения по каждой из дорог различна в разное время суток. Например, если интенсивность движения по дороге A больше, чем по дороге B, то логично сделать так, чтобы зеленый сигнал светофора A горел дольше, чем у светофора B. Это позволит повысить пропускную способность перекрестка. Правда, водители автомобилей на дороге B будут не очень рады — придется постоять на перекрестке немного дольше.

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

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

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

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

Открываем CoDeSys, в меню File выполняем команду New. Теперь нужно выбрать целевую платформу (устройство), в которой

будет выполняться наше приложение. Выбираем DK51_WV — это плата DK50 с поддержкой веб-визуализации (рис. 3).

Появляется диалоговое окно, в котором нам предлагается создать новый программный компонент (POU). По умолчанию это PLC_PRG — программа, вызываемая в каждом рабочем цикле контроллера. Выбираем язык SFC и соглашаемся с прочими опциями диалога New POU (рис. 4).

Hamertll»™» POU. |ммй | <Ж |

1й»о»РОи Language of the RJU

(* &О0ЯП Г Л

С Funchon filock r IP

С Fynchon FBC

Retun Type г SFC

|600L _| a si

C £FC

Рис. 4. Создание программы PLC_PRG

Функциональный блок TRAFFICSIGNAL Но на время забудем про PLC_PRG — будем строить приложение снизу вверх. Создадим функциональный блок TRAFFICSIGNAL, который будет отвечать за работу одного светофора. Функциональный блок будет иметь следующий интерфейс (рис. 5). Вход SWITCH_GREEN включает зеленый сигнал светофора, SWITCH_YELLOW — желтый, SWITCH_RED — красный. После включения зеленый сигнал будет гореть в течение времени GREEN_DELAY, а красный сигнал горит в течение времени RED_DELAY. Время работы желтого сигнала не подается на вход, так как оно фиксированно и составляет 2 с.

FB1

TRAFFICSIGNAL

inputl- input2- SWITCH_GREEN SWITCH YELLOW

YELLOW — output2

input3- SWITCH RED RED — output3

input4- RED DELAY

input5- GREEN DELAY

Рис. S. Функциональный блок TRAFFICSIGNAL

С выходами все понятно — GREEN, YELLOW и RED включают сигналы соответствующих цветов,

Теперь опишем логику работы данного функционального блока на языке FBD, Чтобы управлять светофором, нам понадобится таймер TP, который входит в библиотеку standard.lib (она присоединяется к проекту автоматически при его создании), Логика работы таймера показана на рис, 6,

Extide ; подключение драйвера диска

b: ; переход на диск Ь:

myrts ; запуск системы исполнения

Вход Ш включает выход Q на время Р^ Время с момента включения выхода индицируется на выходе ET.

Используя такой таймер, работу светофора можно описать с помощью трех FBD-схем (рис. 7).

Функциональный блок состоит из двух разделов: объявлений и схем, которые описывают логику его работы, В разделе объявлений описываются входы/выходы функционального блока, а также внутренние переменные, В данном случае внутренними переменными являются экземпляры функциональных блоков TP — по одному на каждый сигнал,

С работой функционального блока, наверное, все понятно,

PLC_PRG

Созданный нами функциональный блок TRAFFICSIGNAL позволяет лишь включать и выключать сигналы светофора, Теперь нам предстоит задать последовательность включения сигналов каждого светофора, Заметим, что сигналы одного светофора зависят от сигналов другого,

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

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

В разделе объявлений нужно объявить два экземпляра функционального блока TRAFFICSIGNAL: TS1 и TS2 (рис. 8). TS1 — для управления светофором A, TS2 — для управления светофором B.

Рис. 8. Объявления TS1 и TS2

По умолчанию схема состоит из одного шага ШП. Добавим еще четыре, как показано на рис. 9.

Каждый шаг описывает одну стадию работы светофоров.

Начнем с шага INIT:

TS1.GREEN_DELAY:=T#6s;

TS1.RED_DELAY:= T#6s;

TS2.GREEN_DELAY:= T#6s;

TS2.RED_DELAY:= T#6s;

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

Следующий шаг RED включает красный сигнал светофора A и зеленый сигнал светофора B. Для реализации этого шага нам понадобится два действия — входное и основное. Входное действие выполняется один раз при входе в шаг, основное — в каждом цикле,

пока не будет достигнуто условие перехода. Во входном действии мы просто включаем нужные сигналы светофора:

TS1(SWITCH_GREEN:=FALSE,SWITCH_YELLOW:=FALSE,SWITC

H_RED:=TRUE);

TS2(SWITCH_GREEN:=TRUE,SWITCH_YELLOW:=FALSE,SWITC

H_RED:=FALSE);

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

Шаг YELLOW1 состоит из трех действий. Входной шаг включает желтый сигнал светофора A:

TS1(SWITCH_GREEN:=FALSE,SWITCH_YELLOW:=TRUE,SWITC

H_RED:=FALSE);

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

Выходное действие выполняется, когда переход уже «сработал». В нем выключается зеленый сигнал светофора B:

TS2(SWITCH_GREEN:=FALSE);

Шаг GREEN включает зеленый сигнал светофора A и красный сигнал светофора B. Для этого во входном действии шага прописываем:

TS1(SWITCH_GREEN:=TRUE,SWITCH_YELLOW:=FALSE,SWITC

H_RED:=FALSE);

TS2(SWITCH_GREEN:=FALSE,SWITCH_YELLOW:=FALSE,SWITC

H_RED:=TRUE);

В основном действии:

TS2;

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Последний шаг YELLOW2 включает желтый сигнал светофора B и выключает зеленый сигнал светофора A.

Входное действие YELLOW2:

TS2(SWITCH_GREEN:=FALSE,SWITCH_YELLOW:=TRUE,SWITC

H_RED:=FALSE);

Основное действие YELLOW2:

TS2;

Выходное действие YELLOW2:

TS1(SWITCH_GREEN:=FALSE);

Описанная последовательность шагов выполняется циклически.

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

Рис. 7. Логика работы функционального блока TRAFFICSIGNAL

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

За включение/выключение светофора будет отвечать глобальная логическая переменная ON.

Добавим в нашу SFC-схему альтернативную ветвь, которая выполняется, когда светофор выключен (ON = FALSE).

В альтернативной ветви (рис. 10) есть два шага. Шаг BLINK_YELLOW включает желтый сигнал обоих светофоров на две секунды:

TS1(SWITCH_YELLOW:=TRUE);

TS2(SWITCH_YELLOW:=TRUE);

После того как желтые сигналы будут выключены, в выходном действии сбрасываются входные сигналы:

TS1(SWITCH_YELLOW:=FALSE);

TS2(SWITCH_YELLOW:=FALSE);

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

Шаг DELAY пустой. Он нужен только для задержки, которая длится 2 c. В течение этого времени желтый сигнал светофора не горит. Для задания этой задержки нужно в свойствах шага определить параметр Minimum time (рис. 11).

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

Рис. 11. Настройка времени шага

включения зеленого сигнала светофора A, так как время включения красного можно посчитать через период.

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

Период работы светофора будет храниться в переменной TS_period, а время разрешающего сигнала светофора A (в процентах от периода) — в переменной TS1_greentme.

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

ютт.

ется глобальная переменная, которая в проекте будет являться входом или выходом (рис. 12).

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

Для этого в функциональном блоке TRAFFICSIGNAL нужно модифицировать объявления выходов функционального блока следующим образом:

VAR_OUTPUT

GREEN AT %Q*:BOOL;

YELLOW AT %Q*:BOOL;

RED AT %Q*:BOOL;

END_VAR

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

Для этого в глобальных переменных проекта в списке уапаЫе_соп^игайоп напишем следующее:

PLC_PRG.TS1.RED AT %QX0.0:BOOL;

PLC_PRG.TS1.YELLOW AT %QX0.1:BOOL;

PLC_PRG.TS1.GREEN AT %QX0.2:BOOL;

PLC_PRG.TS2.RED AT %QX0.3:BOOL;

PLC_PRG.TS2.YELLOW AT %QX0.4:BOOL;

PLC_PRG.TS2.GREEN AT %QX0.5:BOOL;

TS1.GREEN_DELAY:=(TS_penod*TS1_greentime)/100;

TS1.RED_DELAY:=TS_period-T#4s-TS1.GREEN_DELAY;

TS2.GREEN_DELAY:=TS1.RED_DELAY;

TS2.RED_DELAY:=TS1.GREEN_DELAY;

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

Настройка входов/выходов

Начнем с определения входов/выходов. Обычно они объявляются с помощью ПЛК-конфигуратора — по МЭК-адресу объявля-

Запись говорит о том, что PLC_PRG.TS1.RED соответствует нулевому выходу контроллера, PLC_PRG.TS1.YELLOW — первому и т. д. То есть когда значение переменной PLC_PRG.TS1.RED равно TRUE, нулевой выход будет активен. Аналогично и для других выходов.

Создание визуализации

Осталось только создать интерфейс пользователя — и наша система управления движе-

Рис. 12. ПЛК-конфигуратор

нием на перекрестке будет готова. Нам нужно создать визуализацию на вкладке CoDeSys Visualization. Создадим визуализацию с именем PLC_VISU.

Теперь нужно нарисовать форму. Начнем со светофора. Светофор — это три окружности и один прямоугольник — все очень просто (рис. 13).

Теперь надо настроить созданные объекты. Тут идея такая — каждый объект связывается с логической переменной проекта. Если переменная имеет значение FALSE , то объект имеет один цвет, TRUE — другой (этот цвет называется alarm color). Продемонстрируем, как настроить один из сигналов светофора.

1. Дважды щелкаем по объекту.

2. В меню выбираем пункт Variables и вписываем в поле Change color имя переменной (рис. 14). Можно просто нажать F2 и выбрать переменную с помощью «Ассистента ввода».

3. Настроим цвета в пункте Colors (рис. 15).

Alarm color будет красным, а color — белым.

Рис. 14. Настройка свойств сигнала светофора

"

C«9W J[jxj

Stat* їм Cota Осдсагь» ц»*т* or. |

Те* VMt*' Iredt ПГИІГІГГ ■ ГРІГІИБГ ЯГЯШЯЯШШ Cncei |

СЫотаыЫм MotonabtoUc r**"*

Motor* irlVi.e VtMbitt Alrnncotof ■ ("■■■■■■

РюдитмЫ* Ip*

flnun

-:r'

1 OK | Отмой* |

Рис. 15. Настройка свойств сигнала светофора (второй этап)

Рис. 16. Контекстное меню для настройки кнопки включения светофора

Аналогично настраиваются другие сигналы светофора.

Теперь клонируем (выделяем и копируем) созданный светофор, изменяем имена переменных (меняем TS1 на TS2) — и наши светофоры готовы.

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

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

Делается это следующим образом.

1. Создаем прямоугольник.

2. В его свойствах в пункте text делаем следующие настройки (рис. 17).

3. В пункте Variables указываем имя переменной (рис. 18).

4. Теперь внутри созданного прямоугольника будет отображаться переменная PLC_PRG.TS_period. Настраиваем пункт Input (рис. 19).

Рис. 17. Настройка поля ввода

Рис. 18. Настройка поля ввода

Рис. 19. Настройка поля ввода

Сделанные настройки указывают на то, что период работы светофора будет вводиться с экранной клавиатуры в диапазоне от 20 до 600 с.

Поле ввода для времени включения разрешающего светофора A настраивается аналогично, только в качестве переменной textdisplay используется переменная TS1_greentime, а величина задается в диапазоне от 10 до 90 с.

БЛОК УПРАВЛЕНИЯ СВЕТОФОРАМИ

Период переключения светофора (сек)

Время разрешающего сигнала светофора А (%)

%s

Вкл/Выкл

Рис. 20. Визуализация

Рис. 22. Визуализация в режиме Online

Очте£

В І0С4І Vxrfmf «аТср/ Local. • і і . |[ чИр LLcvri ! Q>- 1 Осе |

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

1 vaut 1 Сотам*

Attatt 'siltsom Г«ttwci«Ьомпам PM 1200 MaMittMlai No №x»nn 128 Mual«*h«*Mtea Ы*" | fiance | 5 ¥+»«/ | UP*- |

Рис. 21. Настройка параметров связи с BECK IPC@CHIP

В итоге должна получиться картинка, показанная на рис. 20.

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

Как сделать этот последний шаг? Настройка связи с контроллером

Открываем меню Online/Communication parameters и создаем TCP/IP-соединение, в котором нужно указать ip-адрес контроллера (рис. 21).

И, наконец, выполняем команду Login, затем Run — дело сделано (рис. 22).

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

Согласитесь, что создать визуализацию для управления контроллером в CoDeSys

гораздо проще, нежели написать специальное cgi-приложение.

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

найдете страницах сайта Automation Alliance www.automation-alliance.com.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.