ESPHome 2025.12.0-dev
Loading...
Searching...
No Matches
modbus.h
Go to the documentation of this file.
1#pragma once
2
5
7
8#include <vector>
9
10namespace esphome {
11namespace modbus {
12
17
18class ModbusDevice;
19
20class Modbus : public uart::UARTDevice, public Component {
21 public:
22 Modbus() = default;
23
24 void setup() override;
25
26 void loop() override;
27
28 void dump_config() override;
29
30 void register_device(ModbusDevice *device) { this->devices_.push_back(device); }
31
32 float get_setup_priority() const override;
33
34 void send(uint8_t address, uint8_t function_code, uint16_t start_address, uint16_t number_of_entities,
35 uint8_t payload_len = 0, const uint8_t *payload = nullptr);
36 void send_raw(const std::vector<uint8_t> &payload);
37 void set_role(ModbusRole role) { this->role = role; }
38 void set_flow_control_pin(GPIOPin *flow_control_pin) { this->flow_control_pin_ = flow_control_pin; }
40 void set_send_wait_time(uint16_t time_in_ms) { send_wait_time_ = time_in_ms; }
41 void set_disable_crc(bool disable_crc) { disable_crc_ = disable_crc; }
42
44
45 protected:
47
48 bool parse_modbus_byte_(uint8_t byte);
49 uint16_t send_wait_time_{250};
51 std::vector<uint8_t> rx_buffer_;
52 uint32_t last_modbus_byte_{0};
53 uint32_t last_send_{0};
54 std::vector<ModbusDevice *> devices_;
55};
56
58 public:
59 void set_parent(Modbus *parent) { parent_ = parent; }
60 void set_address(uint8_t address) { address_ = address; }
61 virtual void on_modbus_data(const std::vector<uint8_t> &data) = 0;
62 virtual void on_modbus_error(uint8_t function_code, uint8_t exception_code) {}
63 virtual void on_modbus_read_registers(uint8_t function_code, uint16_t start_address, uint16_t number_of_registers){};
64 virtual void on_modbus_write_registers(uint8_t function_code, const std::vector<uint8_t> &data){};
65 void send(uint8_t function, uint16_t start_address, uint16_t number_of_entities, uint8_t payload_len = 0,
66 const uint8_t *payload = nullptr) {
67 this->parent_->send(this->address_, function, start_address, number_of_entities, payload_len, payload);
68 }
69 void send_raw(const std::vector<uint8_t> &payload) { this->parent_->send_raw(payload); }
70 void send_error(uint8_t function_code, ModbusExceptionCode exception_code) {
71 std::vector<uint8_t> error_response;
72 error_response.reserve(3);
73 error_response.push_back(this->address_);
74 error_response.push_back(function_code | FUNCTION_CODE_EXCEPTION_MASK);
75 error_response.push_back(static_cast<uint8_t>(exception_code));
76 this->send_raw(error_response);
77 }
78 // If more than one device is connected block sending a new command before a response is received
80
81 protected:
82 friend Modbus;
83
85 uint8_t address_;
86};
87
88} // namespace modbus
89} // namespace esphome
uint8_t address
Definition bl0906.h:4
void send_raw(const std::vector< uint8_t > &payload)
Definition modbus.h:69
void set_parent(Modbus *parent)
Definition modbus.h:59
virtual void on_modbus_read_registers(uint8_t function_code, uint16_t start_address, uint16_t number_of_registers)
Definition modbus.h:63
void send(uint8_t function, uint16_t start_address, uint16_t number_of_entities, uint8_t payload_len=0, const uint8_t *payload=nullptr)
Definition modbus.h:65
virtual void on_modbus_data(const std::vector< uint8_t > &data)=0
void send_error(uint8_t function_code, ModbusExceptionCode exception_code)
Definition modbus.h:70
virtual void on_modbus_error(uint8_t function_code, uint8_t exception_code)
Definition modbus.h:62
void set_address(uint8_t address)
Definition modbus.h:60
virtual void on_modbus_write_registers(uint8_t function_code, const std::vector< uint8_t > &data)
Definition modbus.h:64
void set_flow_control_pin(GPIOPin *flow_control_pin)
Definition modbus.h:38
bool parse_modbus_byte_(uint8_t byte)
Definition modbus.cpp:50
void send_raw(const std::vector< uint8_t > &payload)
Definition modbus.cpp:263
void setup() override
Definition modbus.cpp:11
uint16_t send_wait_time_
Definition modbus.h:49
uint8_t waiting_for_response
Definition modbus.h:39
void set_role(ModbusRole role)
Definition modbus.h:37
uint32_t last_modbus_byte_
Definition modbus.h:52
GPIOPin * flow_control_pin_
Definition modbus.h:46
void set_send_wait_time(uint16_t time_in_ms)
Definition modbus.h:40
std::vector< ModbusDevice * > devices_
Definition modbus.h:54
void loop() override
Definition modbus.cpp:16
void set_disable_crc(bool disable_crc)
Definition modbus.h:41
float get_setup_priority() const override
Definition modbus.cpp:203
void dump_config() override
Definition modbus.cpp:195
void register_device(ModbusDevice *device)
Definition modbus.h:30
std::vector< uint8_t > rx_buffer_
Definition modbus.h:51
void send(uint8_t address, uint8_t function_code, uint16_t start_address, uint16_t number_of_entities, uint8_t payload_len=0, const uint8_t *payload=nullptr)
Definition modbus.cpp:208
const uint8_t FUNCTION_CODE_EXCEPTION_MASK
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7