Using µC/Modbus
In order to use µC/Modbus in your product, you need to make sure you have the following elements:
Setup the µC/CPU for the CPU YOU are using:
You need to create a cpu.h
and cpu_a.asm
files (see section 2.04).
Setup the BSP for the UARTs and the RTU timer YOU are using:
You need to create a mb_bsp.c
file (see section 5). You should note that µC/Modbus includes a mb_bsp.c
for different processors and boards. You can use these files as examples on how to write the BSP.
Setup the RTOS Interface for the RTOS YOU are using:
µC/Modbus includes RTOS interfaces for µC/OS-II and µC/OS-III (see section 6). If you are using a different RTOS, you will need to provide an mb_os.c
file. You can actually model your RTOS interface from the one provided for µC/OS-II and µC/OS-III.
For µC/OS-II and µC/OS-III, don’t forget to configure #defines
to setup the task priority and stack size (should be placed in your application’s app_cfg.h
file).
If your product doesn’t require the use of a RTOS you can use the No-OS port. This port is only for µC/Modbus-S. µC/Modbus-M always requires a RTOS interface.
Initialize µC/Modbus and configure your channels.
µC/Modbus is initialized by simply calling MB_Init()
and specifying the Modbus RTU frequency as an argument. Once initialized, you simply need to configure each Modbus channels (using MB_CfgCh()
) as shown in the example below. Here, our product has three Modbus ports: a Modbus RTU port communicating at 9600 baud and a Modbus ASCII port communicating at 19200 baud and a Modbus ASCII Master port communicating at 19200 baud. Both Modbus Slave ports assume Modbus address 1 but, you can specify different node address for each one if you want.
MB_Init(1000); // Initialize uC/Modbus, RTU timer at 1000 Hz MB_CfgCh( 1, // ... Modbus Node # for this slave channel MODBUS_SLAVE, // ... This is a SLAVE 0, // ... 0 when a slave MODBUS_MODE_RTU, // ... Modbus Mode (_ASCII or _RTU) 1, // ... Specify UART #1 9600, // ... Baud Rate 8, // ... Number of data bits 7 or 8 MODBUS_PARITY_NONE,// ... Parity: _NONE, _ODD or _EVEN 1, // ... Number of stop bits 1 or 2 MODBUS_WR_EN); // ... Enable (_EN) or disable (_DIS) writes MB_CfgCh( 1, // ... Modbus Node # for this slave channel MODBUS_SLAVE, // ... This is a SLAVE 0, // ... 0 when a slave MODBUS_MODE_ASCII, // ... Modbus Mode (_ASCII or _RTU) 1, // ... Specify UART #2 19200, // ... Baud Rate 8, // ... Number of data bits 7 or 8 MODBUS_PARITY_NONE,// ... Parity: _NONE, _ODD or _EVEN 1, // ... Number of stop bits 1 or 2 MODBUS_WR_EN); // ... Enable (_EN) or disable (_DIS) writes
Important
If your application is using a RTOS interface, once a µC/Modbus-S channel has been configured, you do not need to do anything else in your code. In other words, a Modbus master can start communicating with your Modbus slave without having to add any additional code in your application tasks! Refer to section 7 for details on how this works.
If your application is not using a RTOS interface, once a µC/Modbus-S channel has been configured, your application needs to call MB_OS_RxTask()to poll the Modbus Slave channels. Refer to section 8 for details on how this works.
MB_CfgCh( 1, // ... Modbus Node # for this slave channel MODBUS_MASTER, // ... This is a MASTER OS_TICKS_PER_SEC, // ... One second timeout waiting for slave response MODBUS_MODE_ASCII, // ... Modbus Mode (_ASCII or _RTU) 2, // ... Specify UART #3 19200, // ... Baud Rate 8, // ... Number of data bits 7 or 8 MODBUS_PARITY_NONE,// ... Parity: _NONE, _ODD or _EVEN 1, // ... Number of stop bits 1 or 2 MODBUS_WR_EN); // ... Enable (_EN) or disable (_DIS) writes
Important
Once a µC/Modbus-M channel has been configured, your application code needs to call MBM_FC??_???()
functions as described in this section in order to obtain data from Modbus slaves connected to that channel. Refer to section 8 for details on how this works.
Your application interfaces to µC/Modbus via a number of functions that allow you to change the behavior of channels. For each interface functions µC/Modbus applies to both Master or Slave channels, µC/Modbus-S applies only to Slave channels and µC/Modbus-M applies only to Master channels.