#ifndef MODBUS_H #define MODBUS_H #include #include #include #include "config.h" // Function codes #define MODBUS_FC_READ_HOLDING_REGISTERS 0x03 #define MODBUS_FC_WRITE_SINGLE_REGISTER 0x06 #define MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10 // Modbus protocol exception codes #define MODBUS_ERROR_NONE 0x00 #define MODBUS_ERROR_ILLEGAL_FUNCTION 0x01 #define MODBUS_ERROR_ILLEGAL_ADDRESS 0x02 #define MODBUS_ERROR_ILLEGAL_VALUE 0x03 #define MODBUS_ERROR_DEVICE_FAILURE 0x04 #define MODBUS_ERROR_ACKNOWLEDGE 0x05 #define MODBUS_ERROR_DEVICE_BUSY 0x06 #define MODBUS_ERROR_MEMORY_PARITY 0x08 #define MODBUS_ERROR_TIMEOUT 0x0B // No response received #define MODBUS_ERROR_CRC 0x0C // CRC check failed // Frame length #define MB_MIN_LEN 4 #define MB_CRC_LEN 2 #define MB_WREG_LEN 8 #define MB_MAX_BUFFER 32 // States for the Modbus protocol state machine typedef enum { MODBUS_IDLE, // Ready to send new request MODBUS_WAITING_RESPONSE, // Request sent, waiting for slave response MODBUS_PROCESS_RESPONSE // Response received, processing data } modbus_state_t; // Callback function type for handling received Modbus register values typedef void (*modbus_value_cb)(uint8_t device_idx, const char* property, uint16_t value); // Initialize the Modbus protocol handler with callback for received values void modbus_handler_init(modbus_value_cb value_callback); void modbus_handler_process(void); // Send a Modbus read or write request to a slave device // Returns true if request was queued successfully bool modbus_handler_send_request(uint8_t device_idx, const char* property, bool is_write, uint16_t value); // Publish a Modbus register value to MQTT broker // Formats topic as device_name/property void modbus_publish_value(MQTTClient* client, const char* device_name, const char* property, uint16_t value); #endif // MODBUS_H