Особливості роботи VAR_IN_OUT CONSTANT у TwinCAT
Аналіз того, як компілятор TwinCAT обробляє параметри VAR_IN_OUT CONSTANT, зокрема з рядковими літералами та тимчасовими змінними.
На перший погляд, VAR_IN_OUT CONSTANT здається просто способом заборонити запис у змінну. Насправді ж його поведінка є набагато тоншою.
Будь-який VAR_IN_OUT — це посилання на змінну із зовнішнього контексту. Проте для VAR_IN_OUT CONSTANT рядкового типу можна передавати рядковий літерал безпосередньо в метод. Це не працює для інших типів (чисел тощо).
Я припускав, що компілятор створює тимчасову змінну для літералу і знищує її після виклику методу. Однак експерименти показали інше: автоматична змінна зберігається в пам’яті, і дані за цією адресою залишаються доступними.
Це означає, що компілятор уже має механізм автоматичного створення змінних для рядкових літералів. Я думаю, що це не працює для інших коротких типів, оскільки такі типи можна передавати через VAR_INPUT без жодних втрат продуктивності.
Було б чудово мати подібну поведінку для структур та масивів, а також підтримувати таку ж функціональність для типу ANY.
Наведена нижче ілюстрація детальніше демонструє цей сценарій.

#TwinCAT #CoDeSys #StructuredText #OOP #IndustrialAutomation