@things-factory/integration-modbus 9.0.0-beta.8 → 9.0.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/dist-server/engine/connector/modbus-tcp.js +1 -2
- package/dist-server/engine/connector/modbus-tcp.js.map +1 -1
- package/dist-server/engine/index.d.ts +2 -2
- package/dist-server/engine/index.js +2 -2
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -15,10 +15,9 @@ class ModbusTCPConnector {
|
|
|
15
15
|
integration_base_1.ConnectionManager.logger.info('modbus-tcp connections are ready');
|
|
16
16
|
}
|
|
17
17
|
checkConnectionInstance(domain, connectionName) {
|
|
18
|
-
var _a;
|
|
19
18
|
try {
|
|
20
19
|
const connection = integration_base_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
|
|
21
|
-
return !!(
|
|
20
|
+
return !!(connection?.client?.connectionState !== 'online');
|
|
22
21
|
}
|
|
23
22
|
catch (e) {
|
|
24
23
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modbus-tcp.js","sourceRoot":"","sources":["../../../server/engine/connector/modbus-tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import * as modbus from 'jsmodbus'\nimport { Socket } from 'net'\nimport PQueue from 'p-queue'\nimport PromiseSocket from 'promise-socket'\n\nimport { Connection, ConnectionManager, Connector } from '@things-factory/integration-base'\nimport { sleep } from '@things-factory/utils'\n\nconst debug = require('debug')('things-factory:modbus-tcp-connector')\n\nexport class ModbusTCPConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('modbus-tcp connections are ready')\n }\n\n checkConnectionInstance(domain, connectionName): boolean {\n try {\n const connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n return !!(connection?.client?.connectionState !== 'online')\n } catch (e) {\n return false\n }\n }\n\n async connect(connection) {\n var [host, port = 502] = connection.endpoint.split(':')\n var {\n params: { keepalive = true }\n } = connection\n\n try {\n /*\n try to keep connecting if keepalive is true\n */\n var clientIdx = 1\n var connected: boolean = false\n var looped: boolean = true\n while (true) {\n var clientSocket = new Socket()\n clientSocket = new Socket()\n var promiseSocket = new PromiseSocket(clientSocket)\n\n var client = new modbus.client.TCP(clientSocket, clientIdx++, 10000)\n\n clientSocket.on('error', async ex => {\n debug(ex)\n ConnectionManager.logger.error(`modbus tcp connection error: ${ex}`)\n })\n\n clientSocket.on('close', async () => {\n debug(`modbus tcp connection closed`)\n if (keepalive && !looped) {\n await this.disconnect(connection)\n await this.connect(connection)\n }\n })\n\n debug(`connecting to ${connection.endpoint}...`)\n\n looped = true\n await promiseSocket\n .connect(port, host)\n .then(() => {\n connected = true\n })\n .catch(ex => {\n promiseSocket && promiseSocket.destroy()\n })\n\n // if the current connections have the connection with the same name, the current try should be stopped.\n if (!keepalive || connected) {\n looped = false\n break\n }\n\n await sleep(1000)\n }\n\n var queue = new PQueue({ concurrency: 1 })\n ConnectionManager.addConnectionInstance(connection, {\n readModBus: async function (objectType, address, quantity, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'descrete input':\n response = await client.readDiscreteInputs(address, quantity)\n break\n case 'input register':\n response = await client.readInputRegisters(address, quantity)\n break\n case 'holding register':\n response = await client.readHoldingRegisters(address, quantity)\n break\n default:\n response = await client.readCoils(address, quantity)\n }\n\n var data = response && response.response._body.valuesAsArray.slice(0, quantity)\n logger.info(`${JSON.stringify(data)}`)\n return {\n data\n }\n })\n },\n writeSingleModBus: async function (objectType, address, value, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'holding register':\n await client.writeSingleRegister(address, parseInt(value))\n response = await client.readHoldingRegisters(address, 1)\n break\n default:\n await client.writeSingleCoil(address, !!Number(value))\n response = await client.readCoils(address, 1)\n }\n\n var data = response && response.response._body.valuesAsArray[0]\n logger.info(data)\n return {\n data\n }\n })\n },\n close: function () {\n queue.clear()\n keepalive = false\n promiseSocket.destroy()\n }\n })\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}:${connection.endpoint}) is connected`)\n } catch (ex) {\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}:${connection.endpoint}) failed to connect`)\n throw ex\n }\n }\n\n async disconnect(connection: Connection) {\n var { close } = ConnectionManager.removeConnectionInstance(connection)\n close()\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'checkbox',\n name: 'keepalive',\n label: 'keepalive',\n property: {\n value: 'checked'\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['modbus']\n }\n\n get help() {\n return 'integration/connector/modbus-tcp'\n }\n}\n\nConnectionManager.registerConnector('modbus-tcp', new ModbusTCPConnector())\n"]}
|
|
1
|
+
{"version":3,"file":"modbus-tcp.js","sourceRoot":"","sources":["../../../server/engine/connector/modbus-tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import * as modbus from 'jsmodbus'\nimport { Socket } from 'net'\nimport PQueue from 'p-queue'\nimport PromiseSocket from 'promise-socket'\n\nimport { Connection, ConnectionManager, Connector } from '@things-factory/integration-base'\nimport { sleep } from '@things-factory/utils'\n\nconst debug = require('debug')('things-factory:modbus-tcp-connector')\n\nexport class ModbusTCPConnector implements Connector {\n async ready(connectionConfigs) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n\n ConnectionManager.logger.info('modbus-tcp connections are ready')\n }\n\n checkConnectionInstance(domain, connectionName): boolean {\n try {\n const connection = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n\n return !!(connection?.client?.connectionState !== 'online')\n } catch (e) {\n return false\n }\n }\n\n async connect(connection) {\n var [host, port = 502] = connection.endpoint.split(':')\n var {\n params: { keepalive = true }\n } = connection\n\n try {\n /*\n try to keep connecting if keepalive is true\n */\n var clientIdx = 1\n var connected: boolean = false\n var looped: boolean = true\n while (true) {\n var clientSocket = new Socket()\n clientSocket = new Socket()\n var promiseSocket = new PromiseSocket(clientSocket)\n\n var client = new modbus.client.TCP(clientSocket, clientIdx++, 10000)\n\n clientSocket.on('error', async ex => {\n debug(ex)\n ConnectionManager.logger.error(`modbus tcp connection error: ${ex}`)\n })\n\n clientSocket.on('close', async () => {\n debug(`modbus tcp connection closed`)\n if (keepalive && !looped) {\n await this.disconnect(connection)\n await this.connect(connection)\n }\n })\n\n debug(`connecting to ${connection.endpoint}...`)\n\n looped = true\n await promiseSocket\n .connect(port, host)\n .then(() => {\n connected = true\n })\n .catch(ex => {\n promiseSocket && promiseSocket.destroy()\n })\n\n // if the current connections have the connection with the same name, the current try should be stopped.\n if (!keepalive || connected) {\n looped = false\n break\n }\n\n await sleep(1000)\n }\n\n var queue = new PQueue({ concurrency: 1 })\n ConnectionManager.addConnectionInstance(connection, {\n readModBus: async function (objectType, address, quantity, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'descrete input':\n response = await client.readDiscreteInputs(address, quantity)\n break\n case 'input register':\n response = await client.readInputRegisters(address, quantity)\n break\n case 'holding register':\n response = await client.readHoldingRegisters(address, quantity)\n break\n default:\n response = await client.readCoils(address, quantity)\n }\n\n var data = response && response.response._body.valuesAsArray.slice(0, quantity)\n logger.info(`${JSON.stringify(data)}`)\n return {\n data\n }\n })\n },\n writeSingleModBus: async function (objectType, address, value, { logger }) {\n return await queue.add(async () => {\n var response\n\n switch (objectType) {\n case 'holding register':\n await client.writeSingleRegister(address, parseInt(value))\n response = await client.readHoldingRegisters(address, 1)\n break\n default:\n await client.writeSingleCoil(address, !!Number(value))\n response = await client.readCoils(address, 1)\n }\n\n var data = response && response.response._body.valuesAsArray[0]\n logger.info(data)\n return {\n data\n }\n })\n },\n close: function () {\n queue.clear()\n keepalive = false\n promiseSocket.destroy()\n }\n })\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}:${connection.endpoint}) is connected`)\n } catch (ex) {\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}:${connection.endpoint}) failed to connect`)\n throw ex\n }\n }\n\n async disconnect(connection: Connection) {\n var { close } = ConnectionManager.removeConnectionInstance(connection)\n close()\n\n ConnectionManager.logger.info(`modbus-tcp connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n {\n type: 'checkbox',\n name: 'keepalive',\n label: 'keepalive',\n property: {\n value: 'checked'\n }\n }\n ]\n }\n\n get taskPrefixes() {\n return ['modbus']\n }\n\n get help() {\n return 'integration/connector/modbus-tcp'\n }\n}\n\nConnectionManager.registerConnector('modbus-tcp', new ModbusTCPConnector())\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import './connector';
|
|
2
|
-
import './task';
|
|
1
|
+
import './connector/index.js';
|
|
2
|
+
import './task/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/engine/index.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/engine/index.ts"],"names":[],"mappings":";;AAAA,gCAA6B;AAC7B,2BAAwB","sourcesContent":["import './connector/index.js'\nimport './task/index.js'\n"]}
|