ООП методы программирования современных контроллеров

Стратегия  — это поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы.
Вот такое определение мы скопируем и вставим, чтобы начать наше повествование. И уже после прочтения определения закрадывается мысль, а как на ПЛК можно реализовать объектно-объективное программирование (ООП)?

По факту легко. И очень много подобных паттернов можно переложить на рельсы промышленного программирования.
Для реализации этого безумства нам потребуется Codesys 3.x ибо он немного, да научился в ООП. Преступим.

РЕАЛИЗАЦИЯ
Что нам предлагают умные статьи в интернетах?
Паттерн Стратегия предлагает определить семейство схожих алгоритмов, которые часто изменяются или расширяются, и вынести их в собственные классы, называемые стратегиями .
Вместо того, чтобы изначальный класс сам выполнял тот или иной алгоритм, он будет играть роль контекста, ссылаясь на одну из стратегий и делегируя ей выполнение работы. Чтобы сменить алгоритм, вам будет достаточно подставить в контекст другой объект-стратегию.
Важно, чтобы все стратегии имели общий интерфейс. Используя этот интерфейс, контекст будет независимым от конкретных классов стратегий. С другой стороны, вы сможете изменять и добавлять новые виды алгоритмов, не трогая код контекста.

ИНТЕРФЕЙС
Интерфейс, согласно документации Codesys - это средство объектно-ориентированного программирования. Объект ITF("Интерфейс") описывает набор прототипов методов и свойств. В этом контексте прототип означает, что методы и свойства содержат только объявления и не содержат реализации.
Это значит, что в интерфейсе мы описываем методы. Даем им имена, перечень входных и выходных данных, но никак не трогаем реализацию.
1.png 
Создание интерфейса
Для создания интерфейса жмем ПКМ->Добавление объекта->Интерфейс, далее задаем ему имя. У меня это будет "StrategyInt".
Затем добавляем метод. Назовем его GetSTR. Для добавления также правая кнопка мыши и добавить метод интерфейса.
Прописываем там лишь одну выходную переменную.

  2.png
Описание переменных метода интерфейса.

Теперь, когда мы будем создавать функциональные блоки, наследуемые от этого интерфейса, то в нем мы уже будем иметь метод GetSTR с выходной переменной OUT.

КОНТЕКСТ
Это тот функциональный блок, который и будет у нас вызывать различные "стратегии".
Создаем обычный функциональный блок.

  3.png
Функциональный блок, который играет роль контекста.
На вход функционального блока мы можем отправить любой объект, который будет унаследован от интерфейса StrategyInt. В реализации мы видим,что при вызове данного функционального блока, мы будем взывать метод GetSTR,а результат возвращать в выходную переменную Result.

СТРАТЕГИИ
Следующий шаг - реализация стратегий. Для начала сделаем две. Они не будет ничем отличаться кроме как возвращать разные значения.
Создаем функциональный блок и наследуем его от нашего интерфейса.

  4.png
Окно создания функционального блока.

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

  5.png
Созданные стратегии

В каждом есть два метода, реализацию которых необходимо написать.

  6.png


Реализация первой стратегии

  7.png
Реализация второй стратегии.

Да можно напрямую возвращать значения через метод, но я так не хочу.

СБОРКА
А теперь собираем это все вместе.
 8.png
Сборка всех компонентов.

Я тут немного разбил по шагам. Для реализации нам понадобится:

Объект, который играет роль контекста - 1 шт. Наши стратегии. Тут я их включил в блок переменных, но можно и сделать указатель на объект нужной нам стратегии, а уже в коде создать через __NEW. Ну и переменные Out_1 и Out_2 для наглядности.
Код работает следующим образом. На первом шаге мы даем на вход MyProc переменной Object нашу стратеги POU_1.

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

9.png 
Результат выполнения.

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

Дополнительно, для поддержки данной статьи, оплатил статический IP и создал на роутере Mikrotik схему проброса портов. Можете подключаться и пользоваться

10.jpg

Для подключению к контроллеру ПЛК210 (89.23.36.110) можно по ссылкам, предварительно скачав дистрибутив Codesys и архив проекта:


