Среди всех инструментов управления нагрузками в арсенале программируемых логических контроллеров широтно-импульсная модуляция занимает особое место - она позволяет одному дискретному транзисторному выходу делать то, что прежде требовало дорогостоящего аналогового модуля: плавно управлять мощностью нагревателя, регулировать яркость освещения, задавать скорость вентилятора или позиционировать электромагнитный клапан.
ШИМ, или PWM по-английски (Pulse-Width Modulation), - это способ управления подачей мощности к нагрузке через изменение длительности импульса при постоянной частоте следования. В мире промышленной автоматизации этот принцип превратился в изящный мост между цифровой логикой контроллера и аналоговыми по своей природе физическими процессами.
Физический принцип: как прямоугольный импульс управляет мощностью
Понять ШИМ проще всего через аналогию с двигателем и маховиком. Представьте тяжёлое колесо, которое раскручивает электродвигатель. Он может быть либо включён, либо выключен - промежуточного состояния нет. Если включать его на одну секунду из каждых десяти, маховик медленно раскрутится до небольшой скорости и будет поддерживать её благодаря инерции.
Включайте электродвигатель на пять секунд из десяти - скорость удвоится. На девять из десяти - маховик раскрутится почти до максимума. Ровно так же работает ШИМ: транзисторный ключ открывается и закрывается тысячи раз в секунду, а нагрузка - нагреватель, электродвигатель, соленоид - в силу своей тепловой или механической инерции воспринимает не отдельные импульсы, а их усреднённый эффект.
Два ключевых параметра определяют работу ШИМ-сигнала. Первый - частота, то есть сколько раз в секунду повторяется цикл включения-выключения. Второй - коэффициент заполнения (Duty Cycle), показывающий, какую долю периода транзистор открыт. Коэффициент заполнения 50% означает равные промежутки включения и выключения. При этом нагрузка получает ровно половину доступной мощности. Обратная величина коэффициента заполнения - скважность: при длительности импульса 10 мкс на период 100 мкс скважность равна десяти, а Duty Cycle составляет 0,1, или 10%.
Это фундаментальное свойство: интегрируя напряжение импульсов по времени, получаем площадь под импульсами, и воздействие на исполнительный механизм оказывается тождественным работе при среднем напряжении. Именно поэтому транзистор в ШИМ-ключе почти не греется: в открытом состоянии его сопротивление близко к нулю, в закрытом - ток не течёт вовсе, а переходные процессы занимают наносекунды. КПД такого преобразователя достигает 95–98%, что кардинально отличает его от линейного регулятора, рассеивающего избыточную мощность в виде тепла.
Аналоговый и цифровой ШИМ: два пути к одному результату
В классической аналоговой реализации ШИМ формируется компаратором: пилообразный или треугольный сигнал подаётся на один вход, управляющее напряжение - на другой. Когда пила ниже управляющего сигнала, на выходе логическая единица; когда выше - ноль. Чем выше управляющее напряжение, тем шире импульсы, тем больше средняя мощность. Именно по этому принципу работает легендарная микросхема TL494, до сих пор встречающаяся в блоках питания, сварочных инверторах и зарядных устройствах.
Цифровой ШИМ в ПЛК устроен иначе: N-битный счётчик непрерывно считает от нуля до максимума, аппаратный компаратор сравнивает его с регистром уставки. Пока счётчик меньше уставки - выход в единице; достиг или превысил - выход в нуле. Изменяя содержимое регистра уставки из программы, инженер плавно меняет коэффициент заполнения, не прерывая генерацию. Частота при этом остаётся неизменной и определяется тактовой частотой таймера и его разрядностью.
Принципиальное преимущество цифрового ШИМ в ПЛК - аппаратная независимость от основного цикла сканирования. Транзистор переключается аппаратным таймером в фоне, пока программа занимается другими задачами. Это гарантирует стабильность частоты даже при высокой загрузке процессора.
Аппаратные возможности ПЛК: что поддерживает ШИМ
Ключевое ограничение ШИМ в ПЛК - тип выходов. Реле коммутируют механически, их ресурс составляет несколько миллионов циклов: при частоте ШИМ 1 кГц этот ресурс исчерпывается за несколько часов. Поэтому ШИМ реализуется исключительно на транзисторных выходах (тип DC/DC), где полевой или биполярный транзистор переключается за наносекунды без износа.
В Siemens S7-1200 и S7-1500 ШИМ встроен аппаратно: специальные высокоскоростные выходы (High-Speed Outputs, HSO) с маркировкой Qa.0–Qa.3 поддерживают режим PWM через технологический объект.
В S7-1200 CPU 1214C DC/DC/DC доступно два высокоскоростных выхода с частотой до 100 кГц. Настройка производится в TIA Portal через вкладку технологических объектов: выбирается выход, задаётся базовая частота, разрядность (обычно 1000 делений для 0,1% точности), режим обновления - и система генерирует начальный код с функциональным блоком CTRL_PWM.
В Siemens S7-200 предусмотрены выходы PTO/PWM: по два на каждый CPU, регистры управления SMB66–SMB85 задают период, ширину импульса и тип работы.
В ПЛК ОВЕН на платформе Codesys быстрые транзисторные выходы поддерживают ШИМ через программный блок с параметрами PWM_POWER (коэффициент заполнения в единицах от 0 до PWM_PERIOD) и PWM_PERIOD (период в миллисекундах).
Функциональный блок CTRL_PWM в TIA Portal
В TIA Portal v16 и новее настройка PWM выполняется через конфигурацию устройства. Путь: Device configuration -> CPU -> Properties -> Pulse Generator (PTO/PWM) -> выбор нужного канала (PWM1–PWM4).
В параметрах канала задаются:
- Time base — временная база: миллисекунды или микросекунды
- Период — например, 100 мс для нагревателей или 1 мкс для высокочастотного управления двигателями
- Формат ширины импульса — выбирается из четырёх вариантов:
|
Формат |
Диапазон |
Разрешение |
|
Hundredths (сотые) |
0 до 100 |
1% |
|
Thousandths (тысячные) |
0 до 1 000 |
0.1% |
|
Ten-thousandths (десятитысячные) |
0 до 10 000 |
0.01% |
|
S7 Analog format |
0 до 27 648 |
~0.0036% |
После выбора формата нужно назначить Q-адрес для управления шириной импульса (например, QW1000). Этот адрес будет использоваться в программе для изменения коэффициента заполнения.
Привязка к физическому выходу: поддерживаются только транзисторные (DC) выходы. Каналы Qa.0–Qa.3 работают до 100 кГц, каналы Qa.4 и выше — до 20 кГц.
Вызов CTRL_PWM в SCL
Блок CTRL_PWM запускает и останавливает аппаратный генератор импульсов. Сигнатура блока содержит четыре параметра (параметра ERROR не существует — все ошибки передаются через STATUS):
CTRL_PWM(
PWM := "PWM_1", // Тип HW_PWM — системная константа, создаётся автоматически
ENABLE := TRUE, // TRUE = запустить генератор, FALSE = остановить
BUSY => #Busy, // BOOL: TRUE пока обрабатывается команда
STATUS => #Status // WORD: код статуса выполнения
);
Управление коэффициентом заполнения
Изменение ширины импульса выполняется прямой записью в Q-адрес, назначенный каналу при конфигурации. Структура "DB".Ctrl.ModifyTimeHigh относится к объектам движения S7-1500 и неприменима к PWM генератору S7-1200.
// Способ 1: через символьный тег (рекомендуется)
"Pulse_1_PulseWidth" := WORD#5000; // 50% при формате 0–10000
// Способ 2: напрямую по адресу (если назначен QW1000)
QW1000 := WORD#5000; // 50% при формате 0–10000
// Примеры значений при формате Ten-thousandths (0–10000):
// WORD#0 = 0% (генератор молчит)
// WORD#2500 = 25%
// WORD#5000 = 50%
// WORD#7500 = 75%
// WORD#10000 = 100% (постоянный сигнал HIGH)
Изменение значения вступает в силу немедленно — без перезапуска генератора.
Коды STATUS
Статус возвращается через выход STATUS (WORD):
|
Код |
Значение |
|
16#0000 |
Норма, команда выполнена успешно |
|
16#8091 |
Генератор не активирован в конфигурации устройства |
|
16#8092 |
Неверный параметр PWM (неверная ссылка на HW_PWM) |
|
16#8093 |
Внутренняя ошибка CPU |
Полный пример управления PWM
PROGRAM PWM_Control
VAR
ctrlPWM : CTRL_PWM;
// Управление
pwmEnable : BOOL := TRUE;
DutyPercent : REAL := 50.0; // Желаемый коэффициент 0–100%
// Диагностика
pwmBusy : BOOL;
pwmStatus : WORD;
// Промежуточные переменные
calcValue : REAL;
pwmWord : WORD;
END_VAR
// === ШАГ 1: Масштабирование 0–100% -> 0–10000 (формат Ten-thousandths) ===
calcValue := (DutyPercent / 100.0) * 10000.0;
// Пример: 75% -> (75 / 100) * 10000 = 7500
// === ШАГ 2: Ограничение диапазона ===
IF calcValue > 10000.0 THEN calcValue := 10000.0; END_IF;
IF calcValue < 0.0 THEN calcValue := 0.0; END_IF;
// === ШАГ 3: Преобразование типа и запись в Q-адрес ===
pwmWord := REAL_TO_UINT(calcValue);
"Pulse_1_PulseWidth" := pwmWord; // Изменение вступает немедленно
// === ШАГ 4: Управление генератором ===
ctrlPWM(
PWM := "PWM_1",
ENABLE := pwmEnable,
BUSY => pwmBusy,
STATUS => pwmStatus
);
// === ШАГ 5: Диагностика ===
IF pwmStatus <> 16#0000 THEN
// Ошибка: остановить выход для безопасности
"Pulse_1_PulseWidth" := WORD#0;
// Здесь можно добавить сигнализацию оператору
END_IF;
END_PROGRAM
Программный ШИМ на таймерах: когда аппаратного выхода нет
Если аппаратных HSO-выходов не хватает или контроллер не поддерживает встроенный ШИМ, применяется программный метод на таймерах. В блоке OB30 (циклическое прерывание 10–100 мс) накапливается счётчик времени: когда он меньше SetPoint, Period - выход включён, иначе выключён. Перезапуск по истечении полного периода.
Существенный недостаток - нестабильность частоты: джиттер достигает ±1 цикла ПЛК (1–10 мс). Для управления нагревателем с постоянной времени 60 секунд это абсолютно несущественно. Для скоростного привода - неприемлемо.
Программный ШИМ в Codesys реализуется через функциональный блок FB_PWM: входы Period (REAL, секунды) и DutyCycle (REAL, 0–1), выход Q (BOOL).
Период исчисляется секундами, поэтому два таймера TON легко справляются с задачей без потери точности.
Важно об интерфейсе блока: входы Period и DutyCycle должны быть объявлены как VAR_INPUT, но их значения нельзя изменять внутри блока — это нарушение стандарта IEC 61131-3. Для ограничения и защиты значений используются локальные копии в секции VAR.
Функциональный блок FB_PWM
FUNCTION_BLOCK FB_PWM
VAR_INPUT
Enable : BOOL; // Разрешение работы ШИМ
DutyCycle : REAL; // Коэффициент заполнения: 0.0 — 1.0
Period : REAL; // Период ШИМ в секундах (например, 10.0)
END_VAR
VAR_OUTPUT
Q : BOOL; // Выход ШИМ (подключается к нагрузке)
END_VAR
VAR
// Таймеры фаз включения и выключения
tmrOn : TON;
tmrOff : TON;
// Расчётные времена в формате TIME
tOn : TIME;
tOff : TIME;
// Локальные копии входов (нельзя изменять VAR_INPUT напрямую)
safeDC : REAL; // Защищённая копия DutyCycle
safePeriod : REAL; // Защищённая копия Period
// Промежуточные переменные для расчёта через DWORD (мс)
periodMS : DWORD;
timeOnMS : DWORD;
timeOffMS : DWORD;
// Внутреннее состояние: FALSE = фаза OFF, TRUE = фаза ON
State : BOOL := TRUE; // Старт с фазы включения
END_VAR
// === ШАГ 1: Копируем входы в локальные переменные ===
safeDC := DutyCycle;
safePeriod := Period;
// === ШАГ 2: Ограничение коэффициента заполнения (0.0 — 1.0) ===
IF safeDC > 1.0 THEN safeDC := 1.0; END_IF;
IF safeDC < 0.0 THEN safeDC := 0.0; END_IF;
// === ШАГ 3: Защита периода от нулевого и отрицательного значения ===
IF safePeriod <= 0.0 THEN safePeriod := 1.0; END_IF; // Минимум 1 секунда
// === ШАГ 4: Сброс при отключении ===
IF NOT Enable THEN
Q := FALSE;
State := TRUE;
tmrOn (IN := FALSE, PT := T#0S);
tmrOff(IN := FALSE, PT := T#0S);
RETURN;
END_IF;
// === ШАГ 5: Граничные случаи — 0% и 100% мощности ===
IF safeDC = 0.0 THEN
Q := FALSE;
RETURN;
ELSIF safeDC = 1.0 THEN
Q := TRUE;
RETURN;
END_IF;
// === ШАГ 6: Расчёт времён включения и выключения через DWORD (мс) ===
// Переводим секунды в миллисекунды, умножаем на коэффициент
// DWORD_TO_TIME / REAL_TO_DWORD — стандартные функции, работают везде
periodMS := REAL_TO_DWORD(safePeriod * 1000.0);
timeOnMS := REAL_TO_DWORD(DWORD_TO_REAL(periodMS) * safeDC);
timeOffMS := REAL_TO_DWORD(DWORD_TO_REAL(periodMS) * (1.0 - safeDC));
tOn := DWORD_TO_TIME(timeOnMS);
tOff := DWORD_TO_TIME(timeOffMS);
// === ШАГ 7: Машина состояний (два состояния: ON и OFF) ===
IF State THEN
// --- ФАЗА ВКЛЮЧЕНИЯ ---
// Таймер считает время tOn, затем переключаемся в OFF
tmrOn (IN := TRUE, PT := tOn);
tmrOff(IN := FALSE, PT := tOff);
IF tmrOn.Q THEN
State := FALSE;
tmrOn(IN := FALSE, PT := tOn); // Сброс таймера
END_IF;
ELSE
// --- ФАЗА ВЫКЛЮЧЕНИЯ ---
// Таймер считает время tOff, затем переключаемся в ON
tmrOff(IN := TRUE, PT := tOff);
tmrOn (IN := FALSE, PT := tOn);
IF tmrOff.Q THEN
State := TRUE;
tmrOff(IN := FALSE, PT := tOff); // Сброс таймера
END_IF;
END_IF;
// === ШАГ 8: Выход следует состоянию ===
Q := State;
END_FUNCTION_BLOCK
Пример вызова FB_PWM в основной программе
PROGRAM PLC_PRG
VAR
Heater1 : FB_PWM; // Экземпляр блока
TempSensor : REAL; // Текущая температура, °C
SetPoint : REAL := 200.0; // Уставка, °C
Power : REAL; // Мощность 0.0 — 1.0
HeaterOut : BOOL AT %Q0.0; // Физический выход на ТЭН
END_VAR
// === Простой P-регулятор ===
// При отклонении на 50°C -> 100% мощности
// При отклонении на 25°C -> 50% мощности
Power := (SetPoint - TempSensor) / 50.0;
IF Power > 1.0 THEN Power := 1.0; END_IF;
IF Power < 0.0 THEN Power := 0.0; END_IF;
// === Вызов ШИМ-блока ===
Heater1(
Enable := TRUE,
DutyCycle := Power, // 0.0 — 1.0 от регулятора
Period := 15.0, // Период 15 секунд
Q => HeaterOut // Выход на ТЭН
);
END_PROGRAM
Расчёт при DutyCycle = 0.75 и Period = 15.0 сек:
- tOn = 15.0 * 0.75 = 11.25 сек — ТЭН включён
- tOff = 15.0 * 0.25 = 3.75 сек — ТЭН выключён
- Средняя мощность = 75%
Сравнение подходов
|
Параметр |
Программный ШИМ (Codesys) |
Аппаратный ШИМ (TIA Portal) |
|
Частота |
0.01 Гц — 2 Гц |
1 Гц — 100 кГц |
|
Точность |
Зависит от цикла ПЛК |
Независима от цикла ПЛК |
|
Платформа |
Любой Codesys / ОВЕН |
Только Siemens S7-1200/1500 |
|
Нагрузка |
Нагреватели, клапаны |
Двигатели, LED, преобразователи |
|
HSO-выход |
Не нужен |
Обязателен (только DC-выходы) |
|
Настройка |
Только в коде |
Device configuration + код |
Выбор частоты ШИМ: ключевое решение для каждого применения
Частота ШИМ определяет характер работы нагрузки и уровень помех. Слишком низкая частота приводит к видимым пульсациям света, слышимому свисту трансформаторов, неравномерному нагреву. Слишком высокая - к росту потерь на переключение в транзисторе и усилению электромагнитных помех.
Для нагревателей и ТЭНов достаточно 0,5–5 Гц: тепловая инерция нагревательного элемента сглаживает любые пульсации, а низкая частота исключает сетевые помехи.
Для регулировки яркости светодиодного освещения нужно минимум 50–100 Гц, чтобы мерцание оставалось незаметным глазу, а в фотографической и видеосъёмочной технике поднимают до 1–10 кГц. Двигатели постоянного тока и серводвигатели требуют 5–20 кГц: на этой частоте ток нарастает плавно, механические вибрации минимальны, и ротор не жужжит. Соленоидные клапаны управляются на 50–200 Гц.
|
Нагрузка |
Типичная частота ШИМ |
Обоснование |
|
ТЭН, нагреватель |
0,1–5 Гц |
Тепловая инерция, нет требований к скорости |
|
LED-освещение |
100 Гц – 10 кГц |
Устранение мерцания для глаза и камер |
|
DC-двигатель |
5–20 кГц |
Плавный ток, акустический комфорт |
|
Серводвигатель |
10–50 кГц |
Высокая динамика, минимум пульсаций |
|
Соленоидный клапан |
50–200 Гц |
Пропорциональное усилие без гидроудара |
Типичные применения в промышленной автоматизации
Управление нагревателями - классика ШИМ в ПЛК. Выход ПИД-регулятора (0–100%) напрямую преобразуется в коэффициент заполнения: при 50% нагреватель получает половину мощности, при 75% - три четверти. Период выбирают 5–20 секунд, чтобы ТЭН не щёлкал чаще необходимого, а термостатирование оставалось плавным. В TIA Portal выход PID_Compact типа PWM подключается к технологическому объекту напрямую, без дополнительного масштабирования.
Регулировка скорости вентиляторов и насосов через ШИМ вместо частотного преобразователя - экономичное решение для маломощных нагрузок до 200–500 Вт. Транзисторный ключ на MOSFET вроде IRLZ44N (55 В, 47 А) с драйвером IR2104 управляется прямо с выхода ПЛК. Обратный диод защищает от индуктивных выбросов обмоток.
Диммирование светодиодных лент и прожекторов в SCADA-управляемых системах освещения: ПЛК принимает уставку яркости 0–100% от системы диспетчеризации по Modbus, преобразует в коэффициент заполнения 0–10000 и записывает в PWM DB. Свет меняется плавно, без мерцания, с задержкой не более 10 мс.
Пропорциональные соленоидные клапаны в гидравлике и пневматике: ШИМ позволяет регулировать усилие плунжера (а значит, расход жидкости) без использования дорогого аналогового выхода. Катушка клапана принимает импульсы, интегрирует их через собственную индуктивность, и якорь занимает промежуточное положение. Метод применяется в мобильной технике, металлообработке, системах дозирования.
ШИМ и ПИД: идеальный тандем
Связка ПИД-регулятора с ШИМ-выходом - одна из самых распространённых схем в промышленности. ПИД вычисляет выходное значение от 0 до 100% на основе рассогласования измеренной и заданной величин, а ШИМ транслирует этот процент в коэффициент заполнения для дискретного транзисторного ключа.
Важный нюанс: период ШИМ должен быть значительно меньше постоянной времени регулируемого объекта. Если нагреватель имеет постоянную времени 60 секунд, период ШИМ 10 секунд даёт достаточную плавность. Для двигателя с постоянной времени 0,1 секунды период ШИМ должен быть не более 5–10 мс. Нарушение этого соотношения приводит к пульсациям регулируемой переменной, которые ПИД будет безуспешно пытаться компенсировать, раскачивая систему.
Anti-windup интегральной составляющей ПИД особенно важен в связке с ШИМ: когда выход насыщается (100% или 0%), интегратор обязан заморозиться, иначе накопленная ошибка при снятии насыщения вызовет перерегулирование.
Диагностика и типичные ошибки при работе с ШИМ
Неправильно выбранный тип выхода - самая распространённая ошибка новичков. Попытка реализовать ШИМ на релейном выходе ведёт к быстрому выгоранию контактов и нестабильной частоте. Всегда проверяйте маркировку CPU: DC/DC/DC означает транзисторные выходы, AC/DC/Relay - релейные.
Электромагнитные помехи от ШИМ: быстрые фронты переключения транзистора создают высокочастотный шум, распространяющийся по силовым проводам. Снеки (snubber-цепочки) RC параллельно нагрузке, ферритовые бусины на силовых проводах и разделение аналоговых и силовых кабельных трасс - обязательные меры для сохранения чистоты аналоговых измерений в том же шкафу.
В Siemens TIA Portal STATUS блока CTRL_PWM 16#8091 означает попытку запустить PWM на выходе, не поддерживающем высокоскоростной режим. Решение - пересмотреть конфигурацию и выбрать правильный физический выход из числа Qa.0–Qa.3.
ОВЕН и Codesys: ШИМ без аппаратного таймера
В контроллерах ОВЕН ПЛК110, ПЛК150, ПЛК160 быстрые транзисторные выходы (Fast outputs) поддерживают ШИМ программным блоком. В конфигурации Codesys к выходу привязывается блок PWM: параметр PWM_PERIOD задаёт период в миллисекундах (например, 10000 = 10 секунд для нагревателя), PWM_POWER задаёт ширину импульса в тех же единицах (5000 из 10000 = 50%).
Типичный рецепт для нагревателя в ОВЕН: ПИД блок FB_PID с выходом REAL 0.0–1.0 умножается на PWM_PERIOD и записывается в PWM_POWER. Связка работает в цикле OB1, период ШИМ - 20 секунд, разрешение 1% вполне достаточно для термостатирования с точностью ±0,5°C.
Будущее ШИМ в промышленных контроллерах
В 2026 году ШИМ в ПЛК эволюционирует вместе с силовой электроникой. Нитрид галлия (GaN) и карбид кремния (SiC) транзисторы переключаются на частотах 1–10 МГц с потерями в разы меньше, чем кремниевые MOSFET. Это открывает путь к ШИМ-выходам ПЛК для прямого управления силовыми ключами без промежуточных драйверных плат.
Интеграция ШИМ с AI-алгоритмами в edge-ПЛК позволяет адаптивно менять частоту переключения в зависимости от загрузки, температуры и спектра помех - что-то среднее между классическим ШИМ и интеллектуальным частотным преобразователем.
Если вы хотите не просто читать о ШИМ и ПЛК, а по-настоящему разобраться в программировании Siemens, ОВЕН и Codesys - с реальными примерами кода, разбором ошибок и ответами от практикующих инженеров - подписывайтесь на Telegram-канал ПЛК и автоматизация. Это сообщество для тех, кто хочет превратить теорию в рабочие проекты.
Андрей Повный

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