1.引入modbus-serial和serialport依赖包
2.使用serialport库主要是为了获取设备列表,使用modbus-serial进行通讯。
modbus.js
const ModbusRTU = require("modbus-serial");
const { SerialPort } = require('serialport')
const client = new ModbusRTU();
let connectRTU = () => {
return new Promise((resolve, reject) => {
let path = ""
SerialPort.list().then((ports, err) => {
// console.log(ports)
path = ports[0].path
if (path) {
client.connectRTUBuffered(path, {
baudRate: 9600,
dataBits: 8,
stopBits: 1,
parity: 'none'
})
.then(function () {
resolve("true")//我是为了判断是否连接上
})
.catch(function (e) {
reject("false")
});;
} else {
reject("没检测到串口设备")
}
})
})
}
let read = (data) => {
return new Promise((resolve, reject) => {
let noSpeace = data.replace(/\s+/g, '');
let id = parseInt(noSpeace.slice(0, 2), 16);
let code = parseInt(noSpeace.slice(2, 4), 16)
let RegisterAdr = parseInt(noSpeace.slice(4, 8), 16)
let RegisterNum = parseInt(noSpeace.slice(8, 12), 16)
console.log(id, code, RegisterAdr, RegisterNum)
client.setID(id);
//下面所有方法npm官网中modbus-serial都有
if (code == 1) {
client.readCoils() .then((res) => {
resolve(res)
}).catch(
err => {
// reject(err)
}
);
}
if (code == 2) {
client.readDiscreteInputs(RegisterAdr, RegisterNum)
.then((res) => {
resolve(res)
}).catch(
err => {
// reject(err)
}
);
}
if (code == 3) {
client.readHoldingRegisters(RegisterAdr, RegisterNum)
.then((res) => {
resolve(res)
}).catch(
err => {
// reject(err)
}
);
}
if (code == 4) {
client.readInputRegisters(RegisterAdr, RegisterNum)
.then((res) => {
resolve(res)
}).catch(
err => {
// reject(err)
});
}
if(code == 15) {
let data = noSpeace.slice(14, -4)
let groups = [];
for (let i = 0; i < data.length; i += 4) {
groups.push(parseInt(data.slice(i, i + 4), 16));
}
client.writeCoils(RegisterAdr,groups)
.then((res) => {
resolve(res)
}).catch(
err => {
// console.log(err)
// reject(err)
});
}
if (code == 16) {
let data = noSpeace.slice(14, -4)
let groups = [];
for (let i = 0; i < data.length; i += 4) {
groups.push(parseInt(data.slice(i, i + 4), 16));
}
client.writeRegisters(RegisterAdr,groups)
.then((res) => {
resolve(res)
}).catch(
err => {
// console.log(err)
// reject(err)
});
}
})
}
module.exports = {
connectRTU, read
};
main.js 中引用
const { connectRTU, read } = require('./src/modbusWarp/modbus');
const state = connectRTU().then((res) => {
console.log(res + 'main')
// read("01 04 00 00 00 06 70 08").then(console.log)
// read("FF 03 00 00 00 01 91 D4").then(console.log)
})
//read中报文是我所接设备的报文
注:这是我在electron中的练习。我刚接触通讯,如果我对通讯处理方法有问题,请大佬们指正!