Update common.js

This commit is contained in:
2018-09-15 10:19:33 +08:00
parent 42c2456c2a
commit 9b4e767ad5
+344 -334
View File
@@ -1,335 +1,345 @@
'use strict'; 'use strict';
var ieee754 = require('ieee754')
function extractValue(type, len, buffer, offset) {
let i1; function extractValue(type, len, buffer, offset) {
let i2; let i1;
let buf; let i2;
let buf;
switch (type) {
case 'uint8be': switch (type) {
return buffer.readUInt8(offset * 2 + 1);
case 'uint8le': case 'ieee754':
return buffer.readUInt8(offset * 2); adapter.log.error("modbus offset = " + offset);
case 'int8be': return ieee754.read(buffer, offset * 2, false, 23, 4)
return buffer.readInt8(offset * 2 + 1);
case 'int8le': case 'uint8be':
return buffer.readInt8(offset * 2); return buffer.readUInt8(offset * 2 + 1);
case 'uint16be': case 'uint8le':
return buffer.readUInt16BE(offset * 2); return buffer.readUInt8(offset * 2);
case 'uint16le': case 'int8be':
return buffer.readUInt16LE(offset * 2); return buffer.readInt8(offset * 2 + 1);
case 'int16be': case 'int8le':
return buffer.readInt16BE(offset * 2); return buffer.readInt8(offset * 2);
case 'int16le': case 'uint16be':
return buffer.readInt16LE(offset * 2); return buffer.readUInt16BE(offset * 2);
case 'uint32be': case 'uint16le':
return buffer.readUInt32BE(offset * 2); return buffer.readUInt16LE(offset * 2);
case 'uint32le': case 'int16be':
return buffer.readUInt32LE(offset * 2); return buffer.readInt16BE(offset * 2);
case 'uint32sw': case 'int16le':
buf = new Buffer(4); return buffer.readInt16LE(offset * 2);
buf[0] = buffer[offset * 2 + 2]; case 'uint32be':
buf[1] = buffer[offset * 2 + 3]; return buffer.readUInt32BE(offset * 2);
buf[2] = buffer[offset * 2 + 0]; case 'uint32le':
buf[3] = buffer[offset * 2 + 1]; return buffer.readUInt32LE(offset * 2);
return buf.readUInt32BE(0); case 'uint32sw':
case 'uint32sb': buf = new Buffer(4);
buf = new Buffer(4); buf[0] = buffer[offset * 2 + 2];
buf[0] = buffer[offset * 2 + 1]; buf[1] = buffer[offset * 2 + 3];
buf[1] = buffer[offset * 2 + 0]; buf[2] = buffer[offset * 2 + 0];
buf[2] = buffer[offset * 2 + 3]; buf[3] = buffer[offset * 2 + 1];
buf[3] = buffer[offset * 2 + 2]; return buf.readUInt32BE(0);
return buf.readUInt32BE(0); case 'uint32sb':
case 'int32be': buf = new Buffer(4);
return buffer.readInt32BE(offset * 2); buf[0] = buffer[offset * 2 + 1];
case 'int32le': buf[1] = buffer[offset * 2 + 0];
return buffer.readInt32LE(offset * 2); buf[2] = buffer[offset * 2 + 3];
case 'int32sw': buf[3] = buffer[offset * 2 + 2];
buf = new Buffer(4); return buf.readUInt32BE(0);
buf[0] = buffer[offset * 2 + 2]; case 'int32be':
buf[1] = buffer[offset * 2 + 3]; return buffer.readInt32BE(offset * 2);
buf[2] = buffer[offset * 2 + 0]; case 'int32le':
buf[3] = buffer[offset * 2 + 1]; return buffer.readInt32LE(offset * 2);
return buf.readInt32BE(0); case 'int32sw':
case 'int32sb': buf = new Buffer(4);
buf = new Buffer(4); buf[0] = buffer[offset * 2 + 2];
buf[0] = buffer[offset * 2 + 1]; buf[1] = buffer[offset * 2 + 3];
buf[1] = buffer[offset * 2 + 0]; buf[2] = buffer[offset * 2 + 0];
buf[2] = buffer[offset * 2 + 3]; buf[3] = buffer[offset * 2 + 1];
buf[3] = buffer[offset * 2 + 2]; return buf.readInt32BE(0);
return buf.readInt32BE(0); case 'int32sb':
case 'uint64be': buf = new Buffer(4);
return buffer.readUInt32BE(offset * 2) * 0x100000000 + buffer.readUInt32BE(offset * 2 + 4); buf[0] = buffer[offset * 2 + 1];
case 'uint64le': buf[1] = buffer[offset * 2 + 0];
return buffer.readUInt32LE(offset * 2) + buffer.readUInt32LE(offset * 2 + 4) * 0x100000000; buf[2] = buffer[offset * 2 + 3];
case 'int64be': buf[3] = buffer[offset * 2 + 2];
i1 = buffer.readInt32BE(offset * 2); return buf.readInt32BE(0);
i2 = buffer.readUInt32BE(offset * 2 + 4); case 'uint64be':
if (i1 >= 0) { return buffer.readUInt32BE(offset * 2) * 0x100000000 + buffer.readUInt32BE(offset * 2 + 4);
return i1 * 0x100000000 + i2; // <<32 does not work case 'uint64le':
} else { return buffer.readUInt32LE(offset * 2) + buffer.readUInt32LE(offset * 2 + 4) * 0x100000000;
return i1 * 0x100000000 - i2; // I have no solution for that ! case 'int64be':
} i1 = buffer.readInt32BE(offset * 2);
break; i2 = buffer.readUInt32BE(offset * 2 + 4);
case 'int64le': if (i1 >= 0) {
i2 = buffer.readUInt32LE(offset * 2); return i1 * 0x100000000 + i2; // <<32 does not work
i1 = buffer.readInt32LE(offset * 2 + 4); } else {
if (i1 >= 0) { return i1 * 0x100000000 - i2; // I have no solution for that !
return i1 * 0x100000000 + i2; // <<32 does not work }
} else { break;
return i1 * 0x100000000 - i2; // I have no solution for that ! case 'int64le':
} i2 = buffer.readUInt32LE(offset * 2);
break; i1 = buffer.readInt32LE(offset * 2 + 4);
case 'floatbe': if (i1 >= 0) {
return buffer.readFloatBE(offset * 2); return i1 * 0x100000000 + i2; // <<32 does not work
case 'floatle': } else {
return buffer.readFloatLE(offset * 2); return i1 * 0x100000000 - i2; // I have no solution for that !
case 'floatsw': }
buf = new Buffer(4); break;
buf[0] = buffer[offset * 2 + 2]; case 'floatbe':
buf[1] = buffer[offset * 2 + 3]; return buffer.readFloatBE(offset * 2);
buf[2] = buffer[offset * 2 + 0]; case 'floatle':
buf[3] = buffer[offset * 2 + 1]; return buffer.readFloatLE(offset * 2);
return buf.readFloatBE(0); case 'floatsw':
case 'floatsb': buf = new Buffer(4);
buf = new Buffer(4); buf[0] = buffer[offset * 2 + 2];
buf[0] = buffer[offset * 2 + 1]; buf[1] = buffer[offset * 2 + 3];
buf[1] = buffer[offset * 2 + 0]; buf[2] = buffer[offset * 2 + 0];
buf[2] = buffer[offset * 2 + 3]; buf[3] = buffer[offset * 2 + 1];
buf[3] = buffer[offset * 2 + 2]; return buf.readFloatBE(0);
return buf.readFloatBE(0); case 'floatsb':
case 'doublebe': buf = new Buffer(4);
return buffer.readDoubleBE(offset * 2); buf[0] = buffer[offset * 2 + 1];
case 'doublele': buf[1] = buffer[offset * 2 + 0];
return buffer.readDoubleLE(offset * 2); buf[2] = buffer[offset * 2 + 3];
case 'string': buf[3] = buffer[offset * 2 + 2];
// find length return buf.readFloatBE(0);
let _len = 0; case 'doublebe':
while (buffer[offset * 2 + _len] && _len < len * 2) { return buffer.readDoubleBE(offset * 2);
_len++; case 'doublele':
} return buffer.readDoubleLE(offset * 2);
case 'string':
return buffer.toString('ascii', offset * 2, offset * 2 + _len); // find length
case 'stringle': let _len = 0;
// find length while (buffer[offset * 2 + _len] && _len < len * 2) {
let __len = 0; _len++;
let str = ''; }
while (__len < len * 2) {
if (buffer[offset * 2 + __len + 1]) { return buffer.toString('ascii', offset * 2, offset * 2 + _len);
str += String.fromCharCode(buffer[offset * 2 + __len + 1]); case 'stringle':
// find length
if (str += String.fromCharCode(buffer[offset * 2 + __len])) { let __len = 0;
str += String.fromCharCode(buffer[offset * 2 + __len]); let str = '';
} else { while (__len < len * 2) {
break; if (buffer[offset * 2 + __len + 1]) {
} str += String.fromCharCode(buffer[offset * 2 + __len + 1]);
} else {
break; if (str += String.fromCharCode(buffer[offset * 2 + __len])) {
} str += String.fromCharCode(buffer[offset * 2 + __len]);
__len += 2; } else {
} break;
}
return str; } else {
default: break;
throw new Error('Invalid type: ' + type); }
return 0; __len += 2;
} }
}
return str;
function writeValue(type, value, len) { default:
let a0; throw new Error('Invalid type: ' + type);
let a1; return 0;
let a2; }
let buffer; }
switch (type) { function writeValue(type, value, len) {
case 'uint8be': let a0;
buffer = new Buffer(2); let a1;
buffer[0] = 0; let a2;
buffer.writeUInt8(value & 0xFF, 1); let buffer;
break;
case 'uint8le': switch (type) {
buffer = new Buffer(2); case 'ieee754':
buffer[1] = 0; buffer = new Buffer(4);
buffer.writeUInt8(value & 0xFF, 0); buffer.writeUInt32BE(value, 0);
break; break;
case 'int8be': case 'uint8be':
buffer = new Buffer(2); buffer = new Buffer(2);
buffer[0] = 0; buffer[0] = 0;
buffer.writeInt8(value & 0xFF, 1); buffer.writeUInt8(value & 0xFF, 1);
break; break;
case 'int8le': case 'uint8le':
buffer = new Buffer(2); buffer = new Buffer(2);
buffer[1] = 0; buffer[1] = 0;
buffer.writeInt8(value & 0xFF, 0); buffer.writeUInt8(value & 0xFF, 0);
break; break;
case 'uint16be': case 'int8be':
buffer = new Buffer(2); buffer = new Buffer(2);
buffer.writeUInt16BE(value, 0); buffer[0] = 0;
break; buffer.writeInt8(value & 0xFF, 1);
case 'uint16le': break;
buffer = new Buffer(2); case 'int8le':
buffer.writeUInt16LE(value, 0); buffer = new Buffer(2);
break; buffer[1] = 0;
case 'int16be': buffer.writeInt8(value & 0xFF, 0);
buffer = new Buffer(2); break;
buffer.writeInt16BE(value, 0); case 'uint16be':
break; buffer = new Buffer(2);
case 'int16le': buffer.writeUInt16BE(value, 0);
buffer = new Buffer(2); break;
buffer.writeInt16LE(value, 0); case 'uint16le':
break; buffer = new Buffer(2);
case 'uint32be': buffer.writeUInt16LE(value, 0);
buffer = new Buffer(4); break;
buffer.writeUInt32BE(value, 0); case 'int16be':
break; buffer = new Buffer(2);
case 'uint32le': buffer.writeInt16BE(value, 0);
buffer = new Buffer(4); break;
buffer.writeUInt32LE(value, 0); case 'int16le':
break; buffer = new Buffer(2);
case 'uint32sw': buffer.writeInt16LE(value, 0);
buffer = new Buffer(4); break;
buffer.writeUInt32BE(value, 0); case 'uint32be':
a0 = buffer[0]; buffer = new Buffer(4);
a1 = buffer[1]; buffer.writeUInt32BE(value, 0);
buffer[0] = buffer[2]; break;
buffer[1] = buffer[3]; case 'uint32le':
buffer[2] = a0; buffer = new Buffer(4);
buffer[3] = a1; buffer.writeUInt32LE(value, 0);
break; break;
case 'uint32sb': case 'uint32sw':
buffer = new Buffer(4); buffer = new Buffer(4);
buffer.writeUInt32BE(value, 0); buffer.writeUInt32BE(value, 0);
a0 = buffer[0]; a0 = buffer[0];
a2 = buffer[2]; a1 = buffer[1];
buffer[0] = buffer[1]; buffer[0] = buffer[2];
buffer[2] = buffer[3]; buffer[1] = buffer[3];
buffer[1] = a0; buffer[2] = a0;
buffer[3] = a2; buffer[3] = a1;
break; break;
case 'int32be': case 'uint32sb':
buffer = new Buffer(4); buffer = new Buffer(4);
buffer.writeInt32BE(value, 0); buffer.writeUInt32BE(value, 0);
break; a0 = buffer[0];
case 'int32le': a2 = buffer[2];
buffer = new Buffer(4); buffer[0] = buffer[1];
buffer.writeInt32LE(value, 0); buffer[2] = buffer[3];
break; buffer[1] = a0;
case 'int32sw': buffer[3] = a2;
buffer = new Buffer(4); break;
buffer.writeInt32BE(value, 0); case 'int32be':
a0 = buffer[0]; buffer = new Buffer(4);
a1 = buffer[1]; buffer.writeInt32BE(value, 0);
buffer[0] = buffer[2]; break;
buffer[1] = buffer[3]; case 'int32le':
buffer[2] = a0; buffer = new Buffer(4);
buffer[3] = a1; buffer.writeInt32LE(value, 0);
break; break;
case 'int32sb': case 'int32sw':
buffer = new Buffer(4); buffer = new Buffer(4);
buffer.writeInt32BE(value, 0); buffer.writeInt32BE(value, 0);
a0 = buffer[0]; a0 = buffer[0];
a2 = buffer[2]; a1 = buffer[1];
buffer[0] = buffer[1]; buffer[0] = buffer[2];
buffer[2] = buffer[3]; buffer[1] = buffer[3];
buffer[1] = a0; buffer[2] = a0;
buffer[3] = a2; buffer[3] = a1;
break; break;
case 'uint64be': case 'int32sb':
buffer = new Buffer(8); buffer = new Buffer(4);
buffer.writeUInt32BE(value >> 32, 0); buffer.writeInt32BE(value, 0);
buffer.writeUInt32BE(value & 0xFFFFFFFF, 4); a0 = buffer[0];
break; a2 = buffer[2];
case 'uint64le': buffer[0] = buffer[1];
buffer = new Buffer(8); buffer[2] = buffer[3];
buffer.writeUInt32LE(value & 0xFFFFFFFF, 0); buffer[1] = a0;
buffer.writeUInt32LE(value >> 32, 4); buffer[3] = a2;
break; break;
case 'int64be': case 'uint64be':
buffer = new Buffer(8); buffer = new Buffer(8);
buffer.writeInt32BE(value >> 32, 0); buffer.writeUInt32BE(value >> 32, 0);
buffer.writeUInt32BE(value & 0xFFFFFFFF, 4); buffer.writeUInt32BE(value & 0xFFFFFFFF, 4);
break; break;
case 'int64le': case 'uint64le':
buffer = new Buffer(8); buffer = new Buffer(8);
buffer.writeUInt32LE(value & 0xFFFFFFFF, 0); buffer.writeUInt32LE(value & 0xFFFFFFFF, 0);
buffer.writeInt32LE(value >> 32, 4); buffer.writeUInt32LE(value >> 32, 4);
break; break;
case 'floatbe': case 'int64be':
buffer = new Buffer(4); buffer = new Buffer(8);
buffer.writeFloatBE(value, 0); buffer.writeInt32BE(value >> 32, 0);
break; buffer.writeUInt32BE(value & 0xFFFFFFFF, 4);
case 'floatle': break;
buffer = new Buffer(4); case 'int64le':
buffer.writeFloatLE(value, 0); buffer = new Buffer(8);
break; buffer.writeUInt32LE(value & 0xFFFFFFFF, 0);
case 'floatsw': buffer.writeInt32LE(value >> 32, 4);
buffer = new Buffer(4); break;
buffer.writeFloatBE(value, 0); case 'floatbe':
a0 = buffer[0]; buffer = new Buffer(4);
a1 = buffer[1]; buffer.writeFloatBE(value, 0);
buffer[0] = buffer[2]; break;
buffer[1] = buffer[3]; case 'floatle':
buffer[2] = a0; buffer = new Buffer(4);
buffer[3] = a1; buffer.writeFloatLE(value, 0);
break; break;
case 'floatsb': case 'floatsw':
buffer = new Buffer(4); buffer = new Buffer(4);
buffer.writeFloatBE(value, 0); buffer.writeFloatBE(value, 0);
a0 = buffer[0]; a0 = buffer[0];
a2 = buffer[2]; a1 = buffer[1];
buffer[0] = buffer[1]; buffer[0] = buffer[2];
buffer[2] = buffer[3]; buffer[1] = buffer[3];
buffer[1] = a0; buffer[2] = a0;
buffer[3] = a2; buffer[3] = a1;
break; break;
case 'doublebe': case 'floatsb':
buffer = new Buffer(8); buffer = new Buffer(4);
buffer.writeDoubleBE(value, 0); buffer.writeFloatBE(value, 0);
break; a0 = buffer[0];
case 'doublele': a2 = buffer[2];
buffer = new Buffer(8); buffer[0] = buffer[1];
buffer.writeDoubleLE(value, 0); buffer[2] = buffer[3];
break; buffer[1] = a0;
case 'string': buffer[3] = a2;
if (value === null) value = 'null'; break;
value = value.toString(); case 'doublebe':
let _len = (value.length + 1); buffer = new Buffer(8);
if (_len % 2) _len++; buffer.writeDoubleBE(value, 0);
buffer = new Buffer(_len); break;
buffer.write(value, 0, value.length > _len ? _len : value.length, 'ascii'); case 'doublele':
break; buffer = new Buffer(8);
case 'stringle': buffer.writeDoubleLE(value, 0);
if (value === null) value = 'null'; break;
value = value.toString(); case 'string':
let __len = (value.length + 1); if (value === null) value = 'null';
if (__len % 2) __len++; value = value.toString();
buffer = new Buffer(__len); let _len = (value.length + 1);
for (let b = 0; b < (__len >> 1); b++) { if (_len % 2) _len++;
buffer.writeInt16LE((value.charCodeAt(b * 2) << 8) | value.charCodeAt(b * 2 + 1)); buffer = new Buffer(_len);
if (b * 2 + 2 >= buffer.length) { buffer.write(value, 0, value.length > _len ? _len : value.length, 'ascii');
break; break;
} case 'stringle':
} if (value === null) value = 'null';
break; value = value.toString();
default: let __len = (value.length + 1);
throw new Error('Invalid type: ' + type); if (__len % 2) __len++;
buffer = new Buffer(2); buffer = new Buffer(__len);
break; for (let b = 0; b < (__len >> 1); b++) {
} buffer.writeInt16LE((value.charCodeAt(b * 2) << 8) | value.charCodeAt(b * 2 + 1));
return buffer; if (b * 2 + 2 >= buffer.length) {
} break;
}
function getJSModbusPath() { }
let path = require.resolve('jsmodbus/package.json'); break;
let parts__ = path.replace(/\\/g, '/').split('/'); default:
parts__.pop(); throw new Error('Invalid type: ' + type);
path = parts__.join('/'); buffer = new Buffer(2);
return path; break;
} }
return buffer;
module.exports = { }
writeValue,
extractValue, function getJSModbusPath() {
getJSModbusPath let path = require.resolve('jsmodbus/package.json');
let parts__ = path.replace(/\\/g, '/').split('/');
parts__.pop();
path = parts__.join('/');
return path;
}
module.exports = {
writeValue,
extractValue,
getJSModbusPath
}; };