Если вы только учитесь программировать ПЛК, то без знаний, как выполняется программа внутри, вам придется туго. На первый взгляд кажется, что выполнение программы – это реакция на событие:
«Нажал кнопку, загорелась лампочка. Пока кнопка не нажата – ничего не происходит, программа не выполняется.»
Но это абсолютно неверно для программируемых логических контролеров.
Чтобы объяснить, как все происходит, в этой статье мы подробно поговорим о таком понятии, как рабочий цикл.
В программировании промышленной автоматики все очень четко, последовательно и предсказуемо.
Представьте, что ПЛК — это единственный сотрудник на огромном заводе, очень ответственный и неутомимый. Его работа состоит в том, чтобы обеспечивать реализацию техпроцесса: постоянно, раз за разом, проверять десятки датчиков и включать/выключать сотни двигателей и клапанов. И делает он все это в строгом порядке раз за разом.
Этот процесс и есть — рабочий цикл.
Рабочий цикл ПЛК (цикл сканирования, scan cycle, тик системы) — это непрерывно повторяющаяся последовательность операций, которые выполняет процессор ПЛК для обработки пользовательской программы, обмена данными с внешним оборудованием и выполнения внутренних служебных задач. Иногда один цикл называют «тактом» или «тиком», а в технической документации и среде разработки можно встретить такой параметр, как время рабочего цикла или время цикла сканирования (Scan Cycle Time).
Рабочий цикл включает четыре этапа.
1. Чтение состояния входов
ПЛК фиксирует состояние всех входов (датчиков, кнопок, выключателей, энкодеров и т.п.) и сохраняет эти данные в область памяти ввода-вывода (I/O Memory), отвечающую за хранение входных данных (Input Image Table). Это важно, так как гарантирует, что программа будет работать с единым набором данных на протяжении всего текущего цикла, даже если реальные входные сигналы вдруг изменятся.
По аналогии с нашим «универсальным сотрудником»: перед началом работы он обходит все датчики и устройства и записывает себе в блокнот их показания, что включено, а что нет, чтобы потом, когда он будет производить необходимые расчеты и принимать какие-то решения, не бегать и не перепроверять их. Иначе он только и будет делать, что бегать туда-сюда.
2. Выполнение кода программы пользователя
Используя полученные данные, процессор последовательно выполняет код программы, написанный пользователем. Выполнение кода в языках стандарта МЭК 61131-3 идет сверху вниз и слева направо. То есть, вы можете использовать результат, полученный в первой строчке кода/в первом блоке, для вычислений в следующей строчке/блоке.
Итоги работы (команды для исполнительных устройств – значения выходов) ПЛК также сохраняет в своей памяти, в области для хранения выходных данных (Output Image Table).
Важно: Физические выходные устройства (лампы, двигатели, клапаны) на этом этапе еще не меняют своего состояния! Программа лишь готовит для них команды, которые будут исполнены в конце цикла.
Глядя в свой блокнот с показаниями, наш работник сверяется с инструкцией (написанной вами программой). "Если давление в котле больше 100 и температура меньше 50, то закрыть аварийный клапан". Он принимает решение: "клапан нужно закрыть" и записывает эту команду себе в блокнот в список дел.
3. Запись состояния выходов
После завершения расчетов программы наступает этап воздействия на реальный мир. ПЛК копирует все сформированные команды из области хранения выходных регистров в физические выходы - свои или модулей. Это приводит к моментальному и одновременному обновлению всех выходных сигналов: включению и выключению реле, двигателей, клапанов и сигнальных ламп.
На нашем фантастическом заводе это выглядит так: закончив обход и приняв все решения, наш универсальный работник подходит к панели управления и одним нажатием кнопки выполняет все, что он записал в свой to-do лист: включает один насос, выключает другой, зажигает сигнальную лампу, перекрывает аварийный клапан…
4. Служебные операции
На последнем этапе рабочего цикла контроллер выполняет служебные и коммуникационные задачи. Контроллер обслуживает запросы от панелей оператора (HMI), систем SCADA и других сетевых устройств, а также выполняет внутреннюю самодиагностику.
Служебные задачи условно можно разделить на:
- коммуникации (обмен данными с HMI, SCADA, другими ПЛК и т. д.),
- самодиагностику (проверка целостности памяти, модулей и т. д.),
- контроль времени цикла.
Сюда входят коммуникация с другими устройствами по внешним сетям и внутренней шине, обслуживание портов и специализированных модулей, диагностика аппаратных сбоев, обновление системных часов, контроль стека вызовов, проверка целостности программы пользователя, мониторинг использования памяти, обработка системных ошибок выполнения и т.д.
Эта фаза важна для надежности и безотказности всей ПЛК-системы и ее связи с внешнем миром. Завершается сервисный этап сбросом сторожевого таймера (watchdog timer, WDT). После этого цикл повторяется с самого начала.
Так, наш универсальный работник, выполнив все задачи в своем списке, проверяет, что с ним самим все ОК, что все пошло по плану, и он все сделал вовремя, что у него в блокноте еще есть чистые листочки, что у него есть ручка, и она пишет и так далее.
Контроль времени цикла
WatchDog Timer (WDT, сторожевой таймер) — это специальный таймер (счетчик), который должен сбрасываться в конце каждого успешного цикла. Идея в том, что если программа работает корректно и завершает цикл за нормальное (установленное пользователем) время, ПЛК успевает сбросить этот таймер. Если же программа «зависла» (попала в бесконечный цикл, произошел сбой), а максимальное время истекло, то этот таймер не сбрасывается и ПЛК перезагружается, переводится в аварийный режим или останавливается по критической ошибке (EXCEPTION).
В среде разработки этот параметр может выглядеть как настройка максимального времени цикла или же отдельная настройка сторожевого таймера. Также обычно можно настроить восприимчивость – это сколько таких «длинных» циклов нужно считать сигналом для остановки или перезапуска.
Таким образом, достигается предсказуемое поведение ПЛK при ошибках в программе и при «зависании».
Контроль времени цикла обеспечивает предсказуемость и надежность системы, что является ключевым требованием для промышленных систем управления.
Иногда в среде разработки или таргет-файле на ПЛК уже прописана переменная, содержащая текущее время цикла, что-то в духе CURRENT_CYCLE_TIME (текущее время цикла). Но что делать, если нет?
Во всех ПЛК есть внутренний отсчет времени от старта. Например, в CoDeSys это значение можно получить функцией TIME(). Используя ее, можно написать простейший счетчик времени цикла, который будет сбрасываться каждый новый цикл.
Этот код (на скриншоте в центре) можно вставить в любую часть программы, которая точно выполняется в каждом цикле, например в самом начале. Но также очень удобно вынести подсчет времени цикла в отдельный функциональный блок или в отдельную программу. В примере мы оформили подсчет времени цикла в виде функционального блока.
Обратите внимание, T0 при объявлении инициализируем здесь через функцию TIME() для расчета самого первого цикла. И в таком случае время самого первого цикла будет равно 0 — это удобнее, чем инициализировать Т0 нулем. Ведь тогда первый цикл может достигать нескольких секунд, так как при первом запуске ПЛК дополнительно проводит ряд сервисных задач. Для каких-то алгоритмов это может быть критично, но все можно предусмотреть в коде. Поэтому выбор за вами.
Возможно, вы задумаетесь, как ПЛК считает время, не имея на борту часов или батарейки. На самом деле тут все просто, но это тема для отдельного поста. Дайте знать, если будет интересно.
Что влияет на время цикла?
- объем и сложность программы,
- количество модулей ввода/вывода,
- обмен с сетевыми устройствами по modbus или другим протоколам,
- скорость процессора,
- нагрузка от системных задач,
- архитектура, многозадачность, прерывания.
Если кратко, то время цикла зависит от того, сколько работы должен выполнить ПЛК за один цикл (программа, обмен с I/O, сервис) и насколько быстро он это способен делать (процессор, архитектура).
Время реакции ПЛК-системы
Еще одно важное понятие в контексте работы контроллеров – это время реакции.
Время реакции – это время, прошедшее с момента изменения состояния системы до момента выработки соответствующей реакции.
Интересный момент в том, что время реакции не равно времени цикла и зависит от конкретного момента возникновения события и начала фазы чтения входов.
Если изменение значений входов произошло непосредственно перед фазой чтения входов, то время реакции будет наименьшим и почти равным времени цикла сканирования.
А если изменение значений входов происходит сразу после фазы чтения входов, тогда время реакции будет наибольшим, равным удвоенному времени цикла сканирования минус время одного чтения входов.
Это не совсем удобно для некоторых быстрых штук, например, энкодеров. Но это часто это решено их устройством – они сами считают свои обороты, а ПЛК передают уже готовое число в фазе опроса.
Заключение
Итак, мы детально разобрали все этапы работы ПЛК: от сканирования входов до сброса сторожевого таймера. Это знание — не просто академическая теория, а фундаментальный принцип, на котором строится вся логика программирования промышленных контроллеров.
Что дает нам понимание циклического характера работы ПЛК:
- Возможность писать четкие, однозначные, последовательные и предсказуемые программы. Понимание того, что ПЛК повторяет ваш код сотни раз в секунду, несколько меняет подход к проектированию логики.
- Вы больше не думаете, что контроллер "ждет" нажатия кнопки. Вы понимаете, что сканирование идет с определенной частотой, и соответственно есть определенные задержки между событием и реакцией на него.
- Контроль над временем цикла и временем реакции системы. Мы можем использовать этот параметр в реализации своих профессиональных задач.
- Эффективную оптимизацию программы. Если время цикла слишком большое, вы сможете локализовать и разрешить причину задержек (если это возможно). Например, реализовывать циклический опрос сетевых устройств и создавать для них свои счетчики времени их внутренних циклов для диагностики таких задержек.
- Понимание принципа работы сторожевого таймера и возможность использовать его для обеспечения безопасности техпроцесса.
Таким образом наш универсальный работник, ПЛК, — это неутомимый автомат, который непрерывно в строгом, предопределенном порядке с огромной скоростью опрашивает мир, принимает решения и воздействует на него. Его работа циклическая, стабильная и абсолютно предсказуемая.
Именно этот принцип — предсказуемое, непрерывное, циклическое выполнение — делает ПЛК сердцем промышленной автоматизации, которое обеспечивает надежность, безопасность и стабильность работы современных автоматизированных комплексов.
Надеемся, эта статья поможет вам глубже понять суть внутренних процессов и прокачаться в программировании, а если вам интересно узнать больше – записывайтесь к нам на курсы!