Noiasca Modbus Server Simple
A lightweight Modbus Server Library
Public Member Functions | Protected Member Functions | List of all members
ModbusServer Class Reference

Class for Modbus Server Modbus Server (aka Modbus Slave) More...

#include <NoiascaModbusServerSimple.h>

Public Member Functions

 ModbusServer (uint8_t serverId, Stream &serial)
 This is the constructor of the ModbusServer Simple class. More...
 
void setPreTransmission (void(*cbPreTransmission)())
 action before the first byte will be transmitted. More...
 
void setPostTransmission (void(*cbPostTransmission)())
 action after the last byte was transmitted. More...
 
void setIsValidAddress (bool(*cbIsValidAddress)(uint16_t))
 validate received additional addresses. FC3/FC6/FC16. More...
 
void setIsValidInputRegister (bool(*cbIsValidInputRegister)(uint16_t))
 validate input register. FC4 Read input register More...
 
void setRegisterSent (const CallBack cbRegisterSent)
 Client has sent an additional register FC6/FC16 Write Holding Registers if Holding Register is an additional address. More...
 
void setRegisterWritten (const CallBack cbRegisterWritten)
 Client has written to a holding register. FC6/FC16 Write Holding Register. More...
 
void setRegisterRead (const CallBack cbRegisterRead)
 Client has read a holding register. FC3 Read Multiple Holding register. More...
 
void setRegisterViewed (uint16_t(*cbRegisterViewed)(uint16_t))
 Client has viewed an additional address FC3 Read Multiple Holding Register. More...
 
void setInputRegisterViewed (uint16_t(*cbInputRegisterViewed)(uint16_t))
 Client has viewed an input register. FC4 Read Input Register. More...
 
int setNoOfCoils (uint16_t newValue)
 sets the valid number of coils FC1/FC5/FC15 More...
 
void setReadCoil (uint16_t(*cbReadCoil)(uint16_t))
 returns one readed Coil from user sketch FC1 Read Coils. More...
 
void setWriteCoil (const CallBack cbWriteCoil)
 Writes value to coil. FC5 Write Single Coil. FC15 Write Multiple Coils. More...
 
void setReadDiscreteInput (uint16_t(*cbReadDiscreteInput)(uint16_t))
 returns one discrete input from user sketch. FC2 Read Discrete Input. More...
 
void setStreamEnd (const CallBack cbStreamEnd)
 transmission of several registers has ended. FC16 Write Multiple Hodling Registers. More...
 
void setOnClientActivity (void(*cbOnClientActivitiy)())
 Client activity. More...
 
int setNoOfDiscreteInputs (uint16_t newValue)
 sets the valid number of discrete inputs FC2 Read Discrete Input More...
 
void begin (Stream *SerialPort, long baud, uint8_t byteFormat, uint8_t serverId, uint16_t holdingRegsSize, uint16_t *regs)
 configures the Modbus instance More...
 
void modbus_update_comms (long baud, unsigned char byteFormat)
 modify Modbus parameters during runtime More...
 
void setServerId (uint8_t serverId)
 modifies the Modbus Server ID (slave ID) More...
 
uint16_t update ()
 Main "run" function to be called in loop() More...
 

Protected Member Functions

void exceptionResponse (unsigned char exception)
 sends exception message
 
unsigned int calculateCRC (unsigned char bufferSize)
 calculates CRC of bufferSize More...
 

Detailed Description

Class for Modbus Server Modbus Server (aka Modbus Slave)

Constructor & Destructor Documentation

◆ ModbusServer()

ModbusServer::ModbusServer ( uint8_t  serverId,
Stream &  serial 
)
inline

This is the constructor of the ModbusServer Simple class.

Parameters
serverIdthe server ID (slave ID) of this device
seriala reference to the serial interface. Can be an instance of HW Serial, SoftSerial or AltSerial.

Member Function Documentation

◆ begin()

void ModbusServer::begin ( Stream *  SerialPort,
long  baud,
uint8_t  byteFormat,
uint8_t  serverId,
uint16_t  holdingRegsSize,
uint16_t *  regs 
)
inline

configures the Modbus instance

Init function. Call this function in setup() former modbus_configure

Parameters
SerialPorta pointer to your serial interface.
baudthe baud rate of your serial interface.
byteFormate.g. 8N1
serverIdthe server ID (slave ID) of your device.
holdingRegsSizethe total number of all holding registers.
regsa pointer to your array of holding registers.

◆ calculateCRC()

unsigned int ModbusServer::calculateCRC ( unsigned char  bufferSize)
inlineprotected

calculates CRC of bufferSize

Parameters
bufferSizethe used number of bytes in the frame buffer
Returns
caclulated CRC

◆ modbus_update_comms()

void ModbusServer::modbus_update_comms ( long  baud,
unsigned char  byteFormat 
)
inline

modify Modbus parameters during runtime

Can be used to modify Modbus parameters. Will adopt frame rates based on baud. Don't forget to set baud (and byte format) of your interface.

Parameters
baudspeed of serial interface.
byteFormate.g. 8N1

◆ setInputRegisterViewed()

void ModbusServer::setInputRegisterViewed ( uint16_t(*)(uint16_t)  cbInputRegisterViewed)
inline

