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

Робота з колекціями змінної довжини у 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