µC/Modbus-S might use an RTOS interface, µC/Modbus-M assumes the presence of an RTOS but, it doesn’t assume any specific RTOS. In fact, µC/Modbus was designed to work with just about commercial RTOS by providing a simple RTOS interface layer.
µC/Modbus is provided with a µC/ModbusRTOS interface layer so you can start using µC/Modbus if you are also using µC/OS-II or µC/OS-III in your product or, use this interface layer as an example for your own RTOS.
Figure 7-1 shows a flow diagram of receive model.
MB_OS_Init()
This function is called by µC/Modbusto initialize the RTOS interface for the RTOS you are using. You would typically create the ‘Modbus Rx Task’ and setup the mechanism needed to signal this task when a packet is received or an RTU timeout occurred for the channel.
Prototype
void MB_OS_Init(void);
Arguments
None.
Returned Value
None.
Notes / Warnings
None.
Called By
MB_Init()
in mb.c
MB_OS_Exit()
This function is called by MB_Exit()
(see mb.c
) to gracefully terminate the Modbus task. In the case of µC/OS-II, we would simply delete the ‘Modbus Rx Task’ and the message queue. In the case of µC/OS-III, we would simply delete the ‘Modbus Rx Task’ since the message queue is built into the task.
Prototype
void MB_OS_Exit(void);
Arguments
None.
Returned Value
None.
Notes / Warnings
None.
Called By
MB_Exit()
in mb.c
MB_OS_RxSignal()
This function signals the reception of a complete packet. It is called by either the RTU timer interrupt for each channel that has not received characters within the timeout period or, by Modbus ASCII channels when a line feed character (i.e. 0x0A
) is received.
Prototype
void MB_OS_RxSignal(MODBUS_CH *pch);
Arguments
pch
specifies a pointer to the Modbus channel data structure associated with the received packet.
Returned Value
None.
Notes / Warnings
None.
Called By
MB_RTU_TmrUpdate()
or MB_ASCII_RxByte()
in mb.c
MB_OS_RxWait()
This function waits for a response from a slave. MB_OS_RxWait()
is called from a Modbus master task after it sent a command to a slave and is waiting for a response. If the response is not received within the timeout specified when the channel was configured (see MB_CfgCh()
) then this function returns to the caller and notifies it of the timeout.
Prototype
void MB_OS_RxWait(MODBUS_CH *pch, CPU_INT16U *perr);
Arguments
pch
specifies a pointer to the Modbus channel data structure associated with the received packet.
perr
is a pointer to an error code indicating the outcome of the call and can be one of the following errors:
MODBUS_ERR_NONE
the call was successful
MODBUS_ERR_TIMED_OUT
A response was not received within the specified timeout.
MODBUS_ERR_NOT_MASTER
You called this function from a non-master channel
MODBUS_ERR_INVALID
An invalid error occurred. Refer to MB_OS.C
for details.
Notes / Warnings
None.
Called By:
MBM_FC??_???()
in MBM_CORE.C
Configuration
If you use µC/OS-II, you need to configure the following #define
constants:
OS_Q_EN
The size needs to be as large as the number of Modbus channels.
OS_SEM_EN
If you use Modbus Master, you need to enable semaphore services.
MB_OS_CFG_RX_TASK_ID
MB_OS_CFG_RX_TASK_PRIO
MB_OS_CFG_RX_TASK_STK_SIZE
If you use µC/OS-III, you need to configure the following #define
constants:
OS_CFG_Q_EN
The size of the message queue will be set to the number of channels (i.e. MODBUS_CFG_MAX_CH
) in mb_os.c
.
OS_CFG_SEM_EN
If you use Modbus Master, you need to enable semaphore services.
MB_OS_CFG_RX_TASK_PRIO
MB_OS_CFG_RX_TASK_STK_SIZE
These constants need to be defines in you application.