UniSet 2.44.3
(JScript) OPC UA Client helper (uniset2-opcua-client.js)

Вспомогательная обёртка над uniset.opcua (реализовано на C++ через open62541/open62541pp).
Даёт удобный объектный API для подключения к серверу OPC UA, чтения и записи переменных из JScript.

Загрузка и создание клиента

load("uniset2-opcua-client.js");
const client = uniset_createOpcuaClient();

Фабрика проверяет наличие всех нативных методов (connect, disconnect, read, write) и кидает исключение, если движок собран без OPC UA.

API

connect(opts)

Подключается к OPC UA серверу.

Параметры (объект):

  • endpoint / url / address — строка вида opc.tcp://host:port; обязательно;
  • user / username — (опционально) логин;
  • pass / password — (опционально) пароль.

Возвращает true при успешном установлении сессии, иначе кидает исключение с текстом из нативного клиента.

disconnect()

Закрывает текущее соединение, повторные вызовы безопасны.

read(nodeIds, [options])

Читает значения узлов.

nodeIds может быть строкой ("ns=1;s=MyVar") или массивом строк. Типичный ответ для двух узлов:

[
{ nodeId: "ns=1;s=TestInt", status: 0, ok: true, type: "int32", value: 55 },
{ nodeId: "ns=1;s=TestBool", status: 0, ok: true, type: "int32", value: 1 }
]

Опции:

  • keepArray — даже если запрошен один nodeId, вернуть массив (как в примере выше), что упрощает унифицированную обработку;
  • asMap — вернуть объект вида { "nodeId" : result }.

readValues(nodeIds, [options])

Упрощённая версия read, которая возвращает только value (или undefined, если status != GOOD). Пример:

const values = client.readValues(["ns=1;s=TestInt", "ns=1;s=TestBool"], { keepArray: true });
// values === [55, true]

Опции (keepArray, asMap) работают аналогично read.

write(items[, value[, type]])

Записывает значения.

Допустимые формы аргументов:

  • write("ns=1;s=TestInt", 123) — одиночный узел;
  • write("ns=1;s=TestFloat", 1.23, "float") — с явным типом (int32, float, double, bool);
  • write([{ nodeId, value, type }, ...]) — массив объектов;
  • write({ "ns=1;s=Out1": 10, "ns=1;s=Flag": true }) — карта.

Возвращает UA_StatusCode (0 при успехе). При первой неудачной записи код ошибки сохраняется в лог JSOPCUAClient.

Примеры

Создание и подключение

load("uniset2-opcua-client.js");
const client = uniset_createOpcuaClient();
client.connect({ endpoint: "opc.tcp://127.0.0.1:4840", user: "user", pass: "pass" });

Чтение значений

const readRes = client.read(["ns=1;s=TestInt", "ns=1;s=TestBool"], { keepArray: true });
readRes.forEach(function(item){
if (item.ok)
log.info(item.nodeId, "=", item.value);
});

Запись значений

const status = client.write([
{ nodeId: "ns=1;s=TestInt", value: 55 },
{ nodeId: "ns=1;s=TestFloat", value: 18.5, type: "float" },
{ nodeId: "ns=1;s=TestBool", value: true, type: "bool" }
]);
if (status !== 0)
throw new Error("OPC UA write failed: " + status);

Полный цикл

try {
client.connect({ endpoint: "opc.tcp://localhost:15480" });
client.write("ns=1;s=RunFlag", true, "bool");
const value = client.read("ns=1;s=Status").value;
client.disconnect();
log.info("Status =", value);
} catch (e) {
log.warn("OPC UA error:", e.message || e);
}