PL::ModbusServer class

class ModbusServer : public PL::ModbusBase, public PL::Server

Modbus server class.

Subclassed by PL::BlackBoxModbusServer

Public Functions

ModbusServer(std::shared_ptr<Stream> stream, ModbusProtocol protocol, uint8_t stationAddress, std::shared_ptr<Buffer> buffer)

Creates a stream Modbus server with shared transaction buffer.

Parameters:
  • stream – stream

  • protocol – Modbus protocol

  • stationAddress – station address

  • buffer – transaction buffer

ModbusServer(std::shared_ptr<Stream> stream, ModbusProtocol protocol, uint8_t stationAddress, size_t bufferSize = defaultBufferSize)

Creates an stream Modbus server and allocates transaction buffer.

Parameters:
  • stream – stream

  • protocol – Modbus protocol

  • stationAddress – station address

  • bufferSize – transaction buffer size

ModbusServer(uint16_t port, std::shared_ptr<Buffer> buffer)

Creates a network Modbus server with shared transaction buffer.

Parameters:
  • port – network port

  • buffer – transaction buffer

ModbusServer(uint16_t port, size_t bufferSize = defaultBufferSize)

Creates a network Modbus server and allocates transaction buffer.

Parameters:
  • port – network port

  • bufferSize – transaction buffer size

~ModbusServer()

Note

Every derived class must call StopTask as the first statement of its own destructor so that the base server task does not call HandleRequest on a partially destroyed object.

virtual esp_err_t Lock(TickType_t timeout = portMAX_DELAY) override

Locks the object.

Parameters:

timeout – timeout in FreeRTOS ticks

Returns:

error code

virtual esp_err_t Unlock() override

Unlocks the object.

Returns:

error code

virtual esp_err_t Enable() override

Enables the server.

Returns:

error code

virtual esp_err_t Disable() override

Disables the server.

Returns:

error code

virtual esp_err_t SetProtocol(ModbusProtocol protocol) override

Note

Returns an error if called from HandleRequest, since changing the protocol mid-transaction would desynchronize the data buffer written by HandleRequest from the one WriteFrame sends.

void AddMemoryArea(std::shared_ptr<ModbusMemoryArea> memoryArea)

Adds a Modbus memory area to the server.

Parameters:

memoryArea – memory area

Returns:

error code

void AddMemoryArea(ModbusMemoryType type, uint16_t address, std::shared_ptr<Buffer> buffer)

Adds buffer as a Modbus memory area to the server.

Parameters:
  • type – memory area type

  • address – memory area address

  • buffer – buffer

virtual bool IsEnabled() override

Checks if the server is enabled.

Returns:

true if the server is enabled

uint8_t GetStationAddress()

Gets the Modbus station address.

Returns:

station address

esp_err_t SetStationAddress(uint8_t stationAddress)

Sets the Modbus station address.

Parameters:

stationAddress – station address

Returns:

error code

esp_err_t SetTaskParameters(const TaskParameters &taskParameters)

Sets the server task parameters.

Parameters:

taskParameters – task parameters

Returns:

error code

std::weak_ptr<Server> GetBaseServer()

Gets the base server (StreamServer or TcpServer)

Returns:

base server

ModbusProtocol GetProtocol()

Gets Modbus protocol.

Returns:

protocol

TickType_t GetReadTimeout()

Gets the read operation timeout.

Returns:

timeout in FreeRTOS ticks

esp_err_t SetReadTimeout(TickType_t timeout)

Sets the read operation timeout.

Parameters:

timeout – timeout in FreeRTOS ticks

Returns:

error code

TickType_t GetWriteTimeout()

Gets the write operation timeout.

Returns:

timeout in FreeRTOS ticks

esp_err_t SetWriteTimeout(TickType_t timeout)

Sets the write operation timeout.

Parameters:

timeout – timeout in FreeRTOS ticks

Returns:

error code

TickType_t GetDelayAfterRead()

Gets the delay between the end of the read operation and unlocking the stream.

Returns:

delay in FreeRTOS ticks

esp_err_t SetDelayAfterRead(TickType_t delay)

Sets the delay between the end of the read operation and unlocking the stream.

Parameters:

delay – delay in FreeRTOS ticks

Returns:

error code

std::string GetName()

Gets the server name.

Returns:

name

void SetName(const std::string &name)

Sets the server name.

Parameters:

name – name

Public Members

Event<Server> enabledEvent

server enabled event

Event<Server> disabledEvent

server disabled event

Public Static Attributes

static constexpr const char *defaultName = "Modbus Server"