Client has viewed an input register. FC4 Read Input Register.

Set callback to receive value from input register.

See also
setIsValidInputRegister

◆ setIsValidAddress()

void ModbusServer::setIsValidAddress ( bool(*)(uint16_t)  cbIsValidAddress)
inline

validate received additional addresses. FC3/FC6/FC16.

This function validates should validate if the received address is correct.

See also
setRegisterSent
setRegisterWritten
setRegisterViewed

◆ setIsValidInputRegister()

void ModbusServer::setIsValidInputRegister ( bool(*)(uint16_t)  cbIsValidInputRegister)
inline

validate input register. FC4 Read input register

Set callback to to validate if the address should be handled as valid input register.

See also
setInputRegisterViewed

◆ setNoOfCoils()

int ModbusServer::setNoOfCoils ( uint16_t  newValue)
inline

sets the valid number of coils FC1/FC5/FC15

FC1 Read Coils. FC5 Write Single Coil. FC15 Write Multiple Coils.

Returns
0 on success
See also
setWriteCoil
setReadCoil

◆ setNoOfDiscreteInputs()

int ModbusServer::setNoOfDiscreteInputs ( uint16_t  newValue)
inline

sets the valid number of discrete inputs FC2 Read Discrete Input

Define the number of discrete Inputs.

Returns
0 on success
See also
setReadDiscreteInput

◆ setOnClientActivity()

void ModbusServer::setOnClientActivity ( void(*)()  cbOnClientActivitiy)
inline

Client activity.

Set callback to a function which gets called if client has send a to this server.

◆ setPostTransmission()

void ModbusServer::setPostTransmission ( void(*)()  cbPostTransmission)
inline

action after the last byte was transmitted.

This function gets called after a Modbus message has finished sending (i.e. after all data has been physically transmitted onto the serial bus).

Typical usage of this callback is to enable an RS485 transceiver's Receiver Enable pin, and disable its Driver Enable pin.

◆ setPreTransmission()

void ModbusServer::setPreTransmission ( void(*)()  cbPreTransmission)
inline

action before the first byte will be transmitted.

This function gets called just before a Modbus message is responded over serial. Typical usage of this callback is to enable an RS485 transceiver's Driver Enable pin, and optionally disable its Receiver Enable pin.

◆ setReadCoil()

void ModbusServer::setReadCoil ( uint16_t(*)(uint16_t)  cbReadCoil)
inline

returns one readed Coil from user sketch FC1 Read Coils.

Set callback to retrieves coil status from user sketch.

See also
setNoOfCoils
setWriteCoil inverse function.

◆ setReadDiscreteInput()

void ModbusServer::setReadDiscreteInput ( uint16_t(*)(uint16_t)  cbReadDiscreteInput)
inline

returns one discrete input from user sketch. FC2 Read Discrete Input.

Set callback to retrieves discrete input status from user sketch.

See also
setNoOfDiscreteInputs

◆ setRegisterRead()

void ModbusServer::setRegisterRead ( const CallBack  cbRegisterRead)
inline

Client has read a holding register. FC3 Read Multiple Holding register.

Set callback to acknowledge the user sketch about client read activity.

See also
setRegisterWritten inverse function for FC6/FC16

◆ setRegisterSent()

void ModbusServer::setRegisterSent ( const CallBack  cbRegisterSent)
inline

Client has sent an additional register FC6/FC16 Write Holding Registers if Holding Register is an additional address.

Set callback to take over received data to user sketch

See also
setIsValidAddress
setRegisterWritten
setRegisterViewed

◆ setRegisterViewed()

void ModbusServer::setRegisterViewed ( uint16_t(*)(uint16_t)  cbRegisterViewed)
inline

Client has viewed an additional address FC3 Read Multiple Holding Register.

Set callback to read from an additional address (outside of Holding Register Array).

See also
setIsValidAddress
setRegisterSent inverse Function for FC6/16

◆ setRegisterWritten()

void ModbusServer::setRegisterWritten ( const CallBack  cbRegisterWritten)
inline

Client has written to a holding register. FC6/FC16 Write Holding Register.

Set callback to acknowledge the user sketch about client write activity

See also
setRegisterRead inverse function for FC3

◆ setServerId()

void ModbusServer::setServerId ( uint8_t  serverId)
inline

modifies the Modbus Server ID (slave ID)

Assigns a new Modbus server ID to this device. Currently the new server ID is not check, but don't use other values than 1..247.

Parameters
serverIdthe server ID (slave ID) from 1 to 247.

◆ setStreamEnd()

void ModbusServer::setStreamEnd ( const CallBack  cbStreamEnd)
inline

transmission of several registers has ended. FC16 Write Multiple Hodling Registers.

Set callback to function when several values were send using FC16 / end of transmission of several values.

◆ setWriteCoil()

void ModbusServer::setWriteCoil ( const CallBack  cbWriteCoil)
inline

Writes value to coil. FC5 Write Single Coil. FC15 Write Multiple Coils.

Set callback to write coil commands. User must implement the On or Off of the coil (output).

See also
setReadCoil inverse function.

◆ update()

uint16_t ModbusServer::update ( )
inline

Main "run" function to be called in loop()

former modbus_unsigned intupdate()

Returns
errorCount