3.7 KiB
3.7 KiB
| title | description | keywords | |||||||
|---|---|---|---|---|---|---|---|---|---|
| ModbusRTU | ESP-32 industrial Modbus-485 implementation for bidirectional communication |
|
ModbusRTU
Path: src/modbusRTU.h
Revision History: Initial documentation
ModbusRTU is a comprehensive implementation of the Modbus RTU protocol over RS-485 for ESP32 devices. It provides a robust, industrial-grade solution for bidirectional communication between master and slave devices, supporting both master functionality for querying other devices and slave functionality for responding to external queries.
REQUIREMENTS
-
Hardware:
- RS-485 transceiver (e.g., MAX485)
- RX pin (configured in
pins_arduino.h) - TX pin (configured in
pins_arduino.h) - DE/RE pin for RS-485 direction control
-
Software:
- Platform.io with ESP32 support
- C17 compiler support
FEATURES
- Supports both Modbus master and slave functionalities
- Implements standard Modbus function codes (3, 4, 6, 16)
- Automatic CRC calculation and validation
- Configurable timeouts and retry mechanisms
- Interrupt-driven communication with hardware buffer
- Thread-safe operation
- Extensible register mapping system
- Support for various data types (uint16_t, float, etc.)
DEPENDENCIES
graph TD
ModbusRTU --> Component
ModbusRTU --> ArduinoLog
BEHAVIOUR
stateDiagram-v2
[*] --> Idle
Idle --> Transmitting: Send Request/Response
Transmitting --> Waiting: Master Mode
Transmitting --> Idle: Slave Mode
Waiting --> Processing: Receive Response
Waiting --> Timeout: No Response
Processing --> Idle: Success/Error
Timeout --> Retry: Retries Left
Timeout --> Idle: Max Retries
Retry --> Transmitting
TODOS
PERFORMANCE
- Consider implementing a more efficient buffer management system to reduce memory usage
- Optimize CRC calculation for speed using lookup tables
- Evaluate interrupt priorities to ensure timely processing of incoming data
SECURITY
- Implement message authentication to prevent unauthorized commands
- Add support for encrypted Modbus communication where security is critical
- Consider implementing access control lists for sensitive register operations
COMPLIANCE
- Complete full compliance with Modbus RTU specification
- Add support for additional function codes as needed for specific applications
- Ensure timing requirements meet the Modbus specification under all operating conditions
RECOMMENDATIONS
- Use shielded twisted pair cables for RS-485 communication to maximize reliability
- Implement proper line termination (120Ω) at both ends of the RS-485 bus
- Consider using galvanic isolation for the RS-485 transceiver in noisy environments
- Regularly test communication with various slave devices to ensure compatibility
EXAMPLE
This example shows how to initialize and mount the ModbusRTU component in master mode:
#ifdef PIN_RS485_DE
modbus = new ModbusRTU(
this, // owner
SERIAL_RS485, // serial port (defined in pins_arduino.h)
PIN_RS485_DE, // direction control pin
MODBUS_BAUD_RATE, // baud rate (typically 9600, 19200, or 115200)
SERIAL_8N1, // data format (8 bits, no parity, 1 stop bit)
1 // device ID for slave mode
);
if (modbus)
{
components.push_back(modbus);
Log.infoln(F("ModbusRTU initialized. DE/RE Pin: %d, Baud: %d, ID: %d"),
PIN_RS485_DE, MODBUS_BAUD_RATE, 1);
}
else
{
Log.errorln(F("ModbusRTU initialization failed."));
}
#endif