#include "1billing.h" #include "para.h" #include "1gprs.h" #include "ReadDeviceData.h" #include "ex_rtc.h" #include "1ValveControl.h" #include "RW_Verification.h" SETTLEMENT_PARA Settlement_Para; u8 Settlement(void) //½áËã { float fFee=0; double dBlanceBeforeSettlement=0; u8 RecalculationFlag=0; double dBlance=0; double dCumulativeGasUsage=0; double dCumulativeFeeUsage=0; dBlanceBeforeSettlement = Settlement_Para.fBalance; if((parameter_bil.cDataObtainType & PULSE_MODE) == PULSE_MODE) //Âö³å { Settlement_Para.fCurrentGasUsage = parameter_bil.fPulseCoefficient * Settlement_Para.u32PulseCounting_last; //±¾´ÎÓÃÆøÁ¿ if(parameter_bil.cBillingType==0x01) { fFee = Settlement_Para.fCurrentGasUsage * parameter_bil.fSingleBillingFee; if((fFee>10000)||(fFee<0)) { fFee = parameter_bil.fPulseCoefficient * parameter_bil.fSingleBillingFee; } if((fFee>10000)||(fFee<0)) { fFee = 0; } dCumulativeGasUsage = Settlement_Para.fCumulativeGasUsage + Settlement_Para.fCurrentGasUsage; dCumulativeFeeUsage = Settlement_Para.fCumulativeFeeUsage + fFee; dBlance = Settlement_Para.fBalance - fFee; //Write_Verification(Settlement_Para.fBalance,REALTIME_BALANCE_ADDR,REALTIME_BALANCE_B_ADDR,REALTIME_BALANCE_C_ADDR); // #ifdef DEBUG_OUT // sprintf(Debug," fBalance = %.2f \r\n", Settlement_Para.fBalance); // UartDebugFun(Debug); // #endif // if(dCumulativeGasUsage>=99999999.99) // { // dCumulativeGasUsage = dCumulativeGasUsage -99999999.99; // } if( (dBlance>BALANCE_LOWER_LIMIT)&&(dBlance=0)&&(dCumulativeFeeUsage=0)&&(dCumulativeGasUsage parameter_bil.fStepBilling_First) { fFee = (parameter_bil.fStepBilling_First - fCumulativeGasUsage)*parameter_bil.fStepBillingFee_First + (Settlement_Para.fCumulativeGasUsage - parameter_bil.fStepBilling_First)* parameter_bil.fStepBillingFee_Second; } else { fFee = fCurrentGasUsage*parameter_bil.fStepBillingFee_First; } } else if((fCumulativeGasUsage >= parameter_bil.fStepBilling_First)&&(fCumulativeGasUsage< parameter_bil.fStepBilling_Second)) { if(Settlement_Para.fCumulativeGasUsage > parameter_bil.fStepBilling_Second) { fFee = (parameter_bil.fStepBilling_Second - fCumulativeGasUsage)*parameter_bil.fStepBillingFee_Second + (Settlement_Para.fCumulativeGasUsage - parameter_bil.fStepBilling_Second)* parameter_bil.fStepBillingFee_Third; } else { fFee = fCurrentGasUsage*parameter_bil.fStepBillingFee_Second; } } else if(fCumulativeGasUsage >= parameter_bil.fStepBilling_Second) { fFee = fCurrentGasUsage*parameter_bil.fStepBillingFee_Third; } return fFee; } void RS485Settlement(void) //485¶ÁÈ¡½áËã { u8 CheckCardinalityResult=0; uint32_t RS485SCACC_Base; uint32_t TotalDifference = 0; //ÓÃÆøÁ¿£¬Á½´Î±ê¿ö×ÜÁ¿¶ÁÈ¡µÄ²îÖµ double RS485Balance_Base; double RS485GasUsage_Base; double RS485FeeUsage_Base; double dBlanceBeforeSettlement=0; dBlanceBeforeSettlement = Settlement_Para.fBalance; if(Settlement_Para.RS485SettlementFlag ==1) { Settlement_Para.fCumulativeGasUsage = LLJ_data_g.SC_Accumulation_long ; //485½áËãģʽÏ£¬Ö»Òª¶ÁÈ¡³É¹¦¾Í°Ñ±ê¿ö×ÜÁ¿¸³Öµ¸ø·§×ÜÓÃÆøÁ¿ Write_Verification(Settlement_Para.fCumulativeGasUsage,REALTIME_CUMULATIVE_GAS_USAGE_ADDR,REALTIME_CUMULATIVE_GAS_USAGE_B_ADDR,REALTIME_CUMULATIVE_GAS_USAGE_C_ADDR); Settlement_Para.RS485SettlementINGFlag = 1;//¿ªÊ¼Ð£Ñé if(Settlement_Para.RS485BilDataReadableFlag == 1) //ÒÑÓлùÊý¿É¶Á£¬¿É¶ÁÈ¡½áËã¡£ { RS485SCACC_Base = FM25V02_data_read_uint32(SCACC_BIL_ADDR); RS485Balance_Base = FM25V02_data_read_double(BALANCE_BIL_ADDR); RS485GasUsage_Base = FM25V02_data_read_double(GAS_USAGE_BIL_ADDR); RS485FeeUsage_Base = FM25V02_data_read_double(FEE_USAGE_BIL_ADDR); //Åж϶ÁÈ¡µÄ»ùÊýÊÇ·ñÓÐÃ÷ÏÔÒì³£ if(RS485SCACC_Base<=999999999) { if((RS485Balance_Base>BALANCE_LOWER_LIMIT)&&(RS485Balance_Base<=BALANCE_UP_LIMIT)) { if((RS485GasUsage_Base>=0)&&(RS485GasUsage_Base<=GAS_USAGE_UP_LIMIT)) { if((RS485FeeUsage_Base>=0)&&(RS485FeeUsage_Base<=FEE_USAGE_UP_LIMIT)) { CheckCardinalityResult = 1; } } } } if(CheckCardinalityResult == 0) { RS485SCACC_Base = FM25V02_data_read_uint32(SCACC_BIL_ADDR); RS485Balance_Base = FM25V02_data_read_double(BALANCE_BIL_ADDR); RS485GasUsage_Base = FM25V02_data_read_double(GAS_USAGE_BIL_ADDR); RS485FeeUsage_Base = FM25V02_data_read_double(FEE_USAGE_BIL_ADDR); //Åж϶ÁÈ¡µÄ»ùÊýÊÇ·ñÓÐÃ÷ÏÔÒì³£ if(RS485SCACC_Base<=999999999) { if((RS485Balance_Base>BALANCE_LOWER_LIMIT)&&(RS485Balance_Base<=BALANCE_UP_LIMIT)) { if((RS485GasUsage_Base>=0)&&(RS485GasUsage_Base<=GAS_USAGE_UP_LIMIT)) { if((RS485FeeUsage_Base>=0)&&(RS485FeeUsage_Base<=FEE_USAGE_UP_LIMIT)) { CheckCardinalityResult = 1; } } } } } if(CheckCardinalityResult == 1) { if(LLJ_data_g.SC_Accumulation_long>=RS485SCACC_Base) //ÓÐÓÃÆø { system_alarm.alarm_RS485_Abnormal_Small_Reading_FLAG =0; TotalDifference = LLJ_data_g.SC_Accumulation_long - RS485SCACC_Base; if(TotalDifference==0) //ÎÞ×߯ø£¬ÎÞÐèºËË㣬»ùÊýÒ²¿ÉÒÔ²»¸üР{ } else if(TotalDifference<1000000) //½áËãÓÃÆøÁ¿Ôݶ¨Ð¡ÓÚ1000000£¬¸ßÁ˱íʾ¼ÆËã´íÎó£¬Ôõô´¦ÀíÓдý¿¼ÂÇ { //Settlement_Para.fCumulativeGasUsage = RS485GasUsage_Base + TotalDifference ; // Settlement_Para.fCumulativeGasUsage = LLJ_data_g.SC_Accumulation_long ; // Write_Verification(Settlement_Para.fCumulativeGasUsage,REALTIME_CUMULATIVE_GAS_USAGE_ADDR,REALTIME_CUMULATIVE_GAS_USAGE_B_ADDR,REALTIME_CUMULATIVE_GAS_USAGE_C_ADDR); Settlement_Para.fCumulativeFeeUsage = RS485FeeUsage_Base + parameter_bil.fSingleBillingFee * TotalDifference ; Settlement_Para.fBalance = RS485Balance_Base - parameter_bil.fSingleBillingFee * TotalDifference; Write_Verification(Settlement_Para.fBalance,REALTIME_BALANCE_ADDR,REALTIME_BALANCE_B_ADDR,REALTIME_BALANCE_C_ADDR); Write_Verification(Settlement_Para.fCumulativeFeeUsage,REALTIME_CUMULATIVE_FEE_USAGE_ADDR,REALTIME_CUMULATIVE_FEE_USAGE_B_ADDR,REALTIME_CUMULATIVE_FEE_USAGE_C_ADDR); StorageCardinality(); }else //Êý¾Ý¿ÉÄÜÒì³££¬ÖØÐ´æ»ùÊý£¬µ«ÊÇ¿ÉÄÜ·¢ÉúÁËÆøÁ¿Â©¼Ç£¬´Ëʱ¸ÃÔõô´¦Àí£ºÅжϻùÊýÒì³£»¹ÊÇ485жÁµÄ±ê¿ö×ÜÁ¿Òì³££¬Èç¹ûжÁ×ÜÁ¿Òì³£Ôò»ùÊý²»¶¯£¬ÓÉÓÚÇ°Ãæ¼ì²é¹ý¶ÁÈ¡µÄ»ùÊý£¬ËùÒÔÕâÀïÖ»¿ÉÄÜÊÇжÁÊýÒì³££¬Ð¶ÁÊýÒì³£Ôò´Ë´Î×÷·Ï£¬Ï´ÎÔÙ¶Á { //Èç¹ûжÁÊýÒ»Ö±Òì³£Ôõô°ì£¿Ä¿Ç°Ã»ÓÐ×ÜÁ¿Ò»Ö±¶ÁÈ¡´íÎóµÄÇé¿ö¡£ÕâÖÖÇé¿öÊÇ·ñÓ¦¸ÃÖ±½ÓÈËΪ¸ÉÔ¤ } } else //жÁÈ¡µÄ×ÜÁ¿±È»ùÊý»¹Ð¡£¬´ËʱÔõô°ì£¬´ËʱÓпÉÄÜжÁÈ¡µÄ×ÜÁ¿Òì³££¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡´Ëʱ¿ÉÄÜ»ùÊý²»»á¸üУ¬Ð¶ÁÈ¡×ÜÁ¿Ò»Ö±±È»ùÊýС£¬Ò»Ö±²»¸üУ¬Ö»ÄÜÈËΪ¸ÉÔ¤£¬ÇåÁã»ùÊýÖØÐ¿ªÊ¼ { if(system_alarm.alarm_RS485_Abnormal_Small_Reading_FLAG==0) { system_alarm.alarm_RS485_Abnormal_Small_Reading=1; system_alarm.alarm_RS485_Abnormal_Small_Reading_FLAG=1; } } //Èç¹ûÓÐÂö³å¿Û·Ñ¸¨Öú£¬ÄÇôһ´ÎÊý¾Ý´íÎóµ¼ÖÂÎÞ·¨½áË㣬ÄÇÊÇ¿ÉÒÔ¶ªÆúµÄ£¬´Óµ±Ç°¿ªÊ¼ÖØÐ³­»ùÊý¼ÆËã¡£ //Èç¹ûûÓÐÂö³å¿Û·Ñ¸¨Öú£¬Ö»ÓÐ485½áË㣬ÄÇôÓÉÓÚÊý¾Ý¶ÁÈ¡´íÎóµ¼ÖµÄÎÞ·¨½áË㽫²»ÄÜÖØÐ³­»ùÊý£¬²»È»Ö®Ç°µÄ»ùÊýûÓмÆËã¹ý£¬»áµ¼ÖÂÆøÁ¿Â©¼Ç¡£Õâ¸öÎÊÌâ±È½ÏÑÏÖØ£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡ //ÒÔÉϵÚÒ»¶þµã±ØÐë±£Ö¤»ùÊý´æ´¢ÊÇûÓÐÎÊÌâµÄ£¬Èç¹ûÓÐÎÊÌâÊý¾Ý²»×÷Ϊ»ùÊý±£´æ¡£ }else { //»ùÊý¶ÁÈ¡Òì³££¬ÏÈÇåÁã»ùÊý£¬ÔÙ´æ´¢»ùÊý ClearCardinalFlag(); StorageCardinality(); } } else if(Settlement_Para.RS485BilDataReadableFlag == 0) //ÎÞ»ùÊý£¬´æ´¢Ò»´Î»ùÊý { //´æ´¢»ùÊý StorageCardinality(); } Settlement_Para.RS485SettlementINGFlag = 0; //УÑé½áÊø if((Settlement_Para.u32PulseCounting_last>0)&&(Settlement_Para.u32PulseCounting_last<18000)) //Èç¹ûÓÐ묒ËãµÄÂö³å£¬ÔòÂö³å¼Æ·Ñ£¬´Ë¼ÆÊý²»¿ÉÄܴܺ󣬴˴¦ÏÈÉèÖÃСÓÚ18000. { if(Settlement()) //½áËãÊýÖµ³ö´íÖØÐ½áË㣬×î¶àÈý´Î { if(Settlement()) { Settlement(); } } Settlement_Para.u32PulseCounting_last = 0; Write_Verification(Settlement_Para.fBalance,REALTIME_BALANCE_ADDR,REALTIME_BALANCE_B_ADDR,REALTIME_BALANCE_C_ADDR); Write_Verification(Settlement_Para.fCumulativeGasUsage,REALTIME_CUMULATIVE_GAS_USAGE_ADDR,REALTIME_CUMULATIVE_GAS_USAGE_B_ADDR,REALTIME_CUMULATIVE_GAS_USAGE_C_ADDR); Write_Verification(Settlement_Para.fCumulativeFeeUsage,REALTIME_CUMULATIVE_FEE_USAGE_ADDR,REALTIME_CUMULATIVE_FEE_USAGE_B_ADDR,REALTIME_CUMULATIVE_FEE_USAGE_C_ADDR); Settlement_Para.SettlementStorageFlag =0; } ArrearsCheck(dBlanceBeforeSettlement); } else { system_alarm.alarm_RS485Cardinalityfree_LCDFLAG=0; } Valve_abnormal_judge(); //¹Ø·§×߯øÅÐ¶Ï } u8 CheckCardinality(void) { //»ùÊý½øÐмì²é£¬ÊÇ·ñÓÐÎÊÌâ if(LLJ_data_g.SC_Accumulation_long<=999999999) { if((Settlement_Para.fBalance>BALANCE_LOWER_LIMIT)&&(Settlement_Para.fBalance<=BALANCE_UP_LIMIT)) { if((Settlement_Para.fCumulativeGasUsage>=0)&&(Settlement_Para.fCumulativeGasUsage<=GAS_USAGE_UP_LIMIT)) { if((Settlement_Para.fCumulativeFeeUsage>=0)&&(Settlement_Para.fCumulativeFeeUsage<=FEE_USAGE_UP_LIMIT)) { return 1; } } } } return 0; } void StorageCardinality(void) //¶Ô»ùÊý½øÐмì²é£¬²»ÊÇÃ÷ÏÔÒ쳣ʱ´æ´¢ { //±£´æ»ùÊýǰ¶Ô»ùÊý½øÐмì²é£¬ÊÇ·ñÓÐÎÊÌâ if(CheckCardinality()==1) { FM25V02_data_write_uint32(SCACC_BIL_ADDR, LLJ_data_g.SC_Accumulation_long); FM25V02_data_write_double(BALANCE_BIL_ADDR, Settlement_Para.fBalance); FM25V02_data_write_double(GAS_USAGE_BIL_ADDR, Settlement_Para.fCumulativeGasUsage); FM25V02_data_write_double(FEE_USAGE_BIL_ADDR, Settlement_Para.fCumulativeFeeUsage); FM25V02_data_write(calendar.year&0x00FF, TIME_BIL_ADDR ); FM25V02_data_write(calendar.month&0xFF, TIME_BIL_ADDR +1 ); FM25V02_data_write(calendar.date&0xFF, TIME_BIL_ADDR + 2 ); FM25V02_data_write(calendar.hour&0xFF, TIME_BIL_ADDR + 3 ); FM25V02_data_write(calendar.min&0xFF, TIME_BIL_ADDR + 4 ); FM25V02_data_write(calendar.sec&0xFF, TIME_BIL_ADDR + 5 ); Settlement_Para.RS485BilDataReadableFlag = 1; FM25V02_data_write(Settlement_Para.RS485BilDataReadableFlag,DATA_READABLE_FLAG_ADDR); } } void ArrearsCheck(double dBlanceBeforeSettlement) //Ç··Ñ¼ì²é£¬·¢ÏÖÇ··Ñ±¨¾¯¹Ø·§µÈ´¦Àí { if((Settlement_Para.fBalance<=parameter_bil.iBalanceInsufAlarmAmount)&&(Settlement_Para.fBalance>(-parameter_bil.fCredits))) { if(dBlanceBeforeSettlement > parameter_bil.iBalanceInsufAlarmAmount) { if(device_Parm.AccountStatus== 0x01) { system_alarm.alarm_Balance_Small =1; system_alarm.alarm_Balance_Small_LCDFLAG = 0x01; } #ifdef DEBUG_OUT sprintf(Debug, "fCumulativeGasUsage = %.2f \r\n" ,Settlement_Para.fCumulativeGasUsage); UartDebugFun(Debug); sprintf(Debug, "fCumulativeFeeUsage = %.2f \r\n" ,Settlement_Para.fCumulativeFeeUsage); UartDebugFun(Debug); sprintf(Debug, "fBalance = %.2f \r\n" ,Settlement_Para.fBalance); UartDebugFun(Debug); #endif } } if(Settlement_Para.fBalance<=0) { if(dBlanceBeforeSettlement > 0) { system_alarm.alarm_Balance_0 =1; #ifdef DEBUG_OUT sprintf(Debug, "fCumulativeGasUsage = %.2f \r\n" ,Settlement_Para.fCumulativeGasUsage); UartDebugFun(Debug); sprintf(Debug, "fCumulativeFeeUsage = %.2f \r\n" ,Settlement_Para.fCumulativeFeeUsage); UartDebugFun(Debug); sprintf(Debug, "fBalance = %.2f \r\n" ,Settlement_Para.fBalance); UartDebugFun(Debug); #endif } } if(Settlement_Para.fBalance<(-parameter_bil.fCredits)) { // close the valve if(device_Parm.AccountStatus== 0x01) { system_alarm.alarm_Credits_0Times ++; if(system_alarm.alarm_Credits_0Times<=2) { system_alarm.alarm_Credits_0 =1; if(gprs_protocol_header.Valve_Status != 2) //·§ÃÅ״̬²»ÊÇΪ¹Ø { Valve_close(); } } } if(dBlanceBeforeSettlement > (-parameter_bil.fCredits)) { #ifdef DEBUG_OUT sprintf(Debug, "fCumulativeGasUsage = %.2f \r\n" ,Settlement_Para.fCumulativeGasUsage); UartDebugFun(Debug); sprintf(Debug, "fCumulativeFeeUsage = %.2f \r\n" ,Settlement_Para.fCumulativeFeeUsage); UartDebugFun(Debug); sprintf(Debug, "fBalance = %.2f \r\n" ,Settlement_Para.fBalance); UartDebugFun(Debug); #endif } }else { system_alarm.alarm_Credits_0Times = 0; } } void ClearCardinalFlag(void) //ÇåÁã»ùÊý±êÖ¾ { system_alarm.alarm_RS485_Abnormal_Small_Reading_FLAG =0;//Çå»ùÊý²Ù×÷»áÇå³ý±¨¾¯Âë7 Settlement_Para.RS485BilDataReadableFlag = 0; FM25V02_data_write(Settlement_Para.RS485BilDataReadableFlag,DATA_READABLE_FLAG_ADDR); } void BalanceModify(double dBalance) //Óà¶îÇåÁã {///jlc´Ë´¦ÏȼÓÈëÓà¶îÇåÁ㹦ÄÜ,³ö³§ºóÓà¶îÇåÁã Settlement_Para.fBalance = dBalance; Write_Verification(Settlement_Para.fBalance,REALTIME_BALANCE_ADDR,REALTIME_BALANCE_B_ADDR,REALTIME_BALANCE_C_ADDR); FM25V02_data_write_double(BALANCE_BIL_ADDR, Settlement_Para.fBalance); }