ts-communication 1.0.0 → 1.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.
Files changed (65) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +246 -14
  3. package/dist/Invt/InvtModbusTcp.d.ts +88 -0
  4. package/dist/Invt/InvtModbusTcp.js +255 -0
  5. package/dist/XCommunication.d.ts +18 -0
  6. package/dist/XCommunication.js +29 -0
  7. package/dist/ab/AbEtherNetIp.d.ts +1 -0
  8. package/dist/ab/AbEtherNetIp.js +2 -0
  9. package/dist/core/CommunicationLock.d.ts +88 -0
  10. package/dist/core/CommunicationLock.js +156 -0
  11. package/dist/core/Core.d.ts +27 -1
  12. package/dist/core/Core.js +375 -71
  13. package/dist/core/DeviceSerialPort.d.ts +64 -0
  14. package/dist/core/DeviceSerialPort.js +283 -0
  15. package/dist/core/DeviceUdpNet.d.ts +56 -0
  16. package/dist/core/DeviceUdpNet.js +307 -0
  17. package/dist/core/INetMessage.d.ts +145 -0
  18. package/dist/core/INetMessage.js +240 -0
  19. package/dist/debug/PingTest.d.ts +11 -0
  20. package/dist/debug/PingTest.js +59 -0
  21. package/dist/debug/tcpClient.d.ts +11 -0
  22. package/dist/debug/tcpClient.js +116 -0
  23. package/dist/debug/tcpServer.d.ts +12 -0
  24. package/dist/debug/tcpServer.js +102 -0
  25. package/dist/delta/DeltaTcpNet.d.ts +65 -0
  26. package/dist/delta/DeltaTcpNet.js +346 -0
  27. package/dist/ge/GeSRTPNet.d.ts +49 -0
  28. package/dist/ge/GeSRTPNet.js +337 -0
  29. package/dist/inovance/InovanceEasyNet.d.ts +8 -0
  30. package/dist/inovance/InovanceEasyNet.js +103 -0
  31. package/dist/inovance/InovanceSerial.d.ts +55 -0
  32. package/dist/inovance/InovanceSerial.js +145 -0
  33. package/dist/inovance/InovanceSerialOverTcp.d.ts +39 -0
  34. package/dist/inovance/InovanceSerialOverTcp.js +172 -0
  35. package/dist/inovance/InovanceTcpNet.d.ts +2 -4
  36. package/dist/inovance/InovanceTcpNet.js +40 -13
  37. package/dist/melsec/MelsecMcAsciiNet.d.ts +49 -0
  38. package/dist/melsec/MelsecMcAsciiNet.js +196 -0
  39. package/dist/melsec/MelsecMcAsciiUdp.d.ts +54 -0
  40. package/dist/melsec/MelsecMcAsciiUdp.js +204 -0
  41. package/dist/melsec/MelsecMcNet.d.ts +1 -8
  42. package/dist/melsec/MelsecMcNet.js +4 -14
  43. package/dist/melsec/MelsecMcUdp.d.ts +52 -0
  44. package/dist/melsec/MelsecMcUdp.js +191 -0
  45. package/dist/modbus/ModbusAscii.d.ts +24 -3
  46. package/dist/modbus/ModbusAscii.js +109 -3
  47. package/dist/modbus/ModbusAsciiOverTcp.d.ts +21 -3
  48. package/dist/modbus/ModbusAsciiOverTcp.js +67 -3
  49. package/dist/modbus/ModbusRtu.d.ts +101 -13
  50. package/dist/modbus/ModbusRtu.js +355 -21
  51. package/dist/modbus/ModbusRtuOverTcp.d.ts +23 -3
  52. package/dist/modbus/ModbusRtuOverTcp.js +68 -3
  53. package/dist/modbus/ModbusTcpNet.d.ts +16 -3
  54. package/dist/modbus/ModbusTcpNet.js +192 -60
  55. package/dist/modbus/ModbusUdpNet.d.ts +26 -3
  56. package/dist/modbus/ModbusUdpNet.js +125 -2
  57. package/dist/omron/OmronFinsNet.d.ts +1 -2
  58. package/dist/omron/OmronFinsNet.js +210 -69
  59. package/dist/omron/OmronFinsUdp.d.ts +41 -0
  60. package/dist/omron/OmronFinsUdp.js +146 -0
  61. package/dist/siemens/SiemensS7Net.d.ts +6 -0
  62. package/dist/siemens/SiemensS7Net.js +45 -6
  63. package/dist/xinjie/XinJETcpNet.d.ts +18 -0
  64. package/dist/xinjie/XinJETcpNet.js +106 -0
  65. package/package.json +16 -3
