Меню
Блог Гридина Семёна

Автоматизация и логические контроллеры

Рубрики блога

CodeSys. ООП. Свойства

CodeSys. ООП. Свойства

Наткнулся в интернете.

Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.

©Википедия. 21 век н.э.

Методология у нас включает объекты, ну а мы в промышленном программировании оперируем объектами. Каждый является экземпляром класса, что наталкивает нас на мысль, что функциональный блок — это «класс». И остается иерархия наследования... С чем, в большинстве случаев очень проблематично. Ибо наследование не наш конек)

Но товарищи из CodeSys, вроде как с этим помогают.

Четрые основные кита, на которых строится ООП:

  1. Абстракция
  2. Инкапсуляция
  3. Наследование
  4. Полиморфизм

И Codesys своим расширением стандарта IEC 61131-3 позволяет немного поиграться с этим.

Объект «Свойства»

Определение

Свойства — это расширение стандарта IEC 61131-3 и инструмент для объектно-ориентированного программирования.

Свойства используются для инкапсуляции данных, поскольку они обеспечивают внешний доступ к данным и одновременно действуют как фильтры. Для этой цели свойство предоставляет методы доступа Get и Set, которые обеспечивают доступ для чтения и записи данных экземпляра.

«Свойства» могут быть добавлены к Программе, Функциональному блоку или блоку глобальных переменных.

Создание «Свойства»

Для создания кликаем ПКМ на нужном нам файле и выбираем «Добавление объекта» ---> «Свойства»

CodeSys. ООП. Свойства

После это операции нам откроется окно настроек свойства.

Окно настроек объекта "Свойство"

Окно настроек объекта «Свойство»

Имя, Тип возвращаемого значения и язык реализации, надеюсь, всем понятные поля. Мякотка тут это «Спецификатор доступа».

Спецификаторы доступа

Спецификаторы доступа

  • Public — доступ без ограничений.
  • Private — доступ ограничен программой, функциональным блоком или глобальным блоком данных.
  • Protected — доступ ограничен программой, функциональным блоком или глобальным блоком данных и объектами, которые будут от них унаследованны.
  • Internal — доступ ограничен пространством имен, библиотекой.

Сегодня мы постараемся разобрать все кроме INTERNAL, так как там очень много надо понять до.

ПРАКТИЧЕСКАЯ ЧАСТЬ

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

Доступ к переменным блока VAR

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

CodeSys. ООП. Свойства

И добавим к нашему ФБ ряд переменных. Name, какой-нибудь ID и условно уставку.

CodeSys. ООП. Свойства

Теперь создаем экземпляр данного функционального блока, сразу в программе.

CodeSys. ООП. Свойства

А теперь присваиваем значения нашим переменным из тела программы.

Записываем переменные в теле PLC_PRG

Записываем переменные в теле PLC_PRG

После компиляции смотрим список ошибок.

CodeSys. ООП. Свойства

Как бы понятно, что это не Input, не IN_OUT, но если я очень хочу? Вот тогда нам на помощь приходят свойства.

Начнем с имени.

CodeSys. ООП. Свойства

Если не указывает модификатор доступа, то считай это PUBLIC.

После того как добавили у нас под блоком появляется его свойство и два метода Get (Взять значение свойства) и Set (Установить значение)

CodeSys. ООП. Свойства

Начнем с установки значения - Set

Открываем в редакторе и пишем что sName:=Name; а в методе Get наоборот.

CodeSys. ООП. Свойства

Теперь можно проверить в действии. Пока все лишнее отправляем в комменты.

CodeSys. ООП. Свойства

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

Методы GET и SET работают в зависимости от того в какой стороне от знака присваивания стоит Свойство. Если слева, то мы присваиваем значение, а если справа то просим вернуть значение.

Теперь пойдем дальше по модификаторам доступа.

Следующий будет у нас свойство с именем ID

CodeSys. ООП. Свойства

Теперь оно прям защищенное защищенное, но возникает кое какой нюанс. (Быстро пропишем Get и Set)

И так же указываем в цикле программы.

CodeSys. ООП. Свойства

Компиляция нам даст ошибки!!!

И поступит информация, что нельзя достучаться до защищенного свойства. Доступ к нему есть только из самого функционального блока.

CodeSys. ООП. Свойства

Посмотрите на скриншот выше. Вы догадываетесь какое будет значение в поле iID?

Правильно никакое, так как у нас данный функциональный блок еще не исполняется в цикле программы.

Но если мы все пропишем, то это одинаковые конструкции.

Тут еще одна конструкция.

Тут еще одна конструкция.

Но зачем тогда нам нужен защищенный модификатор?

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

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

ID больше не Protected, а паблик и мы задаем какое-нибудь значение.

CodeSys. ООП. Свойства

Вполне хорошая тема. А теперь нам надо получить адрес на выходе

CodeSys. ООП. Свойства

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

CodeSys. ООП. Свойства

Ну вот Адрес 204, а теперь мы возьмем другой объект, который будет унаследован он нашего MainObject

Наш новый экземпляр

Наш новый экземпляр

Как можно заметить функциональный блок чист, но так ли это? Создаем экземпляр и смотрим.

CodeSys. ООП. Свойства

Прекрасно работает... У нас есть нужные поля и свойства, хотя в реализации пусто, но что мы видим... OUT равен 0, так как реализация не наследуется. А теперь упакуем реализацию. Идем в родительский класс, у нас он MainObject, и там делаем protected свойство с адресом.

CodeSys. ООП. Свойства

CodeSys. ООП. Свойства

И прописываем эту строчку в родительском классе и у наследника.

CodeSys. ООП. Свойства

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

А теперь я хочу переписать свойство... и в класс FirstLevelObject я опять создаю свойство OutAdr.

CodeSys. ООП. Свойства

И немного меняю реализацию. Прибавляю в конце 5, а не 4. Иииии...

CodeSys. ООП. Свойства

Увы и ах, но так нельзя. Мы не можем переписать Protected методы. А public?

CodeSys. ООП. Свойства

А паблики вполне можно переписывать. Ну вот в целом и небольшая работа с объектами «Свойства»

Пост от Александра Судалина.

Первоисточник на ЯндексДзене.

Интересен блог? Подпишись и получай новости на почту

Подписка на новости блога

Вам так же может быть интересно

Оставить комментарий

  • ;-)
  • :smile:
  • :sad:
  • :roll:
  • :razz:
  • :oops:
  • :o
  • :lol:
  • :idea:
  • :grin:
  • :cry:
  • :cool:
  • :???: