/Methods/CreateMonitoredEvents

<< Click to Display Table of Contents >>

Navigation:  API MasterSCADA 4D > Подключение к исполнительной системе по JSON > HTTP API MasterPLC > События и сообщения >

/Methods/CreateMonitoredEvents

Добавляет одну или несколько выборок в подписку. Выборка задаёт область событий, режим журнала, список возвращаемых полей и DSL-фильтры. Клиент сопоставляет уведомления по clientHandle, а сервер назначает monitoredItemId.

HTTP: POST /Methods/CreateMonitoredEvents

Запрос

{
  "sessionId": 123456789,
  "subscriptionId": 1,
  "items": [
    {
      "clientHandle": 101,
      "fullPath": "Объекты.Объект 1.Оборудование 1",
      "archiveId": 0,
      "useArchive": false,
      "fields": [
        {"name": "EventId"},
        {"name": "Time"},
        {"name": "Message"},
        {"name": "Severity"},
        {"name": "Acked"}
      ],
      "filter": [
        "Active=true",
        "Severity <= 100 or Severity >= 900"
      ]
    }
  ]
}

Поля запроса

Поле

Тип

Обязательное

По умолчанию

Описание

sessionId

integer

условно

Нужен, если сессия не передана заголовком Session-Id

subscriptionId

integer

да

Идентификатор подписки

items

array

да

Массив добавляемых выборок

items[].clientHandle

integer

рекомендуется

0

Идентификатор выборки на стороне клиента

items[].fullPath

string

нет

""

Предпочтительная адресация объекта по полному UTF-8-пути; охватывает его дочерние объекты

items[].itemId

integer

нет

0

Устаревшая совместимая адресация узла из VMInfo

items[].path

string

нет

""

Путь внутри узла при адресации через itemId

items[].taskId

integer

нет

0

Поле читается и сохраняется, но сейчас не участвует в фильтрации

items[].archiveId

integer

нет

0

Если не 0, пропускаются только события назначенного архива

items[].useArchive

boolean

нет

false

Включает хронологический режим UpdateArchive вместо обычных обновлений Update

items[].fields

array

да

Непустой массив полей, возвращаемых в PublishEvents

items[].fields[].id

integer

нет

0

Числовой идентификатор стандартного поля

items[].fields[].name

string

условно

""

Имя стандартного или дополнительного поля; обязательно при id: 0

items[].fields[].type

string

нет

""

Поле сохраняется, но не задаёт тип сериализованного значения

items[].fields[].typeHash

integer

нет

0

Поле сохраняется, но сейчас не используется

items[].filter

array of string

нет

[]

DSL-условия; элементы массива объединяются логическим AND

Если fullPath, itemId и path не заданы, выборка не ограничивает события объектом. При useArchive: true и archiveId: 0 сервер пытается взять архив адресованного объекта, затем использует архив событий по умолчанию.

Стандартные идентификаторы полей:

id

name

id

name

1

EventId

8

Message

2

ActiveTime

9

Comment

3

InactiveTime

10

Time

4

AckedTime

11

RecId

5

Active

12

ActivityPeriod

6

Acked

13

AckPeriod

7

Severity

 

 

При id: 0 точное, с учётом регистра, стандартное имя из таблицы преобразуется в соответствующий id. Другие имена читаются как дополнительные поля события.

Ответ

{
  "subscriptionId": 1,
  "items": [
    {
      "clientHandle": 101,
      "statusCode": 0,
      "monitoredItemId": 1
    }
  ],
  "serverTime": 1710000000123,
  "code": 0
}

Поля ответа

Поле

Тип

Описание

subscriptionId

integer

Идентификатор подписки

items

array

Результаты добавления в порядке элементов запроса

items[].clientHandle

integer

Идентификатор из запроса; при ошибке загрузки может быть 0

items[].statusCode

integer

Результат добавления конкретной выборки

items[].monitoredItemId

integer

Серверный идентификатор; при ранней ошибке загрузки может быть 0

serverTime

integer

Время сервера, Unix time в миллисекундах

code

integer

Общий результат метода; ошибки отдельных выборок не обязаны менять его с 0

Поведение и ограничения

Если items не является массивом, метод возвращает общую ошибку OpcUa_BadSyntaxError.

Пустой fields даёт OpcUa_BadInvalidArgument в items[].statusCode. Текущий код не требует конкретно EventId, однако его следует включать первым: идентификатор нужен для квитирования, а удаление ранее опубликованной записи из ещё растущего пакета сравнивает EventId с первым полем.

Ошибка разбора DSL-фильтра возвращается в items[].statusCode, а некорректная выборка не добавляется.

Сервер не проверяет уникальность clientHandle. monitoredItemId выдаётся глобальным счётчиком процесса, а не отдельной последовательностью внутри подписки.

В обычном режиме приходят изменения типа Update; режим useArchive вместо них принимает хронологические записи UpdateArchive. Ответ на RefreshEvents имеет тип Refresh в обоих режимах.

При archiveId, отличном от 0, выборка дополнительно проверяет фактический архив экземпляра события.

type и typeHash не преобразуют значения: fields сериализуются по фактическим типам вариантов события.