modbus: include timer

This commit is contained in:
Vasily Davydov 2022-10-27 13:14:37 +03:00
parent a3332c562f
commit 2bef3ce8c0

View File

@ -1,6 +1,7 @@
/**
@file
Arduino library for communicating with Modbus slaves over RS232/485 (via RTU protocol).
Arduino library for communicating with Modbus slaves over RS232/485 (via RTU
protocol).
@defgroup setup ModbusMaster Object Instantiation/Initialization
@defgroup buffer ModbusMaster Buffer Management
@ -33,10 +34,10 @@ Arduino library for communicating with Modbus slaves over RS232/485 (via RTU pro
*/
#ifndef ModbusMaster_h
#define ModbusMaster_h
#include "Timer.h"
/**
@def __MODBUSMASTER_DEBUG__ (1).
@ -46,24 +47,24 @@ Set to 1 to enable debugging features within class:
*/
#define __MODBUSMASTER_DEBUG__ (0)
/* _____STANDARD INCLUDES____________________________________________________ */
/* _____STANDARD INCLUDES____________________________________________________
*/
// include types & constants of Wiring core API
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
//#include "WProgram.h"
#include <stdint.h>
#include <cstddef>
#include <stdint.h>
#endif
uint32_t millis();
#define BYTE 0xA5
/* _____UTILITY MACROS_______________________________________________________ */
/* _____UTILITY MACROS_______________________________________________________
*/
/* _____PROJECT INCLUDES_____________________________________________________ */
/* _____PROJECT INCLUDES_____________________________________________________
*/
// functions to calculate Modbus Application Data Unit CRC
//#include "util/crc16.h"
// moved inlcuding crc16.h to ModbusMaster.cpp
@ -72,24 +73,24 @@ uint32_t millis();
///#include "util/word.h"
#include "word.h"
#include "SerialPort.h"
/* _____CLASS DEFINITIONS____________________________________________________ */
/* _____CLASS DEFINITIONS____________________________________________________
*/
/**
Arduino class library for communicating with Modbus slaves over
RS232/485 (via RTU protocol).
*/
class ModbusMaster
{
public:
ModbusMaster();
ModbusMaster(uint8_t);
ModbusMaster(uint8_t, uint8_t);
public:
ModbusMaster ();
ModbusMaster (uint8_t);
ModbusMaster (uint8_t, uint8_t);
void begin();
void begin(uint16_t);
void idle(void (*)());
void begin ();
void begin (uint16_t);
void idle (void (*) ());
// Modbus exception codes
/**
@ -203,75 +204,91 @@ class ModbusMaster
*/
static const uint8_t ku8MBInvalidCRC = 0xE3;
uint16_t getResponseBuffer(uint8_t);
void clearResponseBuffer();
uint8_t setTransmitBuffer(uint8_t, uint16_t);
void clearTransmitBuffer();
uint16_t getResponseBuffer (uint8_t);
void clearResponseBuffer ();
uint8_t setTransmitBuffer (uint8_t, uint16_t);
void clearTransmitBuffer ();
void beginTransmission(uint16_t);
uint8_t requestFrom(uint16_t, uint16_t);
void sendBit(bool);
void send(uint8_t);
void send(uint16_t);
void send(uint32_t);
uint8_t available(void);
uint16_t receive(void);
void beginTransmission (uint16_t);
uint8_t requestFrom (uint16_t, uint16_t);
void sendBit (bool);
void send (uint8_t);
void send (uint16_t);
void send (uint32_t);
uint8_t available (void);
uint16_t receive (void);
uint8_t readCoils (uint16_t, uint16_t);
uint8_t readDiscreteInputs (uint16_t, uint16_t);
uint8_t readHoldingRegisters (uint16_t, uint16_t);
uint8_t readInputRegisters (uint16_t, uint8_t);
uint8_t writeSingleCoil (uint16_t, uint8_t);
uint8_t writeSingleRegister (uint16_t, uint16_t);
uint8_t writeMultipleCoils (uint16_t, uint16_t);
uint8_t writeMultipleCoils ();
uint8_t writeMultipleRegisters (uint16_t, uint16_t);
uint8_t writeMultipleRegisters ();
uint8_t maskWriteRegister (uint16_t, uint16_t, uint16_t);
uint8_t readWriteMultipleRegisters (uint16_t, uint16_t, uint16_t, uint16_t);
uint8_t readWriteMultipleRegisters (uint16_t, uint16_t);
uint8_t readCoils(uint16_t, uint16_t);
uint8_t readDiscreteInputs(uint16_t, uint16_t);
uint8_t readHoldingRegisters(uint16_t, uint16_t);
uint8_t readInputRegisters(uint16_t, uint8_t);
uint8_t writeSingleCoil(uint16_t, uint8_t);
uint8_t writeSingleRegister(uint16_t, uint16_t);
uint8_t writeMultipleCoils(uint16_t, uint16_t);
uint8_t writeMultipleCoils();
uint8_t writeMultipleRegisters(uint16_t, uint16_t);
uint8_t writeMultipleRegisters();
uint8_t maskWriteRegister(uint16_t, uint16_t, uint16_t);
uint8_t readWriteMultipleRegisters(uint16_t, uint16_t, uint16_t, uint16_t);
uint8_t readWriteMultipleRegisters(uint16_t, uint16_t);
private:
private:
uint8_t _u8SerialPort; ///< serial port (0..3) initialized in constructor
uint8_t _u8MBSlave; ///< Modbus slave (1..255) initialized in constructor
uint16_t _u16BaudRate; ///< baud rate (300..115200) initialized in begin()
static const uint8_t ku8MaxBufferSize = 64; ///< size of response/transmit buffers
static const uint8_t ku8MaxBufferSize
= 64; ///< size of response/transmit buffers
uint16_t _u16ReadAddress; ///< slave register from which to read
uint16_t _u16ReadQty; ///< quantity of words to read
uint16_t _u16ResponseBuffer[ku8MaxBufferSize]; ///< buffer to store Modbus slave response; read via GetResponseBuffer()
uint16_t _u16ResponseBuffer[ku8MaxBufferSize]; ///< buffer to store Modbus
///< slave response; read via
///< GetResponseBuffer()
uint16_t _u16WriteAddress; ///< slave register to which to write
uint16_t _u16WriteQty; ///< quantity of words to write
uint16_t _u16TransmitBuffer[ku8MaxBufferSize]; ///< buffer containing data to transmit to Modbus slave; set via SetTransmitBuffer()
uint16_t* txBuffer; // from Wire.h -- need to clean this up Rx
uint16_t
_u16TransmitBuffer[ku8MaxBufferSize]; ///< buffer containing data to
///< transmit to Modbus slave; set
///< via SetTransmitBuffer()
uint16_t *txBuffer; // from Wire.h -- need to clean this up Rx
uint8_t _u8TransmitBufferIndex;
uint16_t u16TransmitBufferLength;
uint16_t* rxBuffer; // from Wire.h -- need to clean this up Rx
uint16_t *rxBuffer; // from Wire.h -- need to clean this up Rx
uint8_t _u8ResponseBufferIndex;
uint8_t _u8ResponseBufferLength;
// Modbus function codes for bit access
static const uint8_t ku8MBReadCoils = 0x01; ///< Modbus function 0x01 Read Coils
static const uint8_t ku8MBReadDiscreteInputs = 0x02; ///< Modbus function 0x02 Read Discrete Inputs
static const uint8_t ku8MBWriteSingleCoil = 0x05; ///< Modbus function 0x05 Write Single Coil
static const uint8_t ku8MBWriteMultipleCoils = 0x0F; ///< Modbus function 0x0F Write Multiple Coils
static const uint8_t ku8MBReadCoils
= 0x01; ///< Modbus function 0x01 Read Coils
static const uint8_t ku8MBReadDiscreteInputs
= 0x02; ///< Modbus function 0x02 Read Discrete Inputs
static const uint8_t ku8MBWriteSingleCoil
= 0x05; ///< Modbus function 0x05 Write Single Coil
static const uint8_t ku8MBWriteMultipleCoils
= 0x0F; ///< Modbus function 0x0F Write Multiple Coils
// Modbus function codes for 16 bit access
static const uint8_t ku8MBReadHoldingRegisters = 0x03; ///< Modbus function 0x03 Read Holding Registers
static const uint8_t ku8MBReadInputRegisters = 0x04; ///< Modbus function 0x04 Read Input Registers
static const uint8_t ku8MBWriteSingleRegister = 0x06; ///< Modbus function 0x06 Write Single Register
static const uint8_t ku8MBWriteMultipleRegisters = 0x10; ///< Modbus function 0x10 Write Multiple Registers
static const uint8_t ku8MBMaskWriteRegister = 0x16; ///< Modbus function 0x16 Mask Write Register
static const uint8_t ku8MBReadWriteMultipleRegisters = 0x17; ///< Modbus function 0x17 Read Write Multiple Registers
static const uint8_t ku8MBReadHoldingRegisters
= 0x03; ///< Modbus function 0x03 Read Holding Registers
static const uint8_t ku8MBReadInputRegisters
= 0x04; ///< Modbus function 0x04 Read Input Registers
static const uint8_t ku8MBWriteSingleRegister
= 0x06; ///< Modbus function 0x06 Write Single Register
static const uint8_t ku8MBWriteMultipleRegisters
= 0x10; ///< Modbus function 0x10 Write Multiple Registers
static const uint8_t ku8MBMaskWriteRegister
= 0x16; ///< Modbus function 0x16 Mask Write Register
static const uint8_t ku8MBReadWriteMultipleRegisters
= 0x17; ///< Modbus function 0x17 Read Write Multiple Registers
// Modbus timeout [milliseconds]
static const uint16_t ku16MBResponseTimeout = 2000; ///< Modbus timeout [milliseconds]
static const uint16_t ku16MBResponseTimeout
= 2000; ///< Modbus timeout [milliseconds]
// master function that conducts Modbus transactions
uint8_t ModbusMasterTransaction(uint8_t u8MBFunction);
uint8_t ModbusMasterTransaction (uint8_t u8MBFunction);
// idle callback function; gets called during idle time between TX and RX
void (*_idle)();
void (*_idle) ();
SerialPort *MBSerial = NULL; // added by KRL
};
#endif