Default server name.

static constexpr TickType_t defaultReadTimeout = 3

Default read operation timeout in FreeRTOS ticks.

static constexpr TickType_t defaultWriteTimeout = 300 / portTICK_PERIOD_MS

Default write operation timeout in FreeRTOS ticks.

static constexpr size_t defaultBufferSize = 260

Default transaction buffer size.

Note

Sized for the largest RTU/TCP transaction.

static constexpr ModbusProtocol defaultNetworkProtocol = ModbusProtocol::tcp

Default protocol for network interface.

static constexpr uint8_t defaultNetworkStationAddress = 255

Default station address for network interface.

static constexpr uint16_t maxNumberOfModbusBitsToRead = 2000

Maximum number of coils or discrete inputs that can be read in one request.

static constexpr uint16_t maxNumberOfModbusBitsToWrite = 1968

Maximum number of coils that can be written in one request.

static constexpr uint16_t maxNumberOfModbusRegistersToRead = 125

Maximum number of holding or input registers that can be read in one request.

static constexpr uint16_t maxNumberOfModbusRegistersToWrite = 123

Maximum number of holding registers that can be written in one request.

Protected Functions

esp_err_t StopTask()

Stops the base server task and waits for it to exit.

Note

Must be called as the first statement of the destructor of every derived class so that the base server task does not call HandleRequest on a partially destroyed object. Aborts if called from the HandleRequest, since it cannot wait for its own task to exit.

Returns:

error code

virtual esp_err_t StreamRead(Stream &stream, void *dest, size_t size) override

Reads data from the stream (overriden in ModbusServer to read one byte at a time)

Parameters:
  • stream – stream to read from

  • dest – destination (can be NULL)

  • size – number of bytes to read

Returns:

error code

virtual esp_err_t StreamRead(Stream &stream, Buffer &dest, size_t offset, size_t size) override

Reads data from the stream into the buffer (overriden in ModbusServer to read one byte at a time)

Parameters:
  • stream – stream to read from

  • dest – destination buffer

  • offset – destination buffer offset

  • size – number of bytes to read

Returns:

error code

virtual esp_err_t StreamReadUntil(Stream &stream, char termChar) override

Reads the data from the stream up to the specified termination character (overriden in ModbusServer to read one byte at a time)

Parameters:
  • stream – stream to read from

  • termChar – termination character

Returns:

error code

virtual esp_err_t ReadRtuData(Stream &stream, ModbusFunctionCode functionCode, size_t &dataSize) override

Reads the data for the specified function code (for Modbus RTU protocol)

Parameters:
  • stream – stream to read from

  • functionCode – frame function code

  • dataSize – frame data size

Returns:

error code

virtual esp_err_t HandleRequest(Stream &stream, uint8_t stationAddress, ModbusFunctionCode functionCode, size_t dataSize, uint16_t transactionId)

Handles the Modbus client request.

Parameters:
  • stream – client stream

  • stationAddress – request station address

  • functionCode – request function code

  • dataSize – request data size

  • transactionId – request transaction ID (for Modbus TCP protocol)

Returns:

error code

esp_err_t WriteExceptionFrame(Stream &stream, uint8_t stationAddress, ModbusFunctionCode functionCode, ModbusException exception, uint16_t transactionId)

Writes the Modbus exception frame.

Parameters:
  • stream – client stream

  • stationAddress – frame station address

  • functionCode – frame function code

  • exception – Modbus exception

  • transactionId – frame transaction ID (for Modbus TCP protocol)

Returns:

error code

esp_err_t ReadFrame(Stream &stream, uint8_t &stationAddress, ModbusFunctionCode &functionCode, size_t &dataSize, uint16_t &transactionId)

Reads the Modbus frame.

Parameters:
  • stream – stream to read from

  • stationAddress – frame station address

  • functionCode – frame function code

  • dataSize – frame data size

  • transactionId – frame transaction ID (for Modbus TCP protocol)

Returns:

error code

esp_err_t WriteFrame(Stream &stream, uint8_t stationAddress, ModbusFunctionCode functionCode, size_t dataSize, uint16_t transactionId)

Writes the Modbus frame.

Parameters:
  • stream – stream to write to

  • stationAddress – frame station address

  • functionCode – frame function code

  • dataSize – frame data size

  • transactionId – frame transaction ID (for Modbus TCP protocol)

Returns:

error code

Buffer &GetDataBuffer()

Gets the data part of the transaction buffer with offset and size based on the Modbus protocol.

Returns:

data buffer