@@ -1,8 +1,73 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ModbusRtuOverTcp = void 0;
4
- const ModbusTcpNet_1 = require("./ModbusTcpNet");
5
- /** Modbus RTU frame carried over TCP. */
6
- class ModbusRtuOverTcp extends ModbusTcpNet_1.ModbusTcpNet {
4
+ const Core_1 = require("../core/Core");
5
+ const Core_2 = require("../core/Core");
6
+ const INetMessage_1 = require("../core/INetMessage");
7
+ const ModbusRtu_1 = require("./ModbusRtu");
8
+ /**
9
+ * Modbus RTU over TCP 客户端
10
+ * TCP 传输 RTU 帧(无 MBAP 头)
11
+ */
12
+ class ModbusRtuOverTcp extends Core_1.DeviceClient {
13
+ Station = 1;
14
+ AddressStartWithZero = true;
15
+ StationCheckMatch = true;
16
+ Crc16CheckEnable = true;
17
+ BroadcastStation = -1;
18
+ get DataFormat() {
19
+ return this.ByteTransform.DataFormat;
20
+ }
21
+ set DataFormat(value) {
22
+ this.ByteTransform.DataFormat = value;
23
+ }
24
+ constructor(ipAddress, port = 502, station = 1) {
25
+ super(ipAddress, port);
26
+ this.Station = station;
27
+ this.ByteTransform.DataFormat = Core_1.DataFormat.CDAB;
28
+ }
29
+ GetNewNetMessage() {
30
+ return new INetMessage_1.ModbusRtuMessage(this.StationCheckMatch);
31
+ }
32
+ packCommand(command) {
33
+ const frame = Buffer.concat([Buffer.from([this.Station]), command]);
34
+ const crc = ModbusRtu_1.ModbusRtu.crc16(frame);
35
+ return Buffer.concat([frame, crc]);
36
+ }
37
+ unpackResponse(send, response) {
38
+ return ModbusRtu_1.ModbusRtu.ExtraRtuResponseContent(send, response, this.Crc16CheckEnable, this.BroadcastStation);
39
+ }
40
+ async sendRequest(command) {
41
+ const packed = this.packCommand(command);
42
+ const result = await this.request(packed);
43
+ if (!result.IsSuccess)
44
+ return result;
45
+ return this.unpackResponse(packed, result.Content);
46
+ }
47
+ async Read(address, length) {
48
+ const cmd = Buffer.alloc(5);
49
+ cmd[0] = 3;
50
+ cmd.writeUInt16BE(parseInt(address), 1);
51
+ cmd.writeUInt16BE(length, 3);
52
+ return this.sendRequest(cmd);
53
+ }
54
+ async ReadInt16(address, length = 1) {
55
+ const result = await this.Read(address, length);
56
+ if (!result.IsSuccess)
57
+ return Core_2.OperateResult.CreateFailedResult(result);
58
+ const values = [];
59
+ for (let i = 0; i < length; i++)
60
+ values.push(this.ByteTransform.TransInt16(result.Content, i * 2));
61
+ return Core_2.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values);
62
+ }
63
+ async ReadFloat(address, length = 1) {
64
+ const result = await this.Read(address, length * 2);
65
+ if (!result.IsSuccess)
66
+ return Core_2.OperateResult.CreateFailedResult(result);
67
+ const values = [];
68
+ for (let i = 0; i < length; i++)
69
+ values.push(this.ByteTransform.TransSingle(result.Content, i * 4));
70
+ return Core_2.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values);
71
+ }
7
72
  }
8
73
  exports.ModbusRtuOverTcp = ModbusRtuOverTcp;
