河北水利局项目

This commit is contained in:
2025-12-15 16:07:49 +08:00
commit f11a7c2b95
1146 changed files with 452892 additions and 0 deletions

502
hb/hbdatapro.c Normal file
View File

@@ -0,0 +1,502 @@
#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;
}