/** ****************************************************************************** * @file embreg.c * @author AndyChen * @version V1.0 * @date 2015-xx-xx * @brief ****************************************************************************** * @attention * ****************************************************************************** */ /* Includes -------------------------------------------------------------------*/ #include "embreg.h" #include "regmap.h" #include "regdefine.h" /* Private_Macros -------------------------------------------------------------*/ //¼Ä´æÆ÷µØÖ·¼ä¾à #define INDEX_BASE 100 //Part1 ºÍ Part2µÄµØÖ··Ö½çµã #define PART12_SECTION_P 1049 //Part3 ºÍ Part4µÄµØÖ··Ö½çµã #define PART34_SECTION_P 1141 /* 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 ) { u16 temp; u8 flag=0,i; float sound_set; uint16_t iRegIndex,uRegs; uint16_t regStartAdress, regNum; eMBErrorCode eStatus = MB_ENOERR; u16 frameadd; volatile uint16_t *data_pointer; volatile void *regP=0; volatile uint16_t my_regAddr,tempaddr; volatile uint16_t *bufferpointer; volatile uint16_t *newpointer,*oldpointer; u8 flowfix_flag,flowfix_user_flag; flowfix_flag = 0; flowfix_user_flag = 0; my_regAddr = usAddress - 1; uRegs = my_regAddr / INDEX_BASE; temp=usNRegs; if(uRegs>=10&&uRegs<20) frameadd=(my_regAddr-1000)*2+200; if(uRegs==0) frameadd=my_regAddr*2; tempaddr = my_regAddr%1000; if( tempaddr == 0) return MB_ENOREG; //¸ù¾ÝµØÖ·È·¶¨Òª·ÃÎʵļĴæÆ÷ switch( uRegs ) { //É豸ÐòÁкżĴæÆ÷ case DEVSERIALNUM_FLAG: //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= DEVSERIALNUM_SADDR + DEVSERIALNUM_NREGS) { data_pointer= (void *)®DevSerialNum; usAddress--; } else { eStatus=MB_ENOREG; } iRegIndex= usAddress %100; //****************************************************// break; //²âÁ¿ÉèÖüĴæÆ÷Part 1 ºÍPart 2 case DEVCFGPARAM12_FLAG: if(my_regAddr < PART12_SECTION_P) { regStartAdress = DEVCFGPARAM1_SADDR; regNum = DEVCFGPARAM1_NREGS; regP = ®DevCfgParam_p1; usAddress--; } else { regStartAdress = DEVCFGPARAM2_SADDR; regNum = DEVCFGPARAM2_NREGS; regP = ®DevCfgParam_p2; usAddress -= DEVCFGPARAM2_OFFSET; } //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= regStartAdress + regNum) { data_pointer = regP; } else { eStatus = MB_ENOREG; } iRegIndex= usAddress %100; //****************************************************// break; //É豸ÅäÖòÎÊý¼Ä´æÆ÷Part 3 ºÍPart 4 case DEVCFGPARAM34_FLAG: if(my_regAddr < PART34_SECTION_P) { regStartAdress = DEVCFGPARAM3_SADDR; regNum = DEVCFGPARAM3_NREGS; regP = ®DevCfgParam_p3; usAddress--; } else { regStartAdress = DEVCFGPARAM4_SADDR; regNum = DEVCFGPARAM4_NREGS; regP = ®DevCfgParam_p4; usAddress -= DEVCFGPARAM4_OFFSET; } //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= regStartAdress + regNum) { data_pointer = regP; } else { eStatus = MB_ENOREG; } iRegIndex= usAddress %100; //****************************************************// break; case DEVCFGPARAM5_FLAG: regStartAdress = DEVCFGPARAM4_SADDR; regNum = DEVCFGPARAM4_NREGS; regP = ®DevCfgParam_p4; usAddress -= DEVCFGPARAM4_OFFSET; //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= regStartAdress + regNum) { data_pointer = regP; } else { eStatus = MB_ENOREG; } iRegIndex= (usAddress-1100)%200; //******************ÁÙʱµÄ²¹¾È´ëÊ©**************************// break; //É豸ÅäÖòÎÊý¼Ä´æÆ÷Part 5 /* case DEVCFGPARAM5_FLAG: //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= DEVCFGPARAM5_SADDR + DEVCFGPARAM5_NREGS) { data_pointer= (void *)®DevCfgParam_p4; usAddress = usAddress - PART5_OFFSET; } else { eStatus=MB_ENOREG; } break;*/ //Á÷Á¿¼Æ¼ÆÁ¿ÐÅÏ¢¼Ä´æÆ÷ case FLOWMETERMSINfO_FLAG: //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= FLOWMETERMSINfO_SADDR + FLOWMETERMSINfO_NREGS) { data_pointer= (void *)®FlowMeterMsInfo; usAddress--; } else { eStatus=MB_ENOREG; } iRegIndex= usAddress %100; //****************************************************// break; //ϵͳ¹¤×÷״̬¼Ä´æÆ÷ case SYSTEMWORKSTATUS_FLAG: //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= SYSTEMWORKSTATUS_SADDR + SYSTEMWORKSTATUS_NREGS) { data_pointer= (void *)®workstatus; usAddress--; } else { eStatus=MB_ENOREG; } iRegIndex= usAddress %100; //****************************************************// break; //µ÷ÊԼĴæÆ÷ 4701 case TEST_FLAG: //ÅжϵØÖ·ºÍ¼Ä´æÆ÷ÊýÄ¿ºÏ·¨ÐÔ if(my_regAddr + usNRegs <= TEST_SADDR + TEST_NREGS) { data_pointer= (void *)®TestInfo; usAddress--; } else { eStatus=MB_ENOREG; } iRegIndex= usAddress %100; //****************************************************// break; //·Ç·¨µØÖ· default: eStatus=MB_ENOREG; break; } if(eStatus != MB_ENOREG) { iRegIndex--; switch(eMode) { //¶Á±£³Ö¼Ä´æÆ÷ case MB_REG_READ: while( usNRegs > 0 ) { if( (my_regAddr>=1175&&my_regAddr<=1180) || ( my_regAddr<1175 && (my_regAddr+usNRegs)>=1175) ) { Get_Time(); regDevCfgParam_p4.RTCtime_year = calendar.year; //RTCʱ¼ä regDevCfgParam_p4.RTCtime_month = calendar.month; regDevCfgParam_p4.RTCtime_day = calendar.date; regDevCfgParam_p4.RTCtime_hour = calendar.hour; regDevCfgParam_p4.RTCtime_min = calendar.min; regDevCfgParam_p4.RTCtime_sec = calendar.sec; } //»ñÈ¡¸ßλ×Ö½Ú *pucRegBuffer++ = ( uint8_t )( *(data_pointer + iRegIndex) >> 8 ); //»ñÈ¡µÍλ×Ö½Ú *pucRegBuffer++ = ( uint8_t )( *(data_pointer +iRegIndex) & 0xFF ); iRegIndex++; usNRegs--; } break; //д±£³Ö¼Ä´æÆ÷ case MB_REG_WRITE: if(BT_status) { // buffer_ins_g.system_para_a[0] = usNRegs; // bufferpointer = (u16 *)&buffer_ins_g.system_para_a[1]; // *bufferpointer = my_regAddr; // oldpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_OLD_NUM]; // newpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_NEW_NUM]; // }else // { // buffer_ins_g.system_para_a[0] = 0; // bufferpointer = (u16 *)&buffer_ins_g.system_para_a[1]; // *bufferpointer = my_regAddr; // oldpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_OLD_NUM]; // newpointer = (u16 *)&buffer_ins_g.system_para_a[BUFFER_NEW_NUM]; } while( usNRegs > 0 ) { /*Ïȱ£´æÔ­ÏȵļĴæÆ÷Öµ*/ *oldpointer = *(data_pointer + iRegIndex); *(data_pointer + iRegIndex) = *pucRegBuffer++ << 8; *(data_pointer + iRegIndex) |= *pucRegBuffer++; *newpointer = *(data_pointer + iRegIndex); oldpointer ++; newpointer ++; if( (my_regAddr<=1180)&& (my_regAddr>=1175) ) { flag=1; }else if((my_regAddr > 1235)&&(my_regAddr < 1280)) { /*ºóÃæµÄ¼Ä´æÆ÷ÊDz»ÐèÒª½øÐд洢µÄ*/ } else { FM25V02_data_write(*(data_pointer + iRegIndex)&0xff, frameadd++); FM25V02_data_write(*(data_pointer + iRegIndex)>>8, frameadd++); } if( (my_regAddr>=1101&&my_regAddr<=1140) ) { flowfix_flag = 1; }else if((my_regAddr>=1240&&my_regAddr<=1279)) { flowfix_user_flag = 1; } iRegIndex ++; usNRegs --; } if(flag) Time_Set(regDevCfgParam_p4.RTCtime_year,regDevCfgParam_p4.RTCtime_month,regDevCfgParam_p4.RTCtime_day,1, regDevCfgParam_p4.RTCtime_hour,regDevCfgParam_p4.RTCtime_min,regDevCfgParam_p4.RTCtime_sec); // reg_change_dect(my_regAddr); if(my_regAddr == 1002) { sound_set = regDevCfgParam_p1.set_sound_speed; //ͨ¹ýÅжϼÆËãµÄÉùËÙÐÞ¸Äʱ¼äÑÓ³Ù¡£ if(sound_set == 0) { }else { /*¼ÆËã*/ regDevCfgParam_p1.mid_a_compensate_time = (regDevCfgParam_p1.mid_distance / sound_set) - regTestInfo.midA + regDevCfgParam_p1.mid_a_compensate_time; FM25V02_data_write_float(MID_A_PROBE_ADD_TIME, regDevCfgParam_p1.mid_a_compensate_time); regDevCfgParam_p1.mid_b_compensate_time = (regDevCfgParam_p1.mid_distance / sound_set) - regTestInfo.midB + regDevCfgParam_p1.mid_b_compensate_time; FM25V02_data_write_float(MID_B_PROBE_ADD_TIME, regDevCfgParam_p1.mid_b_compensate_time); regDevCfgParam_p1.up_a_compensate_time = (regDevCfgParam_p1.up_distance / sound_set) - regTestInfo.upA + regDevCfgParam_p1.up_a_compensate_time; FM25V02_data_write_float(UP_A_PROBE_ADD_TIME, regDevCfgParam_p1.up_a_compensate_time); regDevCfgParam_p1.up_b_compensate_time = (regDevCfgParam_p1.up_distance / sound_set) - regTestInfo.upB + regDevCfgParam_p1.up_b_compensate_time; FM25V02_data_write_float(UP_B_PROBE_ADD_TIME, regDevCfgParam_p1.up_b_compensate_time); regDevCfgParam_p1.down_a_compensate_time = (regDevCfgParam_p1.down_distance / sound_set) - regTestInfo.downA + regDevCfgParam_p1.down_a_compensate_time; FM25V02_data_write_float(DOWN_A_PROBE_ADD_TIME, regDevCfgParam_p1.down_a_compensate_time); regDevCfgParam_p1.down_b_compensate_time = (regDevCfgParam_p1.down_distance / sound_set) - regTestInfo.downB + regDevCfgParam_p1.down_b_compensate_time; FM25V02_data_write_float(DOWN_B_PROBE_ADD_TIME, regDevCfgParam_p1.down_b_compensate_time); } }else if(my_regAddr == 1236) { if(regDevCfgParam_p4.password == regDevCfgParam_p4.userPassword) { regDevCfgParam_p4.confirmpassword = 1111; }else { regDevCfgParam_p4.confirmpassword = 2222; } }else if(my_regAddr == 1237) { if(regDevCfgParam_p4.superpassword == regDevCfgParam_p4.authUsrPassword) { regDevCfgParam_p4.confirmsuperpassword = 1111; }else { regDevCfgParam_p4.confirmsuperpassword = 2222; } } if(flowfix_flag == 1) { for(i=0;i<10;i++) { if(regDevCfgParam_p3.stdEquipmentFlow[i] != 0) { regDevCfgParam_p2.flowCalibFactor[i] = 1.0/(1+regDevCfgParam_p3.indicationError[i]/100); regDevCfgParam_p2.flowSegmentPoint[i] = regDevCfgParam_p3.stdEquipmentFlow[i]/regDevCfgParam_p2.flowCalibFactor[i]; flowfixcount = i + 1; } else { regDevCfgParam_p2.flowCalibFactor[i]=1; regDevCfgParam_p2.flowSegmentPoint[i]=0; } } for(i = 0; i < 10; i ++) { FM25V02_data_write_float((FLOW_CHANGE_K1_ADDR + (u16)(i * 4)),regDevCfgParam_p2.flowCalibFactor[i]); FM25V02_data_write_float((FLOW_CHANGE_L1_ADDR + (u16)(i * 4)),regDevCfgParam_p2.flowSegmentPoint[i]); } //flowfix_flag=0; }else if(flowfix_user_flag == 1) { for(i = 0 ; i < 10; i ++) { if(regDevCfgParam_p4.user_flow[i] != 0) { regDevCfgParam_p4.user_cal_error[i] = 1.0/(1 + regDevCfgParam_p4.user_error[i]/100); regDevCfgParam_p4.user_cal_flow[i] = regDevCfgParam_p4.user_flow[i] / regDevCfgParam_p4.user_cal_error[i]; flowfixcount_user = i + 1; } else { regDevCfgParam_p4.user_cal_error[i] = 1; regDevCfgParam_p4.user_cal_flow[i] = 0; } } for(i = 0; i < 10; i ++) { FM25V02_data_write_float((CAL_USER_ERROR_VALUE_E1_ADDR + (u16)(i * 4)), regDevCfgParam_p4.user_cal_error[i]); FM25V02_data_write_float((CAL_USER_REAL_FLOW_R1_ADDR + (u16)(i * 4)), regDevCfgParam_p4.user_cal_flow[i]); } } 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*************/