С ЦИФРОВЫМИ РЕГУЛЯТОРАМИ НА БАЗЕ ПРОГРАММИРУЕМЫХ ЛОГИЧЕСКИХ КОНТРОЛЛЕРОВ; ПРОГРАММНАЯ РЕАЛИЗАЦИЯ РЕГУЛЯТОРОВ
Аналоговые и дискретные регуляторы
Регуляторы можно строить на основе как аналоговой, так и циф- ровой техники. Соответственно, для анализа и проектирования аналогового и цифрового регулятора требуются разные математи- ческие методы. Хотя цифровая технология позволяет хорошо мо- делировать работу аналоговой системы управления, то есть реализовать аналоговые понятия цифровыми средствами, ее воз- можности гораздо шире. Например, можно построить нелинейные и самонастраивающиеся регуляторы, которые нельзя создать на основе только аналоговых средств. Главная проблема цифрового управления – найти соответствующую структуру регулятора и его параметры. После определения этих параметров реализация алго- ритмов управления обычно представляет собой простую задачу. Помимо этого, каждый регулятор должен включать средства защи- ты, предотвращающие опасное развитие процесса под действием регулятора в нештатных ситуациях. Многие производственные процессы характеризуются несколькими входными и выходными параметрами. В большинстве случаев внутренние связи и взаимо- действие соответствующих сигналов не имеют принципиального значения, и процессом можно управлять с помощью набора про- стых регуляторов, при этом каждый контур управления обрабаты- вает одну пару вход/выход. Такой подход используется в системах прямого цифрового управления.
Релейное управление
Релейное управление – самый простой алгоритм из возможных, ведь у нас есть только два состояния – «вкл.» и «выкл.».
Рассмотрим алгоритмы, которые сделают релейное управление более надежным и повысят точность регулирования. Начнем с самого простого и очевидного:
if (temp < 50.0) digitalWrite(relayPin, 1);
else digitalWrite(relayPin, 0);
Данный код не нуждается в комментариях, он просто включает реле, когда условная температура ниже 50 ºC, и выключает, когда она выше. Если вызывать данный код без задержки или таймера – мы получим жуткий дребезг в момент включения и выключения реле, так как шумы измерений будут постоянно менять результат условия.
Рис. 110. Двухпозиционное регулирование с регулятором без зоны неоднозначности
Зеленый график – как раз состояние реле. Из этого графика так- же следует неутешительный вывод: значения надо фильтровать, это сильно увеличит стабильность системы.
Первым шагом к созданию нормального релейного регулятора является период работы регулятора, его можно реализовать как за- держкой:
if (temp < 50.0) digitalWrite(relayPin, 1);
else digitalWrite(relayPin, 0); delay(1000);
так и таймером: static uint32_t tmr;
if (millis() - tmr >= 1000) { tmr = millis();
if (temp < 50.0) digitalWrite(relayPin, 1);
else digitalWrite(relayPin, 0);
}
Ситуация изменится к лучшему, ведь даже при всем желании реле не сможет переключаться чаще, чем раз в секунду.
Второй способ – гистерезис – позволяет еще сильнее умень- шить количество переключений реле и даже избавиться от опроса по таймеру, что повышает реакцию системы на изменения, сохра- нив при этом хорошую устойчивость к помехам. Гистерезис разде- ляет установку на две, чуть меньше и чуть больше, на размер окна гистерезиса (рис. 111).
Рис. 111. Принцип двухпозиционного регулирования с зоной неоднозначности
Логика работы такова, что мы включаем реле на нагрев ниже нижней линии, и выключаем только выше верхней. То есть образу- ется область, внутри которой система, грубо говоря, движется по инерции от последнего переключения и переходит в новое состоя- ние только при выходе из этой области. Очевидно, что добавление гистерезиса сильно уменьшает не только количество переключений реле, но и точность, потому что мы сами задаем область, точность внутри которой нам фактически безразлична, как и шумы измерения.
В коде гистерезис можно реализовать следующим образом: #define RELAY_PIN 2
float setpoint = 50.0; // установка
float hyster = 2; // ширина окна гистерезиса
//...............
static bool relayState = false; // обязательно глобальная или стати- ческая!
if (temp < (setpoint - hyster )) relayState = true;
else if (temp > (setpoint + hyster )) relayState = false; digitalWrite(RELAY_PIN, relayState);
Пример использования гистерезиса в регулировании уровня во- ды в баке приведены на рис. 112 и 113.
Рис. 112. Двухпозиционное регулирование уровня воды в баке
с зоной неоднозначности, программа на языке релейно-контактных лестничных диаграмм LD
Рис. 113. Программа управления работой электродвигателя (пуск/останов кнопочными постами) на языке релейно-контактных лестничных диаграмм LD
Достарыңызбен бөлісу: |