node modbus rs485 modbus-serial和serialport部分功能二次封装

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中的练习。我刚接触通讯,如果我对通讯处理方法有问题,请大佬们指正!
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值