代码拉取完成,页面将自动刷新
这是一个基于Modbus RTU协议的Arduino modbus库,它支持以下几种modbus协议命令:
这是DFRobot基于modbus RTU协议为Arduino平台移植的modbus库。
Hardware conneted table
Sensor | MCU |
---|---|
VCC | 5V |
GND | GND |
RX | connected to the UART TX pin of MCU |
TX | connected to the UART RX pin of MCU |
To use this library, first download the library file, paste it into the \Arduino\libraries directory, then open the examples folder and run the demo in the folder.
/**
* @brief DFRobot_RTU构造函数. 传递串口指针.
* @param s: 串口抽象类指针。
* @param dePin RS485流控引脚,拉低接收,拉高发送
*/
DFRobot_RTU(Stream *s,int dePin);
DFRobot_RTU(Stream *s);
~DFRobot_RTU()
/**
* @brief 设置串口接收超时时间,单位ms.
* @param timeout: 串口接收超时时间参数,单位ms,默认100ms
*/
void setTimeoutTimeMs(uint32_t timeout = 100);
/**
* @brief 读取线圈寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 线圈寄存器地址.
* @return 返回线圈寄存器的值。
* @n true: 线圈寄存器的值为1
* @n false: 线圈寄存器的值为0
*/
bool readCoilsRegister(uint8_t id, uint16_t reg);
/**
* @brief 读取离散输入寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 离散输入寄存器地址.
* @return 返回离散输入寄存器的值。
*/
uint16_t readDiscreteInputsRegister(uint8_t id, uint16_t reg);
/**
* @brief 读取保持寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 保持寄存器地址.
* @return 返回保持寄存器的值。
*/
uint16_t readHoldingRegister(uint8_t id, uint16_t reg);
/**
* @brief 读取输入寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 输入寄存器地址.
* @return 返回输入寄存器的值。
*/
uint16_t readInputRegister(uint8_t id, uint16_t reg);
/**
* @brief 写单个线圈寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 线圈寄存器地址.
* @param flag: 要写入的线圈寄存器的值,0 或 1。
* @return 返回写线圈寄存起的值, 0 或 1。
*/
uint8_t writeCoilsRegister(uint8_t id, uint16_t reg, bool flag);
/**
* @brief 写单个保持寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 保持寄存器地址.
* @param val: 要写入的保持寄存器的值。
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t writeHoldingRegister(uint8_t id, uint16_t reg, uint16_t val);
/**
* @brief 读多个线圈寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 读线圈寄存器的起始地址.
* @param regNum: 线圈寄存器的个数
* @param data: 存储要读取的数据的指针.
* @param size: 要读取的字节数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t readCoilsRegister(uint8_t id, uint16_t reg, uint16_t regNum, uint8_t *data, uint16_t size);
/**
* @brief 读多个离散输入寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 读离散输入寄存器的起始地址.
* @param regNum: 离散寄存器的个数
* @param data: 存储要读取的数据的指针.
* @param size: 要读取的字节数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t readDiscreteInputsRegister(uint8_t id, uint16_t reg, uint16_t regNum, uint8_t *data, uint16_t size);
/**
* @brief 读多个保持寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 读保持寄存器的起始地址.
* @param data: 存储要读取的数据的指针.
* @param size: 要读取的字节数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t readHoldingRegister(uint8_t id, uint16_t reg, void *data, uint16_t size);
/**
* @brief 读多个输入寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 读输入寄存器的起始地址.
* @param data: 存储要读取的数据的指针.
* @param size: 要读取的字节数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t readInputRegister(uint8_t id, uint16_t reg, void *data, uint16_t size);
/**
* @brief 读多个保持寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 读保持寄存器的起始地址.
* @param data: 存储要读取的数据的指针.
* @param regNum: 表示要读取的寄存器的个数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t readHoldingRegister(uint8_t id, uint16_t reg, uint16_t *data, uint16_t regNum);
/**
* @brief 读多个输入寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 读输入寄存器的起始地址.
* @param data: 存储要读取的数据的指针.
* @param size: 要读取的字节数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t readInputRegister(uint8_t id, uint16_t reg, uint16_t *data, uint16_t size);
/**
* @brief 写多个线圈寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 写线圈寄存器的起始地址.
* @param regNum: 线圈寄存器的个数.
* @param data: 存储要写入的数据的指针.
* @param size: 要写入的字节数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t writeCoilsRegister(uint8_t id, uint16_t reg, uint16_t regNum, void *data, uint16_t size);
/**
* @brief 写多个保持寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 写保持寄存器的起始地址.
* @param data: 存储要写入的数据的指针.
* @param size: 要写入的字节数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t writeHoldingRegister(uint8_t id, uint16_t reg, void *data, uint16_t size);
/**
* @brief 写多个保持寄存器的值。
* @param id: modbus 设备ID,范围0~0xF7(0~247),其中0x00为广播地址,所有modbus从机都会处理广播包,但不会应答。
* @param reg: 写保持寄存器的起始地址.
* @param data: 存储要写入的数据的指针.
* @param regNum: 表示要读取的寄存器的个数.
* @return Exception code:
* @n 0 : sucess.
* @n 1 or eRTU_EXCEPTION_ILLEGAL_FUNCTION : 非法功能.
* @n 2 or eRTU_EXCEPTION_ILLEGAL_DATA_ADDRESS: 非法数据地址.
* @n 3 or eRTU_EXCEPTION_ILLEGAL_DATA_VALUE: 非法数据值.
* @n 4 or eRTU_EXCEPTION_SLAVE_FAILURE: 从机故障.
* @n 8 or eRTU_EXCEPTION_CRC_ERROR: CRC校验错误.
* @n 9 or eRTU_RECV_ERROR: 接收包错误.
* @n 10 or eRTU_MEMORY_ERROR: 内存错误.
* @n 11 or eRTU_ID_ERROR:广播地址或错误ID(因为主机无法收到从机广播包的应答)
*/
uint8_t writeHoldingRegister(uint8_t id, uint16_t reg, uint16_t *data, uint16_t regNum);
MCU | SoftwareSerial | HardwareSerial |
---|---|---|
Arduino Uno | √ | X |
Mega2560 | √ | √ |
Leonardo | √ | √ |
ESP32 | X | √ |
ESP8266 | √ | X |
micro:bit | X | X |
FireBeetle M0 | X | √ |
raspberry | X | √ |
Written by(xue.peng@dfrobot.com), 2021. (Welcome to our website)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。