|
<< Click to Display Table of Contents >> Navigation: API MasterSCADA 4D > Подключение к исполнительной системе по JSON > HTTP API MasterPLC > Установка значений и вызов функциональных блоков > /Methods/CallPOU |
Вызывает программу или функциональный блок в указанной Lua-задаче, предварительно записав входные параметры. При запросе выходных параметров метод ждёт завершения вызова и возвращает их значения.
HTTP: POST /Methods/CallPOU
{
"sessionId": 123456789,
"recs": [
{
"taskId": 0,
"itemId": 30818,
"path": "",
"params": [
{
"name": "_x",
"value": 2
}
],
"outParams": [
{
"name": "_y",
"type": "LREAL"
}
]
}
]
}
Поле |
Тип |
Обязательное |
По умолчанию |
Описание |
|---|---|---|---|---|
sessionId |
integer |
условно |
— |
Нужен, если сессия не передана заголовком Session-Id |
recs |
array |
да |
— |
Массив вызовов POU |
recs[].taskId |
integer |
нет |
0 |
Индекс локальной Lua-задачи, в которой выполняется POU |
recs[].itemId |
integer |
да |
0 |
Идентификатор программы, ФБ или содержащей его переменной из VMInfo |
recs[].path |
string |
нет |
"" |
Путь к вложенному POU внутри узла itemId |
recs[].params |
array |
нет |
пустой массив |
Входные параметры, записываемые перед вызовом |
recs[].params[].name |
string |
да |
"" |
Имя входного параметра POU |
recs[].params[].value |
любое JSON-значение |
да |
— |
Значение параметра; допускается также объект с вложенным полем value |
recs[].outParams |
array |
нет |
пустой массив |
Запрашиваемые выходные параметры; непустой массив включает ожидание результата |
recs[].outParams[].name |
string |
да |
"" |
Имя выходного параметра POU |
recs[].outParams[].type |
string |
нет |
"" |
ST-тип, к которому сервер пытается привести значение ответа |
recs[].callType |
integer |
нет |
— |
Устаревшее поле: текущая реализация его не читает |
recs[].typeHash |
integer |
нет |
0 |
Сохраняется в CallPOURec, но при выполнении не используется |
recs[].params[].typeHash |
integer |
нет |
— |
Устаревшее поле: текущая реализация его не читает |
recs[].outParams[].typeHash |
integer |
нет |
— |
Устаревшее поле: текущая реализация его не читает |
Поле callType не управляет режимом вызова. Фактическое поведение определяется только outParams:
•нет выходных параметров — метод возвращает ответ сразу после постановки вызова в очередь;
•есть хотя бы один выходной параметр — метод ждёт выполнения POU.
{
"recs": [
{
"statusCode": 0,
"outParams": [
3.0
]
}
],
"serverTime": 1710000000123,
"code": 0
}
Без outParams обычный ответ имеет вид:
{
"recs": [
{
"statusCode": 0
}
],
"serverTime": 1710000000123,
"code": 0
}
Поле |
Тип |
Условие |
Описание |
|---|---|---|---|
recs |
array |
обычный ответ |
Результаты принятых вызовов; важное исключение для отказа в правах описано ниже |
recs[].statusCode |
integer |
всегда в возвращённой записи |
Результат вызова либо предварительное значение для асинхронного режима |
recs[].outParams |
array |
в запросе были outParams |
Значения в том же порядке, что описания outParams в запросе; имена не повторяются |
serverTime |
integer |
обычный ответ |
Время сервера после завершения ожидания, Unix time в миллисекундах |
code |
integer |
всегда |
Общий результат метода |
•При пустом outParams вызов выполняется асинхронно в следующем цикле задачи. Возвращаемый statusCode: 0 подтверждает постановку в очередь, но не результат будущего выполнения POU.
•При непустом outParams HTTP-обработчик ждёт завершения каждого такого вызова. Тайм-аут в текущей реализации отсутствует; если задача не обработает очередь, запрос может ожидать неограниченно долго.
•Если taskId не соответствует зарегистрированному DataSource, весь метод завершается корневой ошибкой OpcUa_BadNodeIdUnknown; подготовленные вызовы из того же пакета не ставятся в очередь.
•itemId: 0 с полным путём здесь не поддержан: LuaTask::CallPOUs разрешает адрес через VMInfo. В режиме с outParams невозможность построить Lua-путь возвращается как OpcUa_BadInvalidArgument; в асинхронном режиме эта поздняя ошибка в HTTP-ответ не попадает.
•Для явно указанной локальной задачи проверяется право Execute. В текущей реализации вызов без права молча исключается из recs ответа, а корневой code остаётся равным 0; поэтому длина массива ответа может оказаться меньше длины массива запроса. Это ограничение текущего C++-обработчика, а не рекомендуемый контракт клиента.
•Из-за разных значений по умолчанию в двух чтениях taskId его отсутствие приводит к выполнению в задаче 0, но пропускает проверку права Execute. Клиенту следует всегда передавать taskId явно.
•Неизвестный входной параметр не создаёт отдельную ошибку на этапе разбора: значение читается без типа, в коде оставлен TODO на возврат ошибки.
•Если среди выходных параметров есть Error со строкой "No permission to invoke the FB" или "Нет прав на вызов ФБ", statusCode заменяется на OpcUa_BadUserAccessDenied.
•При резервном состоянии контроллера корневой code равен OpcUa_BadShutdown.