27    IllegalFunction                    = 0x01,
 
   28    IllegalDataAddress                 = 0x02,
 
   29    IllegalDataValue                   = 0x03,
 
   30    SlaveDeviceFailure                 = 0x04,
 
   32    SlaveDeviceBusy                    = 0x06,
 
   33    NegativeAcknowledge                = 0x07,
 
   34    MemoryParityError                  = 0x08,
 
   35    GatewayPathUnavailable             = 0x10,
 
   36    GatewayTargetDeviceFailedToRespond = 0x11,
 
   39    ErrorCodeCRCError = 0b0111111,
 
   40    InvalidCRC        = 0b01111110,
 
   41    InvalidByteOrder  = 0b01111101,
 
   42    InvalidMessageID  = 0b01111100,
 
   43    ProtocolError     = 0b01111011,
 
   44    ConnectionClosed  = 0b01111010,
 
 
   52    case IllegalDataAddress:
 
   53    case IllegalDataValue:
 
   54    case SlaveDeviceFailure:
 
   57    case NegativeAcknowledge:
 
   58    case MemoryParityError:
 
   59    case GatewayPathUnavailable:
 
   60    case GatewayTargetDeviceFailedToRespond:
 
   62    case ErrorCodeCRCError:
 
   64    case InvalidByteOrder:
 
   65    case InvalidMessageID:
 
   67    case ConnectionClosed:
 
 
   78        return "Illegal function";
 
   79    case IllegalDataAddress:
 
   80        return "Illegal data address";
 
   81    case IllegalDataValue:
 
   82        return "Illegal data value";
 
   83    case SlaveDeviceFailure:
 
   84        return "Slave device failure";
 
   88        return "Slave device busy";
 
   89    case NegativeAcknowledge:
 
   90        return "Negative acknowledge";
 
   91    case MemoryParityError:
 
   92        return "Memory parity error";
 
   93    case GatewayPathUnavailable:
 
   94        return "Gateway path unavailable";
 
   95    case GatewayTargetDeviceFailedToRespond:
 
   96        return "Gateway target device failed to respond";
 
   97    case ErrorCodeCRCError:
 
   98        return "CRC error code error";
 
  100        return "Invalid CRC";
 
  101    case InvalidByteOrder:
 
  102        return "Invalid byte order";
 
  103    case InvalidMessageID:
 
  104        return "Invalid messageID (TCP/IP)";
 
  106        return "Protocol error (may be timeout)";
 
  107    case ConnectionClosed:
 
  108        return "Connection is closed";
 
  112        return "Undefined Error";
 
 
  119    ReadDiscreteOutputCoils          = 0x01,
 
  120    ReadDiscreteInputContacts        = 0x02,
 
  121    ReadAnalogOutputHoldingRegisters = 0x03,
 
  122    ReadAnalogInputRegisters         = 0x04,
 
  125    WriteSingleDiscreteOutputCoil   = 0x05,
 
  126    WriteSingleAnalogOutputRegister = 0x06,
 
  129    WriteMultipleDiscreteOutputCoils          = 0x0F,
 
  130    WriteMultipleAnalogOutputHoldingRegisters = 0x10,
 
 
  142    case ReadDiscreteOutputCoils:
 
  143    case ReadAnalogInputRegisters:
 
  144    case ReadDiscreteInputContacts:
 
  145    case ReadAnalogOutputHoldingRegisters:
 
  147    case WriteSingleAnalogOutputRegister:
 
  148    case WriteSingleDiscreteOutputCoil:
 
  150    case WriteMultipleAnalogOutputHoldingRegisters:
 
  151    case WriteMultipleDiscreteOutputCoils:
 
  152        return WriteMultiple;
 
  154        throw std::runtime_error(
"The function code is undefined");
 
 
  164    case ReadDiscreteOutputCoils:
 
  165    case WriteSingleDiscreteOutputCoil:
 
  166    case WriteMultipleDiscreteOutputCoils:
 
  168    case ReadDiscreteInputContacts:
 
  169        return InputContacts;
 
  170    case ReadAnalogOutputHoldingRegisters:
 
  171    case WriteSingleAnalogOutputRegister:
 
  172    case WriteMultipleAnalogOutputHoldingRegisters:
 
  173        return HoldingRegisters;
 
  174    case ReadAnalogInputRegisters:
 
  175        return InputRegisters;
 
  177        throw std::runtime_error(
"The function code is undefined");
 
 
  184    case ReadDiscreteOutputCoils:
 
  185        return "Read from output coils";
 
  186    case ReadDiscreteInputContacts:
 
  187        return "Read from input contacts";
 
  188    case ReadAnalogOutputHoldingRegisters:
 
  189        return "Read from output registers";
 
  190    case ReadAnalogInputRegisters:
 
  191        return "Read from input registers";
 
  192    case WriteSingleAnalogOutputRegister:
 
  193        return "Write to single analog register";
 
  194    case WriteSingleDiscreteOutputCoil:
 
  195        return "Write to single coil";
 
  196    case WriteMultipleAnalogOutputHoldingRegisters:
 
  197        return "Write to multiple holding registers";
 
  198    case WriteMultipleDiscreteOutputCoils:
 
  199        return "Write to multiple output coils";
 
 
  207    return static_cast<uint16_t
>(buf[1]) +
 
  208           (
static_cast<uint16_t
>(buf[0]) << 8u);
 
 
  225inline std::pair<uint8_t, uint8_t> 
splitUint16(
const uint16_t val) {
 
  226    return std::make_pair((val >> 8) & 0xFF, val & 0xFF);
 
 
  230inline void pushUint16(std::vector<uint8_t> &buffer, 
const uint16_t val) {
 
  232    buffer.push_back(high);
 
  233    buffer.push_back(low);
 
 
 
uint16_t calculateCRC(const uint8_t *buff, std::size_t len)
Calculates CRC based on the input buffer - C style.
Definition crc.cpp:3
Definition modbusUtils.hpp:21
MBFunctionType
Simplified function types.
Definition modbusUtils.hpp:137
uint16_t bigEndianConv(const uint8_t *buf)
Create uint16_t from buffer of two bytes, ex. { 0x01, 0x02 } => 0x0102.
Definition modbusUtils.hpp:206
std::pair< uint8_t, uint8_t > splitUint16(const uint16_t val)
Definition modbusUtils.hpp:225
bool isStandardErrorCode(MBErrorCode code)
Checks if error code is modbus standard error code.
Definition modbusUtils.hpp:49
void pushUint16(std::vector< uint8_t > &buffer, const uint16_t val)
Insert uint16_t into buffer of uint8_t's. Preserve big endianess.
Definition modbusUtils.hpp:230
MBFunctionRegisters
Simplified register types.
Definition modbusUtils.hpp:159
MBErrorCode
Definition modbusUtils.hpp:25
uint16_t calculateCRC(const uint8_t *buff, size_t len)
Definition modbusUtils.hpp:212
MBFunctionCode
All modbus standard function codes + Undefined one.
Definition modbusUtils.hpp:117
std::string mbFunctionToStr(MBFunctionCode code) noexcept
Converts modbus function code to its string represenatiton.
Definition modbusUtils.hpp:182
MBFunctionType functionType(const MBFunctionCode code)
Checks "Function type", according to MBFunctionType.
Definition modbusUtils.hpp:140
MBFunctionRegisters functionRegister(const MBFunctionCode code)
Get register type based on function code.
Definition modbusUtils.hpp:162
std::string mbErrorCodeToStr(MBErrorCode code) noexcept
Converts Modbus error code to it's string representation.
Definition modbusUtils.hpp:75