Gazmarket59.ru

Газ Маркет 59
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Регистры счетчиков команд pic

Управление частотным преобразователем по Modbus

2021-05-25 Промышленное 3 комментария

В данной статье рассмотрим, как настроить управление частотным преобразователем по сети Modbus RTU, на примере преобразователя Danfoss VLT Micro Drive и ПЛК Segnetics Pixel 2511.

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

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

Поэтому данный способ управления вполне оправдан и часто используется во многих системах АСУ и ТП.

Перед тем, как мы перейдем непосредственно к практической части, предлагаю для начала немного поговорить об общих принципах управления ПЧ через последовательный интерфейс RS-485 по протоколу Modbus.

Данный протокол подразумевает под собой соединение устройств по типу «ведущий-ведомый» (master-slave). В качестве ведущего устройства применяется ПЛК, ведомого – ПЧ, причем к сети могут быть подключены сразу несколько ведомых устройств, а точнее до 32. Главное, чтобы каждое устройство имело свой уникальный адрес в сети.

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

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

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

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

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

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

Схема подключения

Для физического подключения по RS-485 интерфейсу, должны быть задействованы две клеммы, причем у разных устройств они могут иметь разное обозначение. “+” клемма может обозначаться как DATA+, D1, D+, B, а “-” как D- , D0, Data- , A. Третья клемма – общая COM, обозначаемая как SG, либо GND.

Кстати, здесь может возникнуть путаница. Дело в том, что ряд производителей обозначает как A (+), а B соответственно (-), другие же наоборот A (-) а B (+). Так что при подключении будьте внимательны.

В случае Danfoss VLT Micro Drive и Segnetics Pixel подключение будет следующее:

И не забывайте про оконечные резисторы, они же терминаторы. Они устанавливаются на концах линии — крайних устройствах, подключенных к сети, в случае, если длина линии превышает 3 метра. Номинал резисторов для линии RS-485 обычно 120 Ом. Зачастую эти резисторы уже встроены в ПЧ, для включения их в работу необходимо только выставить джамперы, либо DIP- переключатели.

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

Настройка частотного преобразователя

Первоначальную настройку преобразователя Danfoss VLT Micro Drive можно выполнить с панели оператора, либо с помощью программы настройки MCT-10 через коммуникационный порт RS485.

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

Номер параметраОписание параметровЗначение
8-30Протокол2 — Modbus RTU
8-31Адрес2 — Диапазон адресов: 1-247
8-32Скорость передачи данных порта ПЧ4 — 38400
8-33Четность порта ПЧ2 — Контроль четности отсутствует (1 стоповый бит)
Читайте так же:
Как обнулить счетчик матрица

При изменении протокола обмена связи, преобразователь необходимо будет перезапустить. Управление преобразователем по Modbus возможно, только если он переведен из режима Hand (ручное или местное управление) в Auto (дистанционное).

Настройка ПЛК Segnetics Pixel

Для настройки и программирования будем использовать SMLogix – программное обеспечение для всей линейки контроллеров Segnetics, в том числе для Pixel.

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

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

Добавим в проект устройство Slave. На вкладке Устройство находим порт COM1, кликаем правой кнопкой и выбираем Добавить устройство. В открывшемся окне выбираем способ создания с пустой картой памяти.

После нажатия кнопки Создать появится окно задания свойств.

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

Нажимаем кнопку Готово. После этого в дереве проекта появится наше устройство VLT_51_1.

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

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

Здесь есть один важный момент. Дело в том, что адреса параметров, указанных в документации ПЧ Danfoss, необходимо указывать со смещением, то есть вычитать единицу из адреса. Например, в документации ПЧ указан номер регистра командного слова 50000. Так вот, нам надо вычесть из этого значения 1 и полученное значение 49999 и будет являться адресом параметра.

Также в карте памяти указываем тип переменных, указываем функцию чтения записи значений R/W, она соответствует функции Holding register.

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

Номер регистра = Номер параметра х 10-1

