Блог

Объектно-ориентированное программирование для программируемых логических контроллеров (ПЛК). Что же действительно нового?

Сен 21, 2021

Объектно-ориентированное программирование (ООП) – это парадигма программирования, основанная на концепции объектов, которые могут содержать данные в виде свойств и код в виде процедур, известных как методы. Объекты примечательны тем, что они могут иметь процедуры, которые можно использовать для доступа и изменения полей данных объекта, с которым связаны эти поля. В ООП компьютерные программы состоят из взаимодействующих друг с другом объектов. Языки ООП разнообразны, однако, самые популярные из них основаны на классах. Это означает, что используемые в них объекты являются экземплярами классов, которые и определяют типы самих объектов.

Это сведения, которые можно посмотреть на Wiki, об ООП в целом, и это то, что большинство из нас хотели бы иметь у себя при разработке систем ПЛК. Считается, что у меня больше инструментов и возможностей, когда пишу программу на любом языке высокого уровня, таком как C++ или C#. Тогда и процесс разработки продвигается значительно легче и быстрее.

TwinCat3 от Beckhoff ввёл ООП в сферу ПЛК. Вот список появившихся возможностей:

  • Методы
  • Свойства
  • Интерфейсы

Из этого списка мы можем сделать вывод, что теперь есть возможность извлечь выгоду из большинства преимуществ ООП применительно к автоматизации предприятия. Но так ли они новы как кажутся? Привнесут ли они удобство функциональности C# в разработку ПЛК?

Мы хотели бы представить вам серию статей, в которых с помощью простых примеров попытаемся сравнить старые способы CoDeSys2 с новым TwinCat3. Как с ООП, так и без него. Я попытаюсь использовать образец проекта ПЛК Beckhoff, предназначенный для демонстрации некоторых основных функций объектно-ориентированного программирования. В то же время я запрограммирую его в не объектно-ориентированной системе CodeSys2, чтобы все могли увидеть разницу, включая ошибки и функции, которые могут появиться при разработке ПЛК.

Свою первую статью я хотел бы посвятить самой последней функции, доступной в TwinCat3: Свойства.

Изначально свойства появились в языке JavaScript, чтобы просто установить связь между определённым именем и значением объекта. В TwinCAT у свойств уже есть методы доступа Get и Set для получения и установки их значений, соответственно. TwinCAT автоматически вызывает эти методы при чтении или записи в функциональный блок, реализующий свойство.

Свойства можно распознать по следующим характеристикам:
Спецификатор доступа

  • PUBLIC: Соответствует спецификации без модификатора доступа.
  • PRIVATE: Доступ к свойству возможен только в пределах функционального блока.
  • PROTECTED: Доступ к свойству возможен только в пределах программы, функционального блока и его производных.
  • INTERNAL: Доступ к свойству возможен только в пределах пространства имён, то есть в пределах библиотеки.
  • FINAL: Перезапись свойства в производной от функционального блока не допускается. Это значит, что свойство не может быть перезаписано или расширено в любом из возможно существующих подклассов.

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

При этом у нас всегда была простая ассоциация в ПЛК: VarIn, VarOut и другие типы переменных с разными типами доступа, которые можно использовать так же просто, как свойства.

Пример: Cylinder.var_in_out_bAtBasePos это то же, что и Cylinder.State_AtBasePos.

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

PROTECTED, INTERNAL и FINAL – действительно новые вещи, придающие свойствам гибкость. Но для их использования потребуется дополнительный код. Также за этим кроется неприятная особенность:

Как вы можете заметить, их невозможно отслеживать!

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

Прагмы бывают очень кстати для отслеживания свойств в режиме реального времени. Для этого напишите в верхней части деклараций свойств атрибут ‘monitoring’:

{attribute ‘monitoring := ‘variable’}: TwinCAT при доступе к свойству сохраняет фактическое значение в переменной и отображает её значение. Это значение может оказаться устаревшим, если из кода нет обращений к свойству.

{attribute ‘monitoring’ := ‘call’}: Каждый раз при отображении значения TwinCAT вызывает код метода доступа Get. Любой побочный эффект, вызванный этим кодом, может проявиться в мониторинге.

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

Следующая статья познакомит вас с методами, а также с другими новинками современных инструментов разработки для ПЛК.

Новое в блоге

Первый курс на платформе GRSE TalentLab: Как мы обучали Angular с нуля

В июле 2024 года завершился первый онлайн-курс на базе нашей новой образовательной платформы - “GRSE TalentLab”. Курс был посвящен основам технологии Angular. Для удобства он был разделен на две части: подготовительную и основную. Подготовительный курс Цель...

Разработка через прототипирование

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

Современный подход к подготовке технической документации

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