modbus.c 5.05 KB
#include "modbus.h"
#include "bsp_cpu_flash.h"

USHORT   usRegInputStart = REG_INPUT_START;      
USHORT   usRegInputBuf[REG_INPUT_NREGS];   

USHORT   usRegHoldingStart = REG_HOLDING_START;  

USHORT usRegHoldingBuf[REG_HOLDING_NREGS]; 

eMBErrorCode
eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
{
    eMBErrorCode    eStatus = MB_ENOERR;
    int             iRegIndex;
    u16 *PRT=(u16*)pucRegBuffer;
    
    if( ( usAddress >= REG_INPUT_START )
        && ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )
    {
        iRegIndex = ( int )( usAddress - usRegInputStart );
        while( usNRegs > 0 )
        {
               *PRT++ = __REV16(usRegHoldingBuf[iRegIndex++]);
         //   *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] >> 8 );
          //  *pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] & 0xFF );
          //  iRegIndex++;
            usNRegs--;
        }
    }
    else
    {
        eStatus = MB_ENOREG;
    }

    return eStatus;
}

/****************************************************************************
* 名	  称:eMBRegHoldingCB 
* 功    能:对应功能码有:06 写保持寄存器 eMBFuncWriteHoldingRegister 
*													16 写多个保持寄存器 eMBFuncWriteMultipleHoldingRegister
*													03 读保持寄存器 eMBFuncReadHoldingRegister
*													23 读写多个保持寄存器 eMBFuncReadWriteMultipleHoldingRegister
* 入口参数:pucRegBuffer: 数据缓存区,用于响应主机   
*						usAddress: 寄存器地址
*						usNRegs: 要读写的寄存器个数
*						eMode: 功能码
* 出口参数:
* 注	  意:4 区
****************************************************************************/
eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
{
	eMBErrorCode    eStatus = MB_ENOERR;
	int             iRegIndex;
    u16 *PRT=(u16*)pucRegBuffer;

	if((usAddress >= REG_HOLDING_START)&&
		((usAddress+usNRegs) <= (REG_HOLDING_START + REG_HOLDING_NREGS)))
	{
		iRegIndex = (int)(usAddress - usRegHoldingStart);
		switch(eMode)
		{                                       
			case MB_REG_READ://读 MB_REG_READ = 0
        while(usNRegs > 0)
				{
                    *PRT++ = __REV16(usRegHoldingBuf[iRegIndex++]);
					//*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] >> 8);            
					//*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] & 0xFF); 
                    //iRegIndex++;
                    usNRegs--;					
				}                            
        break;
			case MB_REG_WRITE://写 MB_REG_WRITE = 0
				while(usNRegs > 0)
				{     
                    usRegHoldingBuf[iRegIndex++] = __REV16(*PRT++);                    
					//usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
                   // usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
                    //iRegIndex++;
                    usNRegs--;
                }				
        }
	}
	else//错误
	{
		eStatus = MB_ENOREG;
	}	
	
	return eStatus;
}

/****************************************************************************
* 名	  称:eMBRegCoilsCB 
* 功    能:对应功能码有:01 读线圈 eMBFuncReadCoils
*													05 写线圈 eMBFuncWriteCoil
*													15 写多个线圈 eMBFuncWriteMultipleCoils
* 入口参数:pucRegBuffer: 数据缓存区,用于响应主机   
*						usAddress: 线圈地址
*						usNCoils: 要读写的线圈个数
*						eMode: 功能码
* 出口参数:
* 注	  意:如继电器 
*						0 区
****************************************************************************/
eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
{
	eMBErrorCode    eStatus = MB_ENOERR;
//	int             iRegIndex;


//	if((usAddress >= REG_HOLDING_START)&&\
//		((usAddress+usNCoils) <= (REG_HOLDING_START + REG_HOLDING_NREGS)))
//	{
//		iRegIndex = (int)(usAddress - usRegHoldingStart);
//		switch(eMode)
//		{                                       
//			case MB_REG_READ://读 MB_REG_READ = 0
//        while(usNCoils > 0)
//				{
// 					*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] >> 8);            
// 					*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] & 0xFF); 
//          iRegIndex++;
//          usNCoils--;					
//				}                            
//        break;
//			case MB_REG_WRITE://写 MB_REG_WRITE = 1
//				while(usNCoils > 0)
//				{         
// 					usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
//           usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
//          iRegIndex++;
//          usNCoils--;
//        }				
//			}
//	}
//	else//错误
//	{
//		eStatus = MB_ENOREG;
//	}	
//	
	return eStatus;
}
/****************************************************************************
* 名	  称:eMBRegDiscreteCB 
* 功    能:读取离散寄存器,对应功能码有:02 读离散寄存器 eMBFuncReadDiscreteInputs
* 入口参数:pucRegBuffer: 数据缓存区,用于响应主机   
*						usAddress: 寄存器地址
*						usNDiscrete: 要读取的寄存器个数
* 出口参数:
* 注	  意:1 区
****************************************************************************/
eMBErrorCode
eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{
//    ( void )pucRegBuffer;
//    ( void )usAddress;
//    ( void )usNDiscrete;
    return MB_ENOREG;
}