add modbus slave support
add modbus slave support
This commit is contained in:
123
examples/modbus/modbus.c
Normal file
123
examples/modbus/modbus.c
Normal file
@@ -0,0 +1,123 @@
|
||||
#include "cmsis_os.h"
|
||||
#include "mb.h"
|
||||
#include "tim.h"
|
||||
/* ----------------------- Defines ------------------------------------------*/
|
||||
#define REG_INPUT_START 0x0001U
|
||||
#define REG_INPUT_NREGS 4
|
||||
|
||||
#define REG_HOLDING_START ( 1 )
|
||||
#define REG_HOLDING_NREGS ( 32 )
|
||||
/* ----------------------- Static variables ---------------------------------*/
|
||||
static uint16_t usRegInputStart = REG_INPUT_START;
|
||||
static uint16_t usRegInputBuf[REG_INPUT_NREGS]={0x01,0x02,0x03,0x04};
|
||||
|
||||
static USHORT usRegHoldingStart = REG_HOLDING_START;
|
||||
static USHORT usRegHoldingBuf[REG_HOLDING_NREGS];
|
||||
|
||||
#define TASK1_STK_SIZE 512
|
||||
void task1(void *arg);
|
||||
osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
|
||||
|
||||
|
||||
void task1(void *arg)
|
||||
{
|
||||
__HAL_TIM_CLEAR_FLAG(&htim6,TIM_FLAG_UPDATE);
|
||||
eMBInit(MB_RTU, 0x01, 1, 9600, MB_PAR_ODD);
|
||||
eMBEnable();
|
||||
|
||||
while (1) {
|
||||
eMBPoll();
|
||||
printf("###I am task1\r\n");
|
||||
osDelay(2000);
|
||||
}
|
||||
}
|
||||
|
||||
void application_entry(void *arg)
|
||||
{
|
||||
osThreadCreate(osThread(task1), NULL); // Create task1
|
||||
}
|
||||
|
||||
eMBErrorCode
|
||||
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
|
||||
{
|
||||
eMBErrorCode eStatus = MB_ENOERR;
|
||||
int iRegIndex;
|
||||
|
||||
if( ( usAddress >= REG_INPUT_START )
|
||||
&& ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
|
||||
{
|
||||
iRegIndex = ( int )( usAddress - usRegInputStart );
|
||||
while( usNRegs > 0 )
|
||||
{
|
||||
*pucRegBuffer++ =
|
||||
( unsigned char )( usRegInputBuf[iRegIndex] >> 8 );
|
||||
*pucRegBuffer++ =
|
||||
( unsigned char )( usRegInputBuf[iRegIndex] & 0xFF );
|
||||
iRegIndex++;
|
||||
usNRegs--;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
eStatus = MB_ENOREG;
|
||||
}
|
||||
|
||||
return eStatus;
|
||||
}
|
||||
|
||||
eMBErrorCode
|
||||
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
|
||||
{
|
||||
eMBErrorCode eStatus = MB_ENOERR;
|
||||
int iRegIndex;
|
||||
|
||||
if( ( usAddress >= REG_HOLDING_START ) && ( usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS ) )
|
||||
{
|
||||
iRegIndex = ( int )( usAddress - usRegHoldingStart );
|
||||
switch ( eMode )
|
||||
{
|
||||
case MB_REG_READ:
|
||||
while( usNRegs > 0 )
|
||||
{
|
||||
*pucRegBuffer++ = ( unsigned char )( usRegHoldingBuf[iRegIndex] >> 8 );
|
||||
*pucRegBuffer++ = ( unsigned char )( usRegHoldingBuf[iRegIndex] & 0xFF );
|
||||
iRegIndex++;
|
||||
usNRegs--;
|
||||
}
|
||||
break;
|
||||
|
||||
case MB_REG_WRITE:
|
||||
while( usNRegs > 0 )
|
||||
{
|
||||
usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
|
||||
usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
|
||||
iRegIndex++;
|
||||
usNRegs--;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
eStatus = MB_ENOREG;
|
||||
}
|
||||
return eStatus;
|
||||
}
|
||||
|
||||
eMBErrorCode
|
||||
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
|
||||
{
|
||||
( void )pucRegBuffer;
|
||||
( void )usAddress;
|
||||
( void )usNCoils;
|
||||
( void )eMode;
|
||||
return MB_ENOREG;
|
||||
}
|
||||
|
||||
eMBErrorCode
|
||||
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
|
||||
{
|
||||
( void )pucRegBuffer;
|
||||
( void )usAddress;
|
||||
( void )usNDiscrete;
|
||||
return MB_ENOREG;
|
||||
}
|
Reference in New Issue
Block a user