О моделировании систем управления

Изменения температуры в различных точках вдоль пластины и текущая мощность нагревателя.
Изменения температуры в различных точках вдоль пластины и текущая мощность нагревателя.

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

Подход к моделированию, предложенный в Ява-пакете org.engitex.controllogic, не только поможет с моделированием сложных АСУ, но и с переносом (при необходимости) кода из модели на язык релейной логики, используемый для программирования ПЛК.

Другая "горячая" тема - это выбор ПК вместо ПЛК при проектировании некоторых систем управления. Современные ПК имеют более широкие возможности для симуляций в реальном времени, обработке данных и сетевому взаимодействию за счет многопоточности, мощных CPU, доступности различных сред для написания программ. Однако ПЛК будут по-прежнему использоваться, по крайней мере в тех задачах, где необходимо строгое соблюдение задержек, временных интервалов. ОС на ПК намного менее "строгая" в этих вопросах.

Ява-пакет от НТЦ Энжитек полезен как для моделирования АСУ, так и для непосредственной реализации системы управления на ПК (в среде Java). Примеры, включенные в пакет, доступный для скачивания, содержат:

  • Систему управления в реальном времени, т.е. http-запросы на сервис погоды (HttpResponseTester.java);
  • Моделирование управления нагревателем (HeatDiffusion1D.java).

Рассмотрим 2-ой пример.

Простой пример: пластина, нагреватель, термистор, теплообмен с окружающей средой.
Простой пример: пластина, нагреватель, термистор, теплообмен с окружающей средой.

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

Пакет позволяет сделать код, описывающий АСУ читаемым - внутри цикла по временным шагам будут только условия if для задания логических входных сигналов (перегрев и остывание). Все остальное, имеющее отношение в АСУ, может быть вынесено в отдельный блок кода или класс.

// cs is an object of ControlSimulator class, see HeatDiffusion1D.java source file TriggerManual overheatSignal = new TriggerManual(null, 0, false, cs, "temp. thresh., heater off"); TriggerManual cooledSignal = new TriggerManual(null, 0, false, cs, "temp. thresh., heater on"); // make Runnables for the Task Runnable onStart = new Runnable() { @Override public void run() { if (overheatSignal.isTrue() && !cooledSignal.isTrue()) { currentEdgeSource = 0.0f; // heater off } else if (cooledSignal.isTrue() && !overheatSignal.isTrue()) { currentEdgeSource = edgeSourceNominal; // heater on } } }; Runnable onStop = new Runnable() { @Override public void run() { } }; /* It is important to allow multiple starts by setting allowMultipleStarts = -1 because this task will be started at each time slice. In general, for simulated control allowMultipleStarts = -1 is the most common setting. */ Task sourceControlTask = new Task(onStart, onStop, -1, "source control task"); /* then inside the simulation time loop only overheatSignal and cooledSignal will be updated at each time step */ if (tempProfile[sensorPos] > 60.0f) { overheatSignal.setOn(); cooledSignal.setOff(); } else if (tempProfile[sensorPos] < 50.0f) { cooledSignal.setOn(); overheatSignal.setOff(); }

Итак, после симуляций (графики приведены выше), возможны два пути:

  • Создать систему управления на ПК. В этом случае нагреватель и термистор будут управляться через порты GPIO, USB или даже по сети, в зависимости от "железа".
  • Другой путь - выбор ПЛК.

Опишем для данного примера, что необходимо изменить для переноса модельной АСУ в реальную на ПК:

  • Объект класса ControlSimulator следует заменить на объект класса ControlRealtime (оба класса - прозводные от Control).
  • Очевидно, убрать цикл по временным шагам вместе с методом setTime.
  • Задача sourceControlTask уже будет запускаться в цикле (см. изменения в коде ниже, см. на инициализацию sourceControlTask и Runnable loop). Также будут добавлены методы для коммуникации с нагревателем и датчиком температуры getSensorTemp, setHeaterOff, setHeaterOn:
Runnable loop = new Runnable() { @Override public void run() { if (getSensorTemp() > 60.0f) { overheatSignal.setOn(); cooledSignal.setOff(); } else if (getSensorTemp() < 50.0f) { cooledSignal.setOn(); overheatSignal.setOff(); } if (overheatSignal.isTrue() && !cooledSignal.isTrue()) { setHeaterOff(); } else if (cooledSignal.isTrue() && !overheatSignal.isTrue()) { setHeaterOn(); } } }; Runnable dummy = new Runnable() { @Override public void run() { } }; Task sourceControlTask = new Task(dummy, loop, dummy, -1, "source control task");

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

В случае необходимости переноса кода на язык релейной логики, такую логику несложно построить, смотря на блоки кода, описывающие триггеры (т.е. цифровые сигналы) и задачи (tasks). В этом случае вместо продвижения с временным шагом симуляции dt, продвижение в реальности будет с шагом ПЛК (т.н. cycle time).

Начать дискуссию