@@ -11,19 +11,27 @@ export declare function parseModbusAddress(input: string, defaultStation?: numbe
11
11
  export declare class ModbusTcpNet extends DeviceClient {
12
12
  Station: number;
13
13
  AddressStartWithZero: boolean;
14
- IsStringReverse: boolean;
14
+ /** 字符串是否按 16 位 Modbus 字进行字节反转。 */
15
+ get IsStringReverse(): boolean;
16
+ set IsStringReverse(value: boolean);
15
17
  StationCheckMatch: boolean;
16
18
  BroadcastStation: number;
17
19
  WordReadBatchLength: number;
18
20
  DisableFunctionCode06: boolean;
19
21
  EnableWriteMaskCode: boolean;
20
- DataFormat: DataFormat;
22
+ get DataFormat(): DataFormat;
23
+ set DataFormat(value: DataFormat);
21
24
  MessageId: number;
22
25
  constructor(ipAddress?: string, port?: number, station?: number);
23
26
  private nextId;
24
27
  private frame;
25
28
  private transact;
26
- private addr;
29
+ protected addr(input: string, code: number): OperateResult<ModbusAddress>;
30
+ /**
31
+ * 读取寄存器原始数据,不再分派到被子类重写的读取方法。
32
+ * 地址映射子类在调用类型读取前已经完成转换,避免地址被重复转换。
33
+ */
34
+ private readRaw;
27
35
  Read(address: string, length: number): Promise<OperateResult<Buffer>>;
28
36
  ReadBool(address: string, length?: number): Promise<OperateResult<boolean | boolean[]>>;
29
37
  ReadCoil(address: string, length?: number): Promise<OperateResult<boolean | boolean[]>>;
@@ -39,6 +47,11 @@ export declare class ModbusTcpNet extends DeviceClient {
39
47
  ReadUInt64(address: string, length?: number): Promise<OperateResult<any>>;
40
48
  ReadByte(address: string): Promise<OperateResult<number>>;
41
49
  ReadString(address: string, length: number, encoding?: BufferEncoding): Promise<OperateResult<string>>;
50
+ /**
51
+ * 写入原始数据,不再分派到被子类重写的写入方法。
52
+ * 类型写入可能已经完成了设备专用地址转换。
53
+ */
54
+ private writeRaw;
42
55
  Write(address: string, value: number | boolean | string | Buffer | number[] | boolean[]): Promise<OperateResult<any>>;
43
56
  WriteMask(address: string, andMask: number, orMask: number): Promise<OperateResult<any>>;
44
57
  WriteByte(a: string, v: number): Promise<OperateResult<any>>;
@@ -36,25 +36,58 @@ function parseModbusAddress(input, defaultStation = 1, defaultCode = 3) {
36
36
  return new Core_1.OperateResult(e.message);
37
37
  }
38
38
  }
39
- function crc16(data) { let crc = 0xffff; for (const b of data) {
40
- crc ^= b;
41
- for (let i = 0; i < 8; i++)
42
- crc = (crc & 1) ? (crc >>> 1) ^ 0xa001 : crc >>> 1;
43
- } return Buffer.from([crc & 0xff, crc >>> 8]); }
39
+ function crc16(data) {
40
+ let crc = 0xffff;
41
+ for (const b of data) {
42
+ crc ^= b;
43
+ for (let i = 0; i < 8; i++)
44
+ crc = (crc & 1) ? (crc >>> 1) ^ 0xa001 : crc >>> 1;
45
+ }
46
+ return Buffer.from([crc & 0xff, crc >>> 8]);
47
+ }
44
48
  class ModbusTcpNet extends Core_1.DeviceClient {
45
49
  Station = 1;
46
50
  AddressStartWithZero = true;
47
- IsStringReverse = false;
51
+ /** 字符串是否按 16 位 Modbus 字进行字节反转。 */
52
+ get IsStringReverse() {
53
+ return this.ByteTransform.IsStringReverseByteWord;
54
+ }
55
+ set IsStringReverse(value) {
56
+ this.ByteTransform.IsStringReverseByteWord = value;
57
+ }
48
58
  StationCheckMatch = true;
49
59
  BroadcastStation = -1;
50
60
  WordReadBatchLength = 120;
51
61
  DisableFunctionCode06 = false;
52
62
  EnableWriteMaskCode = true;
53
- DataFormat = Core_1.DataFormat.CDAB;
63
+ get DataFormat() {
64
+ return this.ByteTransform.DataFormat;
65
+ }
66
+ set DataFormat(value) {
67
+ this.ByteTransform.DataFormat = value;
68
+ }
54
69
  MessageId = 0;
55
- constructor(ipAddress, port = 502, station = 1) { super(ipAddress, ipAddress === undefined ? undefined : port); this.Port = ipAddress === undefined ? 5000 : port; this.Station = station; this.ByteTransform = new Core_1.ByteTransform(this.DataFormat); }
56
- nextId() { const id = this.MessageId; this.MessageId = (this.MessageId + 1) & 0xffff; return id; }
57
- frame(pdu, station) { const id = this.nextId(); const out = Buffer.alloc(7 + pdu.length); out.writeUInt16BE(id, 0); out.writeUInt16BE(0, 2); out.writeUInt16BE(pdu.length + 1, 4); out[6] = station; pdu.copy(out, 7); return out; }
70
+ constructor(ipAddress, port = 502, station = 1) {
71
+ super(ipAddress, ipAddress === undefined ? undefined : port);
72
+ this.Port = ipAddress === undefined ? 5000 : port;
73
+ this.Station = station;
74
+ this.ByteTransform = new Core_1.ByteTransform(this.DataFormat);
75
+ }
76
+ nextId() {
77
+ const id = this.MessageId;
78
+ this.MessageId = (this.MessageId + 1) & 0xffff;
79
+ return id;
80
+ }
81
+ frame(pdu, station) {
82
+ const id = this.nextId();
83
+ const out = Buffer.alloc(7 + pdu.length);
84
+ out.writeUInt16BE(id, 0);
85
+ out.writeUInt16BE(0, 2);
86
+ out.writeUInt16BE(pdu.length + 1, 4);
87
+ out[6] = station;
88
+ pdu.copy(out, 7);
89
+ return out;
90
+ }
58
91
  async transact(pdu, station) {
59
92
  const id = this.MessageId;
60
93
  const result = await this.request(this.frame(pdu, station), data => {
@@ -76,28 +109,51 @@ class ModbusTcpNet extends Core_1.DeviceClient {
76
109
  return new Core_1.OperateResult(`Modbus exception ${body[2]}`, body[2]);
77
110
  return Core_1.OperateResult.CreateSuccessResult(body);
78
111
  }
79
- addr(input, code) { const p = parseModbusAddress(input, this.Station, code); if (p.IsSuccess && !this.AddressStartWithZero)
80
- p.Content.address--; return p; }
81
- async Read(address, length) {
112
+ addr(input, code) {
113
+ const p = parseModbusAddress(input, this.Station, code);
114
+ if (p.IsSuccess && !this.AddressStartWithZero)
115
+ p.Content.address--;
116
+ return p;
117
+ }
118
+ /**
119
+ * 读取寄存器原始数据,不再分派到被子类重写的读取方法。
120
+ * 地址映射子类在调用类型读取前已经完成转换,避免地址被重复转换。
121
+ */
122
+ async readRaw(address, length) {
82
123
  const a = this.addr(address, 3);
83
124
  if (!a.IsSuccess)
84
125
  return Core_1.OperateResult.CreateFailedResult(a);
85
126
  const p = a.Content;
86
127
  const fn = p.code === 1 || p.code === 2 || p.code === 4 ? p.code : 3;
87
- const req = Buffer.alloc(5);
88
- req[0] = fn;
89
- req.writeUInt16BE(p.address, 1);
90
- req.writeUInt16BE(length, 3);
91
- const result = await this.transact(req, p.station);
92
- if (!result.IsSuccess)
93
- return result;
94
- const body = result.Content;
95
- if (body.length < 3 || body[1] !== fn)
96
- return new Core_1.OperateResult('Invalid Modbus read response');
97
- const byteCount = body[2];
98
- if (body.length < 3 + byteCount)
99
- return new Core_1.OperateResult('Invalid Modbus read response');
100
- return Core_1.OperateResult.CreateSuccessResult(body.subarray(3, 3 + byteCount));
128
+ if (!Number.isInteger(length) || length < 0)
129
+ return new Core_1.OperateResult('Invalid Modbus read length');
130
+ if (length === 0)
131
+ return Core_1.OperateResult.CreateSuccessResult(Buffer.alloc(0));
132
+ // 长寄存器读取按设备允许的批量大小拆分,再按原顺序合并字节。
133
+ const maxBatch = fn === 1 || fn === 2 ? 2000 : this.WordReadBatchLength;
134
+ const chunks = [];
135
+ for (let offset = 0; offset < length;) {
136
+ const count = Math.min(maxBatch, length - offset);
137
+ const req = Buffer.alloc(5);
138
+ req[0] = fn;
139
+ req.writeUInt16BE(p.address + offset, 1);
140
+ req.writeUInt16BE(count, 3);
141
+ const result = await this.transact(req, p.station);
142
+ if (!result.IsSuccess)
143
+ return result;
144
+ const body = result.Content;
145
+ if (body.length < 3 || body[1] !== fn)
146
+ return new Core_1.OperateResult('Invalid Modbus read response');
147
+ const byteCount = body[2];
148
+ if (body.length < 3 + byteCount)
149
+ return new Core_1.OperateResult('Invalid Modbus read response');
150
+ chunks.push(body.subarray(3, 3 + byteCount));
151
+ offset += count;
152
+ }
153
+ return Core_1.OperateResult.CreateSuccessResult(Buffer.concat(chunks));
154
+ }
155
+ async Read(address, length) {
156
+ return this.readRaw(address, length);
101
157
  }
102
158
  async ReadBool(address, length) {
103
159
  const p = this.addr(address, 1);
@@ -117,23 +173,62 @@ class ModbusTcpNet extends Core_1.DeviceClient {
117
173
  out.push((r.Content[3 + (i >> 3)] & (1 << (i & 7))) !== 0);
118
174
  return Core_1.OperateResult.CreateSuccessResult(length === undefined ? out[0] : out);
119
175
  }
120
- async ReadCoil(address, length) { return this.ReadBool(address, length); }
121
- async ReadDiscrete(address, length) { const p = this.addr(address, 2); if (!p.IsSuccess)
122
- return Core_1.OperateResult.CreateFailedResult(p); return this.ReadBool(address.replace(/^((?:s=\d+;)?)/, '$1x=2;'), length); }
123
- async readTyped(address, length, width, fn) { const r = await this.Read(address, (0, Core_1.wordsFor)('x', length) * width / 2); if (!r.IsSuccess)
124
- return Core_1.OperateResult.CreateFailedResult(r); const transform = this.ByteTransform; const values = Array.from({ length }, (_, i) => fn(r.Content, i * width)); return Core_1.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values); }
125
- async ReadInt16(address, length) { return this.readTyped(address, length ?? 1, 2, (b, o) => this.ByteTransform.TransInt16(b, o)); }
126
- async ReadUInt16(address, length) { return this.readTyped(address, length ?? 1, 2, (b, o) => this.ByteTransform.TransUInt16(b, o)); }
127
- async ReadInt32(address, length) { return this.readTyped(address, length ?? 1, 4, (b, o) => this.ByteTransform.TransInt32(b, o)); }
128
- async ReadUInt32(address, length) { return this.readTyped(address, length ?? 1, 4, (b, o) => this.ByteTransform.TransUInt32(b, o)); }
129
- async ReadFloat(address, length) { return this.readTyped(address, length ?? 1, 4, (b, o) => this.ByteTransform.TransSingle(b, o)); }
130
- async ReadDouble(address, length) { return this.readTyped(address, length ?? 1, 8, (b, o) => this.ByteTransform.TransDouble(b, o)); }
131
- async ReadInt64(address, length) { return this.readTyped(address, length ?? 1, 8, (b, o) => this.ByteTransform.TransInt64(b, o)); }
132
- async ReadUInt64(address, length) { return this.readTyped(address, length ?? 1, 8, (b, o) => this.ByteTransform.TransUInt64(b, o)); }
133
- async ReadByte(address) { const r = await this.Read(address, 1); return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult(r.Content[0]) : Core_1.OperateResult.CreateFailedResult(r); }
134
- async ReadString(address, length, encoding = 'utf8') { const r = await this.Read(address, length); return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult(this.ByteTransform.TransString(r.Content, encoding)) : Core_1.OperateResult.CreateFailedResult(r); }
135
- async Write(address, value) {
136
- const p = this.addr(address, Array.isArray(value) && typeof value[0] === 'boolean' ? 15 : typeof value === 'boolean' ? 5 : 16);
176
+ async ReadCoil(address, length) {
177
+ return this.ReadBool(address, length);
178
+ }
179
+ async ReadDiscrete(address, length) {
180
+ const p = this.addr(address, 2);
181
+ if (!p.IsSuccess)
182
+ return Core_1.OperateResult.CreateFailedResult(p);
183
+ return this.ReadBool(address.replace(/^((?:s=\d+;)?)/, '$1x=2;'), length);
184
+ }
185
+ async readTyped(address, length, width, fn) {
186
+ const r = await this.readRaw(address, (0, Core_1.wordsFor)('x', length) * width / 2);
187
+ if (!r.IsSuccess)
188
+ return Core_1.OperateResult.CreateFailedResult(r);
189
+ const transform = this.ByteTransform;
190
+ const values = Array.from({ length }, (_, i) => fn(r.Content, i * width));
191
+ return Core_1.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values);
192
+ }
193
+ async ReadInt16(address, length) {
194
+ return this.readTyped(address, length ?? 1, 2, (b, o) => this.ByteTransform.TransInt16(b, o));
195
+ }
196
+ async ReadUInt16(address, length) {
197
+ return this.readTyped(address, length ?? 1, 2, (b, o) => this.ByteTransform.TransUInt16(b, o));
198
+ }
199
+ async ReadInt32(address, length) {
200
+ return this.readTyped(address, length ?? 1, 4, (b, o) => this.ByteTransform.TransInt32(b, o));
201
+ }
202
+ async ReadUInt32(address, length) {
203
+ return this.readTyped(address, length ?? 1, 4, (b, o) => this.ByteTransform.TransUInt32(b, o));
204
+ }
205
+ async ReadFloat(address, length) {
206
+ return this.readTyped(address, length ?? 1, 4, (b, o) => this.ByteTransform.TransSingle(b, o));
207
+ }
208
+ async ReadDouble(address, length) {
209
+ return this.readTyped(address, length ?? 1, 8, (b, o) => this.ByteTransform.TransDouble(b, o));
210
+ }
211
+ async ReadInt64(address, length) {
212
+ return this.readTyped(address, length ?? 1, 8, (b, o) => this.ByteTransform.TransInt64(b, o));
213
+ }
214
+ async ReadUInt64(address, length) {
215
+ return this.readTyped(address, length ?? 1, 8, (b, o) => this.ByteTransform.TransUInt64(b, o));
216
+ }
217
+ async ReadByte(address) {
218
+ const r = await this.Read(address, 1);
219
+ return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult(r.Content[0]) : Core_1.OperateResult.CreateFailedResult(r);
220
+ }
221
+ async ReadString(address, length, encoding = 'ascii') {
222
+ const r = await this.Read(address, length);
223
+ return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult(this.ByteTransform.TransString(r.Content, encoding)) : Core_1.OperateResult.CreateFailedResult(r);
224
+ }
225
+ /**
226
+ * 写入原始数据,不再分派到被子类重写的写入方法。
227
+ * 类型写入可能已经完成了设备专用地址转换。
228
+ */
229
+ async writeRaw(address, value, functionCode) {
230
+ const defaultFunction = Array.isArray(value) && typeof value[0] === 'boolean' ? 15 : typeof value === 'boolean' ? 5 : 16;
231
+ const p = this.addr(address, functionCode ?? defaultFunction);
137
232
  if (!p.IsSuccess)
138
233
  return p;
139
234
  const a = p.Content;
@@ -148,13 +243,15 @@ class ModbusTcpNet extends Core_1.DeviceClient {
148
243
  return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult() : r;
149
244
  }
150
245
  if (typeof value === 'string')
151
- data = Buffer.from(value, 'utf8');
246
+ data = Buffer.from(value, 'ascii');
152
247
  else if (Buffer.isBuffer(value))
153
248
  data = value;
154
249
  else if (Array.isArray(value) && typeof value[0] === 'boolean') {
155
250
  data = Buffer.alloc(Math.ceil(value.length / 8));
156
- value.forEach((v, i) => { if (v)
157
- data[i >> 3] |= 1 << (i & 7); });
251
+ value.forEach((v, i) => {
252
+ if (v)
253
+ data[i >> 3] |= 1 << (i & 7);
254
+ });
158
255
  }
159
256
  else if (Array.isArray(value))
160
257
  data = this.ByteTransform.TransByte(value, 2);
@@ -175,18 +272,53 @@ class ModbusTcpNet extends Core_1.DeviceClient {
175
272
  const r = await this.transact(req, a.station);
176
273
  return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult() : r;
177
274
  }
178
- async WriteMask(address, andMask, orMask) { const p = this.addr(address, 22); if (!p.IsSuccess)
179
- return p; const req = Buffer.alloc(7); req[0] = 22; req.writeUInt16BE(p.Content.address, 1); req.writeUInt16BE(andMask, 3); req.writeUInt16BE(orMask, 5); const r = await this.transact(req, p.Content.station); return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult() : r; }
180
- WriteByte(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.Byte(v))); }
181
- WriteInt16(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.Int16(v))); }
182
- WriteUInt16(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.UInt16(v))); }
183
- WriteInt32(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.Int32(v))); }
184
- WriteUInt32(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.UInt32(v))); }
185
- WriteFloat(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.Float(v))); }
186
- WriteDouble(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.Double(v))); }
187
- WriteInt64(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.Int64(v))); }
188
- WriteUInt64(a, v) { return this.Write(a, this.ByteTransform.TransByte(new Core_1.UInt64(v))); }
189
- async ConnectServerAsync() { return this.ConnectServer(); }
190
- async ConnectCloseAsync() { return this.ConnectClose(); }
275
+ async Write(address, value) {
276
+ return this.writeRaw(address, value);
277
+ }
278
+ async WriteMask(address, andMask, orMask) {
279
+ const p = this.addr(address, 22);
280
+ if (!p.IsSuccess)
281
+ return p;
282
+ const req = Buffer.alloc(7);
283
+ req[0] = 22;
284
+ req.writeUInt16BE(p.Content.address, 1);
285
+ req.writeUInt16BE(andMask, 3);
286
+ req.writeUInt16BE(orMask, 5);
287
+ const r = await this.transact(req, p.Content.station);
288
+ return r.IsSuccess ? Core_1.OperateResult.CreateSuccessResult() : r;
289
+ }
290
+ WriteByte(a, v) {
291
+ return this.Write(a, this.ByteTransform.TransByte(new Core_1.Byte(v)));
292
+ }
293
+ WriteInt16(a, v) {
294
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.Int16(v)), 6);
295
+ }
296
+ WriteUInt16(a, v) {
297
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.UInt16(v)), 6);
298
+ }
299
+ WriteInt32(a, v) {
300
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.Int32(v)));
301
+ }
302
+ WriteUInt32(a, v) {
303
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.UInt32(v)));
304
+ }
305
+ WriteFloat(a, v) {
306
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.Float(v)));
307
+ }
308
+ WriteDouble(a, v) {
309
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.Double(v)));
310
+ }
311
+ WriteInt64(a, v) {
312
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.Int64(v)));
313
+ }
314
+ WriteUInt64(a, v) {
315
+ return this.writeRaw(a, this.ByteTransform.TransByte(new Core_1.UInt64(v)));
316
+ }
317
+ async ConnectServerAsync() {
318
+ return this.ConnectServer();
319
+ }
320
+ async ConnectCloseAsync() {
321
+ return this.ConnectClose();
322
+ }
191
323
  }
