Skip to content

Commit 17aacc1

Browse files
authored
Merge pull request #861 from mister13337/master
Use node.session.browse for browse action in client node I hope this will not break anything existing functionality
2 parents 0e7abc4 + e5554cf commit 17aacc1

File tree

3 files changed

+77
-60
lines changed

3 files changed

+77
-60
lines changed

opcua/102-opcuaclient.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,6 @@
258258
<p>Info read attributes from the given nodeId</p>
259259
<p>Build will construct Extension Object message with topic, datatype and payload (value)</p>
260260
<p>Browse will lookup address space from the injected msg.topic (nodeId)</p>
261-
<p> if msg.collect === true then result will be collected into one msg. msg.payload will be array of items</p>
262261
<p> msg.payload.range = "2:4" and FloatArray or any Array datatype then indexes from 2 to 4 will be used to read or write depending on action</p>
263262
<p>History will read msg.topic = nodeId and msg.aggregate = "raw", historical values or aggregate "min" or "max" or "ave" or "interpolative"</p>
264263
<p> Other needed parameters start time and end time:

opcua/102-opcuaclient.js

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2411,53 +2411,61 @@ module.exports = function (RED) {
24112411
}
24122412
}
24132413

2414-
// OLD
2414+
node.add_item = function (item) {
2415+
if (item) {
2416+
if (!node.items) {
2417+
node.items = new Array();
2418+
}
2419+
node.items.push({
2420+
'item': item
2421+
});
2422+
}
2423+
};
2424+
2425+
function node_error(err) {
2426+
node.error("Browse node error!", err);
2427+
}
2428+
24152429
async function browse_action_input(msg) {
24162430
verbose_log("browsing");
2417-
let allInOne = [];
2431+
node.items = [];
24182432

24192433
if (node.session) {
2420-
const crawler = new NodeCrawler(node.session);
2434+
const client = opcua.OPCUAClient.create(connectionOption);
24212435
set_node_status_to("active browsing");
2422-
crawler.on("browsed", function (element) {
2423-
if (msg.collect === undefined || (msg.collect && msg.collect === false)) {
2424-
let item = {};
2425-
item.payload = { ...element }; // Clone element
2426-
let dataType = "";
2427-
item.topic = element.nodeId.toString();
2428-
if (element?.dataType) {
2429-
dataType = opcuaBasics.convertToString(element.dataType.toString());
2430-
}
2431-
if (dataType && dataType.length > 0) {
2432-
item.datatype = dataType;
2433-
}
2434-
node.send([item, null, null]);
2435-
}
2436-
else {
2437-
let item = { ...element }; // Clone element
2438-
allInOne.push(item);
2439-
}
2440-
});
2441-
// Browse from given topic
2442-
const nodeId = msg.topic;
2443-
crawler.read(nodeId, function (err, obj) {
2444-
if (!err) {
2445-
// Crawling done
2446-
if (msg.collect && msg.collect === true) {
2447-
verbose_log("Send all in one, items: " + allInOne.length);
2448-
let all = {};
2449-
all.topic = "AllInOne";
2450-
all.payload = allInOne;
2451-
all.objects = JSON.stringify(obj); // Added extra result
2452-
set_node_status_to("browse done");
2453-
node.send([all, null, null]);
2454-
return;
2455-
}
24562436

2457-
set_node_status_to("browse done");
2458-
}
2459-
crawler.dispose();
2460-
});
2437+
const nodeId = msg.topic;
2438+
node.debug("nodeId: " + nodeId);
2439+
2440+
try {
2441+
const browseResult = await node.session.browse(nodeId);
2442+
2443+
for(const reference of browseResult.references)
2444+
{
2445+
var ref_obj = Object.assign({}, reference);
2446+
const dataValue = await node.session.read({nodeId: ref_obj.nodeId, attributeId: opcua.AttributeIds.Value});
2447+
ref_obj["value"] = dataValue.value.value;
2448+
ref_obj["dataType"] = opcua.DataType[dataValue.value.dataType];
2449+
node.add_item(ref_obj);
2450+
}
2451+
msg.payload = node.items
2452+
node.send([msg, null, null]);
2453+
node.status({
2454+
fill: "green",
2455+
shape: "dot",
2456+
text: "Items: " + node.items.length,
2457+
source: { id: node.id, type: node.type, name: "OPC UA Browser"}
2458+
});
2459+
} catch (err) {
2460+
node_error("Browse error: " + err.message);
2461+
verbose_log(err);
2462+
node.status({
2463+
fill: "yellow",
2464+
shape: "ring",
2465+
text: "browse error",
2466+
source: { id: node.id, type: node.type, name: "OPC UA Browser" }
2467+
});
2468+
}
24612469
} else {
24622470
node_error("Session is not active!");
24632471
set_node_status_to("invalid session");
@@ -2696,4 +2704,4 @@ module.exports = function (RED) {
26962704

26972705
RED.nodes.registerType("OpcUa-Client", OpcUaClientNode);
26982706

2699-
}
2707+
}

opcua/103-opcuabrowser.js

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -124,24 +124,34 @@ module.exports = function (RED) {
124124

125125
// step 3 : browse
126126
node.debug("nodeIdBrowse:" + nodeIdToBrowse);
127-
const browseResult = await session.browse(nodeIdToBrowse);
128-
129-
130-
// step 4 : Read Value and Datatypes
131-
for(const reference of browseResult.references)
132-
{
133-
var ref_obj = Object.assign({}, reference);
134-
const dataValue = await session.read({nodeId: ref_obj.nodeId, attributeId: opcua.AttributeIds.Value});
135-
ref_obj["value"] = dataValue.value.value;
136-
ref_obj["dataType"] = opcua.DataType[dataValue.value.dataType];
137-
node.add_item(ref_obj);
127+
try {
128+
const browseResult = await session.browse(nodeIdToBrowse);
129+
130+
131+
// step 4 : Read Value and Datatypes
132+
for(const reference of browseResult.references)
133+
{
134+
var ref_obj = Object.assign({}, reference);
135+
const dataValue = await session.read({nodeId: ref_obj.nodeId, attributeId: opcua.AttributeIds.Value});
136+
ref_obj["value"] = dataValue.value.value;
137+
ref_obj["dataType"] = opcua.DataType[dataValue.value.dataType];
138+
node.add_item(ref_obj);
139+
}
140+
node.status({
141+
fill: "green",
142+
shape: "dot",
143+
text: "Items: " + node.items.length,
144+
source: { id: node.id, type: node.type, name: "OPC UA Browser"}
145+
});
146+
} catch (err) {
147+
node_error(err);
148+
node.status({
149+
fill: "yellow",
150+
shape: "ring",
151+
text: "browse error",
152+
source: { id: node.id, type: node.type, name: "OPC UA Browser" }
153+
});
138154
}
139-
node.status({
140-
fill: "green",
141-
shape: "dot",
142-
text: "Items: " + node.items.length,
143-
source: { id: node.id, type: node.type, name: "OPC UA Browser"}
144-
});
145155

146156
//step 5 close session
147157
node.debug("close browse session");

0 commit comments

Comments
 (0)