Simple, tiny minimal library to implement a ModBus slave in mbed.
Diff: tinymal_modbus.h
- Revision:
- 0:4f5da8a923c4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tinymal_modbus.h Fri Feb 22 14:31:13 2019 +0000 @@ -0,0 +1,89 @@ +/** @file tinymal_modbus.h + * Library to implement a ModBus slave in mbed. + * @note Currently supports 38400 baud rate only. + * + * @author Fernando Cosentino + * os.mbed.com/users/fbcosentino + * + * Example: + * @code + * #include "mbed.h" + * #include "tinymal_modbus.h" + * + * // pins are for LPC11U35 + * Serial rs485(P0_19, P0_18); // a serial port object + * DigitalOut driver_pin(P0_2); // direction driver pin + * DigitalOut coil1(P0_20); // a coil - this is the application + * + * int main() { + * rs485.baud(38400); + * tinymod_Init(&rs485, &driver_pin); + * tinymod_Address(10); + * + * // tiny_regs is the array containing the modbus registers + * tiny_regs[0] = 0; // Sets an initial value to register 0 + * + * while(1) { + * // call this periodically to process the messages + * tinymod_Check(); + * + * // make the coil reflect the internal modbus register + * if (tiny_regs[0] > 0) { + * coil1 = 1; + * } + * else { + * coil1 = 0; + * } + * } + * } + * @endcode + */ + +#include "mbed.h" + +#define TINYMOD_NUM_REGS 16 + +#define TINYMOD_MODE_SLAVE 0 +#define TINYMOD_MODE_MASTER 1 + +#define MODBUS_FUNC_READ 3 +#define MODBUS_FUNC_WRITE_SINGLE 6 +#define MODBUS_FUNC_WRITE_MULT 16 + + +extern uint8_t tinymod_address; +extern int tinymod_mode; + + +/** + * Array storing the register values - your application will work with this. + */ +extern uint16_t tiny_regs[TINYMOD_NUM_REGS]; + + +/** + * Initialises the internal Modbus receiver based on the specified serial port + * direction driver objects. You must initialise those objects yourself before + * instancing the tinymal modbus object. + * + * @param ser_obj Serial instance of the Serial class. + * @param driver_obj Digital output pin instance of the DigitalOut class + */ +void tinymod_Init(Serial * ser_obj, DigitalOut * driver_obj); + +/** + * Sets the listening address for this device. Valid addresses are in the + * range of 0 - 247 decimal (0x00 - 0xF7). + * + * @param addr Address this device should respond to (0 - 247) + */ +void tinymod_Address(uint8_t addr); + +/** + * Internally processes any received messages - you must call this as often + * as possible (ideally once per main loop if your main loop is short). + * Messages are not automatically processed to keep interrupt handling to the + * bare minimum, so you have the freedom to decide when you are going to spend + * processor time processing the message via this function call. + */ +void tinymod_Check(void); \ No newline at end of file