📄 eepromoper.c
字号:
#include "main.h"
#include "type.h"
#include <math.h>
unsigned int MEASURELEN = 0x50;
MEASUREDATA g_cur_measuredata;//瞬时数据
MEASUREDATA g_min_data; //分钟数据
extern _SITE_CONF g_site_conf;
extern _SITE_CONF_EXTEND g_site_conf_extend;
void setarraytozeroval(unsigned char *ary, unsigned char len)
{
unsigned char i;
for (i = 0; i < len; i++) ary[i] = 0;
}
//初始化EEPROM
void initeeprom(void)
{
unsigned char tmp;
unsigned char data[10];
data[0] = 'I';
tmp = write(SYS_INIT_BYTE_ADDR, data, 1);
strncpy(data, "123456", 6);
tmp = write(PASSWORD_ADDRESS, data, 6);
strncpy(data, convert_float_to_char(0.0), 4);
tmp = write(SYS_SUNJIAN_LIULIANG, data, 4);
strncpy(data, convert_float_to_char(0.0), 4);
tmp = write(SYS_LEIJI_LIULIANG, data, 4);
strncpy(data, inttohexstr(0), 4);
tmp = write(SYS_CURR_INSTANT_ADDR, data, 4);
strncpy(data, inttohexstr(0x50), 4);
tmp = write(SYS_INSTANT_STEP, data, 4);
strncpy(data, inttohexstr(0), 4);
tmp = write(SYS_LAST_REBOOT_TIME, data, 8);
tmp = write(SYS_LAST_DAY_REPORT, data, 8);
tmp = write(SYS_LAST_HOUR_REPORT, data, 8);
tmp = write(SYS_LAST_MIN_REPORT, data, 8);
tmp = write(SYS_LAST_INSTANT_REPORT, data, 8);
tmp = write(SYS_LAST_LOG_REPORT, data, 8);
tmp = write(SYS_LAST_REPORTONTTIME, data, 8);
tmp = write(SYS_LAST_ALARMREPORT, data, 8);
}
void setinitflg(void)
{
}
void setNoinitflg(void)
{
}
//是否进行了初始化
BOOL readinitflg(void)
{
unsigned char tmp;
unsigned char flg;
//读初始位的状态 0-未初始化
tmp = read(SYS_INIT_BYTE_ADDR, &flg, 1);
if (flg == 'I')
return TRUE;
else
return FALSE;
}
void setPassword(char *pw) {
unsigned char tmp;
tmp = write(PASSWORD_ADDRESS, pw, 6);
return;
}
char * readPassword(void) {
unsigned char pw[6];
unsigned char tmp;
tmp = read(PASSWORD_ADDRESS, pw, 6);
return pw;
}
void setinstantflow(float val) {
unsigned char tmp;
unsigned char data[10];
strncpy(data, convert_float_to_char(val), 4);
tmp = write(SYS_SUNJIAN_LIULIANG, data, 4);
g_cur_measuredata.measuredata[P_ADDR_INSTANT].val = val;
return;
}
float readinstantflow(void) {
unsigned char tmp;
unsigned char data[10];
float val;
tmp = read(SYS_SUNJIAN_LIULIANG, data, 4);
val = convert_char_to_double(data);
g_cur_measuredata.measuredata[P_ADDR_INSTANT].val = val;
return val;
}//读瞬时流量,2个小数位
void setmilageflow(float val) {
unsigned char tmp;
unsigned char data[10];
strncpy(data, convert_float_to_char(val), 4);
tmp = write(SYS_LEIJI_LIULIANG, data, 4);
g_cur_measuredata.measuredata[P_ADDR_MILAGE].val = val;
return;
}
float readmilageflow(void) {
unsigned char tmp;
unsigned char data[10];
float val;
tmp = read(SYS_LEIJI_LIULIANG, data, 4);
val = convert_char_to_double(data);
g_cur_measuredata.measuredata[P_ADDR_MILAGE].val = val;
return val;
}//读瞬时流量,2个小数位
void setinstantvalrecpos(long pos) {
unsigned char tmp;
unsigned char data[10];
strncpy(data, inttohexstr(pos), 4);
tmp = write(SYS_CURR_INSTANT_ADDR, data, 4);
return;
}
int readinstantvalrecpos(void) {
unsigned char tmp;
unsigned char data[10];
tmp = read(SYS_CURR_INSTANT_ADDR, data, 4);
return (long)hexstrtoint(data);
}
void setinstantvalreclen(int len) {
unsigned char data[10];
strncpy(data, inttohexstr(len), 4);
write(SYS_INSTANT_STEP, data, 4);
return;
}
//设置瞬间值存储位置
void setlastreboottime(char *rt) {}//设置最后重新启动时间
char *readlastreboottime(void) {}
void setlastdayreporttime(char *rt) {}//设置最后日值上报时间
char *readlastdayreporttime(void) {}
void setlasthourreporttime(char *rt) {}
char *readlasthourreporttime(void) {}
void setlastminreporttime(char *rt) {}//min
char *readlastminreporttime(void) {}
void setlastinstantreporttime(char *rt) {}//instant
char *readlastinstantreporttime(void) {}
void setlastlogreporttime(char *rt) {}
char * readlastlogreporttime(void) {}
void setlastreporttime(char *rt) {}
char * readlastreporttime(void) {}
void setlastalarmreporttime(char *rt) {}
char * readlastalarmreporttime(void) {}
/**************瞬间数据存储,存在EEPROM中 *******************************/
/****************************************
** 加一条数据到EEPROM中
** @param 时间串
** @param 数据单元
** @param 数据单元长度
*****************************************/
void addinstantdata(char *rt, MEASUREDATA *buf, unsigned int len) {
//1.读当前地址,步进
//2.写数据
unsigned int iCurpos;
unsigned int iStep;
unsigned char uTemp[20];
unsigned char bTemp;
iCurpos = readinstantvalrecpos();
iStep = 0x50;
if (((iCurpos - 0x200)/iStep) >= 59)
iCurpos = 0x200;
uTemp[POS_Second] = g_cur_measuredata.measuretime[POS_Second];
uTemp[POS_Minute] = g_cur_measuredata.measuretime[POS_Minute];
uTemp[POS_Hour] = g_cur_measuredata.measuretime[POS_Hour];
uTemp[POS_Week] = g_cur_measuredata.measuretime[POS_Week];
uTemp[POS_Date] = g_cur_measuredata.measuretime[POS_Date];
uTemp[POS_Month] = g_cur_measuredata.measuretime[POS_Month];
uTemp[POS_YearL] = g_cur_measuredata.measuretime[POS_YearL];
uTemp[POS_YearH] = g_cur_measuredata.measuretime[POS_YearH];
//瞬间流量
strncpy(&uTemp[8], convert_float_to_char(g_cur_measuredata.measuredata[P_ADDR_INSTANT].val), 4);
//累计流量
strncpy(&uTemp[12], convert_float_to_char(g_cur_measuredata.measuredata[P_ADDR_MILAGE].val), 4);
bTemp = write(iCurpos, &uTemp[0],16);
delay_xus(10);
//PH,COD,电机,进水瞬时,进水累计....
strncpy(&uTemp[0], convert_float_to_char(g_cur_measuredata.measuredata[2].val), 4);
strncpy(&uTemp[4], convert_float_to_char(g_cur_measuredata.measuredata[3].val), 4);
strncpy(&uTemp[8], convert_float_to_char(g_cur_measuredata.measuredata[4].val), 4);
strncpy(&uTemp[12], convert_float_to_char(g_cur_measuredata.measuredata[5].val), 4);
bTemp = write(iCurpos + 16, &uTemp[0],16);
delay_xus(10);
strncpy(&uTemp[0], convert_float_to_char(g_cur_measuredata.measuredata[6].val), 4);
bTemp = write(iCurpos + 32, &uTemp[0],16);
delay_xus(10);
//纪录步进
iCurpos = iCurpos + iStep;
if (iCurpos >= SYS_INSTANT_BOTTOM_ADDR) iCurpos = 0x200;
setinstantvalrecpos(iCurpos);
}
/*
* 查询瞬时值
*
*/
char * queryinstantdata(char *rt) {
return NULL;
}
/**
* 巴歇尔槽算公式 Q=Ch^n
* @param int slotmodel 槽型
* @param double waterlevel 水位
* @return double instant 瞬间流量 m^3/h
*/
float calParshallFlux(BYTE slotmodel, float waterlevel)
{
switch (slotmodel)
{
case 1:
return (float) (3.6 * 60.4 * pow(waterlevel, 1.55));
case 2:
return (float) (3.6 * 120.7 * pow(waterlevel, 1.55));
case 3:
return (float) (3.6 * 177.1 * pow(waterlevel, 1.55));
case 4:
return (float) (3.6 * 381.2 * pow(waterlevel, 1.54));
case 5:
return (float) (3.6 * 535.4 * pow(waterlevel, 1.53));
case 6:
return (float) (3.6 * 561 * pow(waterlevel, 1.513));
case 7:
return (float) (3.6 * 679 * pow(waterlevel, 1.521));
case 8:
return (float) (3.6 * 1038 * pow(waterlevel, 1.537));
case 9:
return (float) (3.6 * 1403 * pow(waterlevel, 1.548));
case 10:
return (float) (3.6 * 1772 * pow(waterlevel, 1.557));
case 11:
return (float) (3.6 * 2147 * pow(waterlevel, 1.565));
case 12:
return (float) (3.6 * 2397 * pow(waterlevel, 1.569));
case 13:
return (float) (3.6 * 2904 * pow(waterlevel, 1.577));
default:
return 0;
}
}
/**
* V型槽公式 Q=Ch^n
* @param int slotmodel 槽型
* @param double waterlevel 水位
* @return double instant 瞬间流量 m^3/h
*/
float calVFlumeFlux(float waterlevel)
{
if (waterlevel <= 0.25)
return (float) (3600 * 1.4 * pow(waterlevel, 2.5));
else //0.25<=h<=0.6m
return (float) (3600 * 1.343 * pow(waterlevel, 2.5));
}
/*
* 计算/保存瞬间流量,累计流量
* @param unsigned char buf 接收的字串,为NULL时可能是AD或串口无法接收数据
*/
void YunSuan_Data(unsigned char *buf){
float WaterHeight;
float ShunJian_LiuLiang;
float LeiJi_LiuLiang;
switch(g_site_conf_extend.flux_param.FLUX_SET)
{
case 0:
if (buf[0] != 0)
WaterHeight = (buf[1]>>1)/256.0 + ((buf[2]>>1)/256.0)/100.0;
else
WaterHeight = buf[1] / 256.0 + ((buf[2] / 256.0))/ 100.0;
switch (g_site_conf_extend.flux_param.GUTTER_TYPE)
{
case 0: //巴槽
ShunJian_LiuLiang = calParshallFlux(g_site_conf_extend.flux_param.GUTTER_NO, g_site_conf_extend.flux_param.GUTTER_HIGH - WaterHeight);
break;
case 1: //V槽
ShunJian_LiuLiang = calVFlumeFlux(g_site_conf_extend.flux_param.GUTTER_HIGH - WaterHeight);
break;
default:
ShunJian_LiuLiang = 0;
break;
}
if(buf[0] == 0 && buf[1] == 0 && buf[2] == 0 && buf[3] == 0
&& buf[4] == 0 && buf[5] == 0 && buf[6] ==0
&& buf[7] == 0 && buf[8] == 0 && buf[9] == 0
&& buf[10] == 0 && buf[11] == 0){ShunJian_LiuLiang = 0.0;}
LeiJi_LiuLiang = readmilageflow();
LeiJi_LiuLiang += (ShunJian_LiuLiang / 3600) * g_site_conf_extend.flux_param.sleeptime;
break;
case 1: //AD的处理
//adprocess();
break;
case 2: //其他流量计
//otherporcess(buf);
break;
default:
break;
}
//保存瞬间流量,累计流量到EEPROM中
setinstantflow(ShunJian_LiuLiang);
setmilageflow(LeiJi_LiuLiang);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -