Робота з колекціями змінної довжини у Structured Text за допомогою IEnumerator
Як обійти обмеження фіксованих масивів у TwinCAT та CoDeSys. Реалізація інтерфейсу IEnumerator для гнучкої ітерації динамічних послідовностей.
Одним з обмежень мови Structured Text є відсутність повноцінної підтримки колекцій змінної довжини. Наприклад, уявіть реалізацію функції розділення рядка (Split):
• '12,34,56' → ['12', '34', '56']
• '12,34,56,78' → ['12', '34', '56', '78']
❌ Проблема полягає в тому, що компілятор очікує, що розміри масивів будуть відомі ще на етапі компіляції.
💡 Один із можливих варіантів вирішення — повертати IEnumerator замість масиву.
IEnumerator представляє послідовність даних як об’єкт із внутрішнім курсором, який можна обходити за допомогою циклу WHILE.
Інтерфейс IEnumerator дуже простий:
• ➡️ Властивість Current -> повертає поточний елемент у послідовності. Залежно від реалізації, це може быть POINTER TO INT, POINTER TO STRING, POINTER TO __SYSTEM.AnyType або, як у TwinCAT.OpenFramework, REFERENCE TO GENERIC_VALUE.
• ➡️ Метод MoveNext() : BOOL -> переміщує курсор на наступний елемент і повертає TRUE, якщо такий елемент існує.
• ➡️ Метод Reset() -> повертає перелічувач у початковий стан.
⚠️ Важливі нюанси та тонкощі:
• До першого виклику MoveNext() значення властивості Current є невизначеним (null, zero).
• Після того як MoveNext() повертає FALSE, значення Current також стає невизначеним.
🔄 Повертаючись до нашого прикладу зі Split:
Замість повернення масиву невідомого розміру, функція може повертати IEnumerator, який послідовно видає підрядки один за одним.
Ще краще — ми можемо реалізувати симетричну функцію Join, яка приймає IEnumerator як вхідні дані.
Це дозволяє обом функціям працювати з колекціями довільного розміру, взагалі не спираючись на масиви фіксованої довжини.
✅ На практиці IEnumerator надає простий спосіб реалізувати поведінку динамічних колекцій у Structured Text, залишаючись у межах стандартних можливостей мови.
Приклади такого підходу можна знайти в тестовому проекті TwinCAT.OpenFramework за посиланням: TwinCAT.OpenFramework IEnumerator Examples
#TwinCAT #PLC #StructuredText #IndustrialAutomation #IEC61131 #SoftwareEngineering #OpenFramework