Неочевидна пастка з очищенням ресурсів у програмах TwinCAT
Чому FB_init та FB_exit всередині програм TwinCAT (статичних класів) не викликаються автоматично та як обійти це обмеження.
Під очищенням ресурсів я маю на увазі такі операції, як звільнення динамічно виділеної пам’яті, закриття файлових дескрипторів, закриття з’єднань тощо.
Ця проблема насамперед стосується TwinCAT версії 3.1.4024 та раніших, оскільки ці версії дозволяли розробникам створювати методи FB_init та FB_exit безпосередньо всередині програм (PRG). Пастка полягає в тому, що ці методи не викликаються компілятором автоматично.
Якщо вам потрібно звільнити ресурси під час видалення програми, ось підхід, який я пропоную:
- Створіть внутрішній метод у програмі, призначений для очищення ресурсів, наприклад
ReleaseResources(). - Створіть окремий клас, який відповідає виключно за очищення ресурсів, наприклад
MainProgramResourceManager. - Реалізуйте метод
FB_exitвсередині цього класу та викличте з нього метод очищення програми, наприкладMAIN.ReleaseResources(). - Створіть екземпляр цього класу всередині програми, наприклад:
_resourcemanager : MainProgramResourceManager;
Ось і все. При видаленні програми всі її внутрішні змінні (включаючи менеджер ресурсів) видаляються автоматично. А оскільки менеджер ресурсів є об’єктом, його метод FB_exit також буде викликано автоматично. Це дозволяє обійти обмеження компілятора.
Цей же принцип можна застосувати і для логіки ініціалізації.

#TwinCAT #CoDeSys #OOP #StructuredText #IndustrialAutomation