|
<< 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 сериализуются по фактическим типам вариантов события.