УкраїнськаEnglishmRussian
Вхід/Новий

Серія значних вдосконалень модуля {DAQ,Protocol}.OPC_UA

12.07.2021 10:00 Давність: 3 yrs
Категорії: НовинаРозробка

Автор: Роман Савоченко


DAQ.OPC-UA

{DAQ,Protocol}.OPC_UA доповнено реалізацією сервісу Publish, підтримкою шматків (CHUNKS) на клієнтській частині Збору Даних та загальним переглядом коду в процесі цього.

Після випуску 0.9.4 LTS його вже доповнено підтримкою Логічного типу DAQ-Параметрів та Стандартний тип DAQ-Параметрів доповнено режимом не запиту цільових даних на сервері та прямими ІД і назвою атрибутів.

Спонсорування, роботу з UAExpert 1.5, реалізації клієнтського Publish та Chunks, значної уніфікації, підтримки Логічного Рівня та цілковитої ревізії документу на 10.4 ЛД: Фонд

КЛІЄНТ:

  • доповнено підтримкою Логічного типу DAQ-Параметрів;
  • Стандартний тип DAQ-Параметрів доповнено режимом не запиту цільових даних на сервері та прямими ІД і назвою атрибутів;
  • додання атрибутів (елементів моніторингу) пересунено із attrPrc() безпосередньо до enable() та яка запускається при запуску об'єкту контролеру
  • ... та опрацювання елементів покращено оновленням опису, прапорців та зв'язування;
  • збір даних уніфіковано опрацюванням у функції параметру upVal()
  • ... та запиту значень функцією об'єкту контролеру getValMIt() із підтримкою Масивів
  • ... чим впритул приготовано до вбудування логічного типу параметрів;
  • об'єкти параметрів Збору Даних активовано для включення інших параметрів;
  • встановлення та видалення EVAL до всіх атрибутів перевірено у всіх режимах;
  • структурні змінні, у оглядачі обрання DAQ-параметру, дозволені до обрання їх елементів окремо;
  • розбір переліку змінних DAQ-параметрів встановлено у цілковитий розбір із пропуском порожніх рядків;
  • об'єкт DAQ-контролеру доповнено закриттям сеансу та безпечного каналу при його зупинці;
  • загальний статус об'єкту контролеру доповнено деталізованою інформацією щодо використаного каналу безпеки, сеансу, підписки та опрацьованими елементами моніторингу;
  • блокування запиту перейменовано у resOPC.

СЕРВЕР:

  • об'єкт OPC-UA Серверу доповнено вкладкою загального статусу серверу із інформацією щодо активності каналів безпеки;
  • об'єкт Вузла EndPoint доповнено загальним статусом із інформацією щодо активності сеансів та підписок, а також періодичністю і часом виконання завдання підписок.

БІБЛІОТЕКА:

  • уніфіковано у визначені типового значення часу життя каналу безпеки, який встановлено у 300000 мс;
  • типовий LifeTimeCounter підписок встановлено у 2400;
  • об'єкт NodeId доповнено функцією прямого порівняння operator==();
  • функцію XML_N::childClear() доповнено результатом повернення того самого об'єкту XML_N для поєднання;
  • функцію curTime() доповнено аргументом визначення джерела годинника із використанням функції clock_gettime();
  • короткі функції доповнено str2int() та str2uint();
  • деякі поля перейменовано: publInterv у publInterval, cntrLifeTime у lifetimeCnt, cntrKeepAlive у maxKeepAliveCnt, maxNotPerPubl у maxNtfPerPubl, en у publEn;
  • виправлення слова "POOL" на "POLL".

