TwinCAT 3, использование методов для внутренней функциональности FB или только для интерфейсов?

Я старый пользователь технологий Beckhoff, особенно TwinCAT. В настоящее время мы претерпеваем трансформацию архитектуры наших ПЛК из-за новых функций, которые предоставляет TwinCAT 3 (объектно-ориентированный).

В настоящее время мы разрабатываем новую архитектуру ПЛК, и у нас есть несколько опасений по поводу того, как двигаться дальше. Один очень хороший пример, который в значительной степени привлекает наше внимание в данный момент, — это новые Методы и общие различия с Действиями.

С моей точки зрения, методы создаются не только для того, чтобы определять и реализовывать интерфейсы, но и как способ упростить функциональные блоки и их внутренние конечные автоматы. Например, если у меня есть FB_Conveyor, внутри которого есть собственный конечный автомат, я могу выбрать создание внутреннего МЕТОДА (M_INIT) для конвейера, который будет проверять конвейер, чтобы проверить, есть ли какие-либо продукты, когда конвейер находится в состоянии INIT. , проверяя выходное значение метода. MEthod будет содержать свою выигранную конечную машину и не будет готов, пока его вывод не вернет значение TRUE.

Первое беспокойство возникает здесь, так как некоторые из наших программистов реального времени считают, что методы не предназначены для этого, что в этом случае мы должны реализовать FB_INIT, который вызывается из FB_CONVEYOR и содержит свои собственные переменные, поэтому оба имеют REF для FB_MOTOR. .

Основной аргумент заключается в том, что МЕТОДЫ являются инструментом для создания интерфейсов и управления FB, так что, например, мой собственный FB_CONVEYOR мог бы быть расширен из I_Conveyor, который имеет метод M_TakeIn, но НЕ для реализации внутренней функциональности, такой как ее инициализация.

Одним из аргументов также является то, что методы используют свои собственные переменные стека, поэтому все данные метода являются временными и действительны только во время выполнения. Это означает, что если методы станут слишком большими для того, кто их реализует, мы не сможем обеспечить правильную задержку в реальном времени. Тогда, по моему собственному опыту, TC всегда будет потреблять столько ресурсов процессора, чтобы обеспечить правильное время цикла, поэтому использование внутренней переменной стека на самом деле не является архитектурной ошибкой, но это нормально и желательно, потому что на самом деле TC обеспечивает работу в реальном времени, но не требует должен быть реализован как процесс полного реального времени (реального времени на основе C).

Дискуссия продолжается, и очень интересно, как возникают разные мнения относительно того, следует ли использовать методы или нет в качестве внутренней операции, или мы должны фактически следовать архитектуре FB TC2 Motion, где разные функциональные блоки управляют разными функциональность, и каждый из них имеет ссылку на определенную ось (FB_MOVE, FB_HOME и т. д.)

Не нашел реального ответа на этот вопрос ни в каких документах. Методы почти всегда упоминаются в случае определения интерфейсов, но никогда в случае программирования внутренней функциональности FB.

Итак, можно ли использовать методы для внутренней функциональности, это поможет в будущем при преобразовании FB дыры в интерфейсе, для которого метод init необходимо будет повторно реализовать в зависимости от случая.?

Этот вопрос практически одинаков для новых версий CodeSyS, в которых также есть методы и интерфейсы.


person OscarSanhueza    schedule 07.01.2014    source источник


Ответы (3)


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

Но вы можете объявить любой тип переменных внутри метода. Например, VAR_INST, который будет частным для каждого экземпляра, поскольку он создается на уровне FB (функциональный блок) (переменная по умолчанию в FB). Или вы можете объявить VAR_STAT, который будет общим для всех экземпляров. Метод может сделать код более понятным.

И метод, и действие могут использовать все переменные из своего FB.

И методы, и действия могут быть разработаны с использованием другого языка программирования, отличного от FB. Пример: FB написан с использованием ST, но его метод или действие могут быть написаны на лестничной диаграмме.

Лично я не вижу связи между существованием Метода и Интерфейсом. Я бы не торопился использовать все функции, которые может предложить ООП. Наследование, интерфейс и свойства могут превратить вашу программу в кошмар, если их не использовать с умом. В то время как инкапсуляция в TwinCAT в лучшем случае виртуальная.

Редактировать: когда метод создается в программе (статический объект в TwinCAT), VAR_INST не может быть создан в этом методе, поскольку в программе не существует экземпляра. В методе программы можно использовать только VAR_STAT и VAR_TEMP. Это очень похоже на другие языки программирования, которые не могут создавать экземпляры статических классов, а их переменные также могут быть только статическими.

person Ilya Dan    schedule 21.02.2017

вы в значительной степени поняли суть, но, тем не менее, вкратце, функциональные блоки в ПЛК определяют общий «класс» функциональности. Этот класс будет иметь определенные входы и выходы, а также методы/действия для управления ими. Нужно создать экземпляр функционального блока, чтобы использовать методы. Экземпляр сохраняется до тех пор, пока выполняется программа, а затем удаляется (остановка ПЛК).

В новых TwinCAT и CodeSys действия были дополнены методами. Методы имеют свои собственные входные и выходные переменные и код, который ими управляет. Можно использовать эту функцию для разделения (читай лучше модульности) своего кода, а также для выполнения его по мере необходимости.

Подробнее об этом читайте здесь: http://infosys.beckhoff.com/content/1033/tc3_plc_intro/html/pou_method.htm

person Subspacian    schedule 06.05.2014

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

Например, у меня есть блок регистратора, который записывает заданную строку в файл журнала. Он также может считывать этот журнал в массив ПЛК.

Блок выглядит так:

FB_Logger

  • AddLogLine
    • Public method to add log line
  • SaveLogToFile
    • Public action(could be a method too) to save the log file
  • LoadLogFromFile
    • Public action(could be a method too) to read the log file
  • LogArray
    • Public getter for log array. A PROPERTY of type REFERENCE TO ARRAY..
  • GetLogFileHeader
    • Private method to create header to the file
  • GetLogFileLine
    • Private method to create a log line
  • SaveFile
    • Private method to start saving
  • ShiftLogItems
    • Private method to shift the log array

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

Я очень широко использую эти возможности ООП. Иногда я добавляю методы в ПРОГРАММЫ, чтобы сделать их более понятными. Раньше у меня был один функциональный блок и пять вспомогательных функций, теперь у меня есть один функциональный блок с закрытыми методами.

Просто проверьте это!

person Quirzo    schedule 21.08.2017