@ya-modbus/transport 0.9.1 → 0.10.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.
Files changed (61) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +68 -0
  3. package/dist/cjs/src/connection.d.ts +90 -0
  4. package/dist/cjs/src/connection.d.ts.map +1 -0
  5. package/dist/cjs/src/connection.js +217 -0
  6. package/dist/cjs/src/connection.js.map +1 -0
  7. package/dist/cjs/src/create-modbus-transport.d.ts +4 -2
  8. package/dist/cjs/src/create-modbus-transport.d.ts.map +1 -1
  9. package/dist/cjs/src/create-modbus-transport.js +29 -28
  10. package/dist/cjs/src/create-modbus-transport.js.map +1 -1
  11. package/dist/cjs/src/index.d.ts +1 -0
  12. package/dist/cjs/src/index.d.ts.map +1 -1
  13. package/dist/cjs/src/index.js +4 -1
  14. package/dist/cjs/src/index.js.map +1 -1
  15. package/dist/cjs/src/manager.d.ts +10 -0
  16. package/dist/cjs/src/manager.d.ts.map +1 -1
  17. package/dist/cjs/src/manager.js +18 -6
  18. package/dist/cjs/src/manager.js.map +1 -1
  19. package/dist/cjs/src/rtu-transport.d.ts +4 -0
  20. package/dist/cjs/src/rtu-transport.d.ts.map +1 -1
  21. package/dist/cjs/src/rtu-transport.js +19 -10
  22. package/dist/cjs/src/rtu-transport.js.map +1 -1
  23. package/dist/cjs/src/slave-transport.d.ts +10 -5
  24. package/dist/cjs/src/slave-transport.d.ts.map +1 -1
  25. package/dist/cjs/src/slave-transport.js +42 -39
  26. package/dist/cjs/src/slave-transport.js.map +1 -1
  27. package/dist/cjs/src/tcp-transport.d.ts +3 -0
  28. package/dist/cjs/src/tcp-transport.d.ts.map +1 -1
  29. package/dist/cjs/src/tcp-transport.js +14 -5
  30. package/dist/cjs/src/tcp-transport.js.map +1 -1
  31. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  32. package/dist/esm/src/connection.d.ts +90 -0
  33. package/dist/esm/src/connection.d.ts.map +1 -0
  34. package/dist/esm/src/connection.js +211 -0
  35. package/dist/esm/src/connection.js.map +1 -0
  36. package/dist/esm/src/create-modbus-transport.d.ts +4 -2
  37. package/dist/esm/src/create-modbus-transport.d.ts.map +1 -1
  38. package/dist/esm/src/create-modbus-transport.js +29 -28
  39. package/dist/esm/src/create-modbus-transport.js.map +1 -1
  40. package/dist/esm/src/index.d.ts +1 -0
  41. package/dist/esm/src/index.d.ts.map +1 -1
  42. package/dist/esm/src/index.js +1 -0
  43. package/dist/esm/src/index.js.map +1 -1
  44. package/dist/esm/src/manager.d.ts +10 -0
  45. package/dist/esm/src/manager.d.ts.map +1 -1
  46. package/dist/esm/src/manager.js +18 -6
  47. package/dist/esm/src/manager.js.map +1 -1
  48. package/dist/esm/src/rtu-transport.d.ts +4 -0
  49. package/dist/esm/src/rtu-transport.d.ts.map +1 -1
  50. package/dist/esm/src/rtu-transport.js +19 -10
  51. package/dist/esm/src/rtu-transport.js.map +1 -1
  52. package/dist/esm/src/slave-transport.d.ts +10 -5
  53. package/dist/esm/src/slave-transport.d.ts.map +1 -1
  54. package/dist/esm/src/slave-transport.js +42 -39
  55. package/dist/esm/src/slave-transport.js.map +1 -1
  56. package/dist/esm/src/tcp-transport.d.ts +3 -0
  57. package/dist/esm/src/tcp-transport.d.ts.map +1 -1
  58. package/dist/esm/src/tcp-transport.js +14 -5
  59. package/dist/esm/src/tcp-transport.js.map +1 -1
  60. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  61. package/package.json +2 -2
@@ -1,22 +1,31 @@
1
1
  import ModbusRTU from 'modbus-serial';
2
2
  import { configureClient } from './client-config.js';
3
+ import { ModbusConnection } from './connection.js';
3
4
  import { createModbusTransport } from './create-modbus-transport.js';
