Skip to content

Commit

Permalink
opc ua write to modbus
Browse files Browse the repository at this point in the history
  • Loading branch information
BoBiene committed Sep 18, 2021
1 parent 4fd1b18 commit e782820
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 33 deletions.
61 changes: 34 additions & 27 deletions modbushandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,35 +43,42 @@ var modbushandler = {
ReadValue: function (name) {
//console.log("read ", this.ValueMap);
var val = this.ValueMap[name];
let statusCode;
if (!val) {
return opcua.StatusCodes.BadDataUnavailable;
statusCode = opcua.StatusCodes.BadDataUnavailable;
}
if (val.q != "good") {
return opcua.StatusCodes.BadConnectionRejected;//Bad;
if (val?.q != "good") {
switch (val?.q) {
case "BadNotConnected":
statusCode = opcua.StatusCodes.BadNotConnected;
break;
case "BadCommunicationError":
default:
statusCode = opcua.StatusCodes.BadCommunicationError;
break;

}
}
return val.v;
return new opcua.DataValue({ "value": val?.v, "statusCode": statusCode, "sourceTimestamp": new Date() });
},
WriteValue: function (type, address, variant) {
switch (type) {
case "holdingregister":
var value = parseInt(variant.value);
this.modbusclient.writeSingleRegister(address, value).then(function (resp) {

// resp will look like { fc: 6, byteCount: 4, registerAddress: 13, registerValue: 42 }
console.log("Writing to holding register address: " + resp.registerAddress + " value: ", resp.registerValue);

}).fail(console.log);
break;
case "coils":
var value = ((variant.value) === 'true');
this.modbusclient.writeSingleCoil(address, value).then(function (resp) {

// resp will look like { fc: 5, byteCount: 4, outputAddress: 5, outputValue: true }
console.log("Writing to coil address: " + resp.outputAddress + " value: " + resp.outputValue);

}).fail(console.log);
break;
WriteValue: async function (type, address, variant) {
try {
switch (type) {
case "holdingregister": {
var value = parseInt(variant.value);
let resp = await this.modbusclient.writeSingleRegister(address, value);
return true;
}
case "coils": {
var value = ((variant.value) === 'true');
let resp = await this.modbusclient.writeSingleCoil(address, value);
return true;
}
}
} catch (er) {
console.error('unable to write %s', address, er);
}
return false;
},
CreateModbusDevice: function (host, port, unit) {
this.socket = new net.Socket();
Expand All @@ -88,17 +95,17 @@ var modbushandler = {
let recon = new Reconnect(this.socket, options);
this.socket.connect(options);

console.log("Created a Modbus device on %s:%d %s",host,port,unit);
console.log("Created a Modbus device on %s:%d %s", host, port, unit);
this.modbusclient = mclient;
let connectionState = false;
this.socket.on('error', () => {
if (connectionState)
console.warn("Lost connection to Modbus device on %s:%d %s",host,port,unit);
console.warn("Lost connection to Modbus device on %s:%d %s", host, port, unit);
connectionState = false;
});
this.socket.on('connect', () => {
if (!connectionState) {
console.info("Connection established to Modbus device on %s:%d %s",host,port,unit);
console.info("Connection established to Modbus device on %s:%d %s", host, port, unit);
}
connectionState = true;
});
Expand Down
20 changes: 14 additions & 6 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ function create_modbus_variables(server, modbushandler, rootname, register, type
modbushandler.StartPoll(rootname, type, StartAddress, count, device.pollrate);
const addressSpace = server.engine.addressSpace;
const namespace = addressSpace.getOwnNamespace();

for (var i = 0; i < count; i++) {
//console.log("creating variable: " + (address + count).toString());
var node = function (register, type, address, i) {
Expand All @@ -84,12 +84,20 @@ function create_modbus_variables(server, modbushandler, rootname, register, type
minimumSamplingInterval: device.pollrate,
dataType: modbushandler.GetDataTypeString(type),
value: {
get: function () {
timestamped_get: function () {
return modbushandler.ReadValue(rootname + (StartAddress + i).toString());
},
set: function (variant) {
modbushandler.WriteValue(type, StartAddress + i, variant);
return opcua.StatusCodes.Good;
timestamped_set: function (dataValue, callback) {
(async function () {
try {
if (await modbushandler.WriteValue(type, StartAddress + i, dataValue.value) == true)
callback(null, opcua.StatusCodes.Good);
else
callback(null, opcua.StatusCodes.Bad);
} catch (err) {
callback(err, null);
}
})();
}
}
}
Expand Down Expand Up @@ -130,7 +138,7 @@ function create_modbus_variables(server, modbushandler, rootname, register, type
registerDeviceToUAServer(server, devicesnode, namespace, {
"modbushost": options.modbusHost,
"modbusport": options.modbusPort,
"pollrate" : options.modbusPollrate,
"pollrate": options.modbusPollrate,
"unit": options.modbusUnitId,
"onebased": !!options.modbusNotOnebased,
"deviceaddressspace": [
Expand Down

0 comments on commit e782820

Please sign in to comment.