Можливість ігнорування параметрів методу за спеціальними значеннями
Елегантні способи ігнорування параметрів або збереження попередніх значень у TwinCAT / CoDeSys за допомогою REFERENCE TO та quiet NaN (Not a Number).
Уявіть, що у вас є метод з набором параметрів і вам потрібні значення для цих параметрів, які означають: «використовувати попереднє значення (або значення за замовчуванням, якщо попереднього немає)».
Як вирішити таку задачу? Можна використовувати окремі значення поза діапазоном робочих значень — наприклад, 0 для швидкості, порожній рядок для тексту, спеціальне значення перелічення (ENUM) або додаткові логічні прапорці типу ignoreXxxParameter.
Але є й більш елегантні рішення, які можуть цілком задовольнити ваші потреби у деяких випадках:
1. Використання REFERENCE TO (або POINTER TO)
У цьому випадку порожній вказівник або порожнє посилання означає необхідність проігнорувати параметр. Реалізація методу виглядає приблизно так:
METHOD StartAbsoluteMotion(targetPosition : REFERENCE TO LREAL)
BEGIN
IF __ISVALIDREF(targetPosition) THEN
MoveAbsoluteInstance.Position := targetPosition;
END_IF
MoveAbsoluteInstance(Execute := TRUE);
END
Недолік цього способу: неможливість прямого використання літерала (окрім строк), а також виклику іншого методу або властивості для отримання значення параметра. Тобто виклик типу StartAbsoluteMotion(targetPosition := GetTargetPosition()) не спрацює у зв’язку з обмеженнями компілятора.
2. Використання спеціальних значень для чисел з плаваючою комою
Прикладом такого значення може бути так званий Тихий NaN (Not A Number).
Недоліки цього підходу: він працює лише для типів REAL та LREAL. Також у TwinCAT немає вбудованої константи типу NAN, проте її можна отримати за допомогою математичних операцій типу LOG(-1) або SQRT(-1).
Нижче ви можете знайти знімок екрана з прикладом застосування обох підходів:

#TwinCAT #CoDeSys #PLC #StructuredText #IndustrialAutomation #Beckhoff #OOP