4
5
  /**
5
6
  * Create an RTU transport
6
7
  *
8
+ * When the serial port is lost (for example the USB adapter is unplugged), requests
9
+ * reject with a ConnectionLostError and the port is reopened on a later request
10
+ * (see ModbusConnection).
11
+ *
7
12
  * @param config - RTU configuration
8
13
  * @returns Transport implementation for RTU
9
14
  */
10
15
  export async function createRTUTransport(config) {
11
- const client = new ModbusRTU();
12
- // Connect to serial port
13
- await client.connectRTUBuffered(config.port, {
14
- baudRate: config.baudRate,
15
- dataBits: config.dataBits,
16
- parity: config.parity,
17
- stopBits: config.stopBits,
18
- });
19
- configureClient(client, config.slaveId, config.timeout);
20
- return createModbusTransport(client, config.maxRetries, config.logger);
16
+ const open = async () => {
17
+ const client = new ModbusRTU();
18
+ // Connect to serial port
19
+ await client.connectRTUBuffered(config.port, {
20
+ baudRate: config.baudRate,
21
+ dataBits: config.dataBits,
22
+ parity: config.parity,
23
+ stopBits: config.stopBits,
24
+ });
25
+ configureClient(client, config.slaveId, config.timeout);
26
+ return client;
27
+ };
28
+ const connection = new ModbusConnection(await open(), config.port, open);
29
+ return createModbusTransport(connection, config.maxRetries, config.logger);
21
30
  }
22
31
  //# sourceMappingURL=rtu-transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rtu-transport.js","sourceRoot":"","sources":["../../../src/rtu-transport.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AA2BpE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAA;IAE9B,yBAAyB;IACzB,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAA;IAEF,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAEvD,OAAO,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AACxE,CAAC"}
