WEB OPC HTTP API: различия между версиями

Материал из TekonWiki
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
Строка 34: Строка 34:


В текущей версии API-не реализует callback-механизма. Для получения обновлений в подписке, клиент должен выполнять периодические запросы к серверу.  
В текущей версии API-не реализует callback-механизма. Для получения обновлений в подписке, клиент должен выполнять периодические запросы к серверу.  


== ДОСТУП К ДАННЫМ ==
== ДОСТУП К ДАННЫМ ==
Строка 40: Строка 41:


Признаком кооректной обработки запроса является HTTP Responce status code = 200
Признаком кооректной обработки запроса является HTTP Responce status code = 200


=== Коды ошибок WEB-сервиса ===
=== Коды ошибок WEB-сервиса ===
Строка 83: Строка 83:
|}
|}


 
=== Запрос открытия сессии - NewSession ===
 
Это первый запрос, который следует выполнять при подключении к серверу.
<pre>GET http://host:port/NewSession?alldata=0</pre>
 
, где
 
*alldata - определяет механизм обновления данных в подписке&nbsp;  
**0 - обычно, предоставлять только последнее обновление значения&nbsp;элемента&nbsp;между запросами обновления данных
**1 - предоставлять все изменения значений&nbsp;элемента между&nbsp; двумя запросами обновления данных 
 
Ответ: json&nbsp;следующего вида
<pre>{"sessionid":"22339217-FEF1-45B4-BB59-70177BB2997A"}
</pre>
 
=== Запрос адресного пространства OPC-сервера - GetAddressSpace ===
<pre>GET http://host:port/GetAddressSpace?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A</pre>


=== Запрос адресного пространства Tekon OPC-сервера ===
, где


Это первый запрос, который следует выполнять при подключении к серверу.
*sessionid - идентификатор сессии полученный в ответ на запрос открытия сессии
<pre>GET http://host:port/GetAddressSpace</pre>


Ответ: json-массив следующего вида
Ответ: json-массив следующего вида
Строка 136: Строка 151:
Если конфигурация Tekon OPC-сервера не изменяется, на запрос адресного пространства приходит один и тот&nbsp; же ответ. Однако, если в &nbsp;Tekon OPC-сервере появятся новые элементы, например: в результате регистрации нового оборудования, то идентификация его элементов может измениться. Это следует учитывать при подписке на обновления данных.
Если конфигурация Tekon OPC-сервера не изменяется, на запрос адресного пространства приходит один и тот&nbsp; же ответ. Однако, если в &nbsp;Tekon OPC-сервере появятся новые элементы, например: в результате регистрации нового оборудования, то идентификация его элементов может измениться. Это следует учитывать при подписке на обновления данных.


 
=== Запрос закрытия сессии - CloseSession ===
=== Запрос открытия сессии ===
<pre>GET http://host:port/NewSession?alldata=0</pre>
 
, где
 
*alldata - определяет механизм обновления данных в подписке&nbsp;
**0 - обычно, предоставлять только последнее обновление значения&nbsp;элемента&nbsp;между запросами данных
**1 - предоставлять все изменения значений&nbsp;элемента между&nbsp; двумя запросами данных 
 
Ответ: json&nbsp;следующего вида
<pre>{"sessionid":"22339217-FEF1-45B4-BB59-70177BB2997A"}
</pre>
 
 
=== Запрос закрытия сессии ===


Не обязательный запрос. Все "забытые" сессии, автоматически закроются сервером.
Не обязательный запрос. Все "забытые" сессии, автоматически закроются сервером.
Строка 159: Строка 159:
<pre>{"result":"ok"}</pre>
<pre>{"result":"ok"}</pre>


=== Запрос подписки на обновление данных ===
=== Запрос подписки на обновление данных - Subscriber ===
<pre>POST http://host:port/Subscriber?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A</pre>
<pre>POST http://host:port/Subscriber?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A</pre>


Строка 166: Строка 166:
*sessionid - идентификатор сессии полученный в ответ на запрос открытия сессии  
*sessionid - идентификатор сессии полученный в ответ на запрос открытия сессии  


В POST запросе также передается массив идентификаторов элементов адресного пространства, на обновление данных которых необходимо подписаться, например:
В POST запросе также передается массив идентификаторов элементов ItemIndex&nbsp;адресного пространства, на обновление данных которых необходимо подписаться, например:
<pre>{"items":[0,1,2,3,4,5,6,7,8,9]}</pre>
<pre>{"items":[0,1,2,3,4,5,6,7,8,9]}</pre>


Строка 178: Строка 178:
Для добавления элементов в подписку следует повторно выполнить запрос с указанием новых (добавляемых) идентификаторов элементов.
Для добавления элементов в подписку следует повторно выполнить запрос с указанием новых (добавляемых) идентификаторов элементов.


=== Запрос проверки новых данных в подписке - GetUpdates ===


=== Запрос проверки новых данных в подписке ===
Запрос следует выполнять&nbsp;периодически, например: раз в секунду, для полученя новых данных, на которые ранее была выполнена подписка .
 
