/**
|
******************************************************************************
|
* @file embreg.c
|
* @author AndyChen
|
* @version V1.0
|
* @date 2015-xx-xx
|
* @brief
|
******************************************************************************
|
* @attention
|
*
|
******************************************************************************
|
*/
|
|
/* Includes -------------------------------------------------------------------*/
|
|
#include "embreg.h"
|
#include "regmap.h"
|
#include "regdefine.h"
|
#include "fm25v02.h"
|
#include "RTC.h"
|
#include "para.h"
|
//#include "data_write_local.h"
|
#include "log_extern.h"
|
#include "readfromfpga.h"
|
/* Private_Macros -------------------------------------------------------------*/
|
|
/* Private_addr -------------------------------------------------------------*/
|
#define MODBUS_DEVICE_INFO_BASE_ADDR 51
|
#define MODBUS_DEVICE_INFO_END_ADDR MODBUS_DEVICE_INFO_BASE_ADDR + (sizeof(MODBUS_DEVICE_INFO_T) / 2)
|
|
//const uint8_t modbus_realtime_regnum[] = {3,2,1,2,1,2,2,2,2}; //ÿ¸öÊý¾ÝËùÕ¼¼Ä´æÆ÷¸öÊý
|
//#define MODBUS_REALTIME_DATA_NUM sizeof(modbus_realtime_regnum)
|
#define MODBUS_REALTIME_DATA_BASE_ADDR 501
|
#define MODBUS_REALTIME_DATA_END_ADDR MODBUS_REALTIME_DATA_BASE_ADDR + (sizeof(MODBUS_REALTIME_DATA_T) / 2)
|
|
#define FLOW_XINAO_DTU_BASE_ADDR 2001
|
#define FLOW_XINAO_DTU_END_ADDR FLOW_XINAO_DTU_BASE_ADDR + (sizeof(flowMeterxinaoSerialnum_t) / 2)
|
|
|
#define FLOWDTU_BASE_ADDR 3501
|
#define FLOWDTU_END_ADDR FLOWDTU_BASE_ADDR + (sizeof(flowMeterDTUout_t) / 2)
|
|
|
|
|
|
|
|
//¼Ä´æÆ÷µØÖ·¼ä¾à
|
|
|
|
/* Private_TypesDefinitions ---------------------------------------------------*/
|
|
/* Private_Variables ----------------------------------------------------------*/
|
|
/* Private_Functions ----------------------------------------------------------*/
|
|
/**
|
* @brief ¶ÁÊäÈë¼Ä´æÆ÷
|
* @param pucRegBuffer£º·µ»ØÊý¾ÝÖ¸Õë
|
usAddress £ºÊäÈë¼Ä´æÆ÷ÆðʼµØÖ·
|
usNRegs £ºÒª¶ÁµÄ¼Ä´æÆ÷ÊýÄ¿
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
|
{
|
eMBErrorCode eStatus = MB_ENOREG;
|
|
return eStatus;
|
}
|
|
|
|
|
|
|
/**
|
* @brief ¶Á/д±£³Ö¼Ä´æÆ÷
|
* @param pucRegBuffer£ºÊý¾ÝÖ¸Õë
|
usAddress £ºÊäÈë¼Ä´æÆ÷ÆðʼµØÖ·
|
usNRegs £ºÒª²Ù×÷µÄ¼Ä´æÆ÷ÊýÄ¿
|
eMode : ¶Ô±£³Ö¼Ä´æÆ÷µÄ²Ù×÷£¨¶Á»òд£©
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,eMBRegisterMode eMode )
|
{
|
|
u8 flag=0,i,array_size = 0,array_size_start = 0;
|
float sound_set;
|
uint16_t regAdress,regAdressstart, regNum;
|
eMBErrorCode eStatus = MB_ENOERR;
|
uint16_t *reg_ptr;
|
uint8_t *addr_array_ptr;
|
regAdress = usAddress - 1;
|
regNum = 0;
|
|
if(usNRegs == 0)
|
{
|
eStatus = MB_ENOREG;
|
return eStatus;
|
}
|
|
|
if((regAdress >= MODBUS_DEVICE_INFO_BASE_ADDR) && (regAdress < MODBUS_DEVICE_INFO_END_ADDR))
|
{
|
//ÔÚÕâ¸öµØÖ··¶Î§ÄھͿÉÒÔ
|
reg_ptr = (uint16_t *)&modbus_device_info_g;
|
regAdressstart = regAdress - MODBUS_DEVICE_INFO_BASE_ADDR;
|
|
if((regAdress + usNRegs) > MODBUS_DEVICE_INFO_END_ADDR)
|
{
|
eStatus = MB_ENOREG;
|
return eStatus;
|
}
|
}
|
else if((regAdress >= FLOW_XINAO_DTU_BASE_ADDR) && (regAdress < FLOW_XINAO_DTU_END_ADDR))
|
{
|
//ÔÚÕâ¸öµØÖ··¶Î§ÄھͿÉÒÔ
|
reg_ptr = (uint16_t *)®DevxinaoSerialnum_p5;
|
regAdressstart = regAdress - FLOW_XINAO_DTU_BASE_ADDR;
|
|
if((regAdress + usNRegs) > FLOW_XINAO_DTU_END_ADDR)
|
{
|
eStatus = MB_ENOREG;
|
return eStatus;
|
}
|
}
|
else if((regAdress >= FLOWDTU_BASE_ADDR) && (regAdress < FLOWDTU_END_ADDR))
|
{
|
//ÔÚÕâ¸öµØÖ··¶Î§ÄھͿÉÒÔ
|
reg_ptr = (uint16_t *)®DTUoutMsInfo;
|
regAdressstart = regAdress - FLOWDTU_BASE_ADDR;
|
|
if((regAdress + usNRegs) > FLOWDTU_END_ADDR)
|
{
|
eStatus = MB_ENOREG;
|
return eStatus;
|
}
|
dtu_read_data_save(); //±»¶ÁÈ¡×ÜÁ¿Ê±£¬±£´æÒ»´Îʵʱ×ÜÁ¿Êý¾Ý
|
|
}
|
else if((regAdress >= MODBUS_REALTIME_DATA_BASE_ADDR) && (regAdress < MODBUS_REALTIME_DATA_END_ADDR))
|
{
|
//ÔÚÕâ¸öµØÖ··¶Î§ÄھͿÉÒÔ
|
reg_ptr = (uint16_t *)&modbus_realtime_data_g;
|
regAdressstart = regAdress - MODBUS_REALTIME_DATA_BASE_ADDR;
|
|
if((regAdress + usNRegs) > MODBUS_REALTIME_DATA_END_ADDR)
|
{
|
eStatus = MB_ENOREG;
|
return eStatus;
|
}
|
|
if((regAdress >= MODBUS_REALTIME_DATA_BASE_ADDR) && (regAdress < (MODBUS_REALTIME_DATA_BASE_ADDR + 35)))
|
{
|
dtu_read_data_save(); //±»¶ÁÈ¡×ÜÁ¿Ê±£¬±£´æÒ»´Îʵʱ×ÜÁ¿Êý¾Ý
|
}
|
|
}
|
|
else
|
{
|
|
eStatus=MB_ENOREG;
|
return eStatus;
|
}
|
//¸ù¾ÝµØÖ·È·¶¨Òª·ÃÎʵļĴæÆ÷
|
|
|
|
if(eStatus != MB_ENOREG)
|
{
|
|
switch(eMode)
|
{
|
//¶Á±£³Ö¼Ä´æÆ÷
|
case MB_REG_READ:
|
//
|
while(regNum < usNRegs)
|
{
|
// *pucRegBuffer ++ = ( uint8_t )( *(reg_ptr + regAdressstart + regNum) >> 8 ); //¸ß×Ö½ÚÔÚǰ
|
// *pucRegBuffer ++ = ( uint8_t )( *(reg_ptr + regAdressstart + regNum) &0xFF);
|
*pucRegBuffer ++ = ( uint8_t )( *(reg_ptr + regAdressstart + regNum) &0xFF); //µÍ×Ö½ÚÔÚǰ£¬ÎªÁËÕûÌå´ó¶Ë
|
*pucRegBuffer ++ = ( uint8_t )( *(reg_ptr + regAdressstart + regNum) >> 8 );
|
|
regNum ++;
|
}
|
|
break;
|
|
//д±£³Ö¼Ä´æÆ÷
|
case MB_REG_WRITE:
|
|
while(regNum < usNRegs)
|
{
|
|
// *(reg_ptr + regAdressstart + regNum) = ( uint16_t )( *pucRegBuffer ++ << 8 );//¸ß×Ö½ÚÔÚǰ
|
// *(reg_ptr + regAdressstart + regNum) |= ( uint16_t )( *pucRegBuffer ++ );
|
*(reg_ptr + regAdressstart + regNum) = ( uint16_t )( *pucRegBuffer ++ );//µÍ×Ö½ÚÔÚǰ£¬ÎªÁËÕûÌå´ó¶Ë
|
*(reg_ptr + regAdressstart + regNum) |= ( uint16_t )( *pucRegBuffer ++ << 8 );
|
|
regNum ++;
|
|
}
|
|
|
break;
|
|
default:
|
break;
|
}
|
}
|
|
return eStatus;
|
}
|
|
/**
|
* @brief ¶Á/дÏßȦ¼Ä´æÆ÷
|
* @param pucRegBuffer£ºÊý¾ÝÖ¸Õë
|
usAddress £º¼Ä´æÆ÷ÆðʼµØÖ·
|
usNCoils £ºÒª²Ù×÷µÄÏßȦÊýÄ¿
|
eMode £º²Ù×÷ģʽ
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils,eMBRegisterMode eMode )
|
{
|
return MB_ENOREG;
|
}
|
|
/**
|
* @brief ¶ÁÀëÉ¢¼Ä´æÆ÷
|
* @param pucRegBuffer£º·µ»ØÊý¾ÝÖ¸Õë
|
usAddress £º¼Ä´æÆ÷ÆðʼµØÖ·
|
usNDiscrete £ºÒª¶ÁµÄ¼Ä´æÆ÷ÊýÄ¿
|
* @retval ´íÎó´úÂë
|
*/
|
eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
|
{
|
return MB_ENOREG;
|
}
|
|
/******************* (C) COPYRIGHT 2015 AndyChen *******END OF FILE*************/
|