Skip to content

Commit e782820

Browse files
committed
opc ua write to modbus
1 parent 4fd1b18 commit e782820

File tree

2 files changed

+48
-33
lines changed

2 files changed

+48
-33
lines changed

modbushandler.js

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,35 +43,42 @@ var modbushandler = {
4343
ReadValue: function (name) {
4444
//console.log("read ", this.ValueMap);
4545
var val = this.ValueMap[name];
46+
let statusCode;
4647
if (!val) {
47-
return opcua.StatusCodes.BadDataUnavailable;
48+
statusCode = opcua.StatusCodes.BadDataUnavailable;
4849
}
49-
if (val.q != "good") {
50-
return opcua.StatusCodes.BadConnectionRejected;//Bad;
50+
if (val?.q != "good") {
51+
switch (val?.q) {
52+
case "BadNotConnected":
53+
statusCode = opcua.StatusCodes.BadNotConnected;
54+
break;
55+
case "BadCommunicationError":
56+
default:
57+
statusCode = opcua.StatusCodes.BadCommunicationError;
58+
break;
59+
60+
}
5161
}
52-
return val.v;
62+
return new opcua.DataValue({ "value": val?.v, "statusCode": statusCode, "sourceTimestamp": new Date() });
5363
},
54-
WriteValue: function (type, address, variant) {
55-
switch (type) {
56-
case "holdingregister":
57-
var value = parseInt(variant.value);
58-
this.modbusclient.writeSingleRegister(address, value).then(function (resp) {
59-
60-
// resp will look like { fc: 6, byteCount: 4, registerAddress: 13, registerValue: 42 }
61-
console.log("Writing to holding register address: " + resp.registerAddress + " value: ", resp.registerValue);
62-
63-
}).fail(console.log);
64-
break;
65-
case "coils":
66-
var value = ((variant.value) === 'true');
67-
this.modbusclient.writeSingleCoil(address, value).then(function (resp) {
68-
69-
// resp will look like { fc: 5, byteCount: 4, outputAddress: 5, outputValue: true }
70-
console.log("Writing to coil address: " + resp.outputAddress + " value: " + resp.outputValue);
71-
72-
}).fail(console.log);
73-
break;
64+
WriteValue: async function (type, address, variant) {
65+
try {
66+
switch (type) {
67+
case "holdingregister": {
68+
var value = parseInt(variant.value);
69+
let resp = await this.modbusclient.writeSingleRegister(address, value);
70+
return true;
71+
}
72+
case "coils": {
73+
var value = ((variant.value) === 'true');
74+
let resp = await this.modbusclient.writeSingleCoil(address, value);
75+
return true;
76+
}
77+
}
78+
} catch (er) {
79+
console.error('unable to write %s', address, er);
7480
}
81+
return false;
7582
},
7683
CreateModbusDevice: function (host, port, unit) {
7784
this.socket = new net.Socket();
@@ -88,17 +95,17 @@ var modbushandler = {
8895
let recon = new Reconnect(this.socket, options);
8996
this.socket.connect(options);
9097

91-
console.log("Created a Modbus device on %s:%d %s",host,port,unit);
98+
console.log("Created a Modbus device on %s:%d %s", host, port, unit);
9299
this.modbusclient = mclient;
93100
let connectionState = false;
94101
this.socket.on('error', () => {
95102
if (connectionState)
96-
console.warn("Lost connection to Modbus device on %s:%d %s",host,port,unit);
103+
console.warn("Lost connection to Modbus device on %s:%d %s", host, port, unit);
97104
connectionState = false;
98105
});
99106
this.socket.on('connect', () => {
100107
if (!connectionState) {
101-
console.info("Connection established to Modbus device on %s:%d %s",host,port,unit);
108+
console.info("Connection established to Modbus device on %s:%d %s", host, port, unit);
102109
}
103110
connectionState = true;
104111
});

server.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function create_modbus_variables(server, modbushandler, rootname, register, type
7474
modbushandler.StartPoll(rootname, type, StartAddress, count, device.pollrate);
7575
const addressSpace = server.engine.addressSpace;
7676
const namespace = addressSpace.getOwnNamespace();
77-
77+
7878
for (var i = 0; i < count; i++) {
7979
//console.log("creating variable: " + (address + count).toString());
8080
var node = function (register, type, address, i) {
@@ -84,12 +84,20 @@ function create_modbus_variables(server, modbushandler, rootname, register, type
8484
minimumSamplingInterval: device.pollrate,
8585
dataType: modbushandler.GetDataTypeString(type),
8686
value: {
87-
get: function () {
87+
timestamped_get: function () {
8888
return modbushandler.ReadValue(rootname + (StartAddress + i).toString());
8989
},
90-
set: function (variant) {
91-
modbushandler.WriteValue(type, StartAddress + i, variant);
92-
return opcua.StatusCodes.Good;
90+
timestamped_set: function (dataValue, callback) {
91+
(async function () {
92+
try {
93+
if (await modbushandler.WriteValue(type, StartAddress + i, dataValue.value) == true)
94+
callback(null, opcua.StatusCodes.Good);
95+
else
96+
callback(null, opcua.StatusCodes.Bad);
97+
} catch (err) {
98+
callback(err, null);
99+
}
100+
})();
93101
}
94102
}
95103
}
@@ -130,7 +138,7 @@ function create_modbus_variables(server, modbushandler, rootname, register, type
130138
registerDeviceToUAServer(server, devicesnode, namespace, {
131139
"modbushost": options.modbusHost,
132140
"modbusport": options.modbusPort,
133-
"pollrate" : options.modbusPollrate,
141+
"pollrate": options.modbusPollrate,
134142
"unit": options.modbusUnitId,
135143
"onebased": !!options.modbusNotOnebased,
136144
"deviceaddressspace": [

0 commit comments

Comments
 (0)