Запрос выполняется периодически, например: раз в секунду, для проверки наличия новых данных (тех, на которые была выполнена подписка ранее).
<pre>GET http://host:port/GetUpdates?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A</pre>
<pre>GET http://host:port/GetUpdates?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A</pre>


Строка 201: Строка 200:
Внимание! В ответе присуствуют только те данные, которые обновились с момента прошлого запроса.
Внимание! В ответе присуствуют только те данные, которые обновились с момента прошлого запроса.


=== Запрос принудительного чтения значения элемента подписки ===
=== Запрос принудительного чтения значения элемента подписки - ReadItemValue ===
<pre>GET http://host:port/ReadItemValue?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A&item=1</pre>
<pre>GET http://host:port/ReadItemValue?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A&item=1</pre>


, где&nbsp;
, где&nbsp;


*item&nbsp; - идентификатор элемента, который был указан в подписке (и получен из адресного пространства Tekon OPC-сервера)
*item&nbsp; - идентификатор элемента, который ранее был указан в подписке  


Ответ: json&nbsp;следующего вида
Ответ: json&nbsp;следующего вида
Строка 219: Строка 218:
Для получения текущего&nbsp;значения&nbsp;элемента&nbsp;следует выполнить Запрос проверки новых данных (GetUpdates).
Для получения текущего&nbsp;значения&nbsp;элемента&nbsp;следует выполнить Запрос проверки новых данных (GetUpdates).


=== Запрос принудительного чтения значений всех&nbsp;элементов подписки ===
=== Запрос принудительного чтения значений всех&nbsp;элементов подписки - ReadAllItemsValues ===
<pre>GET http://host:port/ReadAllItemsValues?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A
<pre>GET http://host:port/ReadAllItemsValues?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A
</pre>
</pre>
Строка 234: Строка 233:
Для получения текущих значений элементов следует выполнить Запрос проверки новых данных (GetUpdates).
Для получения текущих значений элементов следует выполнить Запрос проверки новых данных (GetUpdates).


 
=== Запрос записи нового значения&nbsp;элемента подписки - WriteItemsValues ===
=== Запрос записи нового значения&nbsp;элемента подписки ===
<pre>POST http://host:port/WriteItemsValues?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A</pre>
<pre>POST http://host:port/WriteItemsValues?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A</pre>


