Привет, Хабр! Это мой первый опыт написания здесь, если что, уж сильно не пинайте). Сам я программист самоучка. Новый язык Structured Text и среду разработки Codesys разбирал по мануалу и стандарту МЭК-61131-3. В статье будет рассматриваться легкий самописный фреймворк для быстрой сборки насосной станции реализованной на ПЛК 110-32м2 фирмы ОВЕН.

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

Большую часть парка промышленного оборудования на предприятии фирмы ОВЕН (это различные датчики температуры и давления, ТРМы, блоки питания, ПЛК (110) аналоговые и дискретные модули ввода-вывода (110), сенсорные панели (СП307 и СП310), и сетевые шлюзы для доступа к сервису OwenCloud, частотные преобразователи(ПЧВ). Основной контроллер который мы используем - ПЛК 110-60 (для автоматизации котельных) и ПЛК 110-32 (для автоматизации ЦТП). Разработка программ для этих ПЛК происходит в Codesys 2.3. Поскольку Программистских академий мы не кончали, а курсов по промышленному программированию на языках МЭК никто отродясь не видывал, пришлось с нуля осваивать новую стезю. О первый мой рабочий код.. я буду плакать по тебе кровавыми слезами. Надеюсь сейчас мой код выглядит получше, чем тогда..

Случилось так что на ЦТП вышла из строя, по сроку годности, одна импортная насосная станция. И светлым умам нашего предприятия пришла идея собрать свою, на ПЛК. набросали хардкодингом-быдлокодингом одну программу.. Через полгода скачком напряжения убило насосную станцию на другом объекте.. Снова ПЛК и снова захардкодили программу. Местному руководству так понравилась идея собственной разработки насосной станции, что при ближайшей реконструкции объекта заменяла старую станцию - собственной разработкой ведь экономия средств то какая. Но конфигурация станций всегда разная: тут два насоса, там пять; на этом объекте надо чтобы насосы поочередно переключались, на следующем чтобы работали в каскадном режиме. Разные запросы были. И тут-то я созрел - нужен какой-нибудь фреймворк, чтобы можно было быстро собирать эти станции различной конфигурации.

Для работы нам понадобятся:

  • Codesys 2.3

  • Таргет-файл для ПЛК 110-32м2

  • Подключить к проекту библиотеку  Util.lib

  1. Создаем новый проект. выбираем конфигурацию нашего ПЛК.

  1. Главная программа будет на языке CFC. Так наглядней и проще для тех кто не знаком с языками программирования.

По ТЗ у нас на ПЛК приходят сигналы:

Discrete inputs:

  1. Защита по сухому ходу (низкое давление на входе насоса).

  2. Защита по превышению давления на выходе насоса.

  3. Внешняя авария (авария частотного преобразователя).

  4. Статус частотного преобразователя "Работа" (RUN).

Discrete outputs:

  1. Запустить частотный преобразователь.

  2. Квитировать/сбросить аварию частотного преобразователя.

Импортируем в программу нашу виртуальную модель ПЛК, структуру для ее работы и методы.

Сложим наши свежие импорты в папочку чтоб не растерять.
Сложим наши свежие импорты в папочку чтоб не растерять.
Структуры необходимые для работы блока ПЛК110
Структуры необходимые для работы блока ПЛК110
Вид ПЛК110-32 на языке CFC
Вид ПЛК110-32 на языке CFC

Теперь к этому блоку мы можем как на электрической схеме подключить наши сигналы к дискретным входам. Допустим у нас станция будет из трех насосов. Подключаем наши сигналы виртуальными проводочками. Для работы с входами ПЛК мы их упаковываем в inputs_plc имеющей тип данных classPLC32m2StatusInputs

inputs_plc присваиваем соответствующую структуры данных.
inputs_plc присваиваем соответствующую структуры данных.

Для работы с этими данными у нас имеются методы: get_fdi и get_di

get_fdi(number_fdi: int, inputs_plc: classPLC32m2StatusInputs) -> bool;
get_di(input_number: int, inputs_plc: classPLC32m2StatusInputs) -> bool;

Подключим наши выходные сигналы к выходам. Для управления выходами добавляем вспомогательный блок get_status_outputs, он принимает на соответсвующий вход булевое состояние и упаковывает все в тип данных classPLC32m2StatusOutputs, с которым работает блок main_plc.

К входам блока outputs мы будем подключать непосредственно результат логики работы нашего контроллера.
К входам блока outputs мы будем подключать непосредственно результат логики работы нашего контроллера.

Эти блоки для работы с ПЛК110-32 универсальны и могут использоваться в любых других проектах под этот контроллер. Визуально все в одном месте и при онлайн отладке удобно наблюдать за состоянием входов-выходов ПЛК.

Для получения давления на входе и выходе насоса используются датчики 4-20мА. Сигнал в контроллер приходит через модуль аналоговых входов МВ110-8а. Импортируем модель этого модуля в проект.

В PLC_PRG добавляем наш блок аналоговых входов. analog_inputs упаковываются в соответствующий класс classInfoAnalogInputModule

Для работы необходим вспомогательный блок с настройками SetChannelsAnalogInputsModule. Этот блок содержит конфигурацию входов модуля. По умолчанию настройки всех каналов (0-100, 4-20мА).

Конфигурация регистров:

Не забываем проставить адреса регистров которые мы будем считывать (см инструкцию Приложение В, таблица В.4 - регистры протокола modbus.

Сконфигурировав канал аналогово модуля можем импортировать блок для датчика 4-20мА.

Метод get_channel_current_value(number_channel: int, analog_inputs: classInfoAnalogInputModule) позволяет получить значение с АЦП соответствующего канала.

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

Блок с параметрами датчика нужен для соответствующего масштабирования согласно параметрам реального датчика.
Блок с параметрами датчика нужен для соответствующего масштабирования согласно параметрам реального датчика.

Насосом у нас управляет частотный преобразователь. Импортируем содержимое папки invertor_drive.

Функциональный блок частотника и его методы.
Функциональный блок частотника и его методы.

Добавляем блок в проект, подключаем данные со входов ПЛК, используя метод get_di. ain_value (float) - это аналоговый вход частотника, подключаем туда наше давление, которое мы собираемся контролировать. set_point (float) - это уставка по давлению.

start_id (bool) - сигнал на старт частотного преобразователя; auto_id (bool) - когда True, то работает ПИД-регулятор, когда False - режим manual; manual_hz - значение выходной частоты в режиме manual (Hz) ;active_id (bool) - флаг готовности к работе насоса; alarm_on (bool) - это флаг аварийного состояния, когда он активен, частотник не стартует. P, I, D - это коэффициенты регулятора, по умолчанию (2, 10, 0). min, max _range - это нижний и верхние пределы значения на выходе регулятора. aout_value - сюда мы подключим частоту на выходе регулятора и она на выходе автоматически масштабируется в значение тока 4-20мА.

Для регулятора импортируем блок распаковки настроек регулятора.

PID регулятор возьмем из библиотеки Util.lib которая идет в комплекте с Codesys (через менеджер библиотек добавляем в проект).

Частотник готов к работе и теперь им можно управлять.
Частотник готов к работе и теперь им можно управлять.

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

Реализация модуля аналогового вывода.
Реализация модуля аналогового вывода.

Для работы насосной станции предусмотрены 3 режима. Single - одиночный режим работы, когда выбираем насос и он всегда работает; Cycle - режим циклического переключения насосов. Задаем время переключения и активные насосы по очереди работают. Cascade - режим каскадного включения насосов, при недостатке давления на выходе. Чтобы насос участвовал в работе его флаг active должен быть True

Блоки режимов работы станции.
Блоки режимов работы станции.

Каждый блок может управлять до 8-ми насосов. Притом для цикла и каскада необходимо более 2х активных насосов.

Рулит этими режимами - селектор.

В селекторе предусмотрен режим обработки ошибок, например таких как: не выбран режим работы или не задан опорный насос и пр.

Обработкой всех ошибок занимается alarm_manager. Для аварий частотного преобразователя сделан свой блок. Сюда собираются все аварийные флаги и в случае нештатной ситуации генерируется код аварии и сообщение.

Менеджер возвращает нам флаг аварии, код аварии и расшифровку в виде информационного сообщения.
Менеджер возвращает нам флаг аварии, код аварии и расшифровку в виде информационного сообщения.

Не забываем вывести наши выходные сигналы на выходы ПЛК.

Конфигурируем выходы ПЛК.
Конфигурируем выходы ПЛК.

Можно запустить эмуляцию и проверить как работают режимы.

Для работы функциональных блоков в фреймворке реализованы functions project. Простенькие функции для работы с массивами, функция масштабирования диапазона и функция для задания времени.

Общие функции фреймворка.
Общие функции фреймворка.

Вот в принципе и всё. Я надеюсь что основная мысль понятна. С помощью фреймворка для контроллера буквально за 15-20 минут можно реализовать программу для нескольких групп насосов работающих независимо друг от друга. Останется дело за малым, сконфигурировать вывод параметров на HMI. Но об этом в следующий раз.

Код проекта с примером

Комментарии (20)


  1. Astronom71
    30.09.2022 11:54

    single_en, cycle_en, cascade_en - ?

    Ждем описания визуализации


    1. mrkrivedko Автор
      30.09.2022 14:29

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


  1. beeptec
    30.09.2022 12:04
    +1

    Интересно, какие контроллеры изначально стояли на Ваших станциях и какой функционал они давали?

    Что касается Овнов, вернитесь сюда скажем через год эксплуатации своих станций.
    Контора изначально организовалась для производства простейших регуляторов температуры. Потом аппетиты выросли. Стали делать ПЛК на 8 битных AVR. Что они делают сами - это вообще загадка. Часть, наверное, делают, но большую часть берут в Китае. В интернете есть даже сравнение - панель HMI китайская и от ОВНО. Найди разницу. Есть у них "завод" в Калужской области. Чисто для сборки. Пришла плата и корпус - соединили и продали.На форуме у них цензура есть. Попробуйте напишите что-нибудь. Могут и судом пригрозить, если что. Надо искать форум независимый от производителя.

    О недостатках Овна, по мере эксплуатации много пишут и уже есть целый самиздат туториал.

    Люди на безрыбье используют их продукцию и катаются регулярно в ремонт с новым на ремонты! Было там костыльное решение с батареей, что тянуло за собой

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

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





    1. smoluks4096
      30.09.2022 13:50
      +2

      Ну у меня допустим есть проекты, где они работают больше года
      Плк и пр свои на stm32, плк с графическим дисплеем китайские, но прошивка своя. Платы сейчас большиство производителей делает и монтирует в Китае, это не аргумент. Косяки - бывают, МЭ110 один раз пришел с одним резистором в обрыве, и у них же RS485 был очень слабый и не тянул терминатор, но за пусконаладку все отловилось.
      Сиеменсы безусловно лучше, но на прям жопу жопу тоже не тянет


      1. beeptec
        30.09.2022 14:40

        На RISC платформах что-то внедрять в промышленность заведомо с малым жизненным циклом 3 - 5 лет, в условиях ... выстрел в ногу.


        1. smoluks4096
          01.10.2022 15:10

          Только чипы на Cortex-M3 не делает только ленивый, то есть они будут производиться до ядерной войны, во время и после. А тот же СПК107 на TI-шном омапе вроде, на что его мигрировать, если этих чипов не будет?


    1. Anidal
      30.09.2022 14:45
      +1

      Самый популярный по числу хейтеров ПЛК - ПЛК от фирмы ОВЕН. Чего только ему не приписывали. Разве что детей по ночам не ест.

      Тем временем работает, работает и работает.



    1. mrkrivedko Автор
      30.09.2022 15:01

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


      1. GreyPhantom
        30.09.2022 20:13
        +1

        курсов по промышленному программированию на языках МЭК никто отродясь не видывал

        дык у того же Овена курсы есть. Вебинары ы свободном доступе на Ютубе, форум, в конце концов.

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

        Если уж

        пришло желание сделать универсальные блоки и быстро собирать программу

        то делали бы библиотеку, без привязки к аппаратному обеспечению. А то снимет ОВЕН 110-е контроллеры с производства (а он уже года два как вовсю пиарит 200-ю серию с CodeSys 3 и ПР200 с OwenLogic ) и превратится "фреймворк" в тыкву.

        ПЛК110 для насосной станции? Кучеряво живете, однако. Или у Вас там на одной станции по 10 насосов, каждый со своим частотником? С большинством (если не со всеми )задачами по автоматизации насосных установок вполне справится таже ПР200, которая в три раза дешевле будет. Или уже готовый блок управления насосами типа СУНА, который суть все та же ПР200, но уже запрограммированная на заводе.


        1. mrkrivedko Автор
          30.09.2022 20:34

          Я людь подневольный.. дали проект, дали шкаф.. и крутись как хочешь, но к отопительному сезону чтоб все работало.. )

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

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


          1. GreyPhantom
            30.09.2022 21:11

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

            Хм, не скажу что это плохое решение. Но ведь тогда все переменные конфигурации нужно выводить на панель или в SCADA-систему? Не думаю, что у вас так часто конфигурация установки меняется. А все возможные ситуации все равно не предусмотришь. У меня вон- при наличии частотников до сих пор на панелях стоят контакторы и куча реле от старых схем, а на приводах питателей - механические вариаторы. На случай- "вдруг частотник помрет". Вот только как доказать начальству, что изменить схему управления с частотника на контакторную, с сохранением всех блокировок и сигнализаций- времени занимает больше, чем заменить и настроить частотник.


            1. mrkrivedko Автор
              30.09.2022 21:36

              О ! У нас на работе есть артефакт собранный на скорую руку. КМИ с интегрированными в корпус реле в корпусе автомата, с замыканием от ЭКМ, для защиты от сухого хода и превышения давления.. ) со времен когда первую станцию с насосами прошило насквозь после удара молнии


  1. rencom66
    30.09.2022 19:41

    Мне вот сегнетикс больше нравится..

    Пытался Овен использовать.

    Нафиг.


    1. mrkrivedko Автор
      30.09.2022 20:01

      У меня из сегнетиков только pixel был.. прикольная балалайка. Визуализацию экранов прям понравилось делать в их среде SM Logic.


  1. beeptec
    30.09.2022 20:03

    В оборонке, космических, медицинских и бытовых проектах нет ограничений по архитектуре, на чем хотите, на том и стройте систему управления хоть на RISC, хоть на CISC, когда в одним случае Вы ограничены проприоритарным железом и средой кодирования, или в другом с полной ЯП свободой действий и выбором осей с расширениями I/O, GPIO.


  1. ventcomplex
    01.10.2022 05:21

    Откуда у "рядового слесаря по КИПиА", и главное зачем? столько терминов из компьютерного программирования? Не употребляются в АСУТП фреймфорки, классы, методы. Шаблон, макрос, тип переменной - наше всё.


    1. BigBeerman
      01.10.2022 16:23

      образование, может, соответствующее? Я не знаю ни одного киповца, который бы мог сходу стать асушником, хотя как слесаря, то есть обслуживающие полевой уровень, вполне ок. Даже с программируемым реле мало кто разеберется


      1. beeptec
        01.10.2022 19:32

        Откуда у "рядового слесаря по КИПиА", и главное зачем? столько терминов из компьютерного программирования? Не употребляются в АСУТП фреймфорки, классы, методы. Шаблон, макрос, тип переменной - наше всё.

        Ну в принципе есть мало известные, от слова совсем не известные встраиваемые программные платформы с интуитивно простой, еще более чем у автора, терминологией инструкций, она же и свободно программируемый контроллер, ничем не уступающий, который на себе несет расширенные функции, которые на PLC отродясь не присутствовали в их классическом стандарте. И Вам вполне достаточно быть электриком или киповцем, чтоб быстро стартануть без погружений в мануалы. Дергайте все что вам нравится без аппаратного подключения, когда все поймете, подключайте к I/O и смело с песней...
        Минусаторы? Вы где? ))


  1. ventcomplex
    01.10.2022 05:25

    Но идея и реализация хорошие.