Files
HBshuiwuConcentrator/hb/hbdatapro.c
2025-12-15 16:07:49 +08:00

503 lines
9.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}