Skip to content

Commit dfc5713

Browse files
Improve custom function handling (#597)
* In custom function use Array<number> instead of Int8Array Numbers > 127 shouldn't be used with Int8Array, so to avoid using negative numbers just use Array<number>. Other functions also seem to use this approach. * Custom function: fix docs and types, add a test
1 parent 2e65ebf commit dfc5713

File tree

5 files changed

+10
-5
lines changed

5 files changed

+10
-5
lines changed

ModbusRTU.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export class ModbusRTU {
2323
writeFC16(address: number, dataAddress: number, values: Array<number>, next: NodeStyleCallback<WriteMultipleResult>): void;
2424
writeFC22(address: number, dataAddress: number, andMask: number, orMask: number, next: NodeStyleCallback<WriteMaskRegisterResult>): void;
2525

26-
writeCustomFC(address: number, functionCode: number, data: Int8Array, next: NodeStyleCallback<CustomFunctionResult>): void;
26+
writeCustomFC(address: number, functionCode: number, data: Array<number>, next: NodeStyleCallback<CustomFunctionResult>): void;
2727

2828
// Connection shorthand API
2929
connectRTU(path: string, options: SerialPortOptions, next: Function): void;
@@ -68,6 +68,7 @@ export class ModbusRTU {
6868
writeRegisterEnron(dataAddress: number, value: number): Promise<WriteRegisterResult>;
6969
writeRegisters(dataAddress: number, values: Array<number> | Buffer): Promise<WriteMultipleResult>; // 16
7070
maskWriteRegister(dataAddress: number, andMask: number, orMask: number): Promise<WriteMaskRegisterResult>;
71+
customFunction(functionCode: number, data: Array<number>): Promise<CustomFunctionResult>;
7172

7273
on(event: 'close', listener: () => unknown): this;
7374
on(event: 'error', listener: (error: unknown) => unknown): this;
@@ -82,7 +83,7 @@ export interface NodeStyleCallback<T> {
8283
}
8384

8485
export interface CustomFunctionResult {
85-
data: Int8Array;
86+
data: Array<number>;
8687
buffer: Buffer;
8788
}
8889

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ This module has not been tested on every single version of NodeJS. For best resu
6969
| FC16 "Preset Multiple Registers" | `writeRegisters(addr, valueAry)` |
7070
| FC22 "Mask Write Register" | `maskWriteRegister(addr, andMask, orMask)` |
7171
| FC43/14 "Read Device Identification" (supported ports: TCP, RTU) | `readDeviceIdentification(id, obj)` |
72+
| CustomFC "Custom Function" | `customFunction(functionCode, data)` |
7273

7374
###### Client Serial:
7475

index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ function _readFC43(data, modbus, next) {
309309

310310
/**
311311
* Parse the data for a Modbus -
312-
* Read Device Identification (FC=43)
312+
* "Custom Function Code" (FC=65-72, 100-110)
313313
*
314314
* @param {Buffer} data the data buffer to parse.
315315
* @param {Modbus} modbus the client in case we need to read more device information
@@ -1226,7 +1226,7 @@ class ModbusRTU extends EventEmitter {
12261226
*
12271227
* @param {number} address the slave unit address.
12281228
* @param {number} functionCode the custom function code.
1229-
* @param {Buffer} data the array of bytes to send.
1229+
* @param {Array<number>} data the array of bytes to send.
12301230
* @param {Function} next the function to call next.
12311231
*/
12321232
writeCustomFC(address, functionCode, data, next) {

ports/testport.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ class TestPort extends EventEmitter {
274274
// Custom function code 100 multiplies inputs by 2
275275
buffer = Buffer.alloc(data.length);
276276
for (let i = 2; i < (data.length - 2); i++) {
277-
buffer.writeUInt8(data.readInt8(i) * 2, i);
277+
buffer.writeUInt8(data.readUInt8(i) * 2, i);
278278
}
279279
}
280280

test/apis/promise.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ describe("Promise", function() {
1717
const value = 1;
1818
const deviceIdCode = 1;
1919
const objectId = 2;
20+
const functionCode = 100;
21+
const data = [1, 2, 3];
2022

2123
modbusRTU.open();
2224
expect(modbusRTU.readCoils(address, arg)).to.be.instanceOf(Promise);
@@ -28,6 +30,7 @@ describe("Promise", function() {
2830
expect(modbusRTU.writeRegisters(address, [value])).to.be.instanceOf(Promise);
2931
expect(modbusRTU.readDeviceIdentification(deviceIdCode, objectId)).to.be.instanceOf(Promise);
3032
expect(modbusRTU.maskWriteRegister(address, arg, arg)).to.be.instanceOf(Promise);
33+
expect(modbusRTU.customFunction(functionCode, data)).to.be.instanceOf(Promise);
3134
});
3235
});
3336

0 commit comments

Comments
 (0)