Вопрос: если нажать ПКМ на POU и выбрать команду Добавление объекта, то появляется возможность добавить в POU Действие, Метод, Переход и Свойство.
Что это и зачем это нужно? Это имеет отношение к объектно-ориентированному подходу (ООП)?
Ответ:
1.1 Действие позволяет выделить фрагмент POU в обособленный объект с собственным названием.
В других языках программирования аналогичные объекты называются процедурами (при этом действие является процедурой без параметров).
Преимущества использования процедур описаны в этой статье:
https://ru.wikipedia.org/wiki/%D0%9F...82%D0%B2%D0%B0
Например, вы замечаете, что в разных фрагментах вашего POU, реализующего машину состояний, вам приходится дублировать один и тот же код для возвращения на шаг ожидания команды и очистки используемых ресурсов.
В этом случае вы можете оформить его в виде действия с названием SwitchToIdle:
2022-05-17_8-15-56.png
Теперь во всех фрагментах POU вы можете заменить повторяющие строки кода вызовом действия:
Код:
// ...
SwitchToIdle();
// ...
Если вам потребуется изменить этот код - то достаточно будет поменять его в действии, а не искать по всей программе.
Кроме того, действия являются неотъемлемой частью языка SFC - они используются для описания выполняемых на конкретном шаге команд:
2022-05-17_8-28-48.png
Действие не является элементом ООП.
За исключением языка SFC - всегда предпочтительнее использовать метод, а не действие (его функциональность перекрывает функциональность действия).
Статьи из справки CODESYS:
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
1.2. Переход является аналогом действия, используемым в языке SFC для описания условий переходов между шагами (см. скриншот выше).
Это удобно для описания сложных условий, состоящих из нескольких строк кода - они бы загромождали блок-схему.
На блок-схеме переход отмечается заливкой правого верхнего угла соответствующего ему прямоугольника.
Справедливый вопрос - почему переход можно добавить к POU, который реализован не на языке SFC?
Ответ есть в баг-трекере CODESYS - это необходимо в тех случаях, когда ФБ на языке SFC, наследуемый от ФБ на другом языке, должен иметь доступ к условиям перехода своего базового ФБ.
2022-05-17_8-38-47.png
Переход не является элементом ООП.
Статья из справки CODESYS: https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
1.3. Метод представляет собой функцию, встраиваемую в ФБ и имеющую доступ к его переменным.
В отличие от действия - метод может иметь собственные входные, выходные и локальные переменные (а также константы).
Возвращаясь к примеру из п. 1.1 - предположим, после очистки ресурсов в зависимости от выполнения тех или иных условий нам требуется перейти на конкретный шаг машины состояний.
Код:
// как и функция - метод может иметь аргументы и возвращать значения
xIsStateSwitched := SwitchToState(eNewState := STATE.READ);
Метод может входить в состав интерфейса.
Метод является элементом ООП, но может успешно использоваться и в структурном программировании.
Статья из справки CODESYS: https://help.codesys.com/webapp/_cds...rsion=3.5.17.0
1.4. Свойство представляет собой переменную, для которой автоматически создаются методы чтения (Get) и записи (Set).
Это позволяет при чтении или записи переменной автоматически выполнить какой-либо фрагмент кода (например, провалидировать значение или отмасштабировать его).
Пример: пусть у нас есть ФБ TEST_FB с локальной переменной iSetpoint. В рамках нашей задачи представим, что ее значение должно принадлежать диапазону -10...10.
2022-05-17_13-33-14.png
Добавим свойство Setpoint и в методе записи обеспечим ограничение значений переменной с помощью оператора LIMIT.
2022-05-17_13-32-48.png
Таким образом, при записи значения в свойство из кода программы произойдет автоматический вызов метода Set и обработанное (ограниченное оператором LIMIT) значение свойства будет записано в переменную iSetpoint.
Доступ к свойству не требует вызова экземпляра ФБ:
2022-05-17_13-32-11.png
Cвойство является элементом ООП.
Статьи из справки CODESYS: https://help.codesys.com/webapp/_cds...rsion=3.5.17.0