@ya-modbus/transport 0.10.0 → 0.10.1
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/CHANGELOG.md +6 -0
- package/README.md +6 -0
- package/dist/cjs/src/client-config.d.ts +15 -0
- package/dist/cjs/src/client-config.d.ts.map +1 -1
- package/dist/cjs/src/client-config.js +26 -0
- package/dist/cjs/src/client-config.js.map +1 -1
- package/dist/cjs/src/manager.js +1 -1
- package/dist/cjs/src/manager.js.map +1 -1
- package/dist/cjs/src/tcp-transport.d.ts +1 -1
- package/dist/cjs/src/tcp-transport.d.ts.map +1 -1
- package/dist/cjs/src/tcp-transport.js +1 -1
- package/dist/cjs/src/tcp-transport.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/client-config.d.ts +15 -0
- package/dist/esm/src/client-config.d.ts.map +1 -1
- package/dist/esm/src/client-config.js +25 -0
- package/dist/esm/src/client-config.js.map +1 -1
- package/dist/esm/src/manager.js +2 -2
- package/dist/esm/src/manager.js.map +1 -1
- package/dist/esm/src/tcp-transport.d.ts +1 -1
- package/dist/esm/src/tcp-transport.d.ts.map +1 -1
- package/dist/esm/src/tcp-transport.js +2 -2
- package/dist/esm/src/tcp-transport.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -12,4 +12,19 @@ export declare const DEFAULT_TIMEOUT_MS = 1000;
|
|
|
12
12
|
* @param timeout - Response timeout in milliseconds (default: DEFAULT_TIMEOUT_MS)
|
|
13
13
|
*/
|
|
14
14
|
export declare function configureClient(client: ModbusRTU, slaveId: number, timeout?: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* Connect a modbus-serial client to a Modbus TCP server, and give up after `timeout` ms when
|
|
17
|
+
* the host does not answer
|
|
18
|
+
*
|
|
19
|
+
* Without a timeout, the connect waits for the TCP timeout of the system (about 2 minutes on
|
|
20
|
+
* Linux). modbus-serial uses the `timeout` option as the socket timeout, so a connect that
|
|
21
|
+
* takes longer fails with 'TCP Connection Timed Out'. After the connect, the socket keeps
|
|
22
|
+
* the timeout, but then it does not close the socket.
|
|
23
|
+
*
|
|
24
|
+
* @param client - New modbus-serial client
|
|
25
|
+
* @param host - TCP host (IP address or hostname)
|
|
26
|
+
* @param port - TCP port
|
|
27
|
+
* @param timeout - Connect timeout in milliseconds (default: DEFAULT_TIMEOUT_MS)
|
|
28
|
+
*/
|
|
29
|
+
export declare function connectTCP(client: ModbusRTU, host: string, port: number, timeout?: number): Promise<void>;
|
|
15
30
|
//# sourceMappingURL=client-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-config.d.ts","sourceRoot":"","sources":["../../../src/client-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG1F"}
|
|
1
|
+
{"version":3,"file":"client-config.d.ts","sourceRoot":"","sources":["../../../src/client-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,SAAS,MAAM,eAAe,CAAA;AAE1C,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG1F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,SAAqB,GAC3B,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -14,4 +14,29 @@ export function configureClient(client, slaveId, timeout) {
|
|
|
14
14
|
client.setID(slaveId);
|
|
15
15
|
client.setTimeout(timeout ?? DEFAULT_TIMEOUT_MS);
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Connect a modbus-serial client to a Modbus TCP server, and give up after `timeout` ms when
|
|
19
|
+
* the host does not answer
|
|
20
|
+
*
|
|
21
|
+
* Without a timeout, the connect waits for the TCP timeout of the system (about 2 minutes on
|
|
22
|
+
* Linux). modbus-serial uses the `timeout` option as the socket timeout, so a connect that
|
|
23
|
+
* takes longer fails with 'TCP Connection Timed Out'. After the connect, the socket keeps
|
|
24
|
+
* the timeout, but then it does not close the socket.
|
|
25
|
+
*
|
|
26
|
+
* @param client - New modbus-serial client
|
|
27
|
+
* @param host - TCP host (IP address or hostname)
|
|
28
|
+
* @param port - TCP port
|
|
29
|
+
* @param timeout - Connect timeout in milliseconds (default: DEFAULT_TIMEOUT_MS)
|
|
30
|
+
*/
|
|
31
|
+
export async function connectTCP(client, host, port, timeout = DEFAULT_TIMEOUT_MS) {
|
|
32
|
+
try {
|
|
33
|
+
await client.connectTCP(host, { port, timeout });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// After a timeout the socket still tries to connect. A connection that it opens later
|
|
37
|
+
// would stay open with nothing using it.
|
|
38
|
+
client.destroy(() => undefined);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
17
42
|
//# sourceMappingURL=client-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-config.js","sourceRoot":"","sources":["../../../src/client-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,OAAe,EAAE,OAAgB;IAClF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrB,MAAM,CAAC,UAAU,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAA;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"client-config.js","sourceRoot":"","sources":["../../../src/client-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,OAAe,EAAE,OAAgB;IAClF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrB,MAAM,CAAC,UAAU,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAA;AAClD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAiB,EACjB,IAAY,EACZ,IAAY,EACZ,OAAO,GAAG,kBAAkB;IAE5B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sFAAsF;QACtF,yCAAyC;QACzC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC/B,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
|
package/dist/esm/src/manager.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Mutex } from 'async-mutex';
|
|
2
2
|
import ModbusRTU from 'modbus-serial';
|
|
3
|
-
import { DEFAULT_TIMEOUT_MS } from './client-config.js';
|
|
3
|
+
import { connectTCP, DEFAULT_TIMEOUT_MS } from './client-config.js';
|
|
4
4
|
import { ModbusConnection } from './connection.js';
|
|
5
5
|
import { SlaveTransport } from './slave-transport.js';
|
|
6
6
|
/**
|
|
@@ -144,7 +144,7 @@ export class TransportManager {
|
|
|
144
144
|
*/
|
|
145
145
|
async createTCPClient(config) {
|
|
146
146
|
const client = new ModbusRTU();
|
|
147
|
-
await
|
|
147
|
+
await connectTCP(client, config.host, config.port ?? 502, config.timeout);
|
|
148
148
|
client.setTimeout(config.timeout ?? DEFAULT_TIMEOUT_MS);
|
|
149
149
|
return client;
|
|
150
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,SAAS,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ export interface TCPConfig {
|
|
|
10
10
|
port?: number | undefined;
|
|
11
11
|
/** Modbus slave ID (1-247) */
|
|
12
12
|
slaveId: number;
|
|
13
|
-
/** Response timeout in milliseconds (default: 1000) */
|
|
13
|
+
/** Response timeout in milliseconds, also used as the connect timeout (default: 1000) */
|
|
14
14
|
timeout?: number | undefined;
|
|
15
15
|
/** Maximum retry attempts (default: 3, use 1 to disable retries) */
|
|
16
16
|
maxRetries?: number | undefined;
|
|
@@ -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;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,
|
|
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,yFAAyF;IACzF,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,5 +1,5 @@
|
|
|
1
1
|
import ModbusRTU from 'modbus-serial';
|
|
2
|
-
import { configureClient } from './client-config.js';
|
|
2
|
+
import { configureClient, connectTCP } from './client-config.js';
|
|
3
3
|
import { ModbusConnection } from './connection.js';
|
|
4
4
|
import { createModbusTransport } from './create-modbus-transport.js';
|
|
5
5
|
/**
|
|
@@ -16,7 +16,7 @@ export async function createTCPTransport(config) {
|
|
|
16
16
|
const open = async () => {
|
|
17
17
|
const client = new ModbusRTU();
|
|
18
18
|
// Connect to TCP server
|
|
19
|
-
await
|
|
19
|
+
await connectTCP(client, config.host, port, config.timeout);
|
|
20
20
|
configureClient(client, config.slaveId, config.timeout);
|
|
21
21
|
return client;
|
|
22
22
|
};
|
|
@@ -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;
|
|
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,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChE,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,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QAE3D,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"}
|