Шпаргалка зі 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

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