На архиве установлен пароль - 159

Автор статьи: Александр Судалин - sudalin.kms@gmail.com


#ООП, #CODESYS, #Пример онлайн, #ПЛК210, #Стратегия, #Проектирования

Array
(
    [ID] => 454
    [IBLOCK_ID] => 8
    [NAME] => ООП для ПЛК. Codesys и Стратегия
    [IBLOCK_SECTION_ID] => 
    [IBLOCK] => Array
        (
            [ID] => 8
            [~ID] => 8
            [TIMESTAMP_X] => 25.03.2021 17:23:33
            [~TIMESTAMP_X] => 25.03.2021 17:23:33
            [IBLOCK_TYPE_ID] => rus
            [~IBLOCK_TYPE_ID] => rus
            [LID] => s1
            [~LID] => s1
            [CODE] => articals
            [~CODE] => articals
            [API_CODE] => 
            [~API_CODE] => 
            [NAME] => Статьи
            [~NAME] => Статьи
            [ACTIVE] => Y
            [~ACTIVE] => Y
            [SORT] => 10
            [~SORT] => 10
            [LIST_PAGE_URL] => /articals/
            [~LIST_PAGE_URL] => /articals/
            [DETAIL_PAGE_URL] => /articals/#ELEMENT_CODE#.html
            [~DETAIL_PAGE_URL] => /articals/#ELEMENT_CODE#.html
            [SECTION_PAGE_URL] => 
            [~SECTION_PAGE_URL] => 
            [CANONICAL_PAGE_URL] => https://lapshinvr.ru/articals/articals.html
            [~CANONICAL_PAGE_URL] => https://lapshinvr.ru/articals/articals.html
            [PICTURE] => 1131
            [~PICTURE] => 1131
            [DESCRIPTION] => 
            [~DESCRIPTION] => 
            [DESCRIPTION_TYPE] => html
            [~DESCRIPTION_TYPE] => html
            [RSS_TTL] => 24
            [~RSS_TTL] => 24
            [RSS_ACTIVE] => Y
            [~RSS_ACTIVE] => Y
            [RSS_FILE_ACTIVE] => N
            [~RSS_FILE_ACTIVE] => N
            [RSS_FILE_LIMIT] => 
            [~RSS_FILE_LIMIT] => 
            [RSS_FILE_DAYS] => 
            [~RSS_FILE_DAYS] => 
            [RSS_YANDEX_ACTIVE] => N
            [~RSS_YANDEX_ACTIVE] => N
            [XML_ID] => 
            [~XML_ID] => 
            [TMP_ID] => 
            [~TMP_ID] => 
            [INDEX_ELEMENT] => Y
            [~INDEX_ELEMENT] => Y
            [INDEX_SECTION] => N
            [~INDEX_SECTION] => N
            [WORKFLOW] => N
            [~WORKFLOW] => N
            [BIZPROC] => N
            [~BIZPROC] => N
            [SECTION_CHOOSER] => L
            [~SECTION_CHOOSER] => L
            [LIST_MODE] => 
            [~LIST_MODE] => 
            [RIGHTS_MODE] => S
            [~RIGHTS_MODE] => S
            [SECTION_PROPERTY] => N
            [~SECTION_PROPERTY] => N
            [PROPERTY_INDEX] => N
            [~PROPERTY_INDEX] => N
            [VERSION] => 1
            [~VERSION] => 1
            [LAST_CONV_ELEMENT] => 0
            [~LAST_CONV_ELEMENT] => 0
            [SOCNET_GROUP_ID] => 
            [~SOCNET_GROUP_ID] => 
            [EDIT_FILE_BEFORE] => 
            [~EDIT_FILE_BEFORE] => 
            [EDIT_FILE_AFTER] => 
            [~EDIT_FILE_AFTER] => 
            [SECTIONS_NAME] => 
            [~SECTIONS_NAME] => 
            [SECTION_NAME] => 
            [~SECTION_NAME] => 
            [ELEMENTS_NAME] => Элементы
            [~ELEMENTS_NAME] => Элементы
            [ELEMENT_NAME] => Элемент
            [~ELEMENT_NAME] => Элемент
            [REST_ON] => N
            [~REST_ON] => N
            [EXTERNAL_ID] => 
            [~EXTERNAL_ID] => 
            [LANG_DIR] => /
            [~LANG_DIR] => /
            [SERVER_NAME] => lapshinvr.ru
            [~SERVER_NAME] => lapshinvr.ru
        )

    [LIST_PAGE_URL] => /articals/
    [~LIST_PAGE_URL] => /articals/
    [SECTION_URL] => 
    [CANONICAL_PAGE_URL] => https://lapshinvr.ru/articals/oop-dlya-plk-codesys-i-strategiya.html
    [SECTION] => Array
        (
            [PATH] => Array
                (
                )

        )

    [IPROPERTY_VALUES] => Array
        (
            [SECTION_META_TITLE] => Статьи по автоматизации
            [SECTION_META_KEYWORDS] => Статьи, автоматизация
            [SECTION_META_DESCRIPTION] => Встречал при производстве работ что-то достойное внимания. Сложно самому оценить необходимость размещения той или иной статьи, старался очевидный мусор убирать
            [SECTION_PAGE_TITLE] => Здесь опубликовал статьи, которые могут кому-то пригодиться при производстве работ
            [ELEMENT_META_KEYWORDS] => ООП, CODESYS, Пример онлайн, ПЛК210, Стратегия, Проектирования, ОВЕН
            [ELEMENT_META_TITLE] => Объектно-ориентированное программирование
            [ELEMENT_META_DESCRIPTION] => Александр Судалин поделился с нами опытом по использования Codesys как пример объектно-ориентированного программирования
            [ELEMENT_PAGE_TITLE] => ООП методы программирования современных контроллеров
        )

    [TIMESTAMP_X] => 25.07.2021 16:58:22
    [META_TAGS] => Array
        (
            [TITLE] => ООП методы программирования современных контроллеров
            [BROWSER_TITLE] => ООП для ПЛК. Codesys и Стратегия
            [KEYWORDS] => ООП, CODESYS, Пример онлайн, ПЛК210, Стратегия, Проектирования, ОВЕН
            [DESCRIPTION] => Александр Судалин поделился с нами опытом по использования Codesys как пример объектно-ориентированного программирования
        )

    [PREVIEW_TEXT] => Очень много подобных паттернов можно переложить на рельсы промышленного программирования. Для реализации этого безумства нам потребуется Codesys 3.x ибо он немного, да научился в ООП. Преступим.
    [PREVIEW_PICTURE] => Array
        (
            [ID] => 1441
            [TIMESTAMP_X] => Bitrix\Main\Type\DateTime Object
                (
                    [value:protected] => DateTime Object
                        (
                            [date] => 2021-07-25 16:58:22.000000
                            [timezone_type] => 3
                            [timezone] => Europe/Moscow
                        )

                )

            [MODULE_ID] => iblock
            [HEIGHT] => 428
            [WIDTH] => 537
            [FILE_SIZE] => 51912
            [CONTENT_TYPE] => image/jpeg
            [SUBDIR] => iblock/37d
            [FILE_NAME] => 6med3k3gsc91qdzsifd7tc0td4cs7izf.jpg
            [ORIGINAL_NAME] => 2018-05-19_10-08-09.jpg
            [DESCRIPTION] => 
            [HANDLER_ID] => 
            [EXTERNAL_ID] => 342ab000ce8c88c695b69423fd3564b8
            [~src] => 
            [SRC] => /upload/iblock/37d/6med3k3gsc91qdzsifd7tc0td4cs7izf.jpg
            [UNSAFE_SRC] => /upload/iblock/37d/6med3k3gsc91qdzsifd7tc0td4cs7izf.jpg
            [SAFE_SRC] => /upload/iblock/37d/6med3k3gsc91qdzsifd7tc0td4cs7izf.jpg
            [ALT] => ООП для ПЛК. Codesys и Стратегия
            [TITLE] => ООП для ПЛК. Codesys и Стратегия
        )

    [DETAIL_PAGE_URL] => /articals/oop-dlya-plk-codesys-i-strategiya.html
)
Ваш комментарий добавлен

Возврат к списку