#include "../main/SystemInclude.h" const u16 ReadCode[] = { CODE1, CODE2, CODE3, CODE4, CODE5, CODE6, CODE7, CODE8, CODE9,CODE10,CODE11,CODE12,CODE13,CODE14,CODE15,CODE16 }; __HWSwitch_Union_TypeDef switchStatus; /******************************************************************************/ void ReadMeterSystemData(void) { while(MBBuf.ByteNumber > 1) { MBBuf.DataByte = 2; switch(MBBuf.StartAddr) { case INT_SYS_STATE: tempL.Word[0] = currentMode.Word; break; // 0x8400 //case INT_SYS_MODE: tempL.Word[0] = currentMode.Word; break; // 0x8401 //case INT_HARD_STATE: SystemHardWaerAutoCheck(); tempL.Word[0] = syatemHardState; break; // 0x8402 case INT_SWTICH_STATE: //0x8403 // switchStatus.Bit.CalibMode = ExternCalibratinInput(); #ifndef ENABLE_DEBUG_PIN #pragma message("[undefined] ENABLE_DEBUG_PIN") #elif(ENABLE_DEBUG_PIN) switchStatus.Bit.DebugMode = ExternDebugInput(); #endif #ifndef ENABLE_ZERO_CALIB_PIN #pragma message("[undefined] ENABLE_ZERO_CALIB_PIN") #elif(ENABLE_ZERO_CALIB_PIN) switchStatus.Bit.ZeroCalib = ZeroCalibInput(); #endif tempL.Word[0] = switchStatus.Word; break; case INT_SYSTEM_VOLTAGE: tempL.Word[0] = systemVoltage; break; case INT_PRODUCT_MODEL: ReadFlashByCom(ProductModel, 12); continue; case INT_BUILD_DATE: ReadFlashByCom(SoftBuildDate, 10); continue; // case INT_PGA_SCALE // PGA放大倍数 case INT_FR_PPM: tempL.Word[0] = temperatureFactor; break; // PPM //case INT_CODE_COEFF: tempL.Word[0] = codeCoeff; break; // TR温度系数 内码归一化系数 //case INT_TA_DELTA: tempL.Word[0] = deltaTA; break; // MCU温度零点差值 // case INT_BL_FLOW //case INT_DOP_VALUE: tempL.Word[0] = CTypeWiper; break; // 数字电位器内码 //case INT_STD_TA: tempL.Word[0] = correctTA; break; // 校准时修正温度检测 case INT_BPS: tempL.Word[0] = baudRate; break; // 校准时BPS //case INT_DAC_ADJUST_OUT1: tempL.Word[0] = (('D'<<8)+'A'); break; // // //case INT_DAC_ADJUST_OUT2: tempL.Word[0] = DACClibVoltageL; break; // // //case INT_DAC_ADJUST_OUT3: tempL.Word[0] = DACClibVoltageM; break; // // //case INT_DAC_ADJUST_OVER: tempL.Word[0] = DACClibVoltageH; break; // // case INT_ZERO_CALIB_COUNTER: tempL.Word[0] = (u16)(compareBaseCounter>>ONE_SECOND_TIME_SHIFT); break; default: if(MBBuf.StartAddr > INT_METER_SYS_MAX) return; tempL.Word[0] = 0; break; } CopyDataAndJudgeComplete(); } } /******************************************************************************/ void ReadMeterInfo(void) { u16 I, K; while(MBBuf.ByteNumber > 1) { MBBuf.DataByte = 2; switch(MBBuf.StartAddr) { // case INT_SERIES_BASE: // //ReadEEPROMByCom(SERIES_BASE, SERIES_DEPTH); // for (I = 0; I < SERIES_DEPTH; I++) MBBuf.RxPointer[MBBuf.Index++] = meterSN[SERIES_DEPTH-I-1] ;return; // continue; //0x8000 // [Enable Read And Write] case INT_SERIES_BASE1: tempL.Word[0] = meterSN1 ; break; case INT_SERIES_BASE2: tempL.Word[0] = meterSN2 ; break; case INT_SERIES_BASE3: tempL.Word[0] = meterSN3 ; break; case INT_SERIES_BASE4: tempL.Word[0] = meterSN4 ; break; case INT_SERIES_BASE5: tempL.Word[0] = meterSN5 ; break; case INT_SERIES_BASE6: tempL.Word[0] = meterSN6 ; break; case INT_TIME_BASE: ReadTimeBase(); continue; //0x8006 [Enable Read And Write] case INT_CURVE_NUM: #ifndef ENABLE_ONE_TABLE #pragma message("[undefined] ENABLE_ONE_TABLE") #elif(ENABLE_ONE_TABLE) calibType = ENABLE_ONE_TABLE_NAME; #endif if(calibType == INTCMD_1ST_TABLE) tempL.Word[0] = curveTANum; else if(calibType == INTCMD_2ND_TABLE) tempL.Word[0] = curveATypeNum; else tempL.Word[0] = 0; break; default: tempL.Word[0] = 0; if(MBBuf.StartAddr < INT_CURVE_NODE1) break; else if(MBBuf.StartAddr > INT_METER_INFO_MAX) return; else if(MBBuf.StartAddr > INT_CURVE_MAX) break; K = MBBuf.StartAddr-INT_CURVE_NODE1; I = K / INT_CURVE_WIDTH; K = K - I*INT_CURVE_WIDTH; if(calibType == INTCMD_1ST_TABLE) { tempL.DWord = calibTANode[I]; if(K == 0) MBBuf.DataByte = 4; else if(K == 1) tempL.Word[0] = tempL.Word[1]; else if(K == 2) tempL.Word[0] = calibTAVal[I]; } else if(calibType == INTCMD_2ND_TABLE) { tempL.DWord = ATypeNode[I]; if(K == 0) MBBuf.DataByte = 4; else if(K == 1) tempL.Word[0] = tempL.Word[1]; else if(K == 2) tempL.Word[0] = ATypeVal[I]; } break; } CopyDataAndJudgeComplete(); } } /******************************************************************************/ void ReadMeterSamplingData(void) //读取流量计采集的数据 { while(MBBuf.ByteNumber > 1) { MBBuf.DataByte = 2; switch(MBBuf.StartAddr & INT_READ_CODE_MASK) { case INT_READ_CODE_BASE: // 0x8300 tempL.Word[0] = voltageDetected[ReadCode[MBBuf.StartAddr - INT_READ_CODE_BASE] & ANX_MASK]; #ifndef ENABLE_READ_CODE_INTO_CALIB #pragma message("[undefined] ENABLE_READ_CODE_INTO_CALIB") #elif(ENABLE_READ_CODE_INTO_CALIB) EnterCalibMode(); #endif break; case INT_SAMPLING_BASE1: // 0x8310 case INT_SAMPLING_BASE2: // 0x8320 tempL.Word[0] = voltageDetected[(MBBuf.StartAddr - INT_SAMPLING_BASE1) & ANX_MASK]; break; default: if(MBBuf.StartAddr > INT_METER_CODE_MAX) return; tempL.Word[0] = 0; break; } CopyDataAndJudgeComplete(); } } /******************************************************************************/ void ReadMeterBasicData(void) { while(MBBuf.ByteNumber > 1) { MBBuf.DataByte = 2; switch(MBBuf.StartAddr & INT_METER_BASIC_MASK) { case INT_METER_BASIC: // 0x8500 if(MBBuf.StartAddr > INT_METER_BASIC_MAX) return; ReadMultiByteFromEEPROM(BASIC_DATA_BASE + (MBBuf.StartAddr - INT_METER_BASIC)*2, &tempL.Byte[0], 2, PARA_EEPROM); break; default: tempL.Word[0] = 0; break; } CopyDataAndJudgeComplete(); } } /******************************************************************************/ void ReadMeterParameter(void) { while(MBBuf.ByteNumber > 1) { MBBuf.DataByte = 2; switch(MBBuf.StartAddr) { case INT_KEY_ID: tempL.DWord = securityID; MBBuf.DataByte = 4; break; //0x8200 Fixed Address write parameter ID Key 0x9600 [Disable Read] case INT_CURVE_TYPE: tempL.Word[0] = calibType; break; // 0x8202 select curve type case INT_RTC_SECOND: tempL.Word[0] = ReadSecond(); break; case INT_CALIB_FAC: ReadCalibFAC(); break; // 0x820A // 2Byte [Disable Write] case INT_CALIB_DEPTH: ReadCalibDepth(); break; // 0x820B // 2Byte [Disable Write] case INT_CALIB_WIDTH: ReadCalibWidth(); break; // 0x820C // 2Byte [Disable Write] case INT_CONTROL: tempL.Word[0] = CMDComPassword; break; // case INT_CLEAR_RECORD 0x820E // clear data record: [Disable Read] // case INT_TEST_OFFSET 0x820F // [Disable Read] // parameter Address // case INT_PROTOCOL 0x8210 // MODBUS Slaver Addr case INT_SLAVER_ADDR: tempL.Word[0] = localAddress; break; // 0x8211 // MODBUS Slaver Addr case INT_METER_FACTOR: tempL.Word[0] = MeterFactor; break; // 0x8212 case INT_GDCF: tempL.Word[0] = GDCFactor; break; // 0x8213 case INT_MAX_FLOW: tempL.DWord = maxFlowRate; MBBuf.DataByte = 4; break; // 0x8214 case INT_OFFSET_GAS: tempL.Word[0] = offsetGas; break; // 0x8216 case INT_OFFSET_AIR: tempL.Word[0] = offsetAir; break; // 0x8217 case INT_SAMPLE_PERIOD: tempL.Word[0] = factoryInterval; break; // 0x8218 factoryInterval case INT_HISTORY_PERIOD: tempL.Word[0] = historyPeriod; break; // 0x8219 //-------------------------------------------------------------------------------------------- #ifndef ENABLE_ACCPULSE #pragma message("[undefined] ENABLE_ACCPULSE") #elif(ENABLE_ACCPULSE) case INT_PULSE_UNIT: tempL.Word[0] = calibUnitPerPulse; break; // 0x821A #endif //-------------------------------------------------------------------------------------------- case INT_SENSOR_SN: ReadEEPROMByCom(SENSOR_SN_BASE, SENSOR_SN_DEPTH); return; //0x821D // 0x821D/0x821E/0x821F case INT_TOTAL_ACC: ReadACCFRByCom(); break; // 0x8220-0x8225 case INT_CALIB_TA: tempL.Word[0] = calibTemperature; break; // 0x8226 //0x8226 //========================================================================== #ifndef ENABLE_A_TYPE_FLOWRATE #pragma message("[undefined] ENABLE_A_TYPE_FLOWRATE") #elif(ENABLE_A_TYPE_FLOWRATE) case INT_OFFSET_A_GAS: tempL.Word[0] = offsetGasA; break; // 0x8227 case INT_OFFSET_A_AIR: tempL.Word[0] = offsetAirA; break; // 0x8228 case INT_ATYPE_INDEX_GAIN: tempL.Word[0] = ATypeIndexGain; break; // 0x8229 case INT_GDCF_ATYPE: tempL.Word[0] = GDCFactorAType; break; // 0x8230 case INT_FR_SWITCH_POINT: tempL.DWord = switchFIndex; MBBuf.DataByte = 4; break; // 0x825D //========================================================================== #ifndef ENABLE_PLUG_IN_FLOWRATE #pragma message("[undefined] ENABLE_PLUG_IN_FLOWRATE") #elif(ENABLE_PLUG_IN_FLOWRATE) case INT_CALIB_PIPE: tempL.Word[0] = calibDiameter; break; // 0x822C case INT_WORK_PIPE: tempL.Word[0] = workDiameter; break; // 0x822D #endif //========================================================================== #ifndef ENABLE_AUTO_CALIB_ATYPE_OFFSET #pragma message("[undefined] ENABLE_AUTO_CALIB_ATYPE_OFFSET") #elif(ENABLE_AUTO_CALIB_ATYPE_OFFSET) case INT_AUTO_CALIB_ATYPE: tempL.Word[0] = autoCalibrateOffset; break; case INT_USER_INIT_INDEX: tempL.Word[0] = userInitialIndex; break; #endif //========================================================================== #endif //============================================================================== case INT_WORK_UNIT: tempL.Word[0] = flowUnit; break; // 0x822E case INT_DIS_LANGUAGE: tempL.Word[0] = language; break; // 0x822F case INT_ACC_OUT_BIT: tempL.Word[0] = uartDecimalPoint; break; // 0x8230 case INT_REVERSE_SCALE: tempL.Word[0] = reverseScale; break; // 0x8231 case INT_VHH_HIGH: tempL.Word[0] = VHHHigh; break; // 0x8232 case INT_VHH_ROOM: tempL.Word[0] = VHHRoom; break; // 0x8233 case INT_VHH_LOW: tempL.Word[0] = VHHLow; break; // 0x8234 case INT_NRH_HIGH: tempL.Word[0] = NRHHigh; break; // 0x8235 case INT_NRH_ROOM: tempL.Word[0] = NRHRoom; break; // 0x8236 case INT_NRH_LOW: tempL.Word[0] = NRHLow; break; // 0x8237 case INT_GCF_A: tempL.DWord = GCFCoefA; MBBuf.DataByte = 4; break; // 0x823B case INT_GCF_B: tempL.Word[0] = GCFCoefB; break; // 0x823D case INT_GCF_C: tempL.DWord = GCFCoefC; MBBuf.DataByte = 4; break; // 0x823E case INT_RH_GAINRES: tempL.Word[0] = RhExtGainRes; break; // 0x8240 case INT_ZERO_SUPPRESSION: tempL.Word[0] = zeroSuppression; break; // 0x8244 case INT_STATIC_LOW_TA: tempL.Word[0] = staticLowTemperature; break; // 0x8245 case INT_STATIC_HIGH_TA: tempL.Word[0] = staticHighTemperature; break; // 0x8246 //--------------------------------------------------------------------- #ifndef ENABLE_ACCPULSE #pragma message("[undefined] ENABLE_ACCPULSE") #elif(ENABLE_ACCPULSE) case INT_PULSE_COUNTER: tempL.DWord = pulseCounter; MBBuf.DataByte = 4; break; // 0x8247 #endif //--------------------------------------------------------------------- //case INT_ATYPE_RC: tempL.Word[0] = ATypeRC; break; // 0x8249 // //--------------------------------------------------------------------- #ifndef ENABLE_USE_ATYPE_DCP #pragma message("[undefined] ENABLE_USE_ATYPE_DCP") #elif(ENABLE_USE_ATYPE_DCP) case INT_ATYPE_WIPER: tempL.Word[0] = ATypeWiper; break; // 0x824A // #endif //--------------------------------------------------------------------- #ifndef ENABLE_USE_CTYPE_DCP #pragma message("[undefined] ENABLE_USE_CTYPE_DCP") #elif(ENABLE_USE_CTYPE_DCP) case INT_CTYPE_WIPER: tempL.Word[0] = CTypeWiper; break; // 0x824B // #endif //--------------------------------------------------------------------- //case INT_CTYPE_ADC: tempL.Word[0] = calCTypeADC; break; // 0x824C // case INT_OFFSET_HIGH: tempL.Word[0] = OffsetHigh; break; // 0x824D // case INT_OFFSET_LOW: tempL.Word[0] = OffsetLow; break; // 0x824E // case INT_TRH_HIGH: tempL.Word[0] = RHHighTa; break; // 0x824F // case INT_TRH_LOW: tempL.Word[0] = RHLowTa; break; // 0x8250 // //case INT_MEMS_RATIO: tempL.Word[0] = MEMSRatio; break; // 0x8251 // //===================================================================== #ifndef ENABLE_EDM7791_ALL #pragma message("[undefined] ENABLE_EDM7791_ALL") #elif(ENABLE_EDM7791_ALL) case INT_SYS_LCD: tempL.Word[0] = SysLcd; break; // 0x8252 // #endif //===================================================================== #ifndef ENABLE_4_20MA_ALL #pragma message("[undefined] ENABLE_4_20MA_ALL") #elif(ENABLE_4_20MA_ALL) case INT_SYS_CHIP: tempL.Word[0] = SysLoopChip; break; // 0x8253 // #endif case INT_TEMP_CORR: tempL.Word[0] = temperatureFactor; break; // 0x8254 // //-------------------------------------------------------------------- #ifndef ENABLE_SAMPLE_GREATER_GAIN #pragma message("[undefined] ENABLE_SAMPLE_GREATER_GAIN") #elif(ENABLE_SAMPLE_GREATER_GAIN) case INT_OFFSET_VDUGX_GAS: tempL.Word[0] = offsetGasGainx; break; // 0x8255 // case INT_OFFSET_VDUGX_AIR: tempL.Word[0] = offsetAirGainx; break; // 0x8256 // case INT_OFFSET_RGINX: tempL.Word[0] = offsetGCFX; break; // 0x8257 // #endif //-------------------------------------------------------------------- case INT_NRH_P50: tempL.Word[0] = P0RhHigh; break; // 0x8258 // P0RhLow case INT_NRH_P0: tempL.Word[0] = P0RhLow; break; // 0x8259 // P0RhLow //-------------------------------------------------------------------- #ifndef ENABLE_ADJUST_ADC_GAIN #pragma message("[undefined] ENABLE_ADJUST_ADC_GAIN") #elif(ENABLE_ADJUST_ADC_GAIN) case INT_ADC_GAIN: tempL.Word[0] = adcGain; break; // 0x825A #endif //-------------------------------------------------------------------- case INT_RES_FACTOR: tempL.Word[0] = resFactor; break; // 0x825B // case INT_BATTEST_PERIOD: tempL.Word[0] = batteryTestPeriod; break; // 0x825C // //-------------------------------------------------------------------- #ifndef ENABLE_FLOW_GAIN #pragma message("[undefined] ENABLE_FLOW_GAIN") #elif(ENABLE_FLOW_GAIN) case INT_CALIB_FR_GAIN: tempL.Word[0] = calibFlowGain; break; // 0x825F // #endif //-------------------------------------------------------------------- #ifndef ENABLE_TD_TU_SWITCH_CONTROL #pragma message("[undefined] ENABLE_TD_TU_SWITCH_CONTROL") #elif(ENABLE_TD_TU_SWITCH_CONTROL) case INT_DIVHX_HIGH: tempL.Word[0] = DIVHHigh; break; // 0x8262 case INT_DIVHX_ROOM: tempL.Word[0] = DIVHRoom; break; // 0x8263 case INT_DIVHX_LOW: tempL.Word[0] = DIVHLow; break; // 0x8264 #endif #ifndef ENABLE_SAMPLE_GREATER_GAIN #pragma message("[undefined] ENABLE_SAMPLE_GREATER_GAIN") #elif(ENABLE_SAMPLE_GREATER_GAIN) case INT_VDUGX_HIGH: tempL.Word[0] = VDUGXHigh; break; // 0x8265 case INT_VDUGX_ROOM: tempL.Word[0] = VDUGXRoom; break; // 0x8266 case INT_VDUGX_LOW: tempL.Word[0] = VDUGXLow; break; // 0x8267 #endif //-------------------------------------------------------------------- default: if(MBBuf.StartAddr > INT_METER_PARA_MAX) return; tempL.Word[0] = 0; break; } CopyDataAndJudgeComplete(); } } /******************************************************************************/ void InternalReadParameterProtocol(void) { u16 I; while(MBBuf.ByteNumber > 1) { MBBuf.DataByte = 2; switch(MBBuf.StartAddr & 0xff00) { case INT_METER_CODE: ReadMeterSamplingData(); continue; // 0x8300 case INT_METER_INFO: ReadMeterInfo(); continue; // 0x8000 case INT_METER_PARA: ReadMeterParameter(); continue; // 0x8200 case INT_METER_SYS: ReadMeterSystemData(); continue; // 0x8400 case INT_METER_BASIC: ReadMeterBasicData(); continue; // 0x8500 default: switch(MBBuf.StartAddr & 0xf000) { case INT_METER_D000: // 0xD000-DF00 if(MBBuf.StartAddr == INT_UPDATE_APP) tempL.Word[0] = ('A'<<8)+'P'; // 0xDF00 else tempL.Word[0] = 0; break; case INT_METER_E000: //displayMode = NO_DIS_UPDATE; if(calibType == INTCMD_CTYPE_CURVE) // { ReadCalbrationDataByCom(CALI_DATA_ADDR, MAX_OPERATE_DEPTH); } #ifndef ENABLE_2ND_CURVE #pragma message("[undefined] ENABLE_2ND_CURVE") #elif(ENABLE_2ND_CURVE) else if(calibType == INT_2ND_CURVE_CMD) ReadCalbrationDataByCom(CALI_DATA2_ADDR, MAX_OPERATE_DEPTH2); #endif #ifndef ENABLE_3RD_CURVE #pragma message("[undefined] ENABLE_3RD_CURVE") #elif(ENABLE_3RD_CURVE) else if(calibType == INT_3RD_CURVE_CMD ) ReadCalbrationDataByCom(CALI_DATA3_ADDR, MAX_OPERATE_DEPTH3); #endif else MBBuf.BusError = SLAVE_DEVICE_FAILURE; return; default: tempL.Word[0] = 0; break; } } for(I=1; I<=MBBuf.DataByte; I++) MBBuf.RxPointer[MBBuf.Index++] = tempL.Byte[MBBuf.DataByte-I]; ModbusVariablePointerDec(); } } /******************************************************************************/ // write************************************************************************ void InternalWriteParameterProtocol(void) { MBBuf.DataByte = 0; while(1) { if(ModbusVariablePointerProcess()) return; // start next parameter MBBuf.DataByte = 2; if(MBBuf.StartAddr == INT_KEY_ID) //8200 { FreeSetDWordCmdByCom(&securityID); if(securityID == COM_PASSWORD2) securityID = COM_PASSWORD1; else if(securityID == COM_PASSWORD3) securityID = COM_PASSWORD1; continue; } if(securityID != COM_PASSWORD1) { MBBuf.BusError = SLAVE_DEVICE_FAILURE; return; } IDvalidTime = 0; switch(MBBuf.StartAddr) { //===================================================================== // Fixed Address for product series //===================================================================== case INT_SERIES_BASE: WriteEEPROMByCom(SERIES_BASE, SERIES_DEPTH); //0x8000 // [Enable Read And Write] //unsigned char J; //for (J = 0; J < SERIES_DEPTH; J++) meterSN[SERIES_DEPTH-J-1] = ReadByteFromEEPROM(SERIES_BASE + J, PARA_EEPROM); ReadMultiByteFromEEPROM(SERIES_BASE, (u8 *)&meterSN1, SERIES_DEPTH, PARA_EEPROM); #ifndef ENABLE_BLUETOOTH_BEACON #pragma message("[undefined] ENABLE_BLUETOOTH_BEACON") #elif(ENABLE_BLUETOOTH_BEACON) SetSNasBleName(); #endif break; case INT_TIME_BASE: //0x8006 [Enable Read And Write] disable_interrupts(); WriteTimeBase(); WriteAnHistoryData(0); // save set time break; //===================================================================== // fixed Read Address //===================================================================== //case INT_KEY_ID: tempL.DWord = securityID; MBBuf.DataByte = 4; break; //0x8200 Fixed Address write parameter ID Key 0x9600 [Disable Read] case INT_CURVE_TYPE: tempL.Byte[1] = MBBuf.RxPointer[MBBuf.Index++]; tempL.Byte[0] = MBBuf.RxPointer[MBBuf.Index++]; //calibType = 0; if(tempL.Word[0] == INTCMD_CTYPE_CURVE) { calibType = INTCMD_CTYPE_CURVE; } #ifndef ENABLE_2ND_CURVE #pragma message("[undefined] ENABLE_2ND_CURVE") #elif(ENABLE_2ND_CURVE) else if(tempL.Word[0] == INT_2ND_CURVE_CMD) calibType = INT_2ND_CURVE_CMD; #endif #ifndef ENABLE_3RD_CURVE #pragma message("[undefined] ENABLE_3RD_CURVE") #elif(ENABLE_3RD_CURVE) else if(tempL.Word[0] == INT_3RD_CURVE_CMD) calibType = INT_3RD_CURVE_CMD; #endif else if(tempL.Word[0] == INTCMD_1ST_TABLE) calibType = INTCMD_1ST_TABLE; else if(tempL.Word[0] == INTCMD_2ND_TABLE) calibType = INTCMD_2ND_TABLE; //============================================================================== else if(tempL.Word[0] == INTCMD_PRESET_OFFSET) PreCalibrationParameterWriting(); else if(tempL.Word[0] == INTCMD_CALIB_HTEMP) HighTemperatureParameterWriting(); else if(tempL.Word[0] == INTCMD_CALIB_LTEMP) LowTemperatureParameterWriting(); else MBBuf.BusError = SLAVE_DEVICE_FAILURE; break; // 0x8202 select curve type //===================================================================== // Variable Address and system work parameter //===================================================================== //case INT_COMMAND: tempL.Word[0] = calibOperateTime; break; // 0x820D internal control start address [Disable Read] // Variable Address: internal parameter and control case INT_CONTROL: //internal control start address [Disable Read] tempL.Byte[1] = MBBuf.RxPointer[MBBuf.Index++]; tempL.Byte[0] = MBBuf.RxPointer[MBBuf.Index++]; disable_interrupts(); if(tempL.Word[0] == INTCMD_USER_MODE) { EnterUserMode(); // user mode #ifndef ENABLE_ZERO_CALIB_CMD #pragma message("[undefined] ENABLE_ZERO_CALIB_CMD") #elif(ENABLE_ZERO_CALIB_CMD) tempL.Word[0] = 0; tempL.Word[0] = WriteShortParameterToEEPROM(SYS_COMMAND, SYS_COMMAND_WIDTH); #endif tempL.Word[0] = INTCMD_USER_MODE; } else if(tempL.Word[0] == INTCMD_CALIB_MODE) EnterCalibMode(); // calibration mode //------------------------------------------------------------------------ #if(ENABLE_ZERO_CALIB_CMD) else if(tempL.Word[0] == INTCMD_ZERO_CALIB_MODE) { tempL.Word[0] = INTCMD_ZERO_CALIB_HEX; tempL.Word[0] = WriteShortParameterToEEPROM(SYS_COMMAND, SYS_COMMAND_WIDTH); if(tempL.Word[0] != INTCMD_ZERO_CALIB_HEX) break; EnterZeroCalibMode(); // calibration mode tempL.Word[0] = INTCMD_ZERO_CALIB_MODE; } #endif //------------------------------------------------------------------------ else if(tempL.Word[0] == INTCMD_DEBUG_MODE) EnterDebugMode(); // debug mode else if(tempL.Word[0] == INTCMD_BATTERY_MODE) EnterBatteryMode(); // battery mode else if(tempL.Word[0] == INTCMD_GCF_TEST_MODE) EnterGcfTestMode(); // GCF 测试 mode else if(tempL.Word[0] == INTCMD_SAVE_SETUP) SaveFactorySetting(); // Save the factory setting else if(tempL.Word[0] == INTCMD_RESTORE) RestoreFactorySetting(); // Restore factory settings else if(tempL.Word[0] == INTCMD_RESET_CORR) DefaultDevCoef(); // Restore else tempL.Word[0] = 0 ; CMDComPassword = tempL.Word[0]; enable_interrupts(); return ; case INT_CLEAR_RECORD: // 0x820E clear data record: [Disable Read] tempL.Byte[1] = MBBuf.RxPointer[MBBuf.Index++]; tempL.Byte[0] = MBBuf.RxPointer[MBBuf.Index++]; if(tempL.Word[0] == ('B'<<8)+'J') ClearAlarmRecord(); else if(tempL.Word[0] == ('L'<<8)+'S') ClearHistoryRecord(); else if(tempL.Word[0] == ('R'<<8)+'Z') ClearDateRecord(); return ; case INT_TEST_OFFSET: // 0x820F [Disable Read] tempL.Byte[1] = MBBuf.RxPointer[MBBuf.Index++]; tempL.Byte[0] = MBBuf.RxPointer[MBBuf.Index++]; CMDComPassword = tempL.Word[0]; tempL.Word[0] = voltageDetected[NIDX]; // ReadDataFromMovingAverage(NIDX); if(CMDComPassword == ('K'<<8)+'Q') offsetAir = WriteShortParameterToEEPROM(OFFSET_AIR, OFFSET_AIR_WIDTH); else if(CMDComPassword == ('J'<<8)+'Z') offsetGas = WriteShortParameterToEEPROM(OFFSET_GAS, OFFSET_GAS_WIDTH); return; // parameter Address //case INT_PROTOCOL 0x8210 // case INT_SLAVER_ADDR: // 0x8211 MODBUS Slaver Addr // if(ZeroCalibInput()) // { // tempL.Byte[1] = MBBuf.RxPointer[MBBuf.Index++]; // tempL.Byte[0] = MBBuf.RxPointer[MBBuf.Index++]; // tempL.Byte[SLAVER_ADDR_CRC] = CRC8(tempL.Byte, SLAVER_ADDR_CRC); // WriteMultiByteToEEPROM(SLAVER_ADDR, tempL.Byte, SLAVER_ADDR_WIDTH, FROCK_EEPROM); // ReadMultiByteFromEEPROM(SLAVER_ADDR, tempL.Byte, SLAVER_ADDR_WIDTH, FROCK_EEPROM); // localAddress = tempL.Byte[0]; // } // else WriteWordByCom(&localAddress, SLAVER_ADDR, SLAVER_ADDR_WIDTH, SLAVER_ADDR_MAX, SLAVER_ADDR_MIN); // break; case INT_METER_FACTOR: WriteWordByCom(&MeterFactor, METER_FACTOR, METER_FACTOR_WIDTH, METER_PARAMETER_MAX, METER_PARAMETER_MIN); break;// 0x8212 case INT_MAX_FLOW: // 0x8214 //WriteDWordByCom(&maxFlowRate,MAX_FLOW, MAX_FLOW_WIDTH,GetFlowRate(MAX_INDEX-1, CTYPE_FR), 0); WriteDWordByCom(&maxFlowRate, MAX_FLOW, MAX_FLOW_WIDTH, 0xFFFFFFFF, 0); DefaultDevCoef(); break; case INT_OFFSET_GAS: WriteWordByCom(&offsetGas, OFFSET_GAS, OFFSET_GAS_WIDTH, OFFSET_MAX, OFFSET_MIN); //sampleState.EnableRoughTest = 0; break; // 0x8216 case INT_OFFSET_AIR: WriteWordByCom(&offsetAir, OFFSET_AIR, OFFSET_AIR_WIDTH, OFFSET_MAX, OFFSET_MIN); //sampleState.EnableRoughTest = 0; break; // 0x8217 case INT_SAMPLE_PERIOD: WriteWordByCom(&factoryInterval, SAMPLE_PERIOD, SAMPLE_PERIOD_WIDTH, SAMPLE_PERIOD_MAX, SAMPLE_PERIOD_MIN); break; // 0x8218 case INT_HISTORY_PERIOD: WriteWordByCom(&historyPeriod, HISTORY_PERIOD, HISTORY_PERIOD_WIDTH, 720, 0); break; // 0x8219 //--------------------------------------------------------------------- #ifndef ENABLE_ACCPULSE #pragma message("[undefined] ENABLE_ACCPULSE") #elif(ENABLE_ACCPULSE) case INT_PULSE_UNIT: // 0x821A //WriteWordByCom(&calibUnitPerPulse, CALIB_PULSE, CALIB_PULSE_WIDTH, CALIB_PULSE_UNIT_MAX, 1); SetWordCmdByCom(&CMDComPassword); if(parameterState == ABORD_OPERATION) break; if((signed int)CMDComPassword > CALIB_PULSE_UNIT_MAX) break; if((signed int)CMDComPassword < CALIB_PULSE_UNIT_MIN) break; tempDev.Word[0] = CMDComPassword; calibUnitPerPulse = (signed int)WriteParameterToEEPROM(CALIB_PULSE, CALIB_PULSE_WIDTH); lastRemaining = 0; Total[MIN_BIT] = 0; break; #endif //--------------------------------------------------------------------- case INT_SENSOR_SN: WriteEEPROMByCom(SENSOR_SN_BASE, SENSOR_SN_DEPTH); break; // 0x821D/0x821E/0x821F case INT_TOTAL_ACC: WriteACCFRByCom(); break; // 0x8220-0x8225 case INT_CALIB_TA: WriteWordByCom(&calibTemperature, CALIB_TEMPERATURE, CALIB_TEMPERATURE_WIDTH, CALIB_TEMPRETURE_MAX, CALIB_TEMPRETURE_MIN); break; //0x8226 //===================================================================== #ifndef ENABLE_A_TYPE_FLOWRATE #pragma message("[undefined] ENABLE_A_TYPE_FLOWRATE") #elif(ENABLE_A_TYPE_FLOWRATE) case INT_OFFSET_A_GAS: WriteWordByCom(&offsetGasA, OFFSET_A_GAS, OFFSET_A_GAS_WIDTH, OFFSET_A_MAX, OFFSET_A_MIN); break; // 0x8227 case INT_OFFSET_A_AIR: WriteWordByCom(&offsetAirA, OFFSET_A_AIR, OFFSET_A_AIR_WIDTH, OFFSET_A_MAX, OFFSET_A_MIN); break; // 8228 // 0x8227 case INT_ATYPE_INDEX_GAIN: if(!currentMode.Bit.CalibMode) return; WriteWordByCom(&ATypeIndexGain, ATYPE_INDEX_GAIN, ATYPE_INDEX_GAIN_WIDTH, ATYPE_INDEX_GAIN_MAX, ATYPE_INDEX_GAIN_MIN); break; case INT_GDCF_ATYPE: WriteWordByCom(&GDCFactorAType, GCF_ATYPE, GCF_ATYPE_WIDTH, GCF_PARAMETER_MAX, GCF_PARAMETER_MIN); break; // 0x822A case INT_FR_SWITCH_POINT: WriteDWordByCom(&switchFIndex, SWITCH_FR, SWITCH_FR_WIDTH, SWITCH_FR_INDEX_MAX, SWITCH_FR_INDEX_MIN); break; // 0x825D // 0x8228 //========================================================================== #ifndef ENABLE_PLUG_IN_FLOWRATE #pragma message("[undefined] ENABLE_PLUG_IN_FLOWRATE") #elif(ENABLE_PLUG_IN_FLOWRATE) case INT_CALIB_PIPE: WriteWordByCom(&calibDiameter, CALIB_DIAMETER, CALIB_DIAMETER_WIDTH, 100, 25); break; //0x822C case INT_WORK_PIPE: WriteWordByCom(&workDiameter, WORK_DIAMETER, WORK_DIAMETER_WIDTH, 5000, 25); break; //0x822D #endif //========================================================================== #ifndef ENABLE_AUTO_CALIB_ATYPE_OFFSET #pragma message("[undefined] ENABLE_AUTO_CALIB_ATYPE_OFFSET") #elif(ENABLE_AUTO_CALIB_ATYPE_OFFSET) case INT_AUTO_CALIB_ATYPE: WriteWordByCom(&autoCalibrateOffset, AUTO_OFFSET_CMD, AUTO_OFFSET_CMD_WIDTH,0xff, 0); case INT_USER_INIT_INDEX: WriteWordByCom(&userInitialIndex, USER_INIT_INDEX, USER_INIT_INDEX_WIDTH, 20000, 0); #endif //===================================================================== #endif //===================================================================== case INT_WORK_UNIT: //0x822E tempL.Byte[1] = MBBuf.RxPointer[MBBuf.Index++]; tempL.Byte[0] = MBBuf.RxPointer[MBBuf.Index++]; //controlCammand = flowUnit; if(tempL.Word[0] == flowUnit) break; ConvertAllFlowRateAndSave(tempL.Word[0]); break; //===================================================================== case INT_DIS_LANGUAGE: WriteWordByCom(&language, DIS_LANGUAGE, DIS_LANGUAGE_WIDTH, 2, 0); break; // 0x822F case INT_ACC_OUT_BIT: WriteWordByCom(&uartDecimalPoint, COM_DECIMAL_POINT, COM_DECIMAL_POINT_WIDTH, 4, 3); break; // 0x8230 case INT_REVERSE_SCALE: WriteWordByCom(&reverseScale, REVERSE_SCALE, REVERSE_SCALE_WIDTH, REVERSE_SCALE_MAX, REVERSE_SCALE_MIN); break; // 0x8231 case INT_VHH_HIGH: WriteWordByCom(&VHHHigh, VHH_HIGH, VHH_HIGH_WIDTH, VHH_MAX, VHH_MIN); break; // 0x8232 case INT_VHH_ROOM: WriteWordByCom(&VHHRoom, VHH_ROOM, VHH_ROOM_WIDTH, VHH_MAX, VHH_MIN); break; // 0x8233 case INT_VHH_LOW: WriteWordByCom(&VHHLow, VHH_LOW, VHH_LOW_WIDTH, VHH_MAX, VHH_MIN); break; // 0x8234 case INT_NRH_HIGH: WriteWordByCom(&NRHHigh, NRH_HIGH, NRH_HIGH_WIDTH, NRH_MAX, NRH_MIN); break; // 0x8235 case INT_NRH_ROOM: WriteWordByCom(&NRHRoom, NRH_ROOM, NRH_ROOM_WIDTH, NRH_MAX, NRH_MIN); break; // 0x8236 case INT_NRH_LOW: WriteWordByCom(&NRHLow, NRH_LOW, NRH_LOW_WIDTH, NRH_MAX, NRH_MIN); break; // 0x8237 //********************************************************************* case INT_GCF_A: WriteDWordByCom((u32 *)&GCFCoefA, GCF_A, GCF_A_WIDTH, 0xffffffff, 0); ComputeGCFFactor(); break; // 0x823B case INT_GDCF: case INT_GCF_B: WriteWordByCom((u16 *)&GDCFactor, GCF_B, GCF_B_WIDTH, GCF_PARAMETER_MAX, GCF_PARAMETER_MIN); ComputeGCFFactor(); break; // 0x8213 // 0x823D case INT_GCF_C: WriteDWordByCom((u32 *)&GCFCoefC, GCF_C, GCF_C_WIDTH, 0xffffffff, 0); ComputeGCFFactor(); break; // 0x823E //********************************************************************* case INT_RH_GAINRES: WriteWordByCom(&RhExtGainRes, RH_GAINRES, RH_GAINRES_WIDTH, RH_GAINRES_MAX, RH_GAINRES_MIN); break; // 0x8240 case INT_ZERO_SUPPRESSION: WriteWordByCom(&zeroSuppression, ZERO_SUPPRESSION, ZERO_SUPPRESSION_WIDTH, ZERO_SUPPRESSION_MAX, ZERO_SUPPRESSION_MIN); break; // 0x8244 case INT_STATIC_LOW_TA: WriteWordByCom(&staticLowTemperature, STATIC_LOW_TA, STATIC_LOW_TA_WIDTH, STATIC_LOW_TA_MAX, STATIC_LOW_TA_MIN); break; // 0x8245 case INT_STATIC_HIGH_TA: WriteWordByCom(&staticHighTemperature, STATIC_HIGH_TA, STATIC_HIGH_TA_WIDTH, STATIC_HIGH_TA_MAX, STATIC_HIGH_TA_MIN); break; // 0x8246 //case INT_PULSE_COUNTER: WriteWordByCom(&pulseCounter, PULSE_COUNTER, PULSE_COUNTER_WIDTH, 0xFFFFFFFF, 0); break; // 0x8247 //FY // case INT_ATYPE_RC: // if(!currentMode.Bit.CalibMode) return; // WriteWordByCom(&ATypeRC, ATYPE_RC, ATYPE_RC_WIDTH, ATYPE_RC_MAX, ATYPE_RC_MIN); // ComputRRRHRatio(); // break; // 0x8249 // //===================================================================== #ifndef ENABLE_USE_ATYPE_DCP #pragma message("[undefined] ENABLE_USE_ATYPE_DCP") #elif(ENABLE_USE_ATYPE_DCP) case INT_ATYPE_WIPER: if(!currentMode.Bit.CalibMode) return; SetWordCmdByCom(&calibType); if(calibType != 0xAA55) { if(calibType > ATYPE_WIPER_MAX) break; tempL.Word[0] = calibType; calibType = 0; ATypeWiper = (u16)WriteShortParameterToEEPROM(ATYPE_WIPER, ATYPE_WIPER_WIDTH); ComputRRRHRatio(); } else { calibType = ('A'<<8)+'P'; MaxCTypeWiper = ATYPE_WIPER_MAX; MinCTypeWiper = ATYPE_WIPER_MIN; } break; // 0x824A // #endif //===================================================================== #ifndef ENABLE_USE_CTYPE_DCP #pragma message("[undefined] ENABLE_USE_CTYPE_DCP") #elif(ENABLE_USE_CTYPE_DCP) case INT_CTYPE_WIPER: if(!currentMode.Bit.CalibMode) return; SetWordCmdByCom(&calibType); if(calibType != 0xAA55) { if(calibType > CTYPE_WIPER_MAX) break; tempL.Word[0] = calibType; calibType = 0; CTypeWiper = (u16)WriteShortParameterToEEPROM(CTYPE_WIPER, CTYPE_WIPER_WIDTH); //ComputRRRHRatio(); } else { calibType = ('C'<<8)+'P'; MaxCTypeWiper = CTYPE_WIPER_MAX; MinCTypeWiper = CTYPE_WIPER_MIN; } //WriteWordByCom(&CTypeWiper, CTYPE_WIPER, CTYPE_WIPER_WIDTH, CTYPE_WIPER_MAX, CTYPE_WIPER_MIN); //ComputRRRHRatio(); break; // 0x824B // #endif //===================================================================== #ifndef ENABLE_EDM7791_ALL #pragma message("[undefined] ENABLE_EDM7791_ALL") #elif(ENABLE_EDM7791_ALL) case INT_SYS_LCD: WriteWordByCom(&SysLcd, SYS_LCD, SYS_LCD_WIDTH, SYS_LCD_MAX, SYS_LCD_MIN); break; // 0x8252 // #endif //===================================================================== #ifndef ENABLE_4_20MA_ALL #pragma message("[undefined] ENABLE_4_20MA_ALL") #elif(ENABLE_4_20MA_ALL) case INT_SYS_CHIP: WriteWordByCom(&SysLoopChip, SYS_LOOP_CHIP, SYS_LOOP_CHIP_WIDTH, SYS_LOOP_CHIP_MAX, SYS_LOOP_CHIP_MIN); break; // 0x8253 // #endif //===================================================================== case INT_TEMP_CORR: WriteWordByCom(&temperatureFactor, TEMP_FACTOR, TEMP_FACTOR_WIDTH, TEMP_FACTOR_MAX, TEMP_FACTOR_MIN); break; // 0x8254 // //-------------------------------------------------------------------- #ifndef ENABLE_SAMPLE_GREATER_GAIN #pragma message("[undefined] ENABLE_SAMPLE_GREATER_GAIN") #elif(ENABLE_SAMPLE_GREATER_GAIN) case INT_OFFSET_VDUGX_GAS: WriteWordByCom(&offsetGasGainx, OFFSET_GAS_VDUGX, OFFSET_GAS_VDUGX_WIDTH, 20000, 4000); break;// 0x8255 // case INT_OFFSET_VDUGX_AIR: WriteWordByCom(&offsetAirGainx, OFFSET_AIR_VDUGX, OFFSET_AIR_VDUGX_WIDTH, 20000, 4000); break; // 0x8256 // case INT_OFFSET_RGINX: WriteWordByCom(&offsetGCFX, OFFSET_GCFX, OFFSET_GCFX_WIDTH, 20000, 4000); break; // 0x8257 // #endif //-------------------------------------------------------------------------- #ifndef ENABLE_A_TYPE_FLOWRATE #pragma message("[undefined] ENABLE_A_TYPE_FLOWRATE") #elif(ENABLE_A_TYPE_FLOWRATE) case INT_NRH_P50: WriteWordByCom(&P0RhHigh, P0_0_RH, P0_0_RH_WIDTH, 65535, 0); break; // 0x8258 // P0RhLow case INT_NRH_P0: WriteWordByCom(&P0RhLow, P0_0_RH, P0_0_RH_WIDTH, 65535, 0); break; // 0x8259 // P0RhLow #endif //-------------------------------------------------------------------- case INT_RES_FACTOR: WriteWordByCom(&resFactor, RES_FACTOR, RES_FACTOR_WIDTH, RES_FACTOR_MAX, RES_FACTOR_MIN); break; // 0x825B case INT_BATTEST_PERIOD: WriteWordByCom(&batteryTestPeriod, BATTEST_PERIOD, BATTEST_PERIOD_WIDTH, BATTEST_PERIOD_MAX, BATTEST_PERIOD_MIN); break; // 0x825C //===================================================================== #ifndef ENABLE_ADJUST_ADC_GAIN #pragma message("[undefined] ENABLE_ADJUST_ADC_GAIN") #elif(ENABLE_ADJUST_ADC_GAIN) case INT_ADC_GAIN: WriteWordByCom(&adcGain, SD24_GAIN, SD24_GAIN_WIDTH, 128, 1); break; // 0x825A #endif //===================================================================== #ifndef ENABLE_FLOW_GAIN #pragma message("[undefined] ENABLE_FLOW_GAIN") #elif(ENABLE_FLOW_GAIN) case INT_CALIB_FR_GAIN: // 0x825F SetWordCmdByCom(&CMDComPassword); //if(JudgeFlowRateGain(CMDComPassword)) break; tempL.Word[0] = CMDComPassword; calibFlowGain = (u16)WriteShortParameterToEEPROM(FLOW_GAIN, FLOW_GAIN_WIDTH); break; #endif //===================================================================== //Update program case INT_UPDATE_APP: SetWordCmdByCom(&CMDComPassword); if(parameterState == ABORD_OPERATION) break; if(CMDComPassword == (u16)UPGRADE_APP_CMD) { UPGRADECammand = (u16)UPGRADE_APP_CMD; disable_interrupts(); ResetSystem(); while(1); } // else // { // disable_interrupts(); // UPGRADECammand = 0; // if((u16)ReadParameterFromMemory(UPGRADE_APP, UPGRADE_APP_WIDTH, 0) != 0xAA55) return; // BackupParameterToFlash(); // enable_interrupts(); // } else if(CMDComPassword == (u16)END_UPGRADE_APP_CMD) { disable_interrupts(); UPGRADECammand = 0; BackupParameterToFlash(); enable_interrupts(); } break; //===================================================================== case INT_CURVE_NUM: // 0x8009 [Enable Read And Write] // max:20 #ifndef ENABLE_ONE_TABLE #pragma message("[undefined] ENABLE_ONE_TABLE") #elif(ENABLE_ONE_TABLE) calibType = ENABLE_ONE_TABLE_NAME; #endif if(calibType == INTCMD_1ST_TABLE) WriteWordByCom(&curveTANum, TACURVE_NUM, TACURVE_NUM_WIDTH, CURVE_DATA_MAX, 3); else if(calibType == INTCMD_2ND_TABLE) WriteWordByCom(&curveATypeNum, ATYPECURVE_NUM, ATYPECURVE_NUM_WIDTH, CURVE_DATA_MAX, 3); break; //===================================================================== // for calibration data //===================================================================== default: if((MBBuf.StartAddr >= INT_CURVE_NODE1) && (MBBuf.StartAddr <= INT_CURVE_NODE36)) { WriteCurveByCom();//0x800A-0x8073 break; } tempL.Word[0] = 0; MBBuf.DataByte = 2; if((MBBuf.StartAddr & 0xF000) != INT_CALIB_1) //0xE000 { MBBuf.BusError = ILLEGAL_DATA_ADDRESS; return; } if(calibType == INTCMD_CTYPE_CURVE)//8202->4354 { WriteCalbrationDataByCom(CALI_DATA_ADDR, MAX_OPERATE_DEPTH); //currentMode.Bit.CalibMode = 0; EnterUserMode(); } //------------------------------------------------------------------------ #ifndef ENABLE_2ND_CURVE #pragma message("[undefined] ENABLE_2ND_CURVE") #elif(ENABLE_2ND_CURVE) else if(calibType == INT_2ND_CURVE_CMD) WriteCalbrationDataByCom(CALI_DATA2_ADDR, MAX_OPERATE_DEPTH2); #endif //------------------------------------------------------------------------ #ifndef ENABLE_3RD_CURVE #pragma message("[undefined] ENABLE_3RD_CURVE") #elif(ENABLE_3RD_CURVE) else if(calibType == INT_3RD_CURVE_CMD) WriteCalbrationDataByCom(CALI_DATA3_ADDR, MAX_OPERATE_DEPTH3); #endif //------------------------------------------------------------------------ else MBBuf.BusError = SLAVE_DEVICE_FAILURE; return; } } } u8 untempBuf[CALIB_WIDTH],untempBuf1[CALIB_WIDTH]; void InternalWriteParameterProtocolToFlash(void) { MBBuf.DataByte = 0; while(1) { if(ModbusVariablePointerProcess()) return; MBBuf.DataByte = 2; switch(MBBuf.StartAddr) { case INT_SERIES_BASE: // 0x8000 从上位机更新 SN ---------------------------------------------------------- { //SN的长度为6个Word WriteWordByComToFlash(&meterSN1,WP_VENDER);//接收并更新meterSN1,将会在更新Flash时被装填 WriteWordByComToFlash(&meterSN2,WP_VENDER);//接收并更新meterSN2,将会在更新Flash时被装填 WriteWordByComToFlash(&meterSN3,WP_VENDER);//接收并更新meterSN3,将会在更新Flash时被装填 WriteWordByComToFlash(&meterSN4,WP_VENDER);//接收并更新meterSN4,将会在更新Flash时被装填 WriteWordByComToFlash(&meterSN5,WP_VENDER);//接收并更新meterSN5,将会在更新Flash时被装填 WriteWordByComToFlash(&meterSN6,WP_VENDER);//接收并更新meterSN6,将会在更新Flash时被装填 }break; case INT_TIME_BASE: /*0x8006 ----------------------------------------------*/ { }break; case INT_CURVE_TYPE:{ /*0x8202 select curve type ----------------------------------------------*/ tempL.Byte[1] = MBBuf.RxPointer[MBBuf.Index++]; tempL.Byte[0] = MBBuf.RxPointer[MBBuf.Index++]; if(tempL.Word[0] == INTCMD_CTYPE_CURVE) {calibType =INTCMD_CTYPE_CURVE;}/*0x4354*/ else if(tempL.Word[0] == INTCMD_ATYPE_CURVE){calibType =INTCMD_ATYPE_CURVE;}/*0x4154*/ else if(tempL.Word[0] == INTCMD_1ST_TABLE){calibType = INTCMD_1ST_TABLE; }/*0x4E31*/ else if(tempL.Word[0] == INTCMD_2ND_TABLE){calibType = INTCMD_2ND_TABLE; }/*0x4E32*/ else if(tempL.Word[0] == INTCMD_PRESET_OFFSET) /*0x5057 更新偏移量*/ { tempL.Word[0] = voltageDetected[NIDX]; // if(voltageDetected[IVHDX]<56000)tempL.Word[0] = voltageDetected[NIDX];//从程序内更新 offsetGas offsetAir // else tempL.Word[0] =voltageDetected[VRHX ]; offsetGas = tempL.Word[0]; //offsetAir = tempL.Word[0]; munWriteParams = WP_VENDER; if(mucSaveParams != PARAMS_ING) mucSaveParams = PARAMS_READY; } else if(tempL.Word[0] == INTCMD_CALIB_HTEMP)/*0x4854*/{HighTemperatureParameterWriting();}// else if(tempL.Word[0] == INTCMD_CALIB_LTEMP)/*0x4c54*/{LowTemperatureParameterWriting();} // else MBBuf.BusError = SLAVE_DEVICE_FAILURE; }break; case INT_OFFSET_GAS:// 0x8216 从上位机更新 offsetGas ---------------------------------------------- WriteWordByComToFlash(&offsetGas,WP_VENDER);//offsetGas将会在更新Flash时被装填 break; case INT_OFFSET_AIR:// 0x8217 从上位机更新 offsetAir ---------------------------------------------- WriteWordByComToFlash(&offsetAir,WP_VENDER);//offsetAir将会在更新Flash时被装填 break; default:// -------------------------------------------------------------------------------------------- //写入校准数据 // //MBBuf.StartAddr = 0x800A-0x8073 写入36个点--------------------------- // if((MBBuf.StartAddr >= INT_CURVE_NODE1) && (MBBuf.StartAddr <= INT_CURVE_NODE36)) // { // WriteCurveByCom(); // break; // } //MBBuf.StartAddr = 0xE000 ------------------------------------------- if((MBBuf.StartAddr & 0xF000) != INT_CALIB_1) { MBBuf.BusError = ILLEGAL_DATA_ADDRESS; return; }//!=0xE000直接退出 if(calibType == INTCMD_CTYPE_CURVE) //8202->4354 { memcpy(untempBuf, (void *)&MBBuf.RxPointer[MBBuf.Index], MBBuf.ByteNumber); if(offsetAir) FLASH_Write_Calib_Data_ToFlash(MBBuf.StartAddr-0xE000 ,untempBuf); else FLASH_Write_Calib2_Data_ToFlash(MBBuf.StartAddr-0xE000 ,untempBuf); ReadCalibDataFromFlash( MBBuf.StartAddr-0xE000 ,untempBuf1, MBBuf.ByteNumber ); if(memcmp(untempBuf,untempBuf1, MBBuf.ByteNumber))MBBuf.BusError = SLAVE_DEVICE_FAILURE; return;//连续写 } else MBBuf.BusError = SLAVE_DEVICE_FAILURE; disable_interrupts(); } } } void InternalReadParameterProtocolInFlash(void) { switch(MBBuf.StartAddr & 0xff00) { case INT_METER_CODE: ReadMeterSamplingData(); break; // 0x8300 case INT_METER_INFO: ReadMeterInfo(); break; // 0x8000 case INT_METER_PARA: ReadMeterParameter(); break; // 0x8200 case INT_METER_SYS: ReadMeterSystemData(); break; // 0x8400 case INT_METER_BASIC: ReadMeterBasicData(); break; // 0x8500 default: // disable_interrupts(); if((MBBuf.StartAddr & 0xF000) == 0xE000) { if(calibType == INTCMD_CTYPE_CURVE) //ReadCalbrationDataByCom(CALI_DATA_ADDR, MAX_OPERATE_DEPTH); { if(offsetAir)ReadCalibDataFromFlash( MBBuf.StartAddr-0xE000 ,&MBBuf.RxPointer[MBBuf.Index], MBBuf.ByteNumber ); else ReadCalib2DataFromFlash(MBBuf.StartAddr-0xE000 ,&MBBuf.RxPointer[MBBuf.Index], MBBuf.ByteNumber ); } } return; } }