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

Можливість ігнорування параметрів методу за спеціальними значеннями

Елегантні способи ігнорування параметрів або збереження попередніх значень у 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