nodejs可通过modbus-serial库来实现modbus协议
npm install modbus-srial
安装完后在examples目录下有例子说明如何使用,本文主要讲述作为客户端的使用方式。
polling_RTU是使用485串口来实现modbus通信, polling_TCP和 polling_UDP则使用TCP/UDP来实现通信。
使用TCP/UDP模式时,modbus-serial发送的指令码格式如下,总共6个字节
如下为使用modbus-seria的polling_TCPl发码,并使用wireshark抓包:
使用RTU(485串口)模式时,发送的指令码格式如下所示,总共8个字节,比TCP、UDP模式增加了2个字节的CRC校验码。
如下为使用modbus-serial的polling_RTU发码,并使用串口抓包工具抓包的发码情况:
以上发码对应某空调协议的发码要求:
slave地址在modbus-serial中使用setID来设置,如下:
功能码一般分为0x03(读Holding寄存器功能码)和0x04(读Input寄存器功能码)
这两个功能码对应modbus-serial中使用两个函数
readHoldingRegisters(对应0x03)
readInputRegisters(对应0x04)
readInputRegisters、readHoldingRegisters这两个函数入口的两个参数则分别为寄存器地址和要读取的字节数。
对于RTU(485串口)模式,modbus-serial自动在数据包末尾添加2个字节的CRC校验码,不需要显式添加。
写入单个寄存器,对应的功能码0x06
client.writeRegister(0x0B/*寄存器地址*/, 0xdc/*寄存器值*/)
抓包发码
对应的文档如下指令码
写入多个寄存器,对应的功能码为16(0x10)
client.writeRegisters(1, [100, 90, 80, -200 + 65535, -100 + 65535])
补充modbus的功能码
其他参考:
NPM 包 modbus-serial 使用教程-JavaScript中文网-JavaScript教程资源分享门户