njs-modbus 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/index.cjs +10 -18
- package/dist/index.d.ts +1 -2
- package/dist/index.mjs +10 -18
- package/dist/src/master/master.d.ts +0 -1
- package/dist/src/types.d.ts +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ A pure JavaScript implementation of MODBUS for NodeJS.
|
|
|
8
8
|
[](http://www.npm-stats.com/~packages/njs-modbus)
|
|
9
9
|
[](https://www.npmjs.com/package/njs-modbus)
|
|
10
10
|
[](https://bundlephobia.com/package/njs-modbus)
|
|
11
|
+
[](https://github.com/xiejay97/njs-modbus/actions)
|
|
11
12
|
<!-- prettier-ignore-end -->
|
|
12
13
|
|
|
13
14
|
</div>
|
|
@@ -188,7 +189,7 @@ If you broadcast over serial (RTU or ASCII), per Modbus over Serial Line V1.02
|
|
|
188
189
|
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
189
190
|
|
|
190
191
|
await master.writeSingleRegister(0, 0x0000, 0x1234); // broadcast
|
|
191
|
-
await sleep(100);
|
|
192
|
+
await sleep(100); // turnaround — tune per devices
|
|
192
193
|
await master.writeSingleRegister(1, 0x0000, 0x5678); // unicast to next slave
|
|
193
194
|
```
|
|
194
195
|
|
package/dist/index.cjs
CHANGED
|
@@ -1305,7 +1305,7 @@ class RtuApplicationLayer extends AbstractApplicationLayer {
|
|
|
1305
1305
|
for (const removeListener of this._removeAllListeners) {
|
|
1306
1306
|
removeListener();
|
|
1307
1307
|
}
|
|
1308
|
-
this._removeAllListeners
|
|
1308
|
+
this._removeAllListeners = [];
|
|
1309
1309
|
for (const state of this._states.values()) {
|
|
1310
1310
|
this.clearStateTimers(state);
|
|
1311
1311
|
}
|
|
@@ -1514,7 +1514,7 @@ class AsciiApplicationLayer extends AbstractApplicationLayer {
|
|
|
1514
1514
|
for (const removeListener of this._removeAllListeners) {
|
|
1515
1515
|
removeListener();
|
|
1516
1516
|
}
|
|
1517
|
-
this._removeAllListeners
|
|
1517
|
+
this._removeAllListeners = [];
|
|
1518
1518
|
this._states.clear();
|
|
1519
1519
|
}
|
|
1520
1520
|
}
|
|
@@ -1644,7 +1644,7 @@ class TcpApplicationLayer extends AbstractApplicationLayer {
|
|
|
1644
1644
|
for (const removeListener of this._removeAllListeners) {
|
|
1645
1645
|
removeListener();
|
|
1646
1646
|
}
|
|
1647
|
-
this._removeAllListeners
|
|
1647
|
+
this._removeAllListeners = [];
|
|
1648
1648
|
this._buffers.clear();
|
|
1649
1649
|
}
|
|
1650
1650
|
}
|
|
@@ -1796,12 +1796,6 @@ class ModbusMaster extends EventEmitter {
|
|
|
1796
1796
|
writable: true,
|
|
1797
1797
|
value: 1
|
|
1798
1798
|
});
|
|
1799
|
-
Object.defineProperty(this, "_closed", {
|
|
1800
|
-
enumerable: true,
|
|
1801
|
-
configurable: true,
|
|
1802
|
-
writable: true,
|
|
1803
|
-
value: false
|
|
1804
|
-
});
|
|
1805
1799
|
Object.defineProperty(this, "_cleanLevel", {
|
|
1806
1800
|
enumerable: true,
|
|
1807
1801
|
configurable: true,
|
|
@@ -1960,7 +1954,7 @@ class ModbusMaster extends EventEmitter {
|
|
|
1960
1954
|
}
|
|
1961
1955
|
_exchange(adu, preCheck, timeout, broadcast) {
|
|
1962
1956
|
return new Promise((resolve, reject) => {
|
|
1963
|
-
if (this.
|
|
1957
|
+
if (this._cleanLevel !== 'none') {
|
|
1964
1958
|
reject(new ModbusError(ModbusErrorCode.MASTER_CLOSED, 'Master closed'));
|
|
1965
1959
|
return;
|
|
1966
1960
|
}
|
|
@@ -2113,7 +2107,7 @@ class ModbusMaster extends EventEmitter {
|
|
|
2113
2107
|
if (frame) {
|
|
2114
2108
|
const runStatusIndex = 1 + serverIdLength;
|
|
2115
2109
|
return Object.assign(Object.assign({}, frame), { data: {
|
|
2116
|
-
serverId:
|
|
2110
|
+
serverId: Array.from(frame.data.subarray(1, runStatusIndex)),
|
|
2117
2111
|
runIndicatorStatus: frame.data[runStatusIndex] === 0xff,
|
|
2118
2112
|
additionalData: Array.from(frame.data.subarray(runStatusIndex + 1)),
|
|
2119
2113
|
} });
|
|
@@ -2230,7 +2224,6 @@ class ModbusMaster extends EventEmitter {
|
|
|
2230
2224
|
}
|
|
2231
2225
|
const errorCode = level === 'destroy' ? ModbusErrorCode.MASTER_DESTROYED : ModbusErrorCode.MASTER_CLOSED;
|
|
2232
2226
|
const message = level === 'destroy' ? 'Master destroyed' : 'Master closed';
|
|
2233
|
-
this._closed = true;
|
|
2234
2227
|
const queued = this._queue.splice(0);
|
|
2235
2228
|
for (const item of queued) {
|
|
2236
2229
|
item.cancel(new ModbusError(errorCode, message));
|
|
@@ -2243,7 +2236,6 @@ class ModbusMaster extends EventEmitter {
|
|
|
2243
2236
|
return Promise.reject(new ModbusError(ModbusErrorCode.PORT_DESTROYED, 'Master is destroyed'));
|
|
2244
2237
|
}
|
|
2245
2238
|
this._cleanLevel = 'none';
|
|
2246
|
-
this._closed = false;
|
|
2247
2239
|
this._nextTid = 1;
|
|
2248
2240
|
return this.physicalLayer.open(...args);
|
|
2249
2241
|
}
|
|
@@ -2352,14 +2344,14 @@ class ModbusSlave extends EventEmitter {
|
|
|
2352
2344
|
if (!q) {
|
|
2353
2345
|
return;
|
|
2354
2346
|
}
|
|
2355
|
-
q.items
|
|
2347
|
+
q.items = [];
|
|
2356
2348
|
if (!q.processing) {
|
|
2357
2349
|
this._queues.delete(connection.id);
|
|
2358
2350
|
}
|
|
2359
2351
|
});
|
|
2360
2352
|
physicalLayer.on('close', () => {
|
|
2361
2353
|
for (const q of this._queues.values()) {
|
|
2362
|
-
q.items
|
|
2354
|
+
q.items = [];
|
|
2363
2355
|
}
|
|
2364
2356
|
this._queues.clear();
|
|
2365
2357
|
this.emit('close');
|
|
@@ -2648,8 +2640,8 @@ class ModbusSlave extends EventEmitter {
|
|
|
2648
2640
|
return;
|
|
2649
2641
|
}
|
|
2650
2642
|
try {
|
|
2651
|
-
const { serverId = (_a = model.unit) !== null && _a !== void 0 ? _a : 1, runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
|
|
2652
|
-
const serverIdBytes =
|
|
2643
|
+
const { serverId = [(_a = model.unit) !== null && _a !== void 0 ? _a : 1], runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
|
|
2644
|
+
const serverIdBytes = serverId;
|
|
2653
2645
|
const byteCount = serverIdBytes.length + 1 + additionalData.length;
|
|
2654
2646
|
if (byteCount > 255) {
|
|
2655
2647
|
yield this.responseError(frame, response, getErrorByCode(exports.ErrorCode.SERVER_DEVICE_FAILURE));
|
|
@@ -3063,7 +3055,7 @@ class ModbusSlave extends EventEmitter {
|
|
|
3063
3055
|
return;
|
|
3064
3056
|
}
|
|
3065
3057
|
for (const q of this._queues.values()) {
|
|
3066
|
-
q.items
|
|
3058
|
+
q.items = [];
|
|
3067
3059
|
}
|
|
3068
3060
|
this._queues.clear();
|
|
3069
3061
|
this._locks.clear();
|
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ interface ApplicationDataUnit {
|
|
|
12
12
|
}
|
|
13
13
|
interface ServerId {
|
|
14
14
|
/** Server ID; may be 1 byte (number) or multi-byte (number[]) per device spec. */
|
|
15
|
-
serverId?: number
|
|
15
|
+
serverId?: number[];
|
|
16
16
|
runIndicatorStatus?: boolean;
|
|
17
17
|
additionalData?: number[];
|
|
18
18
|
}
|
|
@@ -421,7 +421,6 @@ declare class ModbusMaster<A extends AbstractApplicationLayer, P extends Abstrac
|
|
|
421
421
|
private _queue;
|
|
422
422
|
private _draining;
|
|
423
423
|
private _nextTid;
|
|
424
|
-
private _closed;
|
|
425
424
|
private _cleanLevel;
|
|
426
425
|
timeout: number;
|
|
427
426
|
readonly concurrent: boolean;
|
package/dist/index.mjs
CHANGED
|
@@ -1303,7 +1303,7 @@ class RtuApplicationLayer extends AbstractApplicationLayer {
|
|
|
1303
1303
|
for (const removeListener of this._removeAllListeners) {
|
|
1304
1304
|
removeListener();
|
|
1305
1305
|
}
|
|
1306
|
-
this._removeAllListeners
|
|
1306
|
+
this._removeAllListeners = [];
|
|
1307
1307
|
for (const state of this._states.values()) {
|
|
1308
1308
|
this.clearStateTimers(state);
|
|
1309
1309
|
}
|
|
@@ -1512,7 +1512,7 @@ class AsciiApplicationLayer extends AbstractApplicationLayer {
|
|
|
1512
1512
|
for (const removeListener of this._removeAllListeners) {
|
|
1513
1513
|
removeListener();
|
|
1514
1514
|
}
|
|
1515
|
-
this._removeAllListeners
|
|
1515
|
+
this._removeAllListeners = [];
|
|
1516
1516
|
this._states.clear();
|
|
1517
1517
|
}
|
|
1518
1518
|
}
|
|
@@ -1642,7 +1642,7 @@ class TcpApplicationLayer extends AbstractApplicationLayer {
|
|
|
1642
1642
|
for (const removeListener of this._removeAllListeners) {
|
|
1643
1643
|
removeListener();
|
|
1644
1644
|
}
|
|
1645
|
-
this._removeAllListeners
|
|
1645
|
+
this._removeAllListeners = [];
|
|
1646
1646
|
this._buffers.clear();
|
|
1647
1647
|
}
|
|
1648
1648
|
}
|
|
@@ -1794,12 +1794,6 @@ class ModbusMaster extends EventEmitter {
|
|
|
1794
1794
|
writable: true,
|
|
1795
1795
|
value: 1
|
|
1796
1796
|
});
|
|
1797
|
-
Object.defineProperty(this, "_closed", {
|
|
1798
|
-
enumerable: true,
|
|
1799
|
-
configurable: true,
|
|
1800
|
-
writable: true,
|
|
1801
|
-
value: false
|
|
1802
|
-
});
|
|
1803
1797
|
Object.defineProperty(this, "_cleanLevel", {
|
|
1804
1798
|
enumerable: true,
|
|
1805
1799
|
configurable: true,
|
|
@@ -1958,7 +1952,7 @@ class ModbusMaster extends EventEmitter {
|
|
|
1958
1952
|
}
|
|
1959
1953
|
_exchange(adu, preCheck, timeout, broadcast) {
|
|
1960
1954
|
return new Promise((resolve, reject) => {
|
|
1961
|
-
if (this.
|
|
1955
|
+
if (this._cleanLevel !== 'none') {
|
|
1962
1956
|
reject(new ModbusError(ModbusErrorCode.MASTER_CLOSED, 'Master closed'));
|
|
1963
1957
|
return;
|
|
1964
1958
|
}
|
|
@@ -2111,7 +2105,7 @@ class ModbusMaster extends EventEmitter {
|
|
|
2111
2105
|
if (frame) {
|
|
2112
2106
|
const runStatusIndex = 1 + serverIdLength;
|
|
2113
2107
|
return Object.assign(Object.assign({}, frame), { data: {
|
|
2114
|
-
serverId:
|
|
2108
|
+
serverId: Array.from(frame.data.subarray(1, runStatusIndex)),
|
|
2115
2109
|
runIndicatorStatus: frame.data[runStatusIndex] === 0xff,
|
|
2116
2110
|
additionalData: Array.from(frame.data.subarray(runStatusIndex + 1)),
|
|
2117
2111
|
} });
|
|
@@ -2228,7 +2222,6 @@ class ModbusMaster extends EventEmitter {
|
|
|
2228
2222
|
}
|
|
2229
2223
|
const errorCode = level === 'destroy' ? ModbusErrorCode.MASTER_DESTROYED : ModbusErrorCode.MASTER_CLOSED;
|
|
2230
2224
|
const message = level === 'destroy' ? 'Master destroyed' : 'Master closed';
|
|
2231
|
-
this._closed = true;
|
|
2232
2225
|
const queued = this._queue.splice(0);
|
|
2233
2226
|
for (const item of queued) {
|
|
2234
2227
|
item.cancel(new ModbusError(errorCode, message));
|
|
@@ -2241,7 +2234,6 @@ class ModbusMaster extends EventEmitter {
|
|
|
2241
2234
|
return Promise.reject(new ModbusError(ModbusErrorCode.PORT_DESTROYED, 'Master is destroyed'));
|
|
2242
2235
|
}
|
|
2243
2236
|
this._cleanLevel = 'none';
|
|
2244
|
-
this._closed = false;
|
|
2245
2237
|
this._nextTid = 1;
|
|
2246
2238
|
return this.physicalLayer.open(...args);
|
|
2247
2239
|
}
|
|
@@ -2350,14 +2342,14 @@ class ModbusSlave extends EventEmitter {
|
|
|
2350
2342
|
if (!q) {
|
|
2351
2343
|
return;
|
|
2352
2344
|
}
|
|
2353
|
-
q.items
|
|
2345
|
+
q.items = [];
|
|
2354
2346
|
if (!q.processing) {
|
|
2355
2347
|
this._queues.delete(connection.id);
|
|
2356
2348
|
}
|
|
2357
2349
|
});
|
|
2358
2350
|
physicalLayer.on('close', () => {
|
|
2359
2351
|
for (const q of this._queues.values()) {
|
|
2360
|
-
q.items
|
|
2352
|
+
q.items = [];
|
|
2361
2353
|
}
|
|
2362
2354
|
this._queues.clear();
|
|
2363
2355
|
this.emit('close');
|
|
@@ -2646,8 +2638,8 @@ class ModbusSlave extends EventEmitter {
|
|
|
2646
2638
|
return;
|
|
2647
2639
|
}
|
|
2648
2640
|
try {
|
|
2649
|
-
const { serverId = (_a = model.unit) !== null && _a !== void 0 ? _a : 1, runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
|
|
2650
|
-
const serverIdBytes =
|
|
2641
|
+
const { serverId = [(_a = model.unit) !== null && _a !== void 0 ? _a : 1], runIndicatorStatus = true, additionalData = [] } = yield model.reportServerId();
|
|
2642
|
+
const serverIdBytes = serverId;
|
|
2651
2643
|
const byteCount = serverIdBytes.length + 1 + additionalData.length;
|
|
2652
2644
|
if (byteCount > 255) {
|
|
2653
2645
|
yield this.responseError(frame, response, getErrorByCode(ErrorCode.SERVER_DEVICE_FAILURE));
|
|
@@ -3061,7 +3053,7 @@ class ModbusSlave extends EventEmitter {
|
|
|
3061
3053
|
return;
|
|
3062
3054
|
}
|
|
3063
3055
|
for (const q of this._queues.values()) {
|
|
3064
|
-
q.items
|
|
3056
|
+
q.items = [];
|
|
3065
3057
|
}
|
|
3066
3058
|
this._queues.clear();
|
|
3067
3059
|
this._locks.clear();
|
package/dist/src/types.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface ApplicationDataUnit {
|
|
|
8
8
|
}
|
|
9
9
|
export interface ServerId {
|
|
10
10
|
/** Server ID; may be 1 byte (number) or multi-byte (number[]) per device spec. */
|
|
11
|
-
serverId?: number
|
|
11
|
+
serverId?: number[];
|
|
12
12
|
runIndicatorStatus?: boolean;
|
|
13
13
|
additionalData?: number[];
|
|
14
14
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "njs-modbus",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "A pure JavaScript implemetation of Modbus for NodeJS.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"modbus",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
},
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "Xie Jay <xiejay97@gmail.com>",
|
|
23
|
+
"packageManager": "pnpm@10.10.0",
|
|
23
24
|
"sideEffects": false,
|
|
24
25
|
"type": "module",
|
|
25
26
|
"main": "dist/index.cjs",
|
|
@@ -32,7 +33,7 @@
|
|
|
32
33
|
],
|
|
33
34
|
"scripts": {
|
|
34
35
|
"build": "rollup -c",
|
|
35
|
-
"test": "tsx --test
|
|
36
|
+
"test": "tsx --test test/*.test.ts",
|
|
36
37
|
"util:sort-package-json": "sort-package-json"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|
|
@@ -59,6 +60,7 @@
|
|
|
59
60
|
"serialport": ">=12.0.0",
|
|
60
61
|
"sort-package-json": "^3.2.1",
|
|
61
62
|
"tslib": "^2.8.1",
|
|
63
|
+
"tsx": "^4.21.0",
|
|
62
64
|
"typescript": "~5.8.3",
|
|
63
65
|
"typescript-eslint": "^8.34.0"
|
|
64
66
|
},
|