Уважаемые коллеги, мы продолжаем дальше разбираться в инструментарии CodeSys. И наша тема Свойства, они же Properties. Для чего нужны, возможности использования и почему, да как.
В прошлый раз получилось очень сумбурно, так что сейчас нам надо расставить все точки над i.
Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
(с)Википедия. 21 век н.э.
Методология у нас включает объекты, ну а мы в промышленном программировании оперируем объектами. Каждый является экземпляром класса, что наталкивает нас на мысль, что функциональный блок - это "класс". И остается иерархия наследования... С чем, в большинстве случаев очень проблематично. Ибо наследование не наш конек)
Но товарищи из CodeSys, вроде как с этим помогают.
Четрые основные кита, на которых строится ООП:
- Абстракция
- Инкапсуляция
- Наследование
- Полиморфизм
И Codesys своим расширением стандарта IEC 61131-3 позволяет немного поиграться с этим.
Объект "Свойства"
Определение
Свойства - это расширение стандарта IEC 61131-3 и инструмент для объектно-ориентированного программирования.
Свойства используются для инкапсуляции данных, поскольку они обеспечивают внешний доступ к данным и одновременно действуют как фильтры. Для этой цели свойство предоставляет методы доступа Get и Set, которые обеспечивают доступ для чтения и записи данных экземпляра.
"Свойства" могут быть добавлены к Программе, Функциональному блоку или блоку глобальных переменных.
Создание "Свойства"
Для создания кликаем ПКМ на нужном нам файле и выбираем "Добавление объекта" ---> "Свойства"
После это операции нам откроется окно настроек свойства.
Имя, Тип возвращаемого значения и язык реализации, надеюсь, всем понятные поля. Мякотка тут это "Спецификатор доступа".
- Public - доступ без ограничений.
- Private - доступ ограничен программой, функциональным блоком или глобальным блоком данных.
- Protected - доступ ограничен программой, функциональным блоком или глобальным блоком данных и объектами, которые будут от них унаследованны.
- Internal - доступ ограничен пространством имен, библиотекой.
Сегодня мы постараемся разобрать все кроме INTERNAL, так как там очень много надо понять до.
ПРАКТИЧЕСКАЯ ЧАСТЬ
И так вот и начинается наша фантазия. Для чего же нам нужны эти свойства, как работать с ними и так далее....
Доступ к переменным блока VAR
И так приступим... Создадим какой-нибудь функциональный блок, условно это будет главный объект, над которым мы и будем производит наши действия.
И добавим к нашему ФБ ряд переменных. Name, какой-нибудь ID и условно уставку.
Теперь создаем экземпляр данного функционального блока, сразу в программе.
А теперь присваиваем значения нашим переменным из тела программы.
После компиляции смотрим список ошибок.
Как бы понятно, что это не Input, не IN_OUT, но если я очень хочу? Вот тогда нам на помощь приходят свойства.
Начнем с имени.
Если не указывает модификатор доступа, то считай это PUBLIC.
После того как добавили у нас под блоком появляется его свойство и два метода Get(Взять значение свойства) и Set(Установить значение)
Начнем с установки значения - Set
Открываем в редакторе и пишем что sName:=Name; а в методе Get наоборот.
Теперь можно проверить в действии. Пока все лишнее отправляем в комменты.
И вот что у нас выходит. Теперь немного про логику работы.
Методы GET и SET работают в зависимости от того в какой стороне от знака присваивания стоит Свойство. Если слева, то мы присваиваем значение, а если справа то просим вернуть значение.
Теперь пойдем дальше по модификаторам доступа.
Следующий будет у нас свойство с именем ID
Теперь оно прям защищенное защищенное, но возникает кое какой нюанс. (Быстро пропишем Get и Set)
И так же указываем в цикле программы.
Компиляция нам даст ошибки!!!
И поступит информация, что нельзя достучаться до защищенного свойства. Доступ к нему есть только из самого функционального блока.
Посмотрите на скриншот выше. Вы догадываетесь какое будет значение в поле iID?
Правильно никакое, так как у нас данный функциональный блок еще не исполняется в цикле программы.
Но если мы все пропишем, то это одинаковые конструкции.
Но зачем тогда нам нужен защищенный модификатор?
Чтобы скрыть наших полей для внутреннего использования. Хотя мы к ним можем обращаться и так. Единственное, что GET и SET могут дополнительно совершить необходимые действия над полями. Ну и там наследование еще, там типо красиво должно быть...
Представим ситуацию, что ID задается пользователем. Как ему душе угодно, а вот адрес мы выдаем на основании этого ID, но реализация этого чуда скрыта. Перепишем немного исходный код.
ID больше не Protected, а паблик и мы задаем какое-нибудь значение.
Вполне хорошая тема. А теперь нам надо получить адрес на выходе
Вот так у нас считается этот адрес. Давайте запустим и глянем что в итоге.
Ну вот Адрес 204, а теперь мы возьмем другой объект, который будет унаследован он нашего MainObject
Как можно заметить функциональный блок чист, но так ли это? Создаем экземпляр и смотрим.
Прекрасно работает... У нас есть нужные поля и свойства, хотя в реализации пусто, но что мы видим... OUT равен 0, так как реализация не наследуется. А теперь упакуем реализацию. Идем в родительский класс, у нас он MainObject, и там делаем protected свойство с адресом.
И прописываем эту строчку в родительском классе и у наследника.
И мы получаем одинаковые адреса. Если мы изменим алгоритм у родителя, то он меняется и у наследника.
А теперь я хочу переписать свойство.... и в класс FirstLevelObject я опять создаю свойство OutAdr.
И немного меняю реализацию. Прибавляю в конце 5, а не 4. Иииии.....
Увы и ах, но так нельзя. Мы не можем переписать Protected методы. А public?
А паблики вполне можно переписывать. Ну вот в целом и небольшая работа с объектами "Свойства"
Если есть вопросы и пожелания прошу в комментарии.