503 lines
9.3 KiB
C
503 lines
9.3 KiB
C
#include "uart.h"
|
||
#include "addr.h"
|
||
#include "debug_printf.h"
|
||
#include "bl24c512.h"
|
||
#include "WaterMetermanager.h"
|
||
#include "Led.h"
|
||
#include "keywd.h"
|
||
#include "update.h"
|
||
#include "Flash.h"
|
||
#include "PHY.h"
|
||
#include "rtc_ext.h"
|
||
#include "hbframe.h"
|
||
#include "filedata.h"
|
||
|
||
//7E7E //帧起始符 2
|
||
//01 //中心站地址 1
|
||
//1310020028 //遥测站地址 40=28 5
|
||
//1234 //密码 (根据主站下发的变化) 2
|
||
//32 //功能码 1
|
||
//003C //报文上下行标志及长度 0000 上行 1000 下行 60 = 3C 2
|
||
//02 //报文起始符 1
|
||
//05FD //流水号 2
|
||
//201219013000 //发报时间 6
|
||
//F1F1 //地址标识符 2
|
||
//1310020028 //地址 5
|
||
//49 //遥测站分类码 1
|
||
//F0F0 //观测时间标识符 2
|
||
//2012190110 //观测时间 5
|
||
//282B //取水口流量1标识符 2
|
||
//0000000000 //取水口流量 5
|
||
//FF012A //取水口累计流量1标识符 3
|
||
//0002670300 //取水口累计流量 5
|
||
//6033 //水表1剩余水量标识符 2
|
||
//000000000000 //水表1剩余水量 6
|
||
//4520 //遥测状态及报警息信标识符号 2
|
||
//00000001 //遥测状态及报警信息 4
|
||
//3812 //电压标志符 2
|
||
//0000 //蓄电池电压 2
|
||
//FF0208 //CSQ标志符 3
|
||
//12 //信号强度CSQ 1
|
||
//03 //报文结束符 1
|
||
//0BB7 //校验 2
|
||
|
||
//7E 7E
|
||
//01
|
||
//00 00 00 00 01
|
||
//0C 50
|
||
//2F
|
||
//00 08
|
||
//02
|
||
//00 02 12 12 07 08 56 50
|
||
//03
|
||
//22 8D
|
||
|
||
//中心站确认帧
|
||
|
||
//7E 7E
|
||
//00
|
||
//00 00 00 01 01
|
||
//0C 51
|
||
//32
|
||
//80 08
|
||
//02
|
||
//00 00 12 12 07 08 56 50
|
||
//04 ac a5
|
||
|
||
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
||
//7E 7E 01 13 10 02 00 28 12 34 32 00 3C 02 05 FD 20 12 19 01 30 00 F1 F1 13 10 02 00 28 49 F0 F0 20 12 19 01 10 28 2B 00 00 00 00 00 FF 01 2A 00 02 67 03 00 60 33 00 00 00 00 00 00 45 20 00 00 00 01 38 12 00 00 FF 02 08 12 03 0B B7
|
||
|
||
//6.6.4.9 中心站查询遥测站实时数据
|
||
//报文实例:
|
||
//(1)取用水类
|
||
//1)中心站下行报文
|
||
//中心地址 01 遥测站地址 0000000001 密码 0x0c51 功能码 37 发报时间 12-12-07
|
||
|
||
//7E 7E
|
||
//01
|
||
//00 00 00 00 01
|
||
//0C 51
|
||
//37 ***
|
||
//00 3C
|
||
//02
|
||
//00 01
|
||
//12 12 09 10 21 07
|
||
//F1 F1
|
||
//00 00 00 00 01
|
||
//50 ***
|
||
//F0 F0
|
||
//12 12 09 10 21
|
||
//28 2B
|
||
//00 00 23 99 99
|
||
//FF 01 2A
|
||
//00 99 99 99 99
|
||
//60 33
|
||
//00 00 00 20 03 50
|
||
//45 20
|
||
//00 00 00 03
|
||
//38 12
|
||
//12 80
|
||
//FF 02 08
|
||
//26
|
||
//03
|
||
//72 E4
|
||
|
||
//6.6.4.17 初始化固态存储数据
|
||
|
||
//6.6.4.18 恢复遥测站出厂设置
|
||
|
||
//6.6.4.19 修改密码
|
||
|
||
//6.6.4.20 设置遥测站时钟
|
||
|
||
//6.6.4.23 控制水泵开关命令/水泵状态自报
|
||
|
||
//140 页功能码定义
|
||
|
||
extern u8 csq_value;
|
||
extern u8 * hb_getdl_time();
|
||
extern void hb_get_time(u8 * time);
|
||
extern u16 get_crc(u8 * val,u16 len);
|
||
extern void hb_waterdata_read(u16 count,uint8_t * buf,uint16_t len);
|
||
|
||
|
||
bool hb_data_rp_pro(u16 index,u8 * val,u16 * len)
|
||
{
|
||
u8 * addr = NULL;
|
||
u8 * pval = NULL;
|
||
u16 password = 0;
|
||
u16 ck = 0;
|
||
struct hb_struct * p = (struct hb_struct *)val;
|
||
|
||
struct waterdata_struct waterdata;
|
||
u8 data_crc = 0;
|
||
|
||
hb_waterdata_read(index,(u8*)&waterdata,sizeof(struct waterdata_struct));
|
||
|
||
data_crc = GetSum((uint8_t*)&waterdata.invalid,WATERDATA_LEN);
|
||
|
||
if(waterdata.crc != data_crc)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
//帧起始符
|
||
p->head[0] = 0x7E;
|
||
p->head[1] = 0x7E;
|
||
|
||
//中心站地址
|
||
p->centeraddr = get_center_addr();
|
||
|
||
//遥测站地址 40=28
|
||
addr = get_hb_addr();
|
||
MemCpy(p->collectaddr,addr,5);
|
||
|
||
password = get_password();
|
||
|
||
//密码
|
||
hbp2from16(p->pwd,password);
|
||
|
||
//功能码
|
||
p->fn = 0x32;
|
||
|
||
// p->fn = HB_DATA_RP_FUN;
|
||
|
||
//报文上下行标志及长度
|
||
hbp2from16(p->len,60);
|
||
|
||
//报文起始符 1
|
||
p->start = 0x02;
|
||
|
||
//流水号 2
|
||
hbp2from16(p->serial, get_send_serial());
|
||
pval = (u8*)p + sizeof(struct hb_struct);
|
||
|
||
////////////////////////////////////////////////////////////////
|
||
|
||
//发报时间 6
|
||
hb_get_time(pval);
|
||
pval = pval + 6;
|
||
|
||
//地址标识符 2
|
||
pval[0] = 0xF1;
|
||
pval[1] = 0xF1;
|
||
pval = pval + 2;
|
||
|
||
//地址 5
|
||
MemCpy(pval,addr,5);
|
||
pval = pval + 5;
|
||
|
||
//遥测站分类码 1
|
||
pval[0] = 0x49;
|
||
pval = pval + 1;
|
||
|
||
//观测时间标识符 2
|
||
pval[0] = 0xF0;
|
||
pval[1] = 0xF0;
|
||
pval = pval + 2;
|
||
|
||
//观测时间 5
|
||
//MemCpy(pval,hb_getdl_time(),5);
|
||
|
||
|
||
pval[0] = waterdata.year;
|
||
pval[1] = waterdata.mon;
|
||
pval[2] = waterdata.day;
|
||
pval[3] = waterdata.hour;
|
||
/*
|
||
if(waterdata.hour == 0x00)
|
||
{
|
||
if(waterdata.day == 1)
|
||
{
|
||
if(waterdata.mon == 1)
|
||
{
|
||
waterdata.year = waterdata.year - 1;
|
||
}
|
||
else
|
||
{
|
||
pval[1] = waterdata.mon-1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pval[2] = waterdata.day-1;
|
||
}
|
||
pval[3] = 0x23;
|
||
}
|
||
else
|
||
{
|
||
pval[3] = waterdata.hour-1;
|
||
}
|
||
*/
|
||
|
||
pval[4] = 0x00;
|
||
pval[5] = 0;
|
||
|
||
pval = pval + 5;
|
||
|
||
//取水口流量1标识符 2
|
||
pval[0] = 0x28;
|
||
pval[1] = 0x2B;
|
||
pval = pval + 2;
|
||
|
||
//取水口流量 5
|
||
|
||
pval[0] = waterdata.current[0];
|
||
pval[1] = waterdata.current[1];
|
||
pval[2] = waterdata.current[2];
|
||
pval[3] = waterdata.current[3];
|
||
pval[4] = waterdata.current[4];
|
||
pval = pval + 5;
|
||
|
||
//取水口累计流量1标识符 3
|
||
pval[0] = 0xFF;
|
||
pval[1] = 0x01;
|
||
pval[2] = 0x2A;
|
||
pval = pval + 3;
|
||
|
||
|
||
//取水口累计流量 5
|
||
pval[0] = waterdata.sum[0];
|
||
pval[1] = waterdata.sum[1];
|
||
pval[2] = waterdata.sum[2];
|
||
pval[3] = waterdata.sum[3];
|
||
pval[4] = waterdata.sum[4];
|
||
pval = pval + 5;
|
||
|
||
//水表1剩余水量标识符 2
|
||
pval[0] = 0x60;
|
||
pval[1] = 0x33;
|
||
pval = pval + 2;
|
||
|
||
//水表1剩余水量 6
|
||
pval[0] = waterdata.surplus[0];
|
||
pval[1] = waterdata.surplus[1];
|
||
pval[2] = waterdata.surplus[2];
|
||
pval[3] = waterdata.surplus[3];
|
||
pval[4] = waterdata.surplus[4];
|
||
pval[5] = waterdata.surplus[5];
|
||
|
||
pval = pval + 6;
|
||
|
||
//遥测状态及报警息信标识符号 2
|
||
pval[0] = 0x45;
|
||
pval[1] = 0x20;
|
||
pval = pval + 2;
|
||
|
||
//遥测状态及报警信息 4
|
||
pval[0] = waterdata.ala[0];
|
||
pval[1] = waterdata.ala[1];
|
||
pval[2] = waterdata.ala[2];
|
||
pval[3] = waterdata.ala[3];
|
||
pval = pval + 4;
|
||
|
||
//电压标志符 2
|
||
pval[0] = 0x38;
|
||
pval[1] = 0x12;
|
||
pval = pval + 2;
|
||
|
||
//蓄电池电压 2
|
||
//pval[0] = waterdata.vol[0];
|
||
//pval[1] = waterdata.vol[1];
|
||
|
||
pval[0] = 0x12;
|
||
pval[1] = HexToBCD((RTC_GetCounter()%50));
|
||
pval = pval + 2;
|
||
|
||
//CSQ标志符 3
|
||
pval[0] = 0xFF;
|
||
pval[1] = 0x02;
|
||
pval[2] = 0x08;
|
||
pval = pval + 3;
|
||
|
||
|
||
//信号强度CSQ 1
|
||
pval[0] = csq_value;
|
||
pval = pval + 1;
|
||
|
||
//报文结束符 1
|
||
pval[0] = 0x03;
|
||
pval = pval + 1;
|
||
|
||
ck = get_crc(val,75);
|
||
|
||
hbp2from16(pval,ck);
|
||
*len = 77;
|
||
|
||
return true;
|
||
|
||
}
|
||
|
||
bool hb_data_rp_cur_pro(u8 * val,u16 * len,u8 * currentdata,u8 * sumdata,u8 * surplus,u8 * ala,u8 year,u8 month,u8 day,u8 hour)
|
||
{
|
||
u8 * addr = NULL;
|
||
u8 * pval = NULL;
|
||
u16 password = 0;
|
||
u16 ck = 0;
|
||
struct hb_struct * p = (struct hb_struct *)val;
|
||
|
||
|
||
//帧起始符
|
||
p->head[0] = 0x7E;
|
||
p->head[1] = 0x7E;
|
||
|
||
//中心站地址
|
||
p->centeraddr = get_center_addr();
|
||
|
||
//遥测站地址 40=28
|
||
addr = get_hb_addr();
|
||
//addr[4] = addr[4] + 1;
|
||
MemCpy(p->collectaddr,addr,5);
|
||
|
||
password = get_password();
|
||
|
||
//密码
|
||
hbp2from16(p->pwd,password);
|
||
|
||
//功能码
|
||
p->fn = 0x32;
|
||
|
||
// p->fn = HB_DATA_RP_FUN;
|
||
|
||
//报文上下行标志及长度
|
||
hbp2from16(p->len,60);
|
||
|
||
//报文起始符 1
|
||
p->start = 0x02;
|
||
|
||
//流水号 2
|
||
hbp2from16(p->serial, get_send_serial());
|
||
pval = (u8*)p + sizeof(struct hb_struct);
|
||
|
||
////////////////////////////////////////////////////////////////
|
||
|
||
//发报时间 6
|
||
hb_get_time(pval);
|
||
pval = pval + 6;
|
||
|
||
//地址标识符 2
|
||
pval[0] = 0xF1;
|
||
pval[1] = 0xF1;
|
||
pval = pval + 2;
|
||
|
||
//地址 5
|
||
MemCpy(pval,addr,5);
|
||
pval = pval + 5;
|
||
|
||
//遥测站分类码 1
|
||
pval[0] = 0x49;
|
||
pval = pval + 1;
|
||
|
||
//观测时间标识符 2
|
||
pval[0] = 0xF0;
|
||
pval[1] = 0xF0;
|
||
pval = pval + 2;
|
||
|
||
//观测时间 5
|
||
//MemCpy(pval,hb_getdl_time(),5);
|
||
|
||
|
||
pval[0] = year;
|
||
pval[1] = month;
|
||
pval[2] = day;
|
||
pval[3] = hour;
|
||
|
||
pval[4] = 0x00;
|
||
pval[5] = 0;
|
||
|
||
pval = pval + 5;
|
||
|
||
//取水口流量1标识符 2
|
||
pval[0] = 0x28;
|
||
pval[1] = 0x2B;
|
||
pval = pval + 2;
|
||
|
||
//取水口流量 5
|
||
|
||
pval[0] = currentdata[0];
|
||
pval[1] = currentdata[1];
|
||
pval[2] = currentdata[2];
|
||
pval[3] = currentdata[3];
|
||
pval[4] = currentdata[4];
|
||
pval = pval + 5;
|
||
|
||
//取水口累计流量1标识符 3
|
||
pval[0] = 0xFF;
|
||
pval[1] = 0x01;
|
||
pval[2] = 0x2A;
|
||
pval = pval + 3;
|
||
|
||
|
||
//取水口累计流量 5
|
||
pval[0] = sumdata[0];
|
||
pval[1] = sumdata[1];
|
||
pval[2] = sumdata[2];
|
||
pval[3] = sumdata[3];
|
||
pval[4] = sumdata[4];
|
||
pval = pval + 5;
|
||
|
||
//水表1剩余水量标识符 2
|
||
pval[0] = 0x60;
|
||
pval[1] = 0x33;
|
||
pval = pval + 2;
|
||
|
||
//水表1剩余水量 6
|
||
pval[0] = surplus[0];
|
||
pval[1] = surplus[1];
|
||
pval[2] = surplus[2];
|
||
pval[3] = surplus[3];
|
||
pval[4] = surplus[4];
|
||
pval[5] = surplus[5];
|
||
|
||
pval = pval + 6;
|
||
|
||
//遥测状态及报警息信标识符号 2
|
||
pval[0] = 0x45;
|
||
pval[1] = 0x20;
|
||
pval = pval + 2;
|
||
|
||
//遥测状态及报警信息 4
|
||
pval[0] = ala[0];
|
||
pval[1] = ala[1];
|
||
pval[2] = ala[2];
|
||
pval[3] = ala[3];
|
||
pval = pval + 4;
|
||
|
||
//电压标志符 2
|
||
pval[0] = 0x38;
|
||
pval[1] = 0x12;
|
||
pval = pval + 2;
|
||
|
||
//蓄电池电压 2
|
||
pval[0] = 0x12;
|
||
pval[1] = HexToBCD((RTC_GetCounter()%50));
|
||
pval = pval + 2;
|
||
|
||
//CSQ标志符 3
|
||
pval[0] = 0xFF;
|
||
pval[1] = 0x02;
|
||
pval[2] = 0x08;
|
||
pval = pval + 3;
|
||
|
||
|
||
//信号强度CSQ 1
|
||
pval[0] = csq_value;
|
||
pval = pval + 1;
|
||
|
||
//报文结束符 1
|
||
pval[0] = 0x03;
|
||
pval = pval + 1;
|
||
|
||
ck = get_crc(val,75);
|
||
|
||
hbp2from16(pval,ck);
|
||
*len = 77;
|
||
|
||
return true;
|
||
|
||
}
|
||
|
||
|
||
|