В POST запросе также передается массив идентификаторов элементов адресного пространства, на обновление данных которых необходимо подписаться, например:
В POST запросе также передается массив идентификаторов элементов адресного пространства OPC-сервера:
<pre>[{
<pre>[{
   "ItemID": 1,
   "ItemID": 1,

Версия от 11:05, 27 марта 2024


ВВЕДЕНИЕ

Данное API позволяет получить доступ к данными диспетчеризации, циркулирующим в ПО АСУД.SCADA, посредством выполнения запросов по HTTP(S) протоколу к специализированному WEB-сервису.

WEB-сервис реализован в приложении  .. \ tools-server \ opcconnector.exe

По-сути API является OPC-HTTP шлюзом для OPC DA - сервера.

Если вам необходим доступ к данным подсистемы учета ресурсов смотри WEB REST API 

История версий: 

27-03-2024

  • Обновление API
  • Возможность подключение к любому OPC DA серверу (не только к Tekon OPC DA). 


ОБЩИЕ СВЕДЕНИЯ

Взаимодействие реализуется по следующей схеме:

  • открытие сессии
  • получение адресного пространства OPC-сервера (не обязательно)
  • подписка на обновление определенных элементов адресного пространства
  • периодическая проверка обновлений данных в подписке 
  • выборочное чтение значений элементов 
  • выборочная запись новых значений элементов 
  • закрытие сессии

Активная сессия будет автоматически закрыта сервером в случае отстуствия запросов со стороны клиента в течение двух минут.

В текущей версии API-не реализует callback-механизма. Для получения обновлений в подписке, клиент должен выполнять периодические запросы к серверу.  


ДОСТУП К ДАННЫМ

Доступ осуществляется с помощью HTTP-запросов: GET и POST.

Признаком кооректной обработки запроса является HTTP Responce status code = 200

Коды ошибок WEB-сервиса

В случае ошибки обоработки запроса, WEB-сервис формирует следующие коды ошибок 

HTTP Responce status code Описание ошибки Комментарий
400 В запросе не указан идентификатор сессии  
403 Соединение с данного IP-адреса запрещено Список допустимых IP-адресов может быть указан в настройках WEB-сервиса
404 Запрашиваемый ресурс не найден

 

409 Указанный идентификатор сессии не найден Следует переоткрыть сессию
415 В запросе должны быть, но отсутствуют даннные, передаваемые методом POST  
503 OPC-сервер не доступен

Вероятно осуществляется перезапуск OPC-сервера

Следует выполнить переоткрытие сессии и заново оформить подписку на элементы

Запрос открытия сессии - NewSession

Это первый запрос, который следует выполнять при подключении к серверу.

GET http://host:port/NewSession?alldata=0

, где

  • alldata - определяет механизм обновления данных в подписке 
    • 0 - обычно, предоставлять только последнее обновление значения элемента между запросами обновления данных
    • 1 - предоставлять все изменения значений элемента между  двумя запросами обновления данных

Ответ: json следующего вида

{"sessionid":"22339217-FEF1-45B4-BB59-70177BB2997A"}

Запрос адресного пространства OPC-сервера - GetAddressSpace

GET http://host:port/GetAddressSpace?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A

, где

  • sessionid - идентификатор сессии полученный в ответ на запрос открытия сессии

Ответ: json-массив следующего вида

 [
 {
  "ItemProps": [
   {
    "Datatype": 18,
    "ID": 1,
    "Value": "19",
    "Error": 0,
    "Desc": "Тип данных"
   },{
    "Datatype": 19,
    "ID": 5,
    "Value": "3",
    "Error": 0,
    "Desc": "Права доступа"
   }],
  "ItemIndex": 0,
  "ItemName": "DBMonitoring.ConnectFailDevices"
 },{
  "ItemProps": [
   {
    "Datatype": 18,
    "ID": 1,
    "Value": "19",
    "Error": 0,
    "Desc": "Тип данных"
   },{
    "Datatype": 19,
    "ID": 5,
    "Value": "3",
    "Error": 0,
    "Desc": "Права доступа"
   }],
  "ItemIndex": 1,
  "ItemName": "DBMonitoring.KIR_BatteryFail"
 }]

, где:

  • ItemProps - набор свойств элемента Tekon OPC-сервера
  • ItemIndex - идентификатор элемента. Используется далее при обмене данным с сервером
  • ItemName - имя элемента

Если конфигурация Tekon OPC-сервера не изменяется, на запрос адресного пространства приходит один и тот  же ответ. Однако, если в  Tekon OPC-сервере появятся новые элементы, например: в результате регистрации нового оборудования, то идентификация его элементов может измениться. Это следует учитывать при подписке на обновления данных.

Запрос закрытия сессии - CloseSession

Не обязательный запрос. Все "забытые" сессии, автоматически закроются сервером.

GET http://host:port/CloseSession?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A

Ответ: json следующего вида 

{"result":"ok"}

Запрос подписки на обновление данных - Subscriber

POST http://host:port/Subscriber?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A

, где

  • sessionid - идентификатор сессии полученный в ответ на запрос открытия сессии

В POST запросе также передается массив идентификаторов элементов ItemIndex адресного пространства, на обновление данных которых необходимо подписаться, например:

{"items":[0,1,2,3,4,5,6,7,8,9]}

Ответ: json следующего вида

{"result":10}

, где

  • result - число элементов, которые были добавлены в подписку 

Для добавления элементов в подписку следует повторно выполнить запрос с указанием новых (добавляемых) идентификаторов элементов.

Запрос проверки новых данных в подписке - GetUpdates

Запрос следует выполнять периодически, например: раз в секунду, для полученя новых данных, на которые ранее была выполнена подписка .

GET http://host:port/GetUpdates?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A

Ответ: json-массив

 [{
  "UpTime": "2023-04-28 17:54:55",
  "V": "0",
  "ItemID": 3,
  "Qual": 192
 }]

, где 

  • UpTime - время обновления
  • V - значение элемента
  • ItemID - идентификатор элемента, который был указан в подписке (и получен из адресного пространства Tekon OPC-сервера)
  • Qual - качество значения 

Внимание! В ответе присуствуют только те данные, которые обновились с момента прошлого запроса.

Запрос принудительного чтения значения элемента подписки - ReadItemValue

GET http://host:port/ReadItemValue?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A&item=1

, где 

  • item  - идентификатор элемента, который ранее был указан в подписке

Ответ: json следующего вида

{"result":1}

, где

  • result
    • 0 - ошибка, запрашиваемый идентификатор отсутствует в подписке 
    • 1 - ok

Для получения текущего значения элемента следует выполнить Запрос проверки новых данных (GetUpdates).

Запрос принудительного чтения значений всех элементов подписки - ReadAllItemsValues

GET http://host:port/ReadAllItemsValues?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A

Ответ: json следующего вида

{"result":10}

, где

  • result
    • 0 - ошибка, отсутствуют элементы в подписке
    • > 0  - ok, 

Для получения текущих значений элементов следует выполнить Запрос проверки новых данных (GetUpdates).

Запрос записи нового значения элемента подписки - WriteItemsValues

POST http://host:port/WriteItemsValues?sessionid=22339217-FEF1-45B4-BB59-70177BB2997A

В POST запросе также передается массив идентификаторов элементов адресного пространства OPC-сервера:

[{
  "ItemID": 1,
  "Value": "0"
 }]

Для возможности записи значения в ItemID, необходимо чтобы он был ранее добавлен в подписку.

Ответ: json следующего вида

 {"result":1}
  • 1 - количество успешно обновленных элементов