192
324
  exports.ModbusTcpNet = ModbusTcpNet;
@@ -1,4 +1,27 @@
1
- import { ModbusTcpNet } from './ModbusTcpNet';
2
- /** Modbus UDP client. */
3
- export declare class ModbusUdpNet extends ModbusTcpNet {
1
+ import { DeviceUdpNet } from '../core/DeviceUdpNet';
2
+ import { OperateResult, DataFormat } from '../core/Core';
3
+ import { INetMessage } from '../core/INetMessage';
4
+ /**
5
+ * Modbus UDP 客户端
6
+ * UDP 传输 Modbus TCP 帧
7
+ */
8
+ export declare class ModbusUdpNet extends DeviceUdpNet {
9
+ Station: number;
10
+ AddressStartWithZero: boolean;
11
+ get IsStringReverse(): boolean;
12
+ set IsStringReverse(value: boolean);
13
+ MessageId: number;
14
+ get DataFormat(): DataFormat;
15
+ set DataFormat(value: DataFormat);
16
+ constructor(ipAddress?: string, port?: number, station?: number);
17
+ protected GetNewNetMessage(): INetMessage;
18
+ private nextId;
19
+ private frame;
20
+ private addr;
21
+ Read(address: string, length: number): Promise<OperateResult<Buffer>>;
22
+ ReadInt16(address: string, length?: number): Promise<OperateResult<number | number[]>>;
23
+ ReadUInt16(address: string, length?: number): Promise<OperateResult<number | number[]>>;
24
+ ReadInt32(address: string, length?: number): Promise<OperateResult<number | number[]>>;
25
+ ReadFloat(address: string, length?: number): Promise<OperateResult<number | number[]>>;
26
+ WriteRegister(address: string, value: number): Promise<OperateResult<void>>;
4
27
  }
@@ -1,8 +1,131 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ModbusUdpNet = void 0;
4
+ const DeviceUdpNet_1 = require("../core/DeviceUdpNet");
5
+ const Core_1 = require("../core/Core");
6
+ const INetMessage_1 = require("../core/INetMessage");
4
7
  const ModbusTcpNet_1 = require("./ModbusTcpNet");
5
- /** Modbus UDP client. */
6
- class ModbusUdpNet extends ModbusTcpNet_1.ModbusTcpNet {
8
+ /**
9
+ * Modbus UDP 客户端
10
+ * UDP 传输 Modbus TCP 帧
11
+ */
12
+ class ModbusUdpNet extends DeviceUdpNet_1.DeviceUdpNet {
13
+ Station = 1;
14
+ AddressStartWithZero = true;
15
+ get IsStringReverse() {
16
+ return this.ByteTransform.IsStringReverseByteWord;
17
+ }
18
+ set IsStringReverse(value) {
19
+ this.ByteTransform.IsStringReverseByteWord = value;
20
+ }
21
+ MessageId = 0;
22
+ get DataFormat() {
23
+ return this.ByteTransform.DataFormat;
24
+ }
25
+ set DataFormat(value) {
26
+ this.ByteTransform.DataFormat = value;
27
+ }
28
+ constructor(ipAddress, port = 502, station = 1) {
29
+ super(ipAddress, port);
30
+ this.Station = station;
31
+ this.ByteTransform.DataFormat = Core_1.DataFormat.CDAB;
32
+ }
33
+ GetNewNetMessage() {
34
+ return new INetMessage_1.ModbusTcpMessage(true);
35
+ }
36
+ nextId() {
37
+ const id = this.MessageId;
38
+ this.MessageId = (this.MessageId + 1) & 0xFFFF;
39
+ return id;
40
+ }
41
+ frame(pdu, station) {
42
+ const id = this.nextId();
43
+ const out = Buffer.alloc(7 + pdu.length);
44
+ out.writeUInt16BE(id, 0);
45
+ out.writeUInt16BE(0, 2);
46
+ out.writeUInt16BE(pdu.length + 1, 4);
47
+ out[6] = station;
48
+ pdu.copy(out, 7);
49
+ return out;
50
+ }
51
+ addr(input, code) {
52
+ const p = (0, ModbusTcpNet_1.parseModbusAddress)(input, this.Station, code);
53
+ if (p.IsSuccess && !this.AddressStartWithZero) {
54
+ p.Content.address--;
55
+ }
56
+ return p;
57
+ }
58
+ async Read(address, length) {
59
+ const a = this.addr(address, 3);
60
+ if (!a.IsSuccess)
61
+ return Core_1.OperateResult.CreateFailedResult(a);
62
+ const pdu = Buffer.alloc(5);
63
+ pdu[0] = a.Content.code;
64
+ pdu.writeUInt16BE(a.Content.address, 1);
65
+ pdu.writeUInt16BE(length, 3);
66
+ const result = await this.request(this.frame(pdu, a.Content.station));
67
+ if (!result.IsSuccess)
68
+ return result;
69
+ const body = result.Content;
70
+ if (body.length < 2)
71
+ return new Core_1.OperateResult('Invalid Modbus UDP response', -1);
72
+ if ((body[0] & 0x80) !== 0)
73
+ return new Core_1.OperateResult(`Modbus exception ${body[1]}`, body[1]);
74
+ if (body.length < 3)
75
+ return new Core_1.OperateResult('Invalid response length', -2);
76
+ const byteCount = body[1];
77
+ return Core_1.OperateResult.CreateSuccessResult(body.subarray(2, 2 + byteCount));
78
+ }
79
+ async ReadInt16(address, length = 1) {
80
+ const result = await this.Read(address, length);
81
+ if (!result.IsSuccess)
82
+ return Core_1.OperateResult.CreateFailedResult(result);
83
+ const values = [];
84
+ for (let i = 0; i < length; i++) {
85
+ values.push(this.ByteTransform.TransInt16(result.Content, i * 2));
86
+ }
87
+ return Core_1.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values);
88
+ }
89
+ async ReadUInt16(address, length = 1) {
90
+ const result = await this.Read(address, length);
91
+ if (!result.IsSuccess)
92
+ return Core_1.OperateResult.CreateFailedResult(result);
93
+ const values = [];
94
+ for (let i = 0; i < length; i++) {
95
+ values.push(this.ByteTransform.TransUInt16(result.Content, i * 2));
96
+ }
97
+ return Core_1.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values);
98
+ }
99
+ async ReadInt32(address, length = 1) {
100
+ const result = await this.Read(address, length * 2);
101
+ if (!result.IsSuccess)
102
+ return Core_1.OperateResult.CreateFailedResult(result);
103
+ const values = [];
104
+ for (let i = 0; i < length; i++) {
105
+ values.push(this.ByteTransform.TransInt32(result.Content, i * 4));
106
+ }
107
+ return Core_1.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values);
108
+ }
109
+ async ReadFloat(address, length = 1) {
110
+ const result = await this.Read(address, length * 2);
111
+ if (!result.IsSuccess)
112
+ return Core_1.OperateResult.CreateFailedResult(result);
113
+ const values = [];
114
+ for (let i = 0; i < length; i++) {
115
+ values.push(this.ByteTransform.TransSingle(result.Content, i * 4));
116
+ }
117
+ return Core_1.OperateResult.CreateSuccessResult(length === 1 ? values[0] : values);
118
+ }
119
+ async WriteRegister(address, value) {
120
+ const a = this.addr(address, 6);
121
+ if (!a.IsSuccess)
122
+ return Core_1.OperateResult.CreateFailedResult(a);
123
+ const pdu = Buffer.alloc(5);
124
+ pdu[0] = 6;
125
+ pdu.writeUInt16BE(a.Content.address, 1);
126
+ pdu.writeUInt16BE(value & 0xFFFF, 3);
127
+ const result = await this.request(this.frame(pdu, a.Content.station));
128
+ return result.IsSuccess ? Core_1.OperateResult.CreateSuccessResult() : Core_1.OperateResult.CreateFailedResult(result);
129
+ }
7
130
  }
8
131
  exports.ModbusUdpNet = ModbusUdpNet;
@@ -28,6 +28,7 @@ export declare class OmronFinsNet extends DeviceClient {
28
28
  private transact;
29
29
  private command;
30
30
  Read(address: string, length: number): Promise<OperateResult<Buffer<ArrayBufferLike>>>;
31
+ ReadString(address: string, length: number, encoding?: BufferEncoding): Promise<OperateResult<string>>;
31
32
  ReadBool(address: string, length?: number): Promise<OperateResult<boolean | boolean[]>>;
32
33
  private typedRead;
33
34
  ReadInt16(a: string, l?: number): Promise<OperateResult<any>>;
@@ -53,5 +54,3 @@ export declare class OmronFinsNet extends DeviceClient {
53
54
  ConnectServerAsync(): Promise<OperateResult<any>>;
54
55
  ConnectCloseAsync(): Promise<OperateResult<any>>;
55
56
  }
56
- export declare class OmronFinsUdp extends OmronFinsNet {
57
- }