Например, параметр 8-31, указывающий сетевой адрес, будет иметь адрес 831 х 10 — 1 = 8309.

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

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

Преобразуем биты в регистр, то есть в тип integer. Для этого задействуем блок bool->int.

Каждому биту сопоставлены входы блока — bool0, bool1 и т.д.

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

Для преобразования регистра в биты, воспользуемся блоком reg16->bits

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

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

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

Для того, чтобы преобразователь запустился, на входах «Тормож.пост.током», «Останов выбегом», «Быстрый останов», «Фиксация частоты», «Данные ОК» должна быть 1. Ну и на «Пуск/Стоп» 1 – Пуск 0 – Стоп.

Для диагностики связи ПЛК с ПЧ можно задействовать блок Slave (link), с помощью которого можно смотреть статистику обмена данными между устройствами. То есть по факту этот блок представляет собой счетчик ошибок обмена.

На вход Q Err задаем число, которое указывает, какое количество ошибок обмена должно пройти подряд, чтобы на выходе Break выставилось значение логической единицы. Выход Errors отображает текущее состояние счетчика.

Читайте так же:
Как таксисты подкручивают счетчик

Комментарии:

Грубо говоря о сегментных регистрах :
При записании програмы на жёсткий диск , сегменты программы будут сохранятся на опрелённых местах в винчестере . И при запуска екзешника , программа должна выполнять эти сегменты , которые записаны в память . Но как найти эти сегменты в огромнейшим винчестере ? Конечно , сегментные регистры , они очень важны и всего их 4 – СS : сегмент комант (текст программы) , DS : сегмент даты (данные) , SS даёт нам возможность обращения к стекам , ES не помню . Сегментные регистры носят начальную адрес закрепленных за ними сегментов . В дальнейшем любое обращение к ячейкам выполняется через указания сегментов и номер байта ячейки .

Нет, прямо на винчестер сегменты не записываются.
Сегментные регистры инициализируются операционной системой DOS при запуске программы. Потому что она занимается распределением памяти для программ.
А содержимое сегмента считывается из исполняемого файла. Если интересно, как оно там хранится, можешь найти структуру MZ EXE-файлов. Для COM-файла всё очень просто – содержимое файла загружается в единственный сегмент, начиная с адреса 100h

ES (экстракодовый сегмент) используется для передачи данных между ячейками ОП, не попадающими в непрерывную область размером 64 К байт. Например, если необходимо переслать данные из байта с номером 100000 в байт с номером 200000, то это невозможно сделать в пределах одного сегмента данных (DS). Тогда первый байт включается в сегмент DS, а второй – в сегмент ES и выполняются необходимые операции.

Не путайте сектор винчестера и сегменты исполяемой программы – это разные понятия. Сегментом называется условно выделенная область адресного пространства определённого размера в оперативной памяти.

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

а как насчёт 386 ? какие у него есть регистры ?

У 386-го регистры 32-битные: EAX, EBX, ECX, EDX, EDI, ESI и т.д.
Ещё есть некоторые дополнительные регистры, например FS и GS.
Различий много, в комментарии всё не рассказать.

Хотелось бы узнать, что подразумевается под размером выполненной команды.

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

O (Overflow) — флаг переполнения. CF=1, если получен результат за пределами допустимого диапазона значений.
CF = 1? Или O = 1?

P (Parity) — признак чётности результата. Как узнать когда числа четные а когда не четные?

C (Carry) — флаг переноса. CF=1, если при сложении/вычитании возникает перенос/заём из старшего разряда. При сдвигах хранит значение выдвигаемого бита.
Что за перенос/заем из старшего разряда? Что за выдвигаемый бит?

A (Auxiliary) — флаг дополнительного переноса. Используется в операциях с упакованными двоично-десятичными числами.
Опять непонятно что за перенос? И что за упакованные двоично-десятичные числа?

