Інженерні нотатки TwinCAT
← Всі записи

Шпаргалка зі StructuredText: Типи, FB, Класи та Об'єкти

Пояснення основних об'єктно-орієнтованих концепцій у реалізації Structured Text для TwinCAT/CoDeSys.

Тип, Функціональний Блок (FB), Програма, Клас, Статичний Клас, Екземпляр Класу, Об’єкт – що є що?

Прошу вибачення у тих, для кого цей допис здасться занадто простим. Я довго вагався, чи варто його публікувати, але часто стикаюся з ситуаціями, коли люди не розуміють самих основ. Тож нехай буде — сподіваюся, комусь це стане в пригоді.

Це шпаргалка з мови StructuredText у її реалізації для TwinCAT/CoDeSys, як я її розумію.

📌 «Функціональний Блок» (FB) у поточній реалізації є еквівалентом «Класу». На думку спадають лише дві відмінності:

  • FB може мати щось на кшталт методу без імені, чого класичний клас не дозволяє: порівняйте Timer() та Timer.Execute(). Перше не допускається для класичного класу і може бути заборонено для FB за допомогою атрибута {attribute 'no_explicit_call'}.
  • Існують концепції «Дії» (Action) та «Переходу» (Transition), але ви можете розглядати їх просто як специфічні методи для використання з SFC.

📌 «Статичний Клас» та «Програма» (PRG) — це одне й те саме, з тими ж можливостями, що й для функціонального блока/класу.

📌 «Екземпляр Класу» та «Об’єкт» — це одне й те саме, назване двома різними словами. Можна вважати, що клас — це креслення (шаблон), за яким об’єкт створюється під час виконання програми.

📌 «Статичний Клас» схожий на звичайний клас із кількома нюансами:

  • Змінна та екземпляр класу створюються компілятором автоматично.
  • Завжди існує рівно один екземпляр, не більше й не менше.
  • Змінна, що представляє екземпляр, та тип мають однакову назву.
  • FB_init та FB_exit не виконуються компілятором для статичного класу.

📌 «Тип» — це набір правил, що використовуються компілятором (як виділяти пам’ять, як представлені дані, які операції дозволені тощо).

📌 «Клас» — це спосіб для програміста пояснити компілятору, як створити новий тип: для кожного класу компілятор створює новий тип із такою ж назвою.

💡 Важливі моменти:

  • Усі класи визначають типи, але не всі типи є класами (числа, рядки, структури, інтерфейси тощо не є класами).
  • Компiлятор працює на рівні типів.
  • Для типів, створених для класів та структур, компiлятор дозволяє присвоювати об’єкт-нащадок змінній батьківського типу, але не навпаки.
  • Компiлятор обмежує доступ до об’єкта на основі типу змінної, а не типу фактичного об’єкта, який існує в пам’яті.

Більше прикладів можна знайти тут: https://github.com/trofimich/TwinCAT.OpenFramework

Діаграма шпаргалки StructuredText

#TwinCAT #CoDeSys #PLC #IEC61131 #StructuredText #IndustrialAutomation