/** ****************************************************************************** * @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*************/