⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eepromoper.c

📁 工厂环境污染控制数据采集器
💻 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 + -