БІБЛІОТЕКА_КЛІЄНТ:

  • Client::reqService() доповнено мета-командою "CloseALL" закриття поточного сеансу та каналу безпеки;
  • функцію опрацювання клієнтських сервісів protIO() адаптовано до роботи у асинхронному режимі (не запит);
    • функцію Client::messIO() розширено аргументом таймауту із визначенням також режиму запиту;
    • запис до каналу та читання із нього відокремлено у обробці MSG пакетів;
    • адаптація повідомлень безпеки до роботи зі змішаним вхідним буфером;
    • переміщення основного сервісного запиту "OPN" під опрацювання повідомлень через надсилання оновлень всередині Publish активності.
  • реалізовано сервіс Publish на боці клієнту:
    • об'єкт "Client" доповнено реалізацією підоб'єкту "Subscr" (але зберігається у Client::SClntSess) із функціями: activate(), monitoredItemAdd() та monitoredItemDel();
    • об'єкт "Client" доповнено функцією poll() із:
      • уніфікацією читання значень у обох режимах Read та Publish;
      • перевіркою втрати всіх Publish запитів протягом OpcUa_ClntPublishResentCntr(2) спроб-часу збереження живим;
      • відновлення пулу Publish.
    • об'єкт Client::Subscr::MonitItem додано як представник елементів моніторингу із доступом з під загального блокування клієнтських ресурсів;
      • сервісні запити доповнено реалізацією, включно із опрацюванням відповідей: CreateSubscription, DeleteSubscriptions, CreateMonitoredItems, Publish, Poll;
      • реалізовано та перевірено у підтримці безпечних політик за Publish;
      • цільовий пул Publish запитів на підписку встановлено у віртуальній функції publishReqsPool() із типовим значенням 2.
    • доповнено реалізацією шматків (CHUNKS) як у запитах, так і відповідях;
    • цілковито відревізовано та очищено загальну функцію запиту reqService() від дублікатів аргументів та параметрів:
      • доповнено відновленням сеансів при перепідключенні каналу безпеки;
      • уніфіковано очищення поточного сеансу та каналу безпеки.
    • об'єкт клієнту доповнено загальним блокуванням ресурсів mtxData;
    • властивість повідомлення "timeoutHint" встановлено у 0 для всіх повідомлень;
    • запит Read повернуто до "плаского" запиту із обмеженням лише у CHUNKS;
    • помилку OpcUa_BadSecureChannelIdInvalid додано до очищення каналу безпеки;
    • Client::SClntSess::{sessOpen,lstMessReq} перейменовано у {secChnlOpenTm,secLstMessReqTm}
    • ... та попереджено від очищення і відновлення сеансу та каналу безпеки;
    • доповнено налагоджувальними повідомленнями помилок запитів.

БІБЛІОТЕКА_СЕРВЕР:

  • серверну частину адаптовано до роботи із UAExpert 1.5 щодо: встановлення атрибуту AId_Descr DAQ-значення у тип OpcUa_LocalizedText, додання декларації цілочисельного типу OpcUa_IntAuto та OpcUa_UIntAuto;
  • опрацювання підписок повернуто до їх опрацювання у окремому завдання та функції subScrCycle() щодо:
    • правильного рахування всіх таймаутів для вимкнення;
    • опрацювання періодичності підписки та публікації;
    • перевірки стану пов'язаних сеансів та каналів безпеки щодо закриття підписок.
  • але публікацію залишено на опрацювання у активності вхідного каналу та функції Server::EP::publishCall() із попередженням опрацювання Publish для помилкових та чужих Підписок, через перевірку inPrtId, sesTokId та isSecCnlAct;
  • уніфікація Сеансу щодо: пов'язання сеансів із каналами безпеки переключено на один замість масиву, перевірку сеансу всіх повідомлень доповнено попередженням використання чужих підключень;
  • не останні шматки пакету переключено на відправку прямо, щоб не додавати до одного TCP-пакету;
  • EP::mtxData блокування переключено у PTHREAD_MUTEX_RECURSIVE;
  • канали безпеки обмежено кількістю OpcUa_SecCnlLimit(10) та чергу публікацій кількістю OpcUa_ServerMaxPublishQueue(10);
  • EP::secSize() перейменовано у EP::secN() та додано EP::sessN(), EP::subscrN() і chnlList();
  • Server.SecCnl.{TokenId,TokenIdPrev} перейменовано у Server.SecCnl.{tokenId,tokenIdPrev}.

1003