Методи з опціональними аргументами
Користь від аргументів зі значеннями за замовчуванням, їх особливості та обмеження в TwinCAT/CoDeSys.
У TwinCAT 3.1.4026 з’явилася можливість не передавати значення для вхідних параметрів методу, якщо для них визначено значення за замовчуванням.
Хочу показати, як ця можливість допомагає зменшити кількість зайвого коду, а також поділитися кількома особливостями, які я виявив під час її використання.
Загалом усе працює дуже добре, за винятком деяких проблем у конструкціях __TRY/__CATCH, мали бути виправлені в новіших версіях TwinCAT, оскільки я неодноразово повідомляв про них у службу підтримки.
Проте є два моменти, які, на мою думку, ще можна було б покращити.
1. Значення за замовчуванням не підтримуються для типів ANY
Компілятор дозволяє написати щось на кшталт:
targetString : ANY_STRING := SystemAnyTypeVariable
але під час компіляції видає попередження, що така конструкція не підтримується. Як наслідок, під час виклику методу доводиться явно передавати всі аргументи типу ANY. Шкода, адже ця можливість була б дуже корисною.
2. Значення за замовчуванням не підтримуються для VAR_IN_OUT CONSTANT
Нагадаю, що VAR_IN_OUT CONSTANT дозволяє передавати строкові літерали за посиланням, створюючи для них приховану тимчасову змінну. Було б чудово, якби й тут можна було використовувати значення за замовчуванням, але наразі така можливість відсутня.
Де ця функція найбільш корисна?
Сценаріїв використання дуже багато, але особисто для мене найбільша перевага — можливість реалізувати значно зручнішу конкатенацію рядків.
У своєму фреймворку я створив набір утиліт, які суттєво спрощують конкатенацію як коротких рядків (до 255 символів), так і довгих рядків, причому як для STRING, так і для WSTRING.
На зображенні нижче можна побачити один із можливих варіантів реалізації. Якщо ви впровадите щось подібне у своєму проєкті, то відчуєте себе так, ніби зі світу програмування 80-х раптом потрапили в можливості 90-х. 🙂

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