@things-factory/integration-modbus 5.0.0-alpha.9 → 5.0.0-y.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.
|
@@ -27,10 +27,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.ModbusTCPConnector = void 0;
|
|
30
|
-
const integration_base_1 = require("@things-factory/integration-base");
|
|
31
|
-
const net_1 = __importDefault(require("net"));
|
|
32
30
|
const modbus = __importStar(require("jsmodbus"));
|
|
31
|
+
const net_1 = require("net");
|
|
33
32
|
const p_queue_1 = __importDefault(require("p-queue"));
|
|
33
|
+
const promise_socket_1 = __importDefault(require("promise-socket"));
|
|
34
|
+
const integration_base_1 = require("@things-factory/integration-base");
|
|
34
35
|
const utils_1 = require("@things-factory/utils");
|
|
35
36
|
class ModbusTCPConnector {
|
|
36
37
|
async ready(connectionConfigs) {
|
|
@@ -40,100 +41,108 @@ class ModbusTCPConnector {
|
|
|
40
41
|
async connect(config) {
|
|
41
42
|
var [host, port = 502] = config.endpoint.split(':');
|
|
42
43
|
var { params } = config;
|
|
43
|
-
var clientSocket = new net_1.
|
|
44
|
+
var clientSocket = new net_1.Socket();
|
|
45
|
+
var promiseSocket = new promise_socket_1.default(clientSocket);
|
|
44
46
|
var client = new modbus.client.TCP(clientSocket);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
catch (e) {
|
|
75
|
-
logger.error('readModBus command failed.');
|
|
76
|
-
logger.error(e);
|
|
77
|
-
if (keepalive) {
|
|
78
|
-
clientSocket && clientSocket.destroy();
|
|
79
|
-
clientSocket = new net_1.default.Socket();
|
|
80
|
-
client = new modbus.client.TCP(clientSocket);
|
|
81
|
-
clientSocket.on('error', console.error);
|
|
82
|
-
clientSocket.connect({ host, port });
|
|
83
|
-
await (0, utils_1.sleep)(1000);
|
|
47
|
+
try {
|
|
48
|
+
clientSocket.on('error', console.error);
|
|
49
|
+
await promiseSocket.connect(port, host);
|
|
50
|
+
var queue = new p_queue_1.default({ concurrency: 1 });
|
|
51
|
+
var keepalive = params.keepalive;
|
|
52
|
+
integration_base_1.ConnectionManager.addConnectionInstance(config, {
|
|
53
|
+
readModBus: async function (objectType, address, quantity, { logger }) {
|
|
54
|
+
return await queue.add(async () => {
|
|
55
|
+
while (true) {
|
|
56
|
+
try {
|
|
57
|
+
var response;
|
|
58
|
+
switch (objectType) {
|
|
59
|
+
case 'descrete input':
|
|
60
|
+
response = await client.readDiscreteInputs(address, quantity);
|
|
61
|
+
break;
|
|
62
|
+
case 'input register':
|
|
63
|
+
response = await client.readInputRegisters(address, quantity);
|
|
64
|
+
break;
|
|
65
|
+
case 'holding register':
|
|
66
|
+
response = await client.readHoldingRegisters(address, quantity);
|
|
67
|
+
break;
|
|
68
|
+
default:
|
|
69
|
+
response = await client.readCoils(address, quantity);
|
|
70
|
+
}
|
|
71
|
+
var data = response && response.response._body.valuesAsArray.slice(0, quantity);
|
|
72
|
+
logger.info(`${JSON.stringify(data)}`);
|
|
73
|
+
return {
|
|
74
|
+
data
|
|
75
|
+
};
|
|
84
76
|
}
|
|
85
|
-
|
|
86
|
-
|
|
77
|
+
catch (e) {
|
|
78
|
+
logger.error('readModBus command failed.');
|
|
79
|
+
logger.error(e);
|
|
80
|
+
if (keepalive) {
|
|
81
|
+
promiseSocket && promiseSocket.destroy();
|
|
82
|
+
clientSocket = new net_1.Socket();
|
|
83
|
+
promiseSocket = new promise_socket_1.default(clientSocket);
|
|
84
|
+
client = new modbus.client.TCP(clientSocket);
|
|
85
|
+
clientSocket.on('error', console.error);
|
|
86
|
+
promiseSocket.connect(port, host);
|
|
87
|
+
await (0, utils_1.sleep)(1000);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw e;
|
|
91
|
+
}
|
|
87
92
|
}
|
|
88
93
|
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
writeSingleModBus: async function (objectType, address, value, { logger }) {
|
|
97
|
+
return await queue.add(async () => {
|
|
98
|
+
while (true) {
|
|
99
|
+
try {
|
|
100
|
+
var response;
|
|
101
|
+
switch (objectType) {
|
|
102
|
+
case 'holding register':
|
|
103
|
+
await client.writeSingleRegister(address, parseInt(value));
|
|
104
|
+
response = await client.readHoldingRegisters(address, 1);
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
await client.writeSingleCoil(address, !!Number(value));
|
|
108
|
+
response = await client.readCoils(address, 1);
|
|
109
|
+
}
|
|
110
|
+
var data = response && response.response._body.valuesAsArray[0];
|
|
111
|
+
logger.info(data);
|
|
112
|
+
return {
|
|
113
|
+
data
|
|
114
|
+
};
|
|
105
115
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
await (0, utils_1.sleep)(1000);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
throw e;
|
|
116
|
+
catch (e) {
|
|
117
|
+
logger.error('writeSingleModBus command failed.');
|
|
118
|
+
logger.error(e);
|
|
119
|
+
if (keepalive) {
|
|
120
|
+
promiseSocket && promiseSocket.destroy();
|
|
121
|
+
clientSocket = new net_1.Socket();
|
|
122
|
+
promiseSocket = new promise_socket_1.default(clientSocket);
|
|
123
|
+
client = new modbus.client.TCP(clientSocket);
|
|
124
|
+
clientSocket.on('error', console.error);
|
|
125
|
+
promiseSocket.connect(port, host);
|
|
126
|
+
await (0, utils_1.sleep)(1000);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
throw e;
|
|
130
|
+
}
|
|
125
131
|
}
|
|
126
132
|
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
close: function () {
|
|
136
|
+
queue.clear();
|
|
137
|
+
keepalive = false;
|
|
138
|
+
promiseSocket.destroy();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
integration_base_1.ConnectionManager.logger.info(`modbus-tcp connection(${config.name}:${config.endpoint}) is connected`);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
integration_base_1.ConnectionManager.logger.info(`modbus-tcp connection(${config.name}:${config.endpoint}) failed to connect`);
|
|
145
|
+
}
|
|
137
146
|
}
|
|
138
147
|
async disconnect(connection) {
|
|
139
148
|
var { close } = integration_base_1.ConnectionManager.removeConnectionInstance(connection);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modbus-tcp.js","sourceRoot":"","sources":["../../../server/engine/connector/modbus-tcp.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"modbus-tcp.js","sourceRoot":"","sources":["../../../server/engine/connector/modbus-tcp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/integration-modbus",
|
|
3
|
-
"version": "5.0.0-
|
|
3
|
+
"version": "5.0.0-y.0",
|
|
4
4
|
"main": "dist-server/index.js",
|
|
5
5
|
"browser": "client/index.js",
|
|
6
6
|
"things-factory": true,
|
|
@@ -23,10 +23,11 @@
|
|
|
23
23
|
"clean": "npm run clean:server"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@things-factory/integration-base": "^5.0.0-
|
|
26
|
+
"@things-factory/integration-base": "^5.0.0-y.0",
|
|
27
27
|
"jsmodbus": "^4.0.2",
|
|
28
28
|
"p-queue": "^6.4.0",
|
|
29
|
+
"promise-socket": "^7.0.0",
|
|
29
30
|
"serialport": "^9.0.2"
|
|
30
31
|
},
|
|
31
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "2fb8066dae72d864b0fc3a5b439a18579fa39ee6"
|
|
32
33
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { ConnectionManager, Connector, Connection } from '@things-factory/integration-base'
|
|
2
|
-
import net from 'net'
|
|
3
1
|
import * as modbus from 'jsmodbus'
|
|
2
|
+
import { Socket } from 'net'
|
|
4
3
|
import PQueue from 'p-queue'
|
|
4
|
+
import PromiseSocket from 'promise-socket'
|
|
5
|
+
|
|
6
|
+
import { Connection, ConnectionManager, Connector } from '@things-factory/integration-base'
|
|
5
7
|
import { sleep } from '@things-factory/utils'
|
|
6
8
|
|
|
7
9
|
export class ModbusTCPConnector implements Connector {
|
|
@@ -15,110 +17,119 @@ export class ModbusTCPConnector implements Connector {
|
|
|
15
17
|
var [host, port = 502] = config.endpoint.split(':')
|
|
16
18
|
var { params } = config
|
|
17
19
|
|
|
18
|
-
var clientSocket = new
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
clientSocket.on('error', console.error)
|
|
22
|
-
clientSocket.connect({ host, port })
|
|
23
|
-
|
|
24
|
-
var queue = new PQueue({ concurrency: 1 })
|
|
25
|
-
var keepalive = params.keepalive
|
|
26
|
-
|
|
27
|
-
ConnectionManager.addConnectionInstance(config, {
|
|
28
|
-
readModBus: async function (objectType, address, quantity, { logger }) {
|
|
29
|
-
return await queue.add(async () => {
|
|
30
|
-
while (true) {
|
|
31
|
-
try {
|
|
32
|
-
var response
|
|
33
|
-
|
|
34
|
-
switch (objectType) {
|
|
35
|
-
case 'descrete input':
|
|
36
|
-
response = await client.readDiscreteInputs(address, quantity)
|
|
37
|
-
break
|
|
38
|
-
case 'input register':
|
|
39
|
-
response = await client.readInputRegisters(address, quantity)
|
|
40
|
-
break
|
|
41
|
-
case 'holding register':
|
|
42
|
-
response = await client.readHoldingRegisters(address, quantity)
|
|
43
|
-
break
|
|
44
|
-
default:
|
|
45
|
-
response = await client.readCoils(address, quantity)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
var data = response && response.response._body.valuesAsArray.slice(0, quantity)
|
|
49
|
-
logger.info(`${JSON.stringify(data)}`)
|
|
50
|
-
return {
|
|
51
|
-
data
|
|
52
|
-
}
|
|
53
|
-
} catch (e) {
|
|
54
|
-
logger.error('readModBus command failed.')
|
|
55
|
-
logger.error(e)
|
|
56
|
-
|
|
57
|
-
if (keepalive) {
|
|
58
|
-
clientSocket && clientSocket.destroy()
|
|
20
|
+
var clientSocket = new Socket()
|
|
21
|
+
var promiseSocket = new PromiseSocket(clientSocket)
|
|
59
22
|
|
|
60
|
-
|
|
61
|
-
client = new modbus.client.TCP(clientSocket)
|
|
62
|
-
clientSocket.on('error', console.error)
|
|
63
|
-
clientSocket.connect({ host, port })
|
|
23
|
+
var client = new modbus.client.TCP(clientSocket)
|
|
64
24
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
25
|
+
try {
|
|
26
|
+
clientSocket.on('error', console.error)
|
|
27
|
+
|
|
28
|
+
await promiseSocket.connect(port, host)
|
|
29
|
+
|
|
30
|
+
var queue = new PQueue({ concurrency: 1 })
|
|
31
|
+
var keepalive = params.keepalive
|
|
32
|
+
|
|
33
|
+
ConnectionManager.addConnectionInstance(config, {
|
|
34
|
+
readModBus: async function (objectType, address, quantity, { logger }) {
|
|
35
|
+
return await queue.add(async () => {
|
|
36
|
+
while (true) {
|
|
37
|
+
try {
|
|
38
|
+
var response
|
|
39
|
+
|
|
40
|
+
switch (objectType) {
|
|
41
|
+
case 'descrete input':
|
|
42
|
+
response = await client.readDiscreteInputs(address, quantity)
|
|
43
|
+
break
|
|
44
|
+
case 'input register':
|
|
45
|
+
response = await client.readInputRegisters(address, quantity)
|
|
46
|
+
break
|
|
47
|
+
case 'holding register':
|
|
48
|
+
response = await client.readHoldingRegisters(address, quantity)
|
|
49
|
+
break
|
|
50
|
+
default:
|
|
51
|
+
response = await client.readCoils(address, quantity)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
var data = response && response.response._body.valuesAsArray.slice(0, quantity)
|
|
55
|
+
logger.info(`${JSON.stringify(data)}`)
|
|
56
|
+
return {
|
|
57
|
+
data
|
|
58
|
+
}
|
|
59
|
+
} catch (e) {
|
|
60
|
+
logger.error('readModBus command failed.')
|
|
61
|
+
logger.error(e)
|
|
62
|
+
|
|
63
|
+
if (keepalive) {
|
|
64
|
+
promiseSocket && promiseSocket.destroy()
|
|
65
|
+
|
|
66
|
+
clientSocket = new Socket()
|
|
67
|
+
promiseSocket = new PromiseSocket(clientSocket)
|
|
68
|
+
client = new modbus.client.TCP(clientSocket)
|
|
69
|
+
clientSocket.on('error', console.error)
|
|
70
|
+
promiseSocket.connect(port, host)
|
|
71
|
+
|
|
72
|
+
await sleep(1000)
|
|
73
|
+
} else {
|
|
74
|
+
throw e
|
|
75
|
+
}
|
|
68
76
|
}
|
|
69
77
|
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
78
|
+
})
|
|
79
|
+
},
|
|
80
|
+
writeSingleModBus: async function (objectType, address, value, { logger }) {
|
|
81
|
+
return await queue.add(async () => {
|
|
82
|
+
while (true) {
|
|
83
|
+
try {
|
|
84
|
+
var response
|
|
85
|
+
|
|
86
|
+
switch (objectType) {
|
|
87
|
+
case 'holding register':
|
|
88
|
+
await client.writeSingleRegister(address, parseInt(value))
|
|
89
|
+
response = await client.readHoldingRegisters(address, 1)
|
|
90
|
+
break
|
|
91
|
+
default:
|
|
92
|
+
await client.writeSingleCoil(address, !!Number(value))
|
|
93
|
+
response = await client.readCoils(address, 1)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
var data = response && response.response._body.valuesAsArray[0]
|
|
97
|
+
logger.info(data)
|
|
98
|
+
return {
|
|
99
|
+
data
|
|
100
|
+
}
|
|
101
|
+
} catch (e) {
|
|
102
|
+
logger.error('writeSingleModBus command failed.')
|
|
103
|
+
logger.error(e)
|
|
104
|
+
|
|
105
|
+
if (keepalive) {
|
|
106
|
+
promiseSocket && promiseSocket.destroy()
|
|
107
|
+
|
|
108
|
+
clientSocket = new Socket()
|
|
109
|
+
promiseSocket = new PromiseSocket(clientSocket)
|
|
110
|
+
client = new modbus.client.TCP(clientSocket)
|
|
111
|
+
clientSocket.on('error', console.error)
|
|
112
|
+
promiseSocket.connect(port, host)
|
|
113
|
+
|
|
114
|
+
await sleep(1000)
|
|
115
|
+
} else {
|
|
116
|
+
throw e
|
|
117
|
+
}
|
|
109
118
|
}
|
|
110
119
|
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
120
|
+
})
|
|
121
|
+
},
|
|
122
|
+
close: function () {
|
|
123
|
+
queue.clear()
|
|
124
|
+
keepalive = false
|
|
125
|
+
promiseSocket.destroy()
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
ConnectionManager.logger.info(`modbus-tcp connection(${config.name}:${config.endpoint}) is connected`)
|
|
130
|
+
} catch (error) {
|
|
131
|
+
ConnectionManager.logger.info(`modbus-tcp connection(${config.name}:${config.endpoint}) failed to connect`)
|
|
132
|
+
}
|
|
122
133
|
}
|
|
123
134
|
|
|
124
135
|
async disconnect(connection: Connection) {
|