Денис! Найди в Инете книжку В.Юрова “АССЕМБЛЕР” и сразу ВСЕ вопросы отпадут.
Если по тексту вопроса, то флаг Р (PF) = 1, когда в результате операции в двоичном представлении имееися четное число единичных битов. Флаг CF = 1 если при сложениях или сдвигах крайний бит вытесняется за битовую сетку операнда. АF – то же самое, но за пределы полубайта. Упакованные Дв-Дес Числа (BCD формат) – это когда в каждый байт пишутся 2 цифры числа. Цепочка байт м.б. длинной.

1) не сами числа, а количество единиц в двоичном коде числа. Например: 2(10) = 10(2) – PF = 0, 3(10) = 11(2) – PF = 1;
2) допустим значение регистра ax = FFFF, тогда ax + 1 = 1 0000 т. е. возникает перенос единицы из старшего разряда регистра, здесь – переполнение, в таких случаях CF = 1. Тоже самое произойдет если вместо ax взять al;
3) флаг AF = 1 если выполняется следующие условие (может не совсем корректное, но на примере должно быть понятно): сумма 2-х чисел в 16-ти разрядной сис. превышает либо равна 16. Пример: 1A + 7 = 1A + 07 (A + 7 = 10 + 7 = 17 = 1*16 + 1), таким образом AF = 1.

Читайте так же:
Перевод счетчиков с переводом часов

А какие адреса у регистров общего назначения? ну или как узнать.

Сфера применения PIC-микроконтроллеров

Как уже было сказано, семейство PIC16 очень любят радиолюбители. К тому же оно хорошо описано в большом количестве литературы. По количеству учебников с семейством PIC, на момент написания статьи, может посоревноваться только семейство AVR.

Давайте рассмотрим несколько схем с применением микроконтроллеров семейства PIC.

Таймер для управления нагрузкой на PIC16f628

Простейшая автоматика на микроконтроллерах PIC – это стихия 8-битного семейства. Их объём памяти не позволяет делать сложных систем, но отлично подходит для самостоятельного выполнения пары поставленных задач. Так и эта схема трёхканального таймера на Pic16f628, поможет вам управлять нагрузкой любой мощности. Мощность нагрузки зависит только от установленного реле/пускателя/контактора и пропускной способности электросети.

Настраивается прибор с помощью набора из 4-х кнопок SB1-SB4, на HG1 выводятся параметры, это дисплей типа LCD на 2 строки по 16 символов. В схеме используется внешний кварцевый резонатор на 4 МГц, а KV1 – это реле, с питанием катушки в 24 В, вы можете использовать любое реле, лишь бы оно подходило по напряжению катушки к вашему БП. МК питается от 5 В стабилизированного источника.

Вы можете использовать от 1 до 3 каналов в управлении нагрузкой, стоит только продублировать схему, добавив реле к выводам RA3, RA4 микроконтроллера.

Часы-будильник на МК PIC16f628A

Такие часы, согласно заявлениям разработчика, получились весьма точными, их погрешность весьма мала – порядка 30 секунд в год.

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

Регулятор мощности паяльника на PIC16f628A

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

Схема довольно простая, в нижней части реализация светодиодной индикации. Главный силовой элемент – тиристор BT139, а MOC3041 – нужен для гальванической развязки МК от сети и управления тиристором с помощью логического уровня в 5 В.

Регистры процессора

В архитектуре IA-32 есть десять 32-битных и шесть 16-битных процессорных регистров. Регистры делятся на три категории:

Общие регистры (General Registers);

Регистры управления (Control Registers);

Сегментные регистры (Segment Registers).

В свою очередь, общие регистры делятся на следующие:

Регистры данных (Data Registers);

Регистры-указатели (Pointer Registers);

Индексные регистры (Index Registers).

Общий взгляд на устройства ПЛК

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

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

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

  • память,
  • входные порты,
  • выходные порты.

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

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

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

Микроконтроллеры используются в составе современной электроники повсеместно. Умение выполнять программирование микроконтроллеров открывает широкие горизонты

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

Читайте так же:
Кто должен содержать общедомовые счетчики

Задание направления данных для всего порта

В программе для программирования микроконтроллеров AVR Atmel Studio на языке С можно задать направление передачи данных сразу для всего порта.