1
+ {"version":3,"file":"rtu-transport.js","sourceRoot":"","sources":["../../../src/rtu-transport.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AA2BpE;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,IAAI,GAAG,KAAK,IAAwB,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAA;QAE9B,yBAAyB;QACzB,MAAM,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE;YAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAA;QAEF,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACxE,OAAO,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AAC5E,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { Transport } from '@ya-modbus/driver-types';
2
2
  import type { Mutex } from 'async-mutex';
3
3
  import type ModbusRTU from 'modbus-serial';
4
+ import { type ModbusConnection } from './connection.js';
4
5
  import { type RetryLogger } from './retry.js';
5
6
  /**
6
7
  * SlaveTransport wraps a shared ModbusRTU client with slave-specific addressing.
@@ -9,15 +10,19 @@ import { type RetryLogger } from './retry.js';
9
10
  * each communicating with a different slave device. The slave ID is set before each operation
10
11
  * to ensure requests are directed to the correct device.
11
12
  *
13
+ * Requests on a lost connection reject with a ConnectionLostError. When the shared
14
+ * ModbusConnection can reopen its client, all devices on the connection use the new client.
15
+ *
12
16
  * @example
13
17
  * ```typescript
14
18
  * const client = new ModbusRTU()
15
19
  * await client.connectRTUBuffered('/dev/ttyUSB0', { baudRate: 9600 })
20
+ * const connection = new ModbusConnection(client, '/dev/ttyUSB0')
16
21
  * const mutex = new Mutex()
17
22
  *
18
23
  * // Two devices on the same serial port
19
- * const device1 = new SlaveTransport(1, client, mutex, 3)
20
- * const device2 = new SlaveTransport(2, client, mutex, 3)
24
+ * const device1 = new SlaveTransport(1, connection, mutex, 3)
25
+ * const device2 = new SlaveTransport(2, connection, mutex, 3)
21
26
  *
22
27
  * // Each device talks to its own slave ID
23
28
  * await device1.readHoldingRegisters(0, 10) // Reads from slave 1
@@ -26,18 +31,18 @@ import { type RetryLogger } from './retry.js';
26
31
  */
27
32
  export declare class SlaveTransport implements Transport {
28
33
  private readonly slaveId;
29
- private readonly client;
30
34
  private readonly mutex;
31
35
  private readonly maxRetries;
32
36
  private readonly logger?;
37
+ private readonly connection;
33
38
  /**
34
39
  * @param slaveId - Modbus slave/unit ID for this device
35
- * @param client - Shared ModbusRTU client instance
40
+ * @param client - Shared connection, or a ModbusRTU client that is not shared with other transports
36
41
  * @param mutex - Shared mutex for serializing operations on the bus
37
42
  * @param maxRetries - Maximum retry attempts for failed operations (default: 3)
38
43
  * @param logger - Optional callback to log retry attempts
39
44
  */
40
- constructor(slaveId: number, client: ModbusRTU, mutex: Mutex, maxRetries?: number, logger?: RetryLogger | undefined);
45
+ constructor(slaveId: number, client: ModbusConnection | ModbusRTU, mutex: Mutex, maxRetries?: number, logger?: RetryLogger | undefined);
41
46
  readHoldingRegisters(address: number, count: number): Promise<Buffer>;
42
47
  readInputRegisters(address: number, count: number): Promise<Buffer>;
43
48
  readCoils(address: number, count: number): Promise<Buffer>;
@@ -1 +1 @@
1
- {"version":3,"file":"slave-transport.d.ts","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,cAAe,YAAW,SAAS;IAS5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAZ1B;;;;;;OAMG;gBAEgB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,KAAK,EACZ,UAAU,GAAE,MAAU,EACtB,MAAM,CAAC,EAAE,WAAW,YAAA;IAGjC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcrE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalE,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxE;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
1
+ {"version":3,"file":"slave-transport.d.ts","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,cAAe,YAAW,SAAS;IAW5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAd1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAE7C;;;;;;OAMG;gBAEgB,OAAO,EAAE,MAAM,EAChC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACnB,KAAK,EAAE,KAAK,EACZ,UAAU,GAAE,MAAU,EACtB,MAAM,CAAC,EAAE,WAAW,YAAA;IAKjC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAerE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe1D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAenE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclE,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IActE,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/D,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxE;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -1,3 +1,4 @@
1
+ import { toConnection } from './connection.js';
1
2
  import { withRetry } from './retry.js';
2
3
  /**
3
4
  * SlaveTransport wraps a shared ModbusRTU client with slave-specific addressing.
@@ -6,15 +7,19 @@ import { withRetry } from './retry.js';
6
7
  * each communicating with a different slave device. The slave ID is set before each operation
7
8
  * to ensure requests are directed to the correct device.
8
9
  *
10
+ * Requests on a lost connection reject with a ConnectionLostError. When the shared
11
+ * ModbusConnection can reopen its client, all devices on the connection use the new client.
12
+ *
9
13
  * @example
10
14
  * ```typescript
11
15
  * const client = new ModbusRTU()
12
16
  * await client.connectRTUBuffered('/dev/ttyUSB0', { baudRate: 9600 })
17
+ * const connection = new ModbusConnection(client, '/dev/ttyUSB0')
13
18
  * const mutex = new Mutex()
14
19
  *
15
20
  * // Two devices on the same serial port
16
- * const device1 = new SlaveTransport(1, client, mutex, 3)
17
- * const device2 = new SlaveTransport(2, client, mutex, 3)
21
+ * const device1 = new SlaveTransport(1, connection, mutex, 3)
22
+ * const device2 = new SlaveTransport(2, connection, mutex, 3)
18
23
  *
19
24
  * // Each device talks to its own slave ID
20
25
  * await device1.readHoldingRegisters(0, 10) // Reads from slave 1
@@ -24,82 +29,82 @@ import { withRetry } from './retry.js';
24
29
  export class SlaveTransport {
25
30
  /**
26
31
  * @param slaveId - Modbus slave/unit ID for this device
27
- * @param client - Shared ModbusRTU client instance
32
+ * @param client - Shared connection, or a ModbusRTU client that is not shared with other transports
28
33
  * @param mutex - Shared mutex for serializing operations on the bus
29
34
  * @param maxRetries - Maximum retry attempts for failed operations (default: 3)
30
35
  * @param logger - Optional callback to log retry attempts
31
36
  */
32
37
  constructor(slaveId, client, mutex, maxRetries = 3, logger) {
33
38
  this.slaveId = slaveId;
34
- this.client = client;
35
39
  this.mutex = mutex;
36
40
  this.maxRetries = maxRetries;
37
41
  this.logger = logger;
42
+ this.connection = toConnection(client);
38
43
  }
39
44
  async readHoldingRegisters(address, count) {
40
45
  return this.mutex.runExclusive(async () => {
41
- return withRetry(async () => {
42
- this.client.setID(this.slaveId);
43
- const result = await this.client.readHoldingRegisters(address, count);
46
+ return withRetry(() => this.connection.run(async (client) => {
47
+ client.setID(this.slaveId);
48
+ const result = await client.readHoldingRegisters(address, count);
44
49
  return result.buffer;
45
- }, this.maxRetries, this.logger);
50
+ }), this.maxRetries, this.logger);
46
51
  });
47
52
  }
48
53
  async readInputRegisters(address, count) {
49
54
  return this.mutex.runExclusive(async () => {
50
- return withRetry(async () => {
51
- this.client.setID(this.slaveId);
52
- const result = await this.client.readInputRegisters(address, count);
55
+ return withRetry(() => this.connection.run(async (client) => {
56
+ client.setID(this.slaveId);
57
+ const result = await client.readInputRegisters(address, count);
53
58
  return result.buffer;
54
- }, this.maxRetries, this.logger);
59
+ }), this.maxRetries, this.logger);
55
60
  });
56
61
  }
57
62
  async readCoils(address, count) {
58
63
  return this.mutex.runExclusive(async () => {
59
- return withRetry(async () => {
60
- this.client.setID(this.slaveId);
61
- const result = await this.client.readCoils(address, count);
64
+ return withRetry(() => this.connection.run(async (client) => {
65
+ client.setID(this.slaveId);
66
+ const result = await client.readCoils(address, count);
62
67
  return result.buffer;
63
- }, this.maxRetries, this.logger);
68
+ }), this.maxRetries, this.logger);
64
69
  });
65
70
  }
66
71
  async readDiscreteInputs(address, count) {
67
72
  return this.mutex.runExclusive(async () => {
68
- return withRetry(async () => {
69
- this.client.setID(this.slaveId);
70
- const result = await this.client.readDiscreteInputs(address, count);
73
+ return withRetry(() => this.connection.run(async (client) => {
74
+ client.setID(this.slaveId);
75
+ const result = await client.readDiscreteInputs(address, count);
71
76
  return result.buffer;
72
- }, this.maxRetries, this.logger);
77
+ }), this.maxRetries, this.logger);
73
78
  });
74
79
  }
75
80
  async writeSingleRegister(address, value) {
76
81
  return this.mutex.runExclusive(async () => {
77
- return withRetry(async () => {
78
- this.client.setID(this.slaveId);
79
- await this.client.writeRegister(address, value);
80
- }, this.maxRetries, this.logger);
82
+ return withRetry(() => this.connection.run(async (client) => {
83
+ client.setID(this.slaveId);
84
+ await client.writeRegister(address, value);
85
+ }), this.maxRetries, this.logger);
81
86
  });
82
87
  }
83
88
  async writeMultipleRegisters(address, values) {
84
89
  return this.mutex.runExclusive(async () => {
85
- return withRetry(async () => {
86
- this.client.setID(this.slaveId);
87
- await this.client.writeRegisters(address, values);
88
- }, this.maxRetries, this.logger);
90
+ return withRetry(() => this.connection.run(async (client) => {
91
+ client.setID(this.slaveId);
92
+ await client.writeRegisters(address, values);
93
+ }), this.maxRetries, this.logger);
89
94
  });
90
95
  }
91
96
  async writeSingleCoil(address, value) {
92
97
  return this.mutex.runExclusive(async () => {
93
- return withRetry(async () => {
94
- this.client.setID(this.slaveId);
95
- await this.client.writeCoil(address, value);
96
- }, this.maxRetries, this.logger);
98
+ return withRetry(() => this.connection.run(async (client) => {
99
+ client.setID(this.slaveId);
100
+ await client.writeCoil(address, value);
101
+ }), this.maxRetries, this.logger);
97
102
  });
98
103
  }
99
104
  async writeMultipleCoils(address, values) {
100
105
  return this.mutex.runExclusive(async () => {
101
- return withRetry(async () => {
102
- this.client.setID(this.slaveId);
106
+ return withRetry(() => this.connection.run(async (client) => {
107
+ client.setID(this.slaveId);
103
108
  // Convert Buffer to boolean array
104
109
  const bools = [];
105
110
  for (let i = 0; i < values.length * 8; i++) {
@@ -108,8 +113,8 @@ export class SlaveTransport {
108
113
  const byte = values[byteIndex];
109
114
  bools.push((byte & (1 << bitIndex)) !== 0);
110
115
  }
111
- await this.client.writeCoils(address, bools);
112
- }, this.maxRetries, this.logger);
116
+ await client.writeCoils(address, bools);
117
+ }), this.maxRetries, this.logger);
113
118
  });
114
119
  }
115
120
  /**
@@ -124,9 +129,7 @@ export class SlaveTransport {
124
129
  */
125
130
  async close() {
126
131
  // Don't use mutex for close operation
127
- return new Promise((resolve) => {
128
- this.client.close(resolve);
129
- });
132
+ return this.connection.close();
130
133
  }
131
134
  }
132
135
  //# sourceMappingURL=slave-transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slave-transport.js","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAoB,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,cAAc;IACzB;;;;;;OAMG;IACH,YACmB,OAAe,EACf,MAAiB,EACjB,KAAY,EACZ,aAAqB,CAAC,EACtB,MAAoB;QAJpB,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAW;QACjB,UAAK,GAAL,KAAK,CAAO;QACZ,eAAU,GAAV,UAAU,CAAY;QACtB,WAAM,GAAN,MAAM,CAAc;IACpC,CAAC;IAEJ,KAAK,CAAC,oBAAoB,CAAC,OAAe,EAAE,KAAa;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBACrE,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAa;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBACnE,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,KAAa;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBAC1D,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,KAAa;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBACnE,OAAO,MAAM,CAAC,MAAM,CAAA;YACtB,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,KAAa;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YACjD,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAAe,EAAE,MAAc;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACnD,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,KAAc;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC7C,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,MAAc;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YACxC,OAAO,SAAS,CACd,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,kCAAkC;gBAClC,MAAM,KAAK,GAAc,EAAE,CAAA;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;oBACnC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAA;oBACtB,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAW,CAAA;oBACxC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC5C,CAAC;gBACD,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC9C,CAAC,EACD,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CACZ,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,KAAK;QACT,sCAAsC;QACtC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"slave-transport.js","sourceRoot":"","sources":["../../../src/slave-transport.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,9 @@ export interface TCPConfig {
20
20
  /**
21
21
  * Create a TCP transport
22
22
  *
23
+ * When the connection is lost, requests reject with a ConnectionLostError and the
24
+ * connection is reopened on a later request (see ModbusConnection).
25
+ *
23
26
  * @param config - TCP configuration
24
27
  * @returns Transport implementation for TCP
25
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tcp-transport.d.ts","sourceRoot":"","sources":["../../../src/tcp-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAKxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAS9E"}
1
+ {"version":3,"file":"tcp-transport.d.ts","sourceRoot":"","sources":["../../../src/tcp-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAMxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CACjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAc9E"}
@@ -1,17 +1,26 @@
1
1
  import ModbusRTU from 'modbus-serial';
2
2
  import { configureClient } from './client-config.js';
3
+ import { ModbusConnection } from './connection.js';
3
4
  import { createModbusTransport } from './create-modbus-transport.js';
4
5
  /**
5
6
  * Create a TCP transport
6
7
  *
8
+ * When the connection is lost, requests reject with a ConnectionLostError and the
9
+ * connection is reopened on a later request (see ModbusConnection).
10
+ *
7
11
  * @param config - TCP configuration
8
12
  * @returns Transport implementation for TCP
9
13
  */
10
14
  export async function createTCPTransport(config) {
11
- const client = new ModbusRTU();
12
- // Connect to TCP server
13
- await client.connectTCP(config.host, { port: config.port ?? 502 });
14
- configureClient(client, config.slaveId, config.timeout);
15
- return createModbusTransport(client, config.maxRetries, config.logger);
15
+ const port = config.port ?? 502;
16
+ const open = async () => {
17
+ const client = new ModbusRTU();
18
+ // Connect to TCP server
19
+ await client.connectTCP(config.host, { port });
20
+ configureClient(client, config.slaveId, config.timeout);
21
+ return client;
22
+ };
23
+ const connection = new ModbusConnection(await open(), `${config.host}:${port}`, open);
24
+ return createModbusTransport(connection, config.maxRetries, config.logger);
16
25
  }
17
26
  //# sourceMappingURL=tcp-transport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tcp-transport.js","sourceRoot":"","sources":["../../../src/tcp-transport.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAqBpE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAA;IAE9B,wBAAwB;IACxB,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAA;IAElE,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAEvD,OAAO,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AACxE,CAAC"}
1
+ {"version":3,"file":"tcp-transport.js","sourceRoot":"","sources":["../../../src/tcp-transport.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAqBpE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAA;IAC/B,MAAM,IAAI,GAAG,KAAK,IAAwB,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAA;QAE9B,wBAAwB;QACxB,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAE9C,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACvD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;IACrF,OAAO,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;AAC5E,CAAC"}