jsmodbus
Advanced tools
Comparing version 1.0.6 to 1.1.0
var modbus = require('../..'), | ||
client = modbus.client.tcp.complete({ 'host' : process.argv[2], 'port' : process.argv[3]}); | ||
client = modbus.client.tcp.complete({ | ||
'host' : process.argv[2], | ||
'port' : process.argv[3], | ||
'unitId' : 1, | ||
'logEnabled' : true, | ||
'logLevel' : 'debug' | ||
}); | ||
@@ -4,0 +10,0 @@ client.on('connect', function () { |
@@ -5,4 +5,10 @@ var stampit = require('stampit'), | ||
var server = stampit() | ||
.refs({ 'logEnabled' : true, 'port' : 8888, 'responseDelay' : 100 }) | ||
.compose(modbus.server.tcp.complete) | ||
.refs({ | ||
'logEnabled' : true, | ||
'logLevel' : 'debug', | ||
'port' : 8888, | ||
'responseDelay' : 100, | ||
'coils' : new Buffer(100000), | ||
'holding' : new Buffer(100000) | ||
}).compose(modbus.server.tcp.complete) | ||
.init(function () { | ||
@@ -15,11 +21,26 @@ | ||
this.on('readCoilsRequest', function (start, quantity) { | ||
var oldValue = this.getCoils().readUInt8(start); | ||
console.log('readCoilsRequest', start, quantity); | ||
/* var oldValue = this.getCoils().readUInt8(start); | ||
oldValue = (oldValue + 1) % 255; | ||
this.getCoils().writeUInt8(oldValue, start); | ||
*/ | ||
}); | ||
this.on('readHoldingRegistersRequest', function (start, quantity) { | ||
console.log('readHoldingRegisters', start, quantity); | ||
}); | ||
this.on('writeSingleCoilRequest', function (adr, value) { | ||
console.log('writeSingleCoil', adr, value); | ||
}); | ||
this.getHolding().writeUInt16BE(1, 0); | ||
@@ -26,0 +47,0 @@ this.getHolding().writeUInt16BE(2, 2); |
@@ -1,3 +0,8 @@ | ||
var ModbusClient = require('../..'), | ||
client = ModbusClient.createTcpClient('192.168.1.2', 502); | ||
var modbus = require('../..'), | ||
client = modbus.client.tcp.complete({ | ||
'host' : process.argv[2], | ||
'port' : process.argv[3], | ||
'unitId' : 1, | ||
'logEnabled' : true, | ||
'logLevel' : 'debug' }); | ||
@@ -7,3 +12,3 @@ // override logger function | ||
client.writeSingleCoil(4, true).then(function (resp) { | ||
client.writeSingleCoil(process.argv[4], process.argv[5] === '1').then(function (resp) { | ||
@@ -30,2 +35,2 @@ console.log(resp); | ||
client.connect(); |
{ | ||
"name": "jsmodbus", | ||
"version": "1.0.6", | ||
"version": "1.1.0", | ||
"description": "Implementation for the Serial/TCP Modbus protocol.", | ||
@@ -5,0 +5,0 @@ "author": "Stefan Poeter <stefan.poeter@cloud-automation.de>", |
@@ -47,3 +47,3 @@ A simple an easy to use Modbus TCP client/server implementation. | ||
// resp will look like { fc: 1, byteCount: 20, coils: [ values 0 - 13 ] } | ||
// resp will look like { fc: 1, byteCount: 20, coils: [ values 0 - 13 ], payload: <Buffer> } | ||
console.log(resp); | ||
@@ -53,5 +53,5 @@ | ||
client.readDiscreteInput(0, 13).then(function (resp) { | ||
client.readDiscreteInputs(0, 13).then(function (resp) { | ||
// resp will look like { fc: 2, byteCount: 20, coils: [ values 0 - 13 ] } | ||
// resp will look like { fc: 2, byteCount: 20, coils: [ values 0 - 13 ], payload: <Buffer> } | ||
console.log(resp); | ||
@@ -63,3 +63,3 @@ | ||
// resp will look like { fc: 3, byteCount: 20, register: [ values 0 - 10 ] } | ||
// resp will look like { fc: 3, byteCount: 20, register: [ values 0 - 10 ], payload: <Buffer> } | ||
console.log(resp); | ||
@@ -69,5 +69,5 @@ | ||
client.readInputRegister(0, 10).then(function (resp) { | ||
client.readInputRegisters(0, 10).then(function (resp) { | ||
// resp will look like { fc: 4, byteCount: 20, register: [ values 0 - 10 ] } | ||
// resp will look like { fc: 4, byteCount: 20, register: [ values 0 - 10 ], payload: <Buffer> } | ||
console.log(resp); | ||
@@ -84,2 +84,9 @@ | ||
client.writeSingleCoil(5, new Buffer(0x01)).then(function (resp) { | ||
// resp will look like { fc: 5, byteCount: 4, outputAddress: 5, outputValue: true } | ||
console.log(resp); | ||
}).fail(console.log); | ||
client.writeSingleRegister(13, 42).then(function (resp) { | ||
@@ -92,2 +99,9 @@ | ||
client.writeSingleRegister(13, new Buffer([0x00 0x2A])).then(function (resp) { | ||
// resp will look like { fc: 6, byteCount: 4, registerAddress: 13, registerValue: 42 } | ||
console.log(resp); | ||
}).fail(console.log); | ||
client.writeMultipleCoils(3, [1, 0, 1, 0, 1, 1]).then(function (resp) { | ||
@@ -100,2 +114,9 @@ | ||
client.writeMultipleCoils(3, new Buffer([0x2B]), 6).then(function (resp) { | ||
// resp will look like { fc: 15, startAddress: 3, quantity: 6 } | ||
console.log(resp); | ||
}).fail(console.log); | ||
client.writeMultipleRegisters(4, [1, 2, 3, 4]).then(function (resp) { | ||
@@ -108,2 +129,9 @@ | ||
client.writeMultipleRegisters(4, new Buffer([0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04]).then(function (resp) { | ||
// resp will look like { fc : 16, startAddress: 4, quantity: 4 } | ||
console.log(resp); | ||
}).fail(console.log); | ||
}); | ||
@@ -110,0 +138,0 @@ |
@@ -26,2 +26,3 @@ var Stampit = require('stampit'), | ||
byteCount : byteCount, | ||
payload : pdu.slice(2), | ||
coils : [] | ||
@@ -28,0 +29,0 @@ }; |
@@ -25,2 +25,3 @@ var Stampit = require('stampit'), | ||
byteCount : byteCount, | ||
payload : pdu.slice(2), | ||
coils : [] | ||
@@ -27,0 +28,0 @@ }; |
@@ -25,2 +25,3 @@ var Stampit = require('stampit'), | ||
byteCount : byteCount, | ||
payload : pdu.slice(2), | ||
register : [ ] | ||
@@ -27,0 +28,0 @@ }; |
@@ -25,2 +25,3 @@ var Stampit = require('stampit'), | ||
byteCount : byteCount, | ||
payload : pdu.slice(2), | ||
register : [] | ||
@@ -27,0 +28,0 @@ }; |
@@ -39,33 +39,40 @@ var stampit = require('stampit'), | ||
this.writeMultipleCoils = function (startAddress, coils) { | ||
this.writeMultipleCoils = function (startAddress, coils, N) { | ||
var defer = Q.defer(); | ||
var fc = 15, | ||
pdu = Put() | ||
.word8(fc) | ||
.word16be(startAddress) | ||
if (coils.length > 1968) { | ||
if (coils instanceof Buffer) { | ||
pdu.word16be(N) | ||
.word8(coils.length) | ||
.put(coils) | ||
} else if (coils instanceof Array) { | ||
if (coils.length > 1968) { | ||
defer.reject(); | ||
return; | ||
} | ||
} | ||
var byteCount = Math.ceil(coils.length / 8), | ||
curByte = 0, | ||
cntr = 0 | ||
var fc = 15, | ||
byteCount = Math.ceil(coils.length / 8), | ||
curByte = 0, | ||
cntr = 0, | ||
pdu = Put() | ||
.word8(fc) | ||
.word16be(startAddress) | ||
.word16be(coils.length) | ||
.word8(byteCount); | ||
pdu.word16be(coils.length) | ||
.word8(byteCount); | ||
for (var i = 0; i < coils.length; i += 1) { | ||
for (var i = 0; i < coils.length; i += 1) { | ||
curByte += coils[i]?Math.pow(2, cntr):0; | ||
curByte += coils[i]?Math.pow(2, cntr):0; | ||
cntr = (cntr + 1) % 8; | ||
cntr = (cntr + 1) % 8; | ||
if (cntr === 0) { | ||
pdu.word8(curByte); | ||
} | ||
if (cntr === 0 || i === coils.length - 1 ) { | ||
pdu.word8(curByte) | ||
curByte = 0 | ||
} | ||
} | ||
} | ||
@@ -75,6 +82,4 @@ | ||
this.queueRequest(fc, pdu, defer); | ||
return defer.promise; | ||
@@ -81,0 +86,0 @@ |
@@ -42,33 +42,42 @@ var stampit = require('stampit'), | ||
var defer = Q.defer(); | ||
var fc = 16, | ||
pdu = Put() | ||
.word8(fc) | ||
.word16be(startAddress) | ||
if (register.length > 0x007b) { | ||
if(register instanceof Buffer) { | ||
if(register.length/2 > 0x007b) { | ||
defer.reject(); | ||
return; | ||
} | ||
pdu.word16be(register.length/2) | ||
.word8(register.length) | ||
.put(register) | ||
} | ||
else if(register instanceof Array) { | ||
var fc = 16, | ||
byteCount = Math.ceil(register.length * 2), | ||
curByte = 0, | ||
pdu = Put() | ||
.word8(fc) | ||
.word16be(startAddress) | ||
.word16be(register.length) | ||
.word8(byteCount); | ||
if (register.length > 0x007b) { | ||
defer.reject(); | ||
return; | ||
} | ||
for (var i = 0; i < register.length; i += 1) { | ||
var byteCount = Math.ceil(register.length * 2), | ||
curByte = 0 | ||
pdu.word16be(register[i]); | ||
pdu.word16be(register.length) | ||
.word8(byteCount) | ||
for (var i = 0; i < register.length; i += 1) { | ||
pdu.word16be(register[i]); | ||
} | ||
} else { | ||
defer.reject(); | ||
} | ||
pdu = pdu.buffer(); | ||
this.queueRequest(fc, pdu, defer); | ||
return defer.promise; | ||
}; | ||
@@ -75,0 +84,0 @@ |
@@ -41,3 +41,4 @@ var Stampit = require('stampit'), | ||
defer = Q.defer(), | ||
pdu = Put().word8be(5).word16be(address).word16be(value?0xff00:0x0000).buffer(); | ||
payload = (value instanceof Buffer) ? (value.readUInt8(0) > 0) : value, | ||
pdu = Put().word8be(5).word16be(address).word16be(payload?0xff00:0x0000).buffer(); | ||
@@ -44,0 +45,0 @@ this.queueRequest(fc, pdu, defer); |
@@ -26,3 +26,5 @@ var Stampit = require('stampit'), | ||
registerAddress : registerAddress, | ||
registerValue : registerValue | ||
registerValue : registerValue, | ||
registerValueRaw: pdu.slice(1,2), | ||
registerValueRaw: pdu.slice(3,2) | ||
}; | ||
@@ -43,3 +45,4 @@ | ||
defer = Q.defer(), | ||
pdu = Put().word8be(6).word16be(address).word16be(value).buffer(); | ||
payload = (value instanceof Buffer) ? value : Put().word16be(value).buffer(), | ||
pdu = Put().word8be(6).word16be(address).put(payload).buffer(); | ||
@@ -46,0 +49,0 @@ this.queueRequest(fc, pdu, defer); |
@@ -50,19 +50,21 @@ var stampit = require('stampit'), | ||
var val = 0, | ||
j = 0, | ||
thisByteBitCount = 0, | ||
response = Put().word8(0x01).word8(Math.floor(quantity / 8) + (quantity % 8 === 0 ? 0 : 1)); | ||
for (var i = start; i < start + quantity; i += 1) { | ||
for (var totalBitCount = start; totalBitCount < start + quantity; totalBitCount += 1) { | ||
val += mem.readUInt8(Math.floor(i / 8)) & Math.pow(2, i % 8); | ||
var buf = mem.readUInt8(Math.floor(totalBitCount / 8)) | ||
var mask = 1 << (totalBitCount % 8) | ||
if(buf & mask) { | ||
val += 1 << (thisByteBitCount % 8) | ||
} | ||
j += 1; | ||
thisByteBitCount += 1; | ||
if (j % 8 === 0 || i === (start + quantity) - 1) { | ||
if (thisByteBitCount % 8 === 0 || totalBitCount === (start + quantity) - 1) { | ||
response.word8(val); | ||
val = 0; | ||
} | ||
} | ||
@@ -69,0 +71,0 @@ |
@@ -50,19 +50,21 @@ var stampit = require('stampit'), | ||
var val = 0, | ||
j = 0, | ||
thisByteBitCount = 0, | ||
response = Put().word8(0x02).word8(Math.floor(quantity / 8) + (quantity % 8 === 0 ? 0 : 1)); | ||
for (var i = start; i < start + quantity; i += 1) { | ||
for (var totalBitCount = start; totalBitCount < start + quantity; totalBitCount += 1) { | ||
val += mem.readUInt8(Math.floor(i / 8)) & Math.pow(2, i % 8); | ||
var buf = mem.readUInt8(Math.floor(totalBitCount / 8)) | ||
var mask = 1 << (totalBitCount % 8) | ||
if(buf & mask) { | ||
val += 1 << (thisByteBitCount % 8) | ||
} | ||
j += 1; | ||
thisByteBitCount += 1; | ||
if (j % 8 === 0 || i === (start + quantity) - 1) { | ||
if (thisByteBitCount % 8 === 0 || totalBitCount === (start + quantity) - 1) { | ||
response.word8(val); | ||
val = 0; | ||
} | ||
} | ||
@@ -69,0 +71,0 @@ |
@@ -27,5 +27,6 @@ | ||
var reqFifo = [], | ||
responseHandler = { }, | ||
var responseHandler = { }, | ||
currentRequest = null; | ||
this.reqFifo = []; | ||
@@ -49,3 +50,3 @@ var init = function () { | ||
if (reqFifo.length === 0) { | ||
if (this.reqFifo.length === 0) { | ||
this.log.debug('Nothing in request pipe.'); | ||
@@ -55,3 +56,3 @@ return; | ||
currentRequest = reqFifo.shift(); | ||
currentRequest = this.reqFifo.shift(); | ||
@@ -86,4 +87,4 @@ currentRequest.timeout = setTimeout(function () { | ||
this.log.debug('Cleaning up request fifo.'); | ||
reqFifo.forEach(function () { | ||
reqFifo.pop(); | ||
this.reqFifo.forEach(function () { | ||
this.reqFifo.pop(); | ||
}); | ||
@@ -177,3 +178,3 @@ | ||
reqFifo.push(req); | ||
this.reqFifo.push(req); | ||
@@ -180,0 +181,0 @@ if (this.inState('ready')) { |
@@ -13,2 +13,3 @@ var stampit = require('stampit'), | ||
var server, socketCount = 0, fifo = []; | ||
var clients = [] | ||
@@ -31,2 +32,3 @@ var init = function () { | ||
clients.push(s) | ||
initiateSocket(s); | ||
@@ -154,3 +156,10 @@ | ||
server.close(cb); | ||
for(var c in clients) { | ||
clients[c].destroy() | ||
} | ||
server.close(function() { | ||
server.unref() | ||
if(cb) { cb() } | ||
}); | ||
@@ -157,0 +166,0 @@ }; |
@@ -12,3 +12,5 @@ | ||
var ModbusClientCore = require('../src/modbus-client-core.js'); | ||
var ModbusClientCore = require('../src/modbus-client-core.js'), | ||
ModbusClientInspector = require('./modbus-client-inspector.js'), | ||
ModbusClientBase = stampit().compose(ModbusClientCore, ModbusClientInspector) | ||
@@ -18,3 +20,3 @@ describe('Read Coils Tests.', function () { | ||
var ReadCoils = require('../src/handler/client/ReadCoils.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, ReadCoils); | ||
ModbusClient = stampit().compose(ModbusClientBase, ReadCoils); | ||
@@ -27,12 +29,10 @@ it("should read coils just fine.", function (done) { | ||
assert(resp.fc, 1); | ||
assert(resp.byteCount, 2); | ||
assert(resp.coils, [true, false, true, false, true, false, true, false, true]); | ||
assert.equal(resp.fc, 1); | ||
assert.equal(resp.byteCount, 2); | ||
assert.equal(resp.coils.length, 16); | ||
assert.deepEqual(resp.payload, new Buffer([85, 1])) | ||
assert.deepEqual(resp.coils, [true, false, true, false, true, false, true, false, true, false, false, false, false, false, false, false]); | ||
done(); | ||
}).fail(function () { | ||
assert.ok(false); | ||
}).done(); | ||
@@ -54,6 +54,2 @@ | ||
}).then(function () { | ||
assert.ok(false); | ||
}).done(); | ||
@@ -71,3 +67,3 @@ | ||
var ReadDiscreteInputs = require('../src/handler/client/ReadDiscreteInputs.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, ReadDiscreteInputs); | ||
ModbusClient = stampit().compose(ModbusClientBase, ReadDiscreteInputs); | ||
@@ -80,12 +76,10 @@ it('should read discrete inputs just fine.', function (done) { | ||
assert(resp.fc, 2); | ||
assert(resp.byteCount, 10); | ||
assert(resp.coils, [true, true, true, true, false, false, false, false]); | ||
assert.equal(resp.fc, 2); | ||
assert.equal(resp.byteCount, 1); | ||
assert.equal(resp.coils.length, 8); | ||
assert.deepEqual(resp.payload, new Buffer([15])); | ||
assert.deepEqual(resp.coils, [true, true, true, true, false, false, false, false]); | ||
done(); | ||
}).fail(function () { | ||
assert.ok(false); | ||
}).done(); | ||
@@ -123,3 +117,3 @@ | ||
var ReadHoldingRegisters = require('../src/handler/client/ReadHoldingRegisters.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, ReadHoldingRegisters); | ||
ModbusClient = stampit().compose(ModbusClientBase, ReadHoldingRegisters); | ||
@@ -132,12 +126,9 @@ it('should read holding register just fine.', function (done) { | ||
assert(resp.fc, 3); | ||
assert(resp.byteCount, 10); | ||
assert(resp.register, [1, 2, 3, 4, 5]); | ||
assert.equal(resp.fc, 3); | ||
assert.equal(resp.byteCount, 10); | ||
assert.deepEqual(resp.payload, new Buffer([0,1,0,2,0,3,0,4,0,5])); | ||
assert.deepEqual(resp.register, [1, 2, 3, 4, 5]); | ||
done(); | ||
}).fail(function () { | ||
assert.ok(false); | ||
}).done(); | ||
@@ -186,3 +177,3 @@ | ||
var ReadInputRegisters = require('../src/handler/client/ReadInputRegisters.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, ReadInputRegisters); | ||
ModbusClient = stampit().compose(ModbusClientBase, ReadInputRegisters); | ||
@@ -195,12 +186,9 @@ it('should read input registers just fine.', function (done) { | ||
assert(resp.fc, 4); | ||
assert(resp.byteCount, 10); | ||
assert(resp.register, [5, 4, 3, 2, 1]); | ||
assert.equal(resp.fc, 4); | ||
assert.equal(resp.byteCount, 10); | ||
assert.deepEqual(resp.payload, new Buffer([0,5,0,4,0,3,0,2,0,1])) | ||
assert.deepEqual(resp.register, [5, 4, 3, 2, 1]); | ||
done(); | ||
}).fail(function () { | ||
done(true); | ||
}).done(); | ||
@@ -249,3 +237,3 @@ | ||
var WriteSingleCoil = require('../src/handler/client/WriteSingleCoil.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, WriteSingleCoil); | ||
ModbusClient = stampit().compose(ModbusClientBase, WriteSingleCoil); | ||
@@ -258,14 +246,47 @@ it('should write a single coil just fine.', function (done) { | ||
assert(resp.fc, 5); | ||
assert(resp.outputAddress, 3); | ||
assert(resp.outputValue, true); | ||
assert.equal(resp.fc, 5); | ||
assert.equal(resp.outputAddress, 3); | ||
assert.equal(resp.outputValue, true); | ||
done(); | ||
}).fail(function () { | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 5) | ||
assert.equal(pdu.readUInt16BE(1), 3) | ||
assert.equal(pdu.readUInt16BE(3), 0xff00) | ||
client.setState('ready'); | ||
client.emit( | ||
'data', | ||
Put() | ||
.word8be(5) | ||
.word16be(3) | ||
.word16be(0xFF00) | ||
.buffer() | ||
); | ||
}); | ||
it('should write a single coil with Buffer param true just fine.', function (done) { | ||
var client = ModbusClient(true); | ||
client.writeSingleCoil(3, new Buffer([1])).then(function (resp) { | ||
assert.equal(resp.fc, 5); | ||
assert.equal(resp.outputAddress, 3); | ||
assert.equal(resp.outputValue, true); | ||
done(); | ||
assert.ok(false); | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 5) | ||
assert.equal(pdu.readUInt16BE(1), 3) | ||
assert.equal(pdu.readUInt16BE(3), 0xff00) | ||
client.setState('ready'); | ||
@@ -280,3 +301,33 @@ client.emit( | ||
); | ||
}); | ||
it('should write a single coil with Buffer param false just fine.', function (done) { | ||
var client = ModbusClient(true); | ||
client.writeSingleCoil(3, new Buffer([0])).then(function (resp) { | ||
assert.equal(resp.fc, 5); | ||
assert.equal(resp.outputAddress, 3); | ||
assert.equal(resp.outputValue, false); | ||
done(); | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 5) | ||
assert.equal(pdu.readUInt16BE(1), 3) | ||
assert.equal(pdu.readUInt16BE(3), 0x0000) | ||
client.setState('ready'); | ||
client.emit( | ||
'data', | ||
Put() | ||
.word8be(5) | ||
.word16be(3) | ||
.word16be(0x0000) | ||
.buffer() | ||
); | ||
}); | ||
@@ -309,3 +360,3 @@ | ||
var WriteSingleRegister = require('../src/handler/client/WriteSingleRegister.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, WriteSingleRegister); | ||
ModbusClient = stampit().compose(ModbusClientBase, WriteSingleRegister); | ||
@@ -318,14 +369,16 @@ it('should write a single register just fine.', function (done) { | ||
assert(resp.fc, 6); | ||
assert(resp.registerAddress, 3); | ||
assert(resp.registerValue, 123); | ||
assert.equal(resp.fc, 6); | ||
assert.equal(resp.registerAddress, 3); | ||
assert.equal(resp.registerValue, 123); | ||
done(); | ||
}).fail(function () { | ||
done(true); | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 6) | ||
assert.equal(pdu.readUInt16BE(1), 3) | ||
assert.equal(pdu.readUInt16BE(3), 0x007b) | ||
client.setState('ready'); | ||
@@ -343,2 +396,33 @@ client.emit( | ||
it('should write a single register with buffer payload just fine.', function (done) { | ||
var client = ModbusClient(true); | ||
client.writeSingleRegister(3, new Buffer([0x00, 0x7b])).then(function (resp) { | ||
assert.equal(resp.fc, 6); | ||
assert.equal(resp.registerAddress, 3); | ||
assert.equal(resp.registerValue, 123); | ||
done(); | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 6) | ||
assert.equal(pdu.readUInt16BE(1), 3) | ||
assert.equal(pdu.readUInt16BE(3), 0x007b) | ||
client.setState('ready'); | ||
client.emit( | ||
'data', | ||
Put() | ||
.word8be(6) | ||
.word16be(3) | ||
.word16be(123) | ||
.buffer() | ||
); | ||
}); | ||
it('should fail writing single register.', function (done) { | ||
@@ -369,3 +453,3 @@ | ||
var WriteMultipleCoils = require('../src/handler/client/WriteMultipleCoils.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, WriteMultipleCoils); | ||
ModbusClient = stampit().compose(ModbusClientBase, WriteMultipleCoils); | ||
@@ -376,16 +460,23 @@ it('should write multiple coils just fine.', function (done) { | ||
client.writeMultipleCoils(3, [true, false, true, false]).then(function (resp) { | ||
client.writeMultipleCoils(20, [true, false, true, true, false, false, true, true, true, false]) | ||
.then(function (resp) { | ||
assert(resp.fc, 6); | ||
assert(resp.startAddress, 3); | ||
assert(resp.quantity, 4); | ||
assert.equal(resp.fc, 15); | ||
assert.equal(resp.startAddress, 20); | ||
assert.equal(resp.quantity, 10); | ||
done(); | ||
}).fail(function () { | ||
done(true); | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 15) // fc | ||
assert.equal(pdu.length, 8) | ||
assert.equal(pdu.readUInt16BE(1), 20) // startAddress | ||
assert.equal(pdu.readUInt16BE(3), 10) // coilCount | ||
assert.equal(pdu.readUInt8(5), 2) // byteCount | ||
assert.equal(pdu.readUInt8(6), 0xCD) // registerValue | ||
assert.equal(pdu.readUInt8(7), 0x01) // registerValue | ||
client.setState('ready'); | ||
@@ -396,7 +487,49 @@ client.emit( | ||
.word8be(15) | ||
.word16be(3) | ||
.word16be(4) | ||
.word16be(20) | ||
.word16be(10) | ||
.word8be(2) | ||
.word8be(0xCD) | ||
.word8be(0x01) | ||
.buffer() | ||
); | ||
}); | ||
it('should write multiple coils with buffer payload just fine.', function (done) { | ||
var client = ModbusClient(true); | ||
client.writeMultipleCoils(20, new Buffer([0xCD, 0x01]), 10) | ||
.then(function (resp) { | ||
assert.equal(resp.fc, 15); | ||
assert.equal(resp.startAddress, 20); | ||
assert.equal(resp.quantity, 10); | ||
done(); | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 15) // fc | ||
assert.equal(pdu.length, 8) | ||
assert.equal(pdu.readUInt16BE(1), 20) // startAddress | ||
assert.equal(pdu.readUInt16BE(3), 10) // coilCount | ||
assert.equal(pdu.readUInt8(5), 2) // byteCount | ||
assert.equal(pdu.readUInt8(6), 0xCD) // registerValue | ||
assert.equal(pdu.readUInt8(7), 0x01) // registerValue | ||
client.setState('ready'); | ||
client.emit( | ||
'data', | ||
Put() | ||
.word8be(15) | ||
.word16be(20) | ||
.word16be(10) | ||
.word8be(2) | ||
.word8be(0xCD) | ||
.word8be(0x01) | ||
.buffer() | ||
); | ||
}); | ||
@@ -429,3 +562,3 @@ | ||
var WriteMultipleRegisters = require('../src/handler/client/WriteMultipleRegisters.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, WriteMultipleRegisters); | ||
ModbusClient = stampit().compose(ModbusClientBase, WriteMultipleRegisters); | ||
@@ -436,29 +569,50 @@ it('should write multiple registers just fine.', function (done) { | ||
client.writeMultipleRegisters(3, [1, 2, 3]).then(function (resp) { | ||
assert(resp.fc, 16); | ||
assert(resp.startAddress, 3); | ||
assert(resp.quantity, 3); | ||
client.writeMultipleRegisters(3, [1, 2, 350]).then(function (resp) { | ||
assert.equal(resp.fc, 16); | ||
assert.equal(resp.startAddress, 3); | ||
assert.equal(resp.quantity, 3); | ||
done(); | ||
done(); | ||
}).fail(function () { | ||
done(true); | ||
}).done(); | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 16) // fc | ||
assert.equal(pdu.length, 12) | ||
assert.equal(pdu.readUInt16BE(1), 3) // startAddress | ||
assert.equal(pdu.readUInt16BE(3), 3) // registerCount | ||
assert.equal(pdu.readUInt8(5), 6) // byteCount | ||
assert.equal(pdu.readUInt16BE(6), 1) // registerValue | ||
assert.equal(pdu.readUInt16BE(8), 2) // registerValue | ||
assert.equal(pdu.readUInt16BE(10), 350) // registerValue | ||
client.setState('ready'); | ||
client.emit( | ||
'data', | ||
Put() | ||
.word8be(0x10) | ||
.word16be(0x0003) | ||
.word16be(0x0004) | ||
.word16be(0x0001) | ||
.word16be(0x0002) | ||
.word16be(0x0003) | ||
.buffer() | ||
'data', | ||
Put() | ||
.word8be(16) | ||
.word16be(3) | ||
.word16be(3) | ||
.word16be(1) | ||
.word16be(2) | ||
.word16be(350) | ||
.buffer() | ||
); | ||
}); | ||
it('should write multiple registers with buffer payload just fine.', function () { | ||
var client = ModbusClient(true); | ||
client.writeMultipleRegisters(3, new Buffer([0x00, 0xc4])) | ||
var pdu = client.queueSpy().pdu | ||
assert.equal(pdu.readUInt8(0), 16) // fc | ||
assert.equal(pdu.length, 8) | ||
assert.equal(pdu.readUInt16BE(1), 3) // startAddress | ||
assert.equal(pdu.readUInt16BE(3), 1) // registerCount | ||
assert.equal(pdu.readUInt8(5), 2) // byteCount | ||
assert.equal(pdu.readUInt16BE(6), 196) // registerValue | ||
}); | ||
@@ -491,3 +645,3 @@ | ||
var ReadHoldingRegisters = require('../src/handler/client/ReadHoldingRegisters.js'), | ||
ModbusClient = stampit().compose(ModbusClientCore, ReadHoldingRegisters); | ||
ModbusClient = stampit().compose(ModbusClientBase, ReadHoldingRegisters); | ||
@@ -522,3 +676,3 @@ it('should timeout a read holding registers request.', function (done) { | ||
assert(err.err, 'timeout'); | ||
assert.equal(err.err, 'timeout'); | ||
@@ -525,0 +679,0 @@ }).done(); |
@@ -44,3 +44,3 @@ var stampit = require('stampit'), | ||
exResponse = Put().word8(0x01).word8(1).word8(0x15).buffer(); | ||
core.getCoils().writeUInt8(0x15, 0); | ||
@@ -60,2 +60,22 @@ | ||
it('should handle a read coils request with odd start address just fine.', function (done) { | ||
var core = Core(), | ||
request = Put().word8(0x01).word16be(2).word16be(5).buffer(), | ||
exResponse = Put().word8(0x01).word8(1).word8(0x05).buffer(); | ||
core.getCoils().writeUInt8(0x15, 0); | ||
var resp = function (response) { | ||
assert.equal(response.compare(exResponse), 0); | ||
done(); | ||
}; | ||
core.onData(request, resp); | ||
}); | ||
it('should handle a read coils request with a start address outside the address space.', function (done) { | ||
@@ -124,2 +144,22 @@ | ||
it('should handle a read discrete inputs request with odd start address just fine.', function (done) { | ||
var core = Core(), | ||
request = Put().word8(0x02).word16be(2).word16be(5).buffer(), | ||
exResponse = Put().word8(0x02).word8(1).word8(0x05).buffer(); | ||
core.getInput().writeUInt8(0x15, 0); | ||
var resp = function (response) { | ||
assert.equal(response.compare(exResponse), 0); | ||
done(); | ||
}; | ||
core.onData(request, resp); | ||
}); | ||
it('should handle a read discrete inputs request with a start address outside the address space.', function (done) { | ||
@@ -126,0 +166,0 @@ |
111413
49
2411
207