#include "ReadDeviceData.h"
|
|
#include "math.h"
|
#include "para.h"
|
#include "e2p.h"
|
#include "ex_rtc.h"
|
#include "data_write_local.h"
|
#include "1gprs.h"
|
#include "1billing.h"
|
#include "1ValveControl.h"
|
#include "mbcrc.h"
|
#include "devicegpioinit.h"
|
#include "rs485.h"
|
#include "1powermanage.h"
|
|
FRAME LLJ_Msg;
|
MODBUS_LLJ ModbusDlg;
|
|
PARM_ACCESS parmAccess;
|
|
uint8_t ddr_index_2,Last_Data_DDR=0,NOW_Data_DDR=0;
|
uint32_t NumDataStored;
|
uint8_t DataStoredFlag;
|
uint8_t Beginflag;
|
|
|
|
void LLJ_sendFrame(u8 slaveAddress,u16 dataAddress,u16 readDataNum)
|
{
|
u16 crc;
|
u8 sendFrame[8];
|
|
LLJ_Msg.HandlePtr = LLJ_Msg.WritePtr ; //Çå¿Õ½ÓÊÕ»º³åÇø
|
|
sendFrame[0] = slaveAddress; //´Ó»úµØÖ·
|
sendFrame[1] = 0x03; //¹¦ÄܺÅ
|
sendFrame[2] = dataAddress>>8; //Êý¾ÝµØÖ·¸ß8λ
|
sendFrame[3] = dataAddress&0x00FF; //Êý¾ÝµØÖ·µÍ8λ
|
sendFrame[4] = readDataNum>>8; //¶ÁÈ¡Êý¾Ý¸öÊý¸ß8λ
|
sendFrame[5] = readDataNum&0x00FF; //¶ÁÈ¡Êý¾Ý¸öÊýµÍ8λ
|
crc = usMBCRC16(0xFFFF,sendFrame,6);
|
sendFrame[6] = crc&0x00FF; //CRC16УÑé¸ß8λ
|
sendFrame[7] = crc>>8; //CRC16УÑéµÍ8λ
|
RS485_Send_Data(sendFrame,8);
|
|
}
|
|
|
|
void Pressure_alarm()
|
{
|
uint32 Pressure_addr;
|
if((LLJ_data_g.Pressure < system_alarm.fPressureLowLimit)||(LLJ_data_g.Pressure > system_alarm.fPressureHighLimit))
|
{
|
Pressure_addr = FIRST_ALARM_RECORD_ADDR + (uint32)system_alarm.u16AlarmStoreNum * ALARM_RECORD_LENGTH;
|
FM25V02_data_write(calendar.year&0x00FF, Pressure_addr );
|
FM25V02_data_write(calendar.month&0xFF, Pressure_addr + 1 );
|
FM25V02_data_write(calendar.date&0xFF, Pressure_addr + 2 );
|
FM25V02_data_write(calendar.hour&0xFF, Pressure_addr + 3 );
|
FM25V02_data_write(calendar.min&0xFF, Pressure_addr + 4 );
|
FM25V02_data_write(calendar.sec&0xFF, Pressure_addr + 5 );
|
FM25V02_data_write_uint16( Pressure_addr + 6 ,PRESSURE_ABNORMAL_ALARM_CODE);
|
|
system_alarm.alarm_l ++;
|
system_alarm.u16AlarmStoreNum ++;
|
if(system_alarm.u16AlarmStoreNum >= ALARM_RECORD_NUM)
|
{
|
system_alarm.u16AlarmStoreNum = 0;
|
system_alarm.u8AlarmStoreFullFlag = 1;
|
FM25V02_data_write(system_alarm.u8AlarmStoreFullFlag,ALARM_RECORD_FULL_FLAG_ADDR);
|
}
|
FM25V02_data_write_uint16(CURRENT_ALARM_RECORD_NUM_ADDR,system_alarm.u16AlarmStoreNum);
|
|
system_alarm.alarm_PRE = 1;
|
//GPRS_sendFlag = 1; //ζÈÒì³££¬Ö±½Ó·¢Ë;¯±¨
|
}
|
else
|
{
|
system_alarm.alarm_PRE = 0;
|
}
|
}
|
|
void Temperature_alarm()
|
{
|
uint32 Temperature_addr;
|
if((LLJ_data_g.Temperature<system_alarm.fTempratureLowLimit)||(LLJ_data_g.Temperature > system_alarm.fTempratureHighLimit) )
|
{
|
Temperature_addr = FIRST_ALARM_RECORD_ADDR + (uint32)system_alarm.u16AlarmStoreNum * ALARM_RECORD_LENGTH;
|
FM25V02_data_write(calendar.year&0x00FF, Temperature_addr );
|
FM25V02_data_write(calendar.month&0xFF, Temperature_addr + 1 );
|
FM25V02_data_write(calendar.date&0xFF, Temperature_addr + 2 );
|
FM25V02_data_write(calendar.hour&0xFF, Temperature_addr + 3 );
|
FM25V02_data_write(calendar.min&0xFF, Temperature_addr + 4 );
|
FM25V02_data_write(calendar.sec&0xFF, Temperature_addr + 5 );
|
FM25V02_data_write_uint16( Temperature_addr + 6 ,TEMPERATURE_ABNORMAL_ALARM_CODE);
|
|
system_alarm.alarm_l ++;
|
system_alarm.u16AlarmStoreNum ++;
|
if(system_alarm.u16AlarmStoreNum >= ALARM_RECORD_NUM)
|
{
|
system_alarm.u16AlarmStoreNum = 0;
|
system_alarm.u8AlarmStoreFullFlag = 1;
|
FM25V02_data_write(system_alarm.u8AlarmStoreFullFlag,ALARM_RECORD_FULL_FLAG_ADDR);
|
}
|
FM25V02_data_write_uint16(CURRENT_ALARM_RECORD_NUM_ADDR,system_alarm.u16AlarmStoreNum);
|
|
system_alarm.alarm_TEM = 1;
|
//GPRS_sendFlag = 1; //ζÈÒì³££¬Ö±½Ó·¢Ë;¯±¨
|
}
|
else
|
{
|
system_alarm.alarm_TEM = 0;
|
}
|
|
}
|
|
|
uint8_t LLJ_ModbusHandle( uint16_t address )
|
{
|
u16 crc;
|
unsigned char retflag = 0 ;
|
unsigned short i ;
|
unsigned char temp;
|
float Temp;
|
int i32Temperature;
|
int i32Pressure;
|
int i32SC_instant;
|
int i32WC_instant;
|
|
|
while(1)
|
{
|
temp = LLJ_Msg.WritePtr ;
|
delay_ms(10);
|
if(temp == LLJ_Msg.WritePtr)
|
{
|
break;
|
}
|
}
|
LLJ_Msg.TempPtr = LLJ_Msg.HandlePtr ; //¼Ç¼´¦ÀíÖ¸ÕëµÄλÖ㬿ªÊ¼·ÖÎöÖ®ºóµÄÊý¾Ý
|
LLJ_Msg.NewLen = (LLJ_Msg.WritePtr - LLJ_Msg.HandlePtr) & LLJRXDBOUND ; //ÐÂÊÕµ½µÄÊý¾Ý³¤¶È
|
|
if(LLJ_Msg.NewLen > 0x02) //½ÓÊÕ»º´æÇøÄÚÓÐÊý¾Ý
|
{
|
LLJ_Msg.TempPtr = LLJ_Msg.HandlePtr ; //¼Ç¼´¦ÀíÖ¸ÕëµÄλÖ㬿ªÊ¼·ÖÎöÖ®ºóµÄÊý¾Ý
|
memset((char *)LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
for(i=0;i<LLJ_Msg.NewLen;i++) //½«»º´æÇøÄÚµÄÊý¾Ý¶Áµ½´¦Àí»º´æÇø½øÐзÖÎö
|
{
|
LLJ_Msg.HandBuff[i] = LLJ_Msg.UartBuff[LLJ_Msg.TempPtr];
|
LLJ_Msg.TempPtr = (LLJ_Msg.TempPtr + 1) & LLJRXDBOUND ;
|
}
|
|
crc = LLJ_Msg.HandBuff[LLJ_Msg.NewLen - 1]; //¸ß8λ¼ìÑéÂë
|
crc = (crc<<8)+ LLJ_Msg.HandBuff[LLJ_Msg.NewLen -2];
|
if( (crc==usMBCRC16(0xFFFF,LLJ_Msg.HandBuff,LLJ_Msg.NewLen - 2)) &&(LLJ_Msg.HandBuff[0] == parmAccess.u8deviceAdress)&&(LLJ_Msg.HandBuff[1]==3))
|
{
|
if(address==parmAccess.u32VTAddr)
|
{
|
|
if(parmAccess.decoding_Type == 5) // CDAB
|
{
|
if((parmAccess.u16MeterTypeCode==SIZHUMODBUS1)&&(LLJ_Msg.HandBuff[2]==28))
|
{
|
(*(uint8_t *)(&LLJ_data_g.WC_Accumulation_long))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.WC_Accumulation_long) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.WC_Accumulation_long) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.WC_Accumulation_long) + 3))=LLJ_Msg.HandBuff[5];
|
|
(*(uint8_t *)(&LLJ_data_g.SC_Accumulation_long))=LLJ_Msg.HandBuff[10];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation_long) + 1))=LLJ_Msg.HandBuff[9];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation_long) + 2))=LLJ_Msg.HandBuff[12];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation_long) + 3))=LLJ_Msg.HandBuff[11];
|
|
(*(uint8_t *)(&LLJ_data_g.WC_instant))=LLJ_Msg.HandBuff[16];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 1))=LLJ_Msg.HandBuff[15];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 2))=LLJ_Msg.HandBuff[18];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 3))=LLJ_Msg.HandBuff[17];
|
|
(*(uint8_t *)(&LLJ_data_g.SC_instant))=LLJ_Msg.HandBuff[20];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 1))=LLJ_Msg.HandBuff[19];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 2))=LLJ_Msg.HandBuff[22];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 3))=LLJ_Msg.HandBuff[21];
|
|
(*(uint8_t *)(&LLJ_data_g.Temperature))=LLJ_Msg.HandBuff[24];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 1))=LLJ_Msg.HandBuff[23];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 2))=LLJ_Msg.HandBuff[26];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 3))=LLJ_Msg.HandBuff[25];
|
|
(*(uint8_t *)(&LLJ_data_g.Pressure))=LLJ_Msg.HandBuff[28];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 1))=LLJ_Msg.HandBuff[27];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 2))=LLJ_Msg.HandBuff[30];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 3))=LLJ_Msg.HandBuff[29];
|
|
}
|
else if((parmAccess.u16MeterTypeCode==SIZHUMODBUS2)&&(LLJ_Msg.HandBuff[2]==56))
|
{
|
(*(uint8_t *)(&LLJ_data_g.WC_Accumulation))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.WC_Accumulation) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.WC_Accumulation) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.WC_Accumulation) + 3))=LLJ_Msg.HandBuff[5];
|
|
(*(uint8_t *)(&LLJ_data_g.SC_Accumulation))=LLJ_Msg.HandBuff[8];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation) + 1))=LLJ_Msg.HandBuff[7];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation) + 2))=LLJ_Msg.HandBuff[10];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation) + 3))=LLJ_Msg.HandBuff[9];
|
|
(*(uint8_t *)(&LLJ_data_g.WC_instant))=LLJ_Msg.HandBuff[12];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 1))=LLJ_Msg.HandBuff[11];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 2))=LLJ_Msg.HandBuff[14];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 3))=LLJ_Msg.HandBuff[13];
|
|
(*(uint8_t *)(&LLJ_data_g.SC_instant))=LLJ_Msg.HandBuff[16];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 1))=LLJ_Msg.HandBuff[15];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 2))=LLJ_Msg.HandBuff[18];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 3))=LLJ_Msg.HandBuff[17];
|
|
(*(uint8_t *)(&LLJ_data_g.Temperature))=LLJ_Msg.HandBuff[52];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 1))=LLJ_Msg.HandBuff[51];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 2))=LLJ_Msg.HandBuff[54];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 3))=LLJ_Msg.HandBuff[53];
|
|
(*(uint8_t *)(&LLJ_data_g.Pressure))=LLJ_Msg.HandBuff[56];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 1))=LLJ_Msg.HandBuff[55];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 2))=LLJ_Msg.HandBuff[58];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 3))=LLJ_Msg.HandBuff[57];
|
|
LLJ_data_g.SC_Accumulation_long = LLJ_data_g.SC_Accumulation;
|
LLJ_data_g.WC_Accumulation_long = LLJ_data_g.WC_Accumulation;
|
|
}
|
}
|
else{}
|
|
if((parmAccess.u16MeterTypeCode!=SIZHUMODBUS1)&&(parmAccess.u16MeterTypeCode!=SIZHUMODBUS2)&&(parmAccess.u16MeterTypeCode!=ASMODBUS)&&(parmAccess.u16MeterTypeCode!=AS100MODBUS)
|
&&(parmAccess.u16MeterTypeCode!=XINKEMODBUS1))
|
{
|
|
FM25V02_data_write_uint32(WCACC_addr + 4*NumDataStored, LLJ_data_g.WC_Accumulation_long);
|
ModbusDlg.dataAddress = parmAccess.u32VbTAddr;
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
}
|
else
|
{
|
|
FM25V02_data_write_uint32(WCACC_addr + 4*NumDataStored, LLJ_data_g.WC_Accumulation_long);
|
FM25V02_data_write_uint32_WRCheck(SCACC_addr + 4*NumDataStored, LLJ_data_g.SC_Accumulation_long);
|
FM25V02_data_write_float(PRE_addr + 4*NumDataStored, LLJ_data_g.Pressure);
|
FM25V02_data_write_float(TEM_addr + 4*NumDataStored, LLJ_data_g.Temperature);
|
FM25V02_data_write_float(WCINS_addr + 4*NumDataStored, LLJ_data_g.WC_instant);
|
FM25V02_data_write_float(SCINS_addr + 4*NumDataStored, LLJ_data_g.SC_instant);
|
Pressure_alarm();
|
Temperature_alarm();
|
|
ddr_index_2 ++;
|
NumDataStored ++;
|
if(NumDataStored >= NumStoredLength)
|
{
|
NumDataStored = 0;
|
DataStoredFlag =1;
|
FM25V02_data_write(DataStoredFlag,DataStoredFlag_Addr);
|
}
|
FM25V02_data_write_uint16(NumDataStored_Addr,NumDataStored);
|
|
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
ModbusDlg.RepeadTime = 0 ;
|
ModbusDlg.RepeadNum = REPEATNUM ;
|
ModbusDlg.HandleStep = MODBUS_WAIT;
|
memset(LLJ_Msg.UartBuff,0,sizeof(LLJ_Msg.UartBuff));
|
memset(LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
LLJ_Msg.WritePtr=0;
|
LLJ_Msg.HandlePtr=0;
|
Beginflag = 0;
|
FirstTimeRunFlag = 0;
|
system_alarm.alarm_Sample = 0x00;
|
system_alarm.u8ReadSuccessfullyTimes ++;
|
system_alarm.u8ReadfailedTimes = 0;
|
|
}
|
}
|
else if(address==parmAccess.u32VbTAddr)
|
{
|
|
if(parmAccess.decoding_Type == 5)
|
{
|
if(parmAccess.u16MeterTypeCode==SIZHUMODBUS1)
|
{
|
(*(uint8_t *)(&LLJ_data_g.SC_Accumulation_long))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation_long) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation_long) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation_long) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
else
|
{
|
(*(uint8_t *)(&LLJ_data_g.SC_Accumulation))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.SC_Accumulation) + 3))=LLJ_Msg.HandBuff[5];
|
|
LLJ_data_g.SC_Accumulation_long = LLJ_data_g.SC_Accumulation;
|
}
|
|
}
|
else{}
|
|
|
if(parmAccess.u16MeterTypeCode!=TIANXINMODBUS)
|
{
|
|
FM25V02_data_write_uint32_WRCheck(SCACC_addr + 4*NumDataStored, LLJ_data_g.SC_Accumulation_long);
|
ModbusDlg.dataAddress = parmAccess.u32PMESAddr;
|
if(parmAccess.Vbt_Flag)
|
{
|
ModbusDlg.dataAddress = parmAccess.u32VbT2Addr;
|
}
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
|
}
|
else
|
{
|
|
FM25V02_data_write_uint32(WCACC_addr + 4*NumDataStored, LLJ_data_g.WC_Accumulation_long);
|
FM25V02_data_write_uint32_WRCheck(SCACC_addr + 4*NumDataStored, LLJ_data_g.SC_Accumulation_long);
|
FM25V02_data_write_float(PRE_addr + 4*NumDataStored, LLJ_data_g.Pressure);
|
FM25V02_data_write_float(TEM_addr + 4*NumDataStored, LLJ_data_g.Temperature);
|
FM25V02_data_write_float(WCINS_addr + 4*NumDataStored, LLJ_data_g.WC_instant);
|
FM25V02_data_write_float(SCINS_addr + 4*NumDataStored, LLJ_data_g.SC_instant);
|
Pressure_alarm();
|
Temperature_alarm();
|
|
ddr_index_2 ++;
|
NumDataStored ++;
|
if(NumDataStored >= NumStoredLength)
|
{
|
NumDataStored = 0;
|
DataStoredFlag =1;
|
FM25V02_data_write(DataStoredFlag,DataStoredFlag_Addr);
|
}
|
FM25V02_data_write_uint16(NumDataStored_Addr,NumDataStored);
|
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
ModbusDlg.RepeadTime = 0 ;
|
ModbusDlg.RepeadNum = REPEATNUM ;
|
ModbusDlg.HandleStep = MODBUS_WAIT;
|
memset(LLJ_Msg.UartBuff,0,sizeof(LLJ_Msg.UartBuff));
|
memset(LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
LLJ_Msg.WritePtr=0;
|
LLJ_Msg.HandlePtr=0;
|
Beginflag = 0;
|
FirstTimeRunFlag = 0;
|
system_alarm.alarm_Sample = 0x00;
|
system_alarm.u8ReadSuccessfullyTimes ++;
|
system_alarm.u8ReadfailedTimes = 0;
|
|
}
|
}
|
else if(address==parmAccess.u32VbT2Addr && parmAccess.Vbt_Flag == 1)
|
{
|
|
FM25V02_data_write_uint32_WRCheck(SCACC_addr + 4*NumDataStored, LLJ_data_g.SC_Accumulation_long);
|
ModbusDlg.dataAddress = parmAccess.u32PMESAddr;
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
}
|
else if(address==parmAccess.u32PMESAddr)
|
{
|
if(parmAccess.decoding_Type == 5)
|
{
|
|
if(parmAccess.u16MeterTypeCode==SIZHUMODBUS1)
|
{
|
(*(uint8_t *)(&LLJ_data_g.Pressure))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
else
|
{
|
(*(uint8_t *)(&LLJ_data_g.Pressure))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
}
|
else{}
|
|
|
FM25V02_data_write_float(PRE_addr + 4*NumDataStored, LLJ_data_g.Pressure);
|
|
Pressure_alarm();
|
|
ModbusDlg.dataAddress = parmAccess.u32TMESAddr;
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
}
|
else if(address==parmAccess.u32TMESAddr)
|
{
|
if(parmAccess.decoding_Type == 5)
|
{
|
if(parmAccess.u16MeterTypeCode==SIZHUMODBUS1)
|
{
|
(*(uint8_t *)(&LLJ_data_g.Temperature))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
else
|
{
|
(*(uint8_t *)(&LLJ_data_g.Temperature))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
}
|
else{}
|
|
|
FM25V02_data_write_float(TEM_addr + 4*NumDataStored, LLJ_data_g.Temperature);
|
Temperature_alarm();
|
|
if(parmAccess.Q_permission == 1)
|
{
|
ModbusDlg.dataAddress = parmAccess.u32QAddr;
|
}
|
else
|
{
|
ModbusDlg.dataAddress = parmAccess.u32QbAddr;
|
}
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
}
|
|
else if(address==parmAccess.u32QAddr)
|
{
|
if(parmAccess.decoding_Type == 5)
|
{
|
if(parmAccess.u16MeterTypeCode==SIZHUMODBUS1)
|
{
|
(*(uint8_t *)(&LLJ_data_g.WC_instant))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
else
|
{
|
(*(uint8_t *)(&LLJ_data_g.WC_instant))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
}
|
else{}
|
|
|
FM25V02_data_write_float(WCINS_addr + 4*NumDataStored, LLJ_data_g.WC_instant);
|
|
if(parmAccess.Qb_permission == 1)
|
{
|
ModbusDlg.dataAddress = parmAccess.u32QbAddr;
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
}
|
else
|
{
|
ddr_index_2++; //ËùÓÐÊý¾ÝµØÖ·Í³Ò»¼Ó£¬Ä³Ò»¸öÊý¾Ý¶Áȡʧ°Ü×÷·Ï¡£
|
NumDataStored ++;
|
|
if(NumDataStored >= NumStoredLength)
|
{
|
NumDataStored = 0;
|
DataStoredFlag =1;
|
FM25V02_data_write(DataStoredFlag,DataStoredFlag_Addr);
|
}
|
FM25V02_data_write_uint16(NumDataStored_Addr,NumDataStored);
|
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
ModbusDlg.RepeadTime = 0 ; //ÖØ·¢Ê±¼äÇåÁã
|
ModbusDlg.RepeadNum = REPEATNUM ; //ÖØÖÃÖØ·¢´ÎÊý
|
ModbusDlg.HandleStep = MODBUS_WAIT;
|
memset(LLJ_Msg.UartBuff,0,sizeof(LLJ_Msg.UartBuff));
|
memset(LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
LLJ_Msg.WritePtr=0;
|
LLJ_Msg.HandlePtr=0;
|
Beginflag = 0;
|
FirstTimeRunFlag = 0;
|
system_alarm.alarm_Sample = 0x00;
|
system_alarm.u8ReadSuccessfullyTimes ++;
|
system_alarm.u8ReadfailedTimes = 0;
|
|
}
|
}
|
else if(address==parmAccess.u32QbAddr)
|
{
|
if(parmAccess.decoding_Type == 5)
|
{
|
if(parmAccess.u16MeterTypeCode==SIZHUMODBUS1)
|
{
|
(*(uint8_t *)(&LLJ_data_g.SC_instant))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
else
|
{
|
(*(uint8_t *)(&LLJ_data_g.SC_instant))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 1))=LLJ_Msg.HandBuff[3];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 2))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 3))=LLJ_Msg.HandBuff[5];
|
}
|
}
|
else{}
|
|
FM25V02_data_write_float(SCINS_addr + 4*NumDataStored, LLJ_data_g.SC_instant);
|
ddr_index_2 ++;
|
NumDataStored ++;
|
if(NumDataStored >= NumStoredLength)
|
{
|
NumDataStored = 0;
|
DataStoredFlag =1;
|
FM25V02_data_write(DataStoredFlag,DataStoredFlag_Addr);
|
}
|
FM25V02_data_write_uint16(NumDataStored_Addr,NumDataStored);
|
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
ModbusDlg.RepeadTime = 0 ;
|
ModbusDlg.RepeadNum = REPEATNUM ;
|
ModbusDlg.HandleStep = MODBUS_WAIT;
|
memset(LLJ_Msg.UartBuff,0,sizeof(LLJ_Msg.UartBuff));
|
memset(LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
LLJ_Msg.WritePtr=0;
|
LLJ_Msg.HandlePtr=0;
|
Beginflag = 0;
|
FirstTimeRunFlag = 0;
|
system_alarm.alarm_Sample = 0x00;
|
system_alarm.u8ReadSuccessfullyTimes ++;
|
system_alarm.u8ReadfailedTimes = 0;
|
|
}
|
else
|
{
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
memset(LLJ_Msg.UartBuff,0,sizeof(LLJ_Msg.UartBuff));
|
memset(LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
LLJ_Msg.WritePtr=0;
|
LLJ_Msg.HandlePtr=0;
|
}
|
}
|
else//CRC16УÑé³ö´í
|
{
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
|
for(i=0;i<LLJ_Msg.NewLen;i++)
|
{
|
|
}
|
|
}
|
|
}
|
return (retflag);
|
}
|
|
|
|
|
|
|
/*****************************************************************/
|
///Êý¾Ý½âÎö
|
u8 LLJ_ModbusHandle_SIZHUV2_0()
|
{
|
u8 retflag = 1;
|
|
int i;
|
u32 SC_Accumulation_zs;
|
u16 SC_Accumulation_xs;
|
|
u32 WC_Accumulation_zs;
|
u16 WC_Accumulation_xs;
|
|
u32 SC_Accumulation_zs_reverse;
|
u16 SC_Accumulation_xs_reverse;
|
|
u32 WC_Accumulation_zs_reverse;
|
u16 WC_Accumulation_xs_reverse;
|
|
double WC_Accumulation_reverse;
|
double SC_Accumulation_reverse;
|
|
u16 Status_word[6];
|
|
(*(uint8_t *)(&WC_Accumulation_zs))=LLJ_Msg.HandBuff[6];
|
(*((uint8_t *)(&WC_Accumulation_zs) + 1))=LLJ_Msg.HandBuff[5];
|
(*((uint8_t *)(&WC_Accumulation_zs) + 2))=LLJ_Msg.HandBuff[4];
|
(*((uint8_t *)(&WC_Accumulation_zs) + 3))=LLJ_Msg.HandBuff[3];
|
|
(*((uint8_t *)(&WC_Accumulation_xs) + 0))=LLJ_Msg.HandBuff[8];
|
(*((uint8_t *)(&WC_Accumulation_xs) + 1))=LLJ_Msg.HandBuff[7];
|
|
(*(uint8_t *)(&SC_Accumulation_zs))=LLJ_Msg.HandBuff[12];
|
(*((uint8_t *)(&SC_Accumulation_zs) + 1))=LLJ_Msg.HandBuff[11];
|
(*((uint8_t *)(&SC_Accumulation_zs) + 2))=LLJ_Msg.HandBuff[10];
|
(*((uint8_t *)(&SC_Accumulation_zs) + 3))=LLJ_Msg.HandBuff[9];
|
|
(*((uint8_t *)(&SC_Accumulation_xs) + 0))=LLJ_Msg.HandBuff[14];
|
(*((uint8_t *)(&SC_Accumulation_xs) + 1))=LLJ_Msg.HandBuff[13];
|
|
(*(uint8_t *)(&LLJ_data_g.WC_instant))=LLJ_Msg.HandBuff[18];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 1))=LLJ_Msg.HandBuff[17];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 2))=LLJ_Msg.HandBuff[16];
|
(*((uint8_t *)(&LLJ_data_g.WC_instant) + 3))=LLJ_Msg.HandBuff[15];
|
|
(*(uint8_t *)(&LLJ_data_g.SC_instant))=LLJ_Msg.HandBuff[22];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 1))=LLJ_Msg.HandBuff[21];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 2))=LLJ_Msg.HandBuff[20];
|
(*((uint8_t *)(&LLJ_data_g.SC_instant) + 3))=LLJ_Msg.HandBuff[19];
|
|
(*(uint8_t *)(&LLJ_data_g.Temperature))=LLJ_Msg.HandBuff[26];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 1))=LLJ_Msg.HandBuff[25];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 2))=LLJ_Msg.HandBuff[24];
|
(*((uint8_t *)(&LLJ_data_g.Temperature) + 3))=LLJ_Msg.HandBuff[23];
|
|
(*(uint8_t *)(&LLJ_data_g.Pressure))=LLJ_Msg.HandBuff[30];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 1))=LLJ_Msg.HandBuff[29];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 2))=LLJ_Msg.HandBuff[28];
|
(*((uint8_t *)(&LLJ_data_g.Pressure) + 3))=LLJ_Msg.HandBuff[27];
|
|
(*(uint8_t *)(&WC_Accumulation_zs_reverse))=LLJ_Msg.HandBuff[34];
|
(*((uint8_t *)(&WC_Accumulation_zs_reverse) + 1))=LLJ_Msg.HandBuff[33];
|
(*((uint8_t *)(&WC_Accumulation_zs_reverse) + 2))=LLJ_Msg.HandBuff[32];
|
(*((uint8_t *)(&WC_Accumulation_zs_reverse) + 3))=LLJ_Msg.HandBuff[31];
|
|
(*((uint8_t *)(&WC_Accumulation_xs_reverse) + 0))=LLJ_Msg.HandBuff[36];
|
(*((uint8_t *)(&WC_Accumulation_xs_reverse) + 1))=LLJ_Msg.HandBuff[35];
|
|
(*(uint8_t *)(&SC_Accumulation_zs_reverse))=LLJ_Msg.HandBuff[40];
|
(*((uint8_t *)(&SC_Accumulation_zs_reverse) + 1))=LLJ_Msg.HandBuff[39];
|
(*((uint8_t *)(&SC_Accumulation_zs_reverse) + 2))=LLJ_Msg.HandBuff[38];
|
(*((uint8_t *)(&SC_Accumulation_zs_reverse) + 3))=LLJ_Msg.HandBuff[37];
|
|
(*((uint8_t *)(&SC_Accumulation_xs_reverse) + 0))=LLJ_Msg.HandBuff[42];
|
(*((uint8_t *)(&SC_Accumulation_xs_reverse) + 1))=LLJ_Msg.HandBuff[41];
|
|
for(i = 0; i < 6; i++)
|
{
|
arraya_2_arrayb(&LLJ_Msg.HandBuff[43 + 2*i] , (u8*)&Status_word[i] , 2 , 1);
|
}
|
|
LLJ_data_g.WC_Accumulation_double = WC_Accumulation_zs + WC_Accumulation_xs/100.0;
|
LLJ_data_g.WC_Accumulation_long = LLJ_data_g.WC_Accumulation_double;
|
|
LLJ_data_g.SC_Accumulation_double = SC_Accumulation_zs + SC_Accumulation_xs/100.0;
|
LLJ_data_g.SC_Accumulation_long = LLJ_data_g.SC_Accumulation_double;
|
|
|
FM25V02_data_write_uint32(WCACC_addr + 4*NumDataStored, LLJ_data_g.WC_Accumulation_long);
|
FM25V02_data_write_uint32_WRCheck(SCACC_addr + 4*NumDataStored, LLJ_data_g.SC_Accumulation_long);
|
FM25V02_data_write_float(PRE_addr + 4*NumDataStored, LLJ_data_g.Pressure);
|
FM25V02_data_write_float(TEM_addr + 4*NumDataStored, LLJ_data_g.Temperature);
|
FM25V02_data_write_float(WCINS_addr + 4*NumDataStored, LLJ_data_g.WC_instant);
|
FM25V02_data_write_float(SCINS_addr + 4*NumDataStored, LLJ_data_g.SC_instant);
|
Pressure_alarm();
|
Temperature_alarm();
|
|
ddr_index_2 ++;
|
NumDataStored ++;
|
if(NumDataStored >= NumStoredLength)
|
{
|
NumDataStored = 0;
|
DataStoredFlag =1;
|
FM25V02_data_write(DataStoredFlag,DataStoredFlag_Addr);
|
}
|
FM25V02_data_write_uint16(NumDataStored_Addr,NumDataStored);
|
|
retflag = 0x01;
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
ModbusDlg.RepeadTime = 0 ;
|
ModbusDlg.RepeadNum = REPEATNUM ;
|
ModbusDlg.HandleStep = MODBUS_WAIT;
|
memset(LLJ_Msg.UartBuff,0,sizeof(LLJ_Msg.UartBuff));
|
memset(LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
LLJ_Msg.WritePtr=0;
|
LLJ_Msg.HandlePtr=0;
|
Beginflag = 0;
|
FirstTimeRunFlag = 0;
|
system_alarm.alarm_Sample = 0x00;
|
system_alarm.u8ReadSuccessfullyTimes ++;
|
system_alarm.u8ReadfailedTimes = 0;
|
|
return retflag;
|
}
|
|
uint8_t LLJ_ModbusHandle_CRCData( uint16_t address )
|
{
|
u16 crc;
|
unsigned char retflag = 0 ;
|
unsigned short i ;
|
unsigned char temp;
|
float Temp;
|
int i32Temperature;
|
int i32Pressure;
|
int i32SC_instant;
|
int i32WC_instant;
|
|
while(1)
|
{
|
temp = LLJ_Msg.WritePtr ;
|
delay_ms(10);
|
if(temp == LLJ_Msg.WritePtr)
|
{
|
break;
|
}
|
}
|
LLJ_Msg.TempPtr = LLJ_Msg.HandlePtr ; //¼Ç¼´¦ÀíÖ¸ÕëµÄλÖ㬿ªÊ¼·ÖÎöÖ®ºóµÄÊý¾Ý
|
LLJ_Msg.NewLen = (LLJ_Msg.WritePtr - LLJ_Msg.HandlePtr) & LLJRXDBOUND ; //ÐÂÊÕµ½µÄÊý¾Ý³¤¶È
|
|
if(LLJ_Msg.NewLen > 0x02) //½ÓÊÕ»º´æÇøÄÚÓÐÊý¾Ý
|
{
|
LLJ_Msg.TempPtr = LLJ_Msg.HandlePtr ; //¼Ç¼´¦ÀíÖ¸ÕëµÄλÖ㬿ªÊ¼·ÖÎöÖ®ºóµÄÊý¾Ý
|
memset((char *)LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
for(i=0;i<LLJ_Msg.NewLen;i++) //½«»º´æÇøÄÚµÄÊý¾Ý¶Áµ½´¦Àí»º´æÇø½øÐзÖÎö
|
{
|
LLJ_Msg.HandBuff[i] = LLJ_Msg.UartBuff[LLJ_Msg.TempPtr];
|
LLJ_Msg.TempPtr = (LLJ_Msg.TempPtr + 1) & LLJRXDBOUND ;//0xFF
|
}
|
|
crc = LLJ_Msg.HandBuff[LLJ_Msg.NewLen - 1]; //¸ß8λ¼ìÑéÂë
|
crc = (crc<<8)+ LLJ_Msg.HandBuff[LLJ_Msg.NewLen -2];
|
if((crc==usMBCRC16(0xFFFF,LLJ_Msg.HandBuff,LLJ_Msg.NewLen - 2))&&(LLJ_Msg.HandBuff[0] == parmAccess.u8deviceAdress)&&(LLJ_Msg.HandBuff[1]==3))
|
{
|
if((parmAccess.u16MeterTypeCode == SIZHUMODBUSV2_0)&&(LLJ_Msg.HandBuff[2]==52))
|
{
|
retflag = LLJ_ModbusHandle_SIZHUV2_0();
|
}
|
|
}
|
else//CRC16УÑé³ö´í
|
{
|
|
LLJ_Msg.HandlePtr = (LLJ_Msg.HandlePtr + LLJ_Msg.NewLen) & LLJRXDBOUND ;
|
|
for(i=0;i<LLJ_Msg.NewLen;i++)
|
{
|
|
}
|
|
}
|
|
}
|
return (retflag);
|
}
|
|
|
/******************************************
|
* func: Analysis_Float
|
* desc: custom floating-point analysis
|
* input:
|
* Order_Code -??
|
* Mantissa -??
|
* output: none
|
* return: Result
|
*****************************************/
|
double Analysis_Float(int8_t Order_Code,uint32_t Mantissa)
|
{
|
float Order_Code1;
|
double Order_Code_res;
|
float Mantissa_res;
|
double Result;
|
|
if((Order_Code & 0x80)==0x80)
|
{
|
Order_Code1 = 0.0 - (0xFF-Order_Code +1);
|
}
|
else
|
{
|
Order_Code1 = Order_Code;
|
}
|
Order_Code_res = pow(2,Order_Code1);
|
if((Mantissa & 0x00800000)==0x00800000)
|
{
|
Mantissa_res = 0.0 - (float)(Mantissa & 0x007fffff);
|
}
|
else
|
{
|
Mantissa_res = (float)(Mantissa);
|
}
|
Mantissa_res = Mantissa_res / 8388608;
|
Result = Order_Code_res * Mantissa_res;
|
return Result;
|
}
|
|
/******************************************
|
* func: Analysis_Float48
|
* desc: custom 48-bit floating-point analysis
|
* input:
|
* Order_Code -??
|
* MantissaH -????
|
* MantissaL -????
|
* output: none
|
* return: Result
|
*****************************************/
|
double Analysis_Float48(int8_t Order_Code,uint32_t MantissaH,uint32_t MantissaL)
|
{
|
// float Order_Code_res;
|
double Mantissa_resH,Mantissa_resL;
|
double Result;
|
|
Mantissa_resH = MantissaH * pow(2,(Order_Code-15));
|
Mantissa_resL = MantissaL * pow(2,(Order_Code-39));
|
|
Result = Mantissa_resH + Mantissa_resL;
|
return Result;
|
}
|
|
void Modbus_RS485B()
|
{
|
uint8_t ret = 0;
|
uint8_t Read_flag = 0; //¶Áȡʧ°ÜµÄΪ1£¬³É¹¦Îª0
|
uint32_t index_break=0;
|
|
|
Beginflag = 1;
|
while(Beginflag)
|
{
|
IWDT_Clr();
|
index_break++;
|
if(index_break>=6000) //½ÓÊÕ´¦Àíº¯ÊýµÄµØ·½ÓиöÑÓʱ100000£¬ÅäºÏÕâ¸öÊýÖµ´ó¸ÅÀÛ»ý1·ÖÖÓ×óÓÒ»¹ÔÚwhileÑ»·µÄ»°£¬Ç¿ÖÆbreakÌø³öÑ»·¡£
|
{
|
index_break=0;
|
Beginflag=0;
|
break;
|
}
|
if(ModbusDlg.HandleStep == MODBUS_WAIT)
|
{
|
Parameter_assignment(); //Á÷Á¿¼ÆÅäÖÃ
|
|
if(parmAccess.VT_permission == 1)
|
{
|
ModbusDlg.dataAddress = parmAccess.u32VTAddr;
|
}
|
else
|
{
|
ModbusDlg.dataAddress = parmAccess.u32VbTAddr;
|
}
|
ModbusDlg.RepeadNum = REPEATNUM;
|
LLJ_Msg.WritePtr = LLJ_Msg.HandlePtr;
|
ModbusDlg.HandleStep = MODBUS_TX;
|
}
|
else if(ModbusDlg.HandleStep == MODBUS_TX)
|
{
|
if(!ModbusDlg.RepeadTime)
|
{
|
if(ModbusDlg.RepeadNum)
|
{
|
ModbusDlg.RepeadNum -- ;
|
ModbusDlg.RepeadTime = REPEATUNIT ;
|
|
if(parmAccess.u16MeterTypeCode==SIZHUMODBUS1)
|
{
|
ModbusDlg.dataAddress = parmAccess.u32VTAddr;
|
LLJ_sendFrame(parmAccess.u8deviceAdress,ModbusDlg.dataAddress,14);
|
}
|
else if(parmAccess.u16MeterTypeCode==SIZHUMODBUS2)
|
{
|
ModbusDlg.dataAddress = parmAccess.u32VTAddr;
|
LLJ_sendFrame(parmAccess.u8deviceAdress,ModbusDlg.dataAddress,28);
|
}
|
else if(parmAccess.u16MeterTypeCode == SIZHUMODBUSV2_0)
|
{
|
LLJ_sendFrame(parmAccess.u8deviceAdress,ModbusDlg.dataAddress,26);
|
}
|
else
|
{
|
LLJ_sendFrame(parmAccess.u8deviceAdress,ModbusDlg.dataAddress,0x02);
|
}
|
|
}
|
else
|
{
|
ModbusDlg.RepeadTime = 0 ; //ÖØ·¢Ê±¼äÇåÁã
|
ModbusDlg.HandleStep = MODBUS_WAIT; //Æô¶¯Ê§°Ü£¬ÖØÐÂÆô¶¯
|
memset(LLJ_Msg.UartBuff,0,sizeof(LLJ_Msg.UartBuff));
|
memset(LLJ_Msg.HandBuff,0,sizeof(LLJ_Msg.HandBuff));
|
LLJ_Msg.HandlePtr = LLJ_Msg.WritePtr = 0;; //Çå¿Õ½ÓÊÕ»º³åÇø
|
//¶Áȡʧ°ÜËùÓÐΪ0
|
FM25V02_data_write_uint32(WCACC_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_uint32_WRCheck(SCACC_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(PRE_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(TEM_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(WCINS_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(SCINS_addr + 4*NumDataStored, 0);
|
ddr_index_2 ++;
|
NumDataStored++;
|
|
if(NumDataStored >= NumStoredLength)
|
{
|
NumDataStored = 0;
|
DataStoredFlag =1;
|
FM25V02_data_write(DataStoredFlag,DataStoredFlag_Addr );
|
}
|
FM25V02_data_write_uint16(NumDataStored_Addr,NumDataStored);
|
|
system_alarm.u8ReadSuccessfullyTimes =0;
|
system_alarm.u8ReadfailedTimes ++;
|
|
Beginflag = 0;
|
Read_flag = 1; //¶Áȡʧ°ÜµÄ
|
|
break;
|
}
|
}
|
else
|
{
|
if(ret == 0x01) //485¶ÁÈ¡Êý¾ÝÕýÈ·£¬½øÐÐÏÂÒ»´ÎÊÕ·¢
|
{
|
ret = 0 ;
|
ModbusDlg.RepeadTime = 0 ;
|
ModbusDlg.RepeadNum = REPEATNUM ;
|
}
|
}
|
}
|
if(ModbusDlg.HandleStep != MODBUS_WAIT)
|
{
|
if((parmAccess.u16MeterTypeCode==SIZHUMODBUS1)||(parmAccess.u16MeterTypeCode==SIZHUMODBUS2))
|
{
|
ret = LLJ_ModbusHandle(ModbusDlg.dataAddress);
|
}
|
else if(parmAccess.u16MeterTypeCode == SIZHUMODBUSV2_0)
|
{
|
ret = LLJ_ModbusHandle_CRCData(ModbusDlg.dataAddress);
|
}
|
else
|
{
|
ret = LLJ_ModbusHandle(ModbusDlg.dataAddress);
|
}
|
}
|
}
|
|
if(Read_flag==0) //¶ÁÈ¡ ³É¹¦£¬´æÈë¼Æ·ÑУÑéÇøÓò£¬ÓÃ×÷½áËãУÑéÓᣲ¢ÇÒ½øÐÐÒ»´Î½áËãУÑé
|
{
|
RS485Settlement();
|
}
|
|
//Óà¶îÓÃÆøÁ¿µÈ´æ´¢Òª·Åµ½RS485½áËãÖ®ºó£¬ ֮ǰNumDataStored++¹ý£¬ËùÒÔÕâÀïµÃ-1£»
|
if(NumDataStored == 0)
|
{
|
FM25V02_data_write_double(CUMULATIVE_GAS_USAGE_ADDR + 8*(NumDataStored + NumStoredLength-1), Settlement_Para.fCumulativeGasUsage);
|
FM25V02_data_write_double(CUMULATIVE_FEE_USAGE_ADDR + 8*(NumDataStored + NumStoredLength-1), Settlement_Para.fCumulativeFeeUsage);
|
FM25V02_data_write_double(BALANCE_ADDR + 8*(NumDataStored + NumStoredLength-1), Settlement_Para.fBalance);
|
}
|
else if(NumDataStored > 0)
|
{
|
FM25V02_data_write_double(CUMULATIVE_GAS_USAGE_ADDR + 8*(NumDataStored -1), Settlement_Para.fCumulativeGasUsage);
|
FM25V02_data_write_double(CUMULATIVE_FEE_USAGE_ADDR + 8*(NumDataStored -1), Settlement_Para.fCumulativeFeeUsage);
|
FM25V02_data_write_double(BALANCE_ADDR + 8*(NumDataStored -1), Settlement_Para.fBalance);
|
}
|
}
|
|
/*********485¶ÁÈ¡ÒDZíÊý¾ÝÁ÷³Ì***********/
|
void Read485_process(void)
|
{
|
uint32 Sample_alarm_addr;
|
uint8_t i = 0, Vcc_Out_State = 0;
|
|
RS485_GPIO_Init();
|
POWER_EX_GPIO_Init();
|
OUTPUT_EN_GPIO_Init();
|
if(awaken_flag == Key_awaken) //°´¼ü»½ÐÑ
|
{
|
GPRS_sendFlag = 1;
|
}
|
Get_Time(); // »ñȡʱ¼ä
|
FM25V02_data_write(calendar.year&0x00FF, YEAR_addr + NumDataStored );
|
FM25V02_data_write(calendar.month&0xFF, MONTH_addr + NumDataStored);
|
FM25V02_data_write(calendar.date&0xFF, DAY_addr + NumDataStored );
|
FM25V02_data_write(calendar.hour&0xFF, HOUR_addr + NumDataStored);
|
FM25V02_data_write(calendar.min&0xFF, MIN_addr + NumDataStored);
|
FM25V02_data_write(calendar.sec&0xFF, SEC_addr + NumDataStored);
|
|
|
|
if(Settlement_Para.fBalance<=parameter_bil.iBalanceInsufAlarmAmount)
|
{
|
system_alarm.alarm_Balance_Small_LCDFLAG = 0x01;
|
}
|
else
|
{
|
system_alarm.alarm_Balance_Small_LCDFLAG = 0x00;
|
}
|
|
RS485_POWER_ON; //¿ªÆô485¹©µç
|
Vcc_Out_State = RS485_SYNC_READ;
|
while (Vcc_Out_State) //Vcc_Out_State != 0ÓеçÔ´Êä³ö
|
{
|
i++;
|
|
powerEX_OFF;
|
OUTPUT1_EN_OFF;
|
OUTPUT2_EN_OFF;
|
|
delay_ms(100);
|
Vcc_Out_State = RS485_SYNC_READ;
|
if (i > 5)
|
break;
|
}
|
if(!Vcc_Out_State)
|
{
|
if((Bat_Alka_status==0)||(HWID0_READ==0)) //¼îµçÓеã»òÕßÓÐÍ⹩µçµÄʱºò¿ªÆô¶ÔÍâÒÇ±í¹©µç
|
{
|
if((parmAccess.u8EXPVoltageCode&0xf0)==0x10)
|
{
|
//¿ªÆôµÚ¶þ·V2Êä³ö
|
OUTPUT2_EN_ON;
|
OUTPUT1_EN_OFF;
|
}else
|
{
|
//¿ªÆôµÚһ·V1Êä³ö
|
OUTPUT2_EN_OFF;
|
OUTPUT1_EN_ON;
|
}
|
powerEX_ON; //¿ªÆôÍ⹩µç
|
}
|
|
|
if((parmAccess.u16MeterTypeCode==SIZHUMODBUS1)||(parmAccess.u16MeterTypeCode==SIZHUMODBUS2)||(parmAccess.u16MeterTypeCode==SIZHUMODBUSV2_0)) // modbus
|
{
|
RS485_Usart_Init(parmAccess.u8BaudRateCode,parmAccess.u8RS485Parity);
|
EXPower_Control(parmAccess.u8EXPVoltageCode);
|
IWDT_Clr();
|
delay_ms(1000);
|
delay_ms(200);
|
IWDT_Clr();
|
}
|
else
|
{
|
RS485_Usart_Init(parmAccess.u8BaudRateCode,parmAccess.u8RS485Parity);
|
EXPower_Control(parmAccess.u8EXPVoltageCode);
|
}
|
|
|
/*read data from 485*/
|
Modbus_RS485B(); ///modbus /********·¢ËÍÃüÁîºÍ½âÎöÊý¾Ý******/
|
power12V_OFF;
|
power9V_OFF;
|
powerEX_OFF;
|
OUTPUT2_EN_OFF;
|
OUTPUT1_EN_OFF;
|
RS485_POWER_OFF;
|
}
|
else
|
{
|
power12V_OFF;
|
power9V_OFF;
|
powerEX_OFF;
|
OUTPUT2_EN_OFF;
|
OUTPUT1_EN_OFF;
|
RS485_POWER_OFF;
|
}
|
|
|
|
if((system_alarm.u8ReadfailedTimes>0)&&(system_alarm.u8ReadfailedTimes <3))
|
{
|
|
Get_Time(); // »ñȡʱ¼ä
|
Sample_alarm_addr = FIRST_ALARM_RECORD_ADDR + (uint32)system_alarm.u16AlarmStoreNum * ALARM_RECORD_LENGTH;
|
FM25V02_data_write(calendar.year&0x00FF, Sample_alarm_addr );
|
FM25V02_data_write(calendar.month&0xFF, Sample_alarm_addr + 1 );
|
FM25V02_data_write(calendar.date&0xFF, Sample_alarm_addr + 2 );
|
FM25V02_data_write(calendar.hour&0xFF, Sample_alarm_addr + 3 );
|
FM25V02_data_write(calendar.min&0xFF, Sample_alarm_addr + 4 );
|
FM25V02_data_write(calendar.sec&0xFF, Sample_alarm_addr + 5 );
|
FM25V02_data_write_uint16(Sample_alarm_addr + 6, RS485_READ_FLOW_FAILED_ALARM_CODE);
|
|
system_alarm.alarm_l ++;
|
system_alarm.u16AlarmStoreNum ++;
|
if(system_alarm.u16AlarmStoreNum >= ALARM_RECORD_NUM)
|
{
|
system_alarm.u16AlarmStoreNum = 0;
|
system_alarm.u8AlarmStoreFullFlag = 1;
|
FM25V02_data_write(system_alarm.u8AlarmStoreFullFlag,ALARM_RECORD_FULL_FLAG_ADDR);
|
}
|
FM25V02_data_write_uint16(CURRENT_ALARM_RECORD_NUM_ADDR,system_alarm.u16AlarmStoreNum);
|
|
system_alarm.alarm_Sample = 0x01;
|
|
}
|
}
|
|
/******************************************
|
* func: Parameter_assignment
|
* desc: Parameter assignment
|
* input:
|
* output: none
|
* return: none
|
*****************************************/
|
void Parameter_assignment(void)
|
{
|
if(parmAccess.u16MeterTypeCode==SIZHUMODBUS1) //
|
{
|
parmAccess.decoding_Type = 5;
|
parmAccess.Vbt_Flag = 0;
|
parmAccess.VT_permission = 1;
|
parmAccess.VbT_permission = 1;
|
parmAccess.Q_permission = 1;
|
parmAccess.Qb_permission = 1;
|
parmAccess.TEMP_permission = 1;
|
parmAccess.PRES_permission = 1;
|
|
parmAccess.u8deviceAdress = parmAccess.u8slaveAddress;//0x01
|
parmAccess.u32VTAddr = 3501;
|
parmAccess.u32VbTAddr = 3504;
|
parmAccess.u32VbT2Addr = 3003;
|
parmAccess.u32QAddr = 3507;
|
parmAccess.u32QbAddr = 3509;
|
parmAccess.u32TMESAddr = 3511;
|
parmAccess.u32PMESAddr = 3513;
|
parmAccess.u32P_Bar = 1;
|
}
|
else if(parmAccess.u16MeterTypeCode==SIZHUMODBUS2) //
|
{
|
parmAccess.decoding_Type = 5;
|
parmAccess.Vbt_Flag = 0;
|
parmAccess.VT_permission = 1;
|
parmAccess.VbT_permission = 1;
|
parmAccess.Q_permission = 1;
|
parmAccess.Qb_permission = 1;
|
parmAccess.TEMP_permission = 1;
|
parmAccess.PRES_permission = 1;
|
|
parmAccess.u8deviceAdress = parmAccess.u8slaveAddress;//0x01
|
parmAccess.u32VTAddr = 3001;
|
parmAccess.u32VbTAddr = 3003;
|
parmAccess.u32VbT2Addr = 3003;
|
parmAccess.u32QAddr = 3005;
|
parmAccess.u32QbAddr = 3007;
|
parmAccess.u32TMESAddr = 3025;
|
parmAccess.u32PMESAddr = 3027;
|
parmAccess.u32P_Bar = 1;
|
}
|
else if(parmAccess.u16MeterTypeCode==SIZHUMODBUSV2_0) //
|
{
|
parmAccess.decoding_Type = 5; //SIZHUMODBUS2
|
parmAccess.Vbt_Flag = 0;
|
parmAccess.VT_permission = 1;
|
parmAccess.VbT_permission = 1;
|
parmAccess.Q_permission = 1;
|
parmAccess.Qb_permission = 1;
|
parmAccess.TEMP_permission = 1;
|
parmAccess.PRES_permission = 1;
|
|
parmAccess.u8deviceAdress = parmAccess.u8slaveAddress;//parmAccess.u8deviceAdress = 0x01;
|
parmAccess.u32VTAddr = 504;
|
parmAccess.u32VbTAddr = 507;
|
parmAccess.u32QAddr = 510;
|
parmAccess.u32QbAddr = 512;
|
parmAccess.u32TMESAddr = 514;
|
parmAccess.u32PMESAddr = 516;
|
parmAccess.u32P_Bar = 1;
|
}
|
else
|
{
|
parmAccess.u16MeterTypeCode = SIZHUMODBUS1;
|
parmAccess.decoding_Type = 5;
|
parmAccess.Vbt_Flag = 0;
|
parmAccess.VT_permission = 1;
|
parmAccess.VbT_permission = 1;
|
parmAccess.Q_permission = 1;
|
parmAccess.Qb_permission = 1;
|
parmAccess.TEMP_permission = 1;
|
parmAccess.PRES_permission = 1;
|
|
parmAccess.u8deviceAdress = parmAccess.u8slaveAddress;//0x01
|
parmAccess.u32VTAddr = 3501;
|
parmAccess.u32VbTAddr = 3504;
|
parmAccess.u32VbT2Addr = 3003;
|
parmAccess.u32QAddr = 3507;
|
parmAccess.u32QbAddr = 3509;
|
parmAccess.u32TMESAddr = 3511;
|
parmAccess.u32PMESAddr = 3513;
|
parmAccess.u32P_Bar = 1;
|
}
|
}
|
|
|
void PULSE_Recording(void)
|
{
|
|
if((parameter_bil.cDataObtainType & RS485_MODE)!= RS485_MODE)//ûÓÐ485¶ÁÈ¡
|
{
|
Get_Time();// »ñȡʱ¼ä
|
FM25V02_data_write(calendar.year&0x00FF, YEAR_addr + NumDataStored );
|
FM25V02_data_write(calendar.month&0xFF, MONTH_addr + NumDataStored);
|
FM25V02_data_write(calendar.date&0xFF, DAY_addr + NumDataStored );
|
FM25V02_data_write(calendar.hour&0xFF, HOUR_addr + NumDataStored);
|
FM25V02_data_write(calendar.min&0xFF, MIN_addr + NumDataStored);
|
FM25V02_data_write(calendar.sec&0xFF, SEC_addr + NumDataStored);
|
FM25V02_data_write_uint32(WCACC_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_uint32_WRCheck(SCACC_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(PRE_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(TEM_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(WCINS_addr + 4*NumDataStored, 0);
|
FM25V02_data_write_float(SCINS_addr + 4*NumDataStored, 0);
|
|
// parmAccess.Vbt_Flag = 0;
|
// parmAccess.VT_permission = 0;
|
// parmAccess.VbT_permission = 0;
|
// parmAccess.Q_permission = 0;
|
// parmAccess.Qb_permission = 0;
|
// parmAccess.TEMP_permission = 0;
|
// parmAccess.PRES_permission = 0;
|
|
}
|
|
if(Settlement_Para.fBalance<=parameter_bil.iBalanceInsufAlarmAmount)
|
{
|
system_alarm.alarm_Balance_Small_LCDFLAG = 0x01;
|
}
|
else
|
{
|
system_alarm.alarm_Balance_Small_LCDFLAG = 0x00;
|
}
|
|
FM25V02_data_write_double(CUMULATIVE_GAS_USAGE_ADDR + 8*NumDataStored, Settlement_Para.fCumulativeGasUsage);
|
FM25V02_data_write_double(CUMULATIVE_FEE_USAGE_ADDR + 8*NumDataStored, Settlement_Para.fCumulativeFeeUsage);
|
FM25V02_data_write_double(BALANCE_ADDR + 8*NumDataStored, Settlement_Para.fBalance);
|
|
ddr_index_2 ++;
|
NumDataStored++;
|
if(NumDataStored >= NumStoredLength)
|
{
|
NumDataStored = 0;
|
DataStoredFlag =1;
|
FM25V02_data_write(DataStoredFlag,DataStoredFlag_Addr );
|
}
|
FM25V02_data_write_uint16(NumDataStored_Addr,NumDataStored);
|
|
}
|