С помощью этой команды все выводы (контакты) порта B будут сконфигурированы как выходы.

0xff представляет собой шестнадцатиричное представление числа ff, а 0x является префиксом, указывающим на то, что число записано в шестнадцатиричное форме. В десятичном представлении число 0xff будет равно 255, а в двоичном – 11111111. То есть с помощью представленной команды во все биты регистра DDRB будут записаны логические единицы.

В языке Си для микроконтроллеров AVR для представления двоичных чисел применяется префикс 0b. Соответственно, представленную выше команду записи логических единиц во все биты регистра DDRB можно записать и с помощью двоичного вида числа 255:

Эта запись команды является более наглядной, но все таки правилом «хорошего тона» в программировании для микроконтроллеров считается использование шестнадцатиричного представления чисел.

Для того чтобы сконфигурировать все выводы (контакты) порта B как входы необходимо записать во все биты регистра DDRB логические нули. Это можно сделать с помощью следующей команды.

Но кроме рассмотренных «крайних» случаев (все единицы или все нули) в регистр DDRB можно записать и другие числа. Например:

0xb4 — шестнадцатиричное представление числа 180. В двоичном виде его можно записать как 10110100. То есть часть выводов (контактов) порта B будет сконфигурирована как выходы, а часть — как входы.

PB0 — 0 (вход)
PB1 — 0 (вход)
PB2 — 1 (выход)
PB3 — 0 (вход)
PB4 — 1 (выход)
PB5 — 1 (выход)
PB6 — 0 (вход)
PB7 — 1 (выход)

Визуализация цикла обучения

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

  • Получить или захватить: В котором инструкция захватывается из ОЗУ и копируется в процессор.
  • Декодирование или декодирование: В котором ранее захваченная инструкция декодируется и отправляется исполнительным блокам.
  • Выполнили: Если инструкция разрешена, а результат записан во внутренние регистры процессора или в адрес памяти RAM

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

Первый этап цикла обучения: выборка

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

  1. Программный счетчик или Программный счетчик: Что указывает на следующую строку памяти, где находится следующая инструкция процессора. Его значение увеличивается на 1 каждый раз, когда завершается полный цикл команд или когда команда перехода изменяет значение программного счетчика.
  2. Регистр адреса памяти: MAR копирует содержимое ПК и отправляет его в ОЗУ через адресационные контакты ЦП, которые соединены с адресными контактами самого ОЗУ.
  3. Регистр данных памяти или регистр данных памяти : В случае, если ЦП должен выполнить чтение памяти, MDR копирует содержимое этого адреса памяти во внутренний регистр ЦП, который является временным регистром передачи, прежде чем его содержимое будет скопировано в регистр команд. MDR, в отличие от MAR, подключается к выводам данных RAM, а не к контактам адресации, и в случае инструкции записи содержимое того, что вы хотите записать в RAM, также записывается в MDR.
  4. Реестр инструкций: Заключительной частью этапа выборки является запись инструкции в регистр инструкций, из которого блок управления процессором копирует ее содержимое для второго этапа цикла инструкций.

Эти 4 подэтапа происходят во всех процессорах, независимо от их полезности, архитектуры и двоичной совместимости или того, что мы называем ISA.

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

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

  • Они отвечают за координацию движения и порядок, в котором данные перемещаются внутри и вне процессора, а также за различные подблоки, которые за это отвечают.
  • В общем, считается, что блоки этапа захвата или Fetch являются частью оборудования, которое мы называем блоком управления, и это оборудование также называется Front-End процессора.
  • Он интерпретирует инструкции и отправляет их различным исполнительным устройствам, к которым он подключен.
  • Он передается различным ALU и исполнительным блокам процессора, которые действуют
  • Он отвечает за захват и декодирование инструкций, а также за запись результатов в регистры, кеши или в соответствующий адрес ОЗУ.
Читайте так же:
Объединение счетчиков яндекс метрика

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

Второй этап: декодирование

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

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

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

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

Третий этап: Выполнить

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

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

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

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

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector