コード例 #1
0
/**
* @brief 多功能表计通信任务
*/
static void *CenMetTask(void * arg)
{
	unsigned long ev;
	sysclock_t clock;

	Sleep(500);
	SysClockReadCurrent(&clock);
	while(1) 
	{
		SysWaitEvent(&CenMetEvent, 1, METEV_WAIT, &ev);

		if(ev&METEV_RDMET) //根据抄表间隔自动抄读总表数据
		{
			CenMetProc();//抄读总表数据
		}

		if(ev&METEV_1MIN) // 1分钟计算
		{
			UpdateMdbUseEne();//更新用电量数据库
		}

		if(ev&METEV_DAY) // 日冻结
		{ 
			UpdateCurveDay();
			SysClockReadCurrent(&clock);
		}
	}

	return 0;
}
コード例 #2
0
void SavePlStic(void)
{
	sysclock_t clock;
	int i = 0;
	char filename[32];

	printf("SavePlStic...\n");
	PrintLog(0, "SavePlStic...\n");
	
	sprintf(filename,"/home/nandflash/data/plsticinfo");
	SysClockReadCurrent(&clock);//读系统时间

	if(ReadBinFile(filename, PLMDB_MAGIC, (unsigned char *)&pl_read_meter_stic, sizeof(pl_read_meter_stic)) > 0) 
	{
		PrintLog(0, "ReadBinFileSucc...\n");
	}
	else 
	{
		PrintLog(0, "ReadBinFileFail...\n");
	}
	i = clock.day;
	if(i < 1 || i > 31)		return;
	pl_read_meter_stic[i - 1].read_meter_succ_cnt = check_read_meter_succ_cnt();
	pl_read_meter_stic[i - 1].read_meter_prd = check_read_meter_succ_cnt()*100/(meter_total_cnt - cen_meter_cnt);

	LOCK_PLMDB;
	system("rm -r -f /home/nandflash/data/plsticinfo");
	SaveBinFile(filename, PLMDB_MAGIC, (unsigned char *)&pl_read_meter_stic,sizeof(pl_read_meter_stic));
	UNLOCK_PLMDB;
}
コード例 #3
0
/**
* @brief 保存载波表数据
*/
void SavePlMdb(void)
{
	sysclock_t clock;
	dbtime_t dbtime;

	printf("SavePlMdb...\n");
	PrintLog(3, "SavePlMdb...\n");

	SysClockReadCurrent(&clock);//读系统时间
	SYSCLOCK_DBTIME(&clock, dbtime);

	LOCK_PLMDB;

	//if(!FlagDaySaved) 
	//{
		SavePlMdbDay(PlMdbDay, dbtime);//根据时标存储日冻结数据
		//FlagDaySaved = 1;
	//}
/*
	if(!FlagMonthSaved) 
	{
		SavePlMdbMonth(PlMdbMonth, dbtime);
		FlagMonthSaved = 1;
	}

	if(!FlagImpSaved)
	{
		SavePlMdbImp(PlMdbImp, dbtime);
		FlagImpSaved = 1;
	}

	PlcStateSave();
*/
	UNLOCK_PLMDB;
}
コード例 #4
0
ファイル: keepalive.c プロジェクト: bearxiong99/XXOO_000
/**
* @brief 检测是否在可上线时段
* @return 可上线返回1, 不可上线返回0
*/
int CheckinActivePeriod()
{
    sysclock_t clock;
    unsigned int mask;


    SysClockReadCurrent(&clock);
    mask = (unsigned int)1<<(clock.hour);
    if(mask&ParaTerm.uplink.onlineflag) return 1;
    else return 0;
}
コード例 #5
0
/**
* @brief 抄表日定时器
* @param arg 定时器参数
* @param utime 当前时间
*/
static void RTimerRmd(unsigned long arg, utime_t utime)
{
	unsigned char day;
	unsigned int mask;
	sysclock_t clk;
	const para_commport_t *pcfg = GetParaCommPort(COMMPORT_RS485_2);

	SysClockReadCurrent(&clk);
	day = clk.day;

	if(day) day -= 1;
	mask = 1<<day;
	if(mask & pcfg->dateflag) MakeCenMetEvent(METEV_RDMETDAY);
}
コード例 #6
0
/**
* @brief 显示时钟
*/
void ShowTime(void)
{		
	unsigned char ch;
	int i,j;
	sysclock_t clock;
	
	SysClockReadCurrent(&clock);
	ch=(clock.hour%24)/10;
	memcpy(topm_buf[16], &asc10x8[ch*16], 16);
	ch = clock.hour%10;
	memcpy(topm_buf[17], &asc10x8[ch*16], 16);
	
    for(i=0;i<16;i++)
    {
    	topm_buf[14][i]=(topm_buf[14][i]>>1);
		if((i==6)||(i==9))
			topm_buf[17][i]=(topm_buf[17][i]|0x01);
    }
    
	ch=(clock.minute %60)/10;
	memcpy(topm_buf[18], &asc10x8[ch*16], 16);
	ch = clock.minute%10;
	memcpy(topm_buf[19], &asc10x8[ch*16], 16);


	/*
    for(i=0;i<16;i++)
    {
    	topm_buf[16][i]=(topm_buf[16][i]>>1);
		if((i==6)||(i==9))
			topm_buf[17][i]=(topm_buf[17][i]|0x01);
	}
    
    ch=(clock.second % 60)/10;
	memcpy(topm_buf[18], &asc10x8[ch*16], 16);
	ch = clock.second%10;
	memcpy(topm_buf[19], &asc10x8[ch*16], 16);
	
	for(i=0;i<16;i++)
	{
		topm_buf[18][i]=(topm_buf[18][i]>>1);
	}
	*/
	    
	for(i=0;i<12;i++)
		for(j=12;j<20;j++)
    		lcd_buffer[20*i+j]=topm_buf[j][i];
}
コード例 #7
0
/**
* @brief 抄表日冻结初始化
*/
void CenMetRmdInit(void)
{
	//@change later: 更改抄表日时需重新初始化
	rtimer_conf_t conf;
	const para_commport_t *pcfg = GetParaCommPort(COMMPORT_RS485_2);

	if(TimerIdRmd >= 0) SysStopRTimer(TimerIdRmd);

	conf.curtime = UTimeReadCurrent();
	conf.bonce = 0;
	conf.tdev = 1;
	conf.tmod = UTIMEDEV_DAY;  // 1 day

	SysClockReadCurrent(&conf.basetime);
	conf.basetime.hour = pcfg->time_hour;
	conf.basetime.minute = pcfg->time_minute;

	TimerIdRmd = SysAddRTimer(&conf, RTimerRmd, 0);
}
コード例 #8
0
/**
* @brief 读取载波表即时数据
* @param metpid 测量点号, MAX_CENMETP+1 ~ MAX_METP
* @param itemid 数据项编号
* @param buf 输出缓存区指针
* @param len 输出缓存区长度
* @return 成功返回实际读取长度, 失败返回负数, 无此数据项返回-2, 缓存区溢出返回-1
*/
static int ReadPlMdbCurrent(unsigned short metpid, unsigned short itemid, unsigned char *buf, int len)
{
#define RETRY_TIMES		3
	unsigned short mid;
	plc_dest_t dest;
	int i, retry;
	unsigned char databuf[4];
	sysclock_t clock;
	unsigned char point_read_receive_buf[256];
	int point_read_receive_len = 0;
	plc_packet_t pak;
	pak_645_t pak_645;
	unsigned char meter_addr_tmp[6];
	unsigned char ene_buf[20];
	int meter_postion = 0;

	PrintLog(0, "ReadPlMdbCurrent1\n");
	if(metpid <= PLC_BASEMETP || metpid > MAX_METER) return -2;
	mid = metpid - 1;
	if(ParaMeter[mid].metp_id == 0) return -2;
	
	PrintLog(0, "ReadPlMdbCurrent2\n");

	//MakePlcDest(mid, &dest);
	//dest.metid = 0;
	PrintLog(0, "itemid = %x\n",itemid);
	switch(itemid) {
	case 0x1001:  //F129 即时读,如果失败,则读库
	case 0x0401:  //F33 即时读,如果失败,则读库
		if(len < 11) return -1;
		PrintLog(0, "ReadPlMdbCurrent3\n");
		for(retry=0; retry<RETRY_TIMES; retry++) 
		{
			if(ParaMeter[mid].proto == PROTO_DL1997_376_1)
			{
				point_read_receive_len = point_read(0x9010,(unsigned char *)&ParaMeter[mid].addr[0],point_read_receive_buf);
				pak_645.proto = PROTO_DL1997;
			}
			else if(ParaMeter[mid].proto == PROTO_DL2007_376_1)
			{
				point_read_receive_len = point_read(0x00010000,(unsigned char *)&ParaMeter[mid].addr[0],point_read_receive_buf);
				pak_645.proto = PROTO_DL2007;
			}
			PrintLog(0, "ReadPlMdbCurrent4\n");
			//point_read_receive_len = point_read(0x9010,(unsigned char *)&ParaMeter[mid].addr[0],point_read_receive_buf);
			if(point_read_receive_len>0)	
			{
				printf("point_read_receive_len = %d\n",point_read_receive_len);
				printf("point_read_receive_buf = ");
				for(i=0;i<point_read_receive_len;i++)
					printf("%02X ",point_read_receive_buf[i]);
				printf("\n");
				PrintLog(0, "ReadPlMdbCurrent4\n");
				if(check_rcv_frame(point_read_receive_buf,point_read_receive_len) == 1)
				{
					printf("rcv_point_read_report_data...1\n");
					memset((unsigned char *)&pak.head,0x00,sizeof(pak));
					memset((unsigned char *)pak_645.meter_index,0x00,sizeof(pak_645));
					memcpy((unsigned char *)&pak.head,point_read_receive_buf,point_read_receive_len);
					if(pak.afn == 0x13 && pak.fn[0] == 0x01 && pak.fn[1] == 0x00)	
					{
						printf("rcv_point_read_report_data...2\n");
						memset(meter_addr_tmp,0x00,6);
						memset(ene_buf,0x00,20);
						//pak_645.proto = PROTO_DL1997;
						pak_645.len = pak.data[1];
						meter_postion = process_rcv_645_pak((unsigned char *)pak.data,pak_645.len,meter_addr_tmp,ene_buf);
						printf("meter_postion = %d\n",meter_postion);
						printf("rcv_point_read_report_data...3\n");
						//if(meter_postion>=8)
						//if(meter_postion>=2)	
						//if(process_rcv_645_pak((unsigned char *)pak.data,pak_645.len,pak_645.proto,meter_addr_tmp,ene_buf) == 1)
						//{
							//for(i=0; i<4; i++) ene_buf[i] = databuf[i];
							printf("rcv_point_read_report_data...4\n");
							for(i=0; i<4; i++) 
							{
								databuf[i] = ene_buf[i];
								PrintLog(0, "ene_buf[%d] = %x\n",i,ene_buf[i]);
							}
							PrintLog(0, "retry = %x\n",retry);
							break;
						//}
					}
				}
			}
		}
		if(retry >= RETRY_TIMES) 
		{
			sysclock_t clock2;

			if(PLTIME_EMTPY == PlMdbDay[mid-PLC_BASEMETP].readtime) return -2;

			SysClockReadCurrent(&clock);
			ReadTimeToClock(&clock, PlMdbDay[mid-PLC_BASEMETP].readtime, 0, &clock2);
			buf[0] = clock2.minute;
			buf[1] = clock2.hour;
			buf[2] = clock2.day;
			buf[3] = clock2.month;
			buf[4] = clock2.year;
			HexToBcd(buf, 5);
			buf[5] = 0;//费率数
			buf[6] = 0;
			for(i=0; i<4; i++) buf[i+7] = PlMdbDay[mid-PLC_BASEMETP].meter_ene[i];
		}
		else 
		{
			SysClockReadCurrent(&clock);
			buf[0] = clock.minute;
			buf[1] = clock.hour;
			buf[2] = clock.day;
			buf[3] = clock.month;
			buf[4] = clock.year;
			HexToBcd(buf, 5);
			buf[5] = 0;//费率数
			buf[6] = 0;
			for(i=0; i<4; i++) buf[i+7] = databuf[i];
		}

		return 11;
		break;

	case 0x1101: //F137
		//@change later 多费率, 重读
		if(len < 11) return -1;
		if(PlcRead(&dest, 0x9410, databuf, 4) <= 0) {
			sysclock_t clock2;

			if(PLTIME_EMTPY == PlMdbMonth[mid-PLC_BASEMETP].readtime) return -2;

			SysClockReadCurrent(&clock);
			ReadTimeToClock(&clock, PlMdbMonth[mid-PLC_BASEMETP].readtime, 1, &clock2);
			buf[0] = clock2.minute;
			buf[1] = clock2.hour;
			buf[2] = clock2.day;
			buf[3] = clock2.month;
			buf[4] = clock2.year;
			HexToBcd(buf, 5);
			buf[5] = 0;
			buf[6] = 0;
			for(i=0; i<4; i++) buf[i+7] = PlMdbMonth[mid-PLC_BASEMETP].ene[i];
		}
		else {
			SysClockReadCurrent(&clock);
			buf[0] = clock.minute;
			buf[1] = clock.hour;
			buf[2] = clock.day;
			buf[3] = clock.month;
			buf[4] = clock.year;
			HexToBcd(buf, 5);
			buf[5] = 0;
			buf[6] = 0;
			for(i=0; i<4; i++) buf[i+7] = databuf[i];
		}

		return 11;
		break;

	default: return -2;
	}

	return -2;
}
コード例 #9
0
void UpdatePlMdb(unsigned short mid, unsigned short itemid, const unsigned char *buf, int len)
{
	if(mid < PLC_BASEMETP || mid >= MAX_METER) return;
	mid -= PLC_BASEMETP;

	switch(itemid) {
	case 0x9010:
	case 0x9210:
		smallcpy(PlMdbDay[mid].meter_ene, buf, 4);
		PlMdbDay[mid].readtime = ClockToReadTime(&PlcState[mid+PLC_BASEMETP].oktime, 0);
		/*smallcpy(PlMdbMonth[mid].ene, buf, 4);
		PlMdbMonth[mid].readtime = ClockToReadTime(&PlcState[mid+PLC_BASEMETP].oktime, 1);*/
		FlagDaySaved = 0;
		//FlagMonthSaved = 0;
		break;

	case 0x9410:
		smallcpy(PlMdbMonth[mid].ene, buf, 4);
		FlagMonthSaved = 0;
		PlMdbMonth[mid].readtime = ClockToReadTime(&PlcState[mid+PLC_BASEMETP].oktime, 1);
		break;

	//case 0x9011:
	case 0x9411:
		smallcpy(PlMdbMonth[mid].ene+4, buf, 4);
		FlagMonthSaved = 0;
		//PlMdbMonth[mid].readtime = ClockToReadTime(&PlcState[mid+PLC_BASEMETP].oktime, 1);
		break;

	//case 0x9012:
	case 0x9412:
		smallcpy(PlMdbMonth[mid].ene+8, buf, 4);
		FlagMonthSaved = 0;
		//PlMdbMonth[mid].readtime = ClockToReadTime(&PlcState[mid+PLC_BASEMETP].oktime, 1);
		break;

	//case 0x9013:
	case 0x9413:
		smallcpy(PlMdbMonth[mid].ene+12, buf, 4);
		FlagMonthSaved = 0;
		//PlMdbMonth[mid].readtime = ClockToReadTime(&PlcState[mid+PLC_BASEMETP].oktime, 1);
		break;

	//case 0x9014:
	case 0x9414:
		smallcpy(PlMdbMonth[mid].ene+16, buf, 4);
		FlagMonthSaved = 0;
		//PlMdbMonth[mid].readtime = ClockToReadTime(&PlcState[mid+PLC_BASEMETP].oktime, 1);
		break;

	case 0xC010:  //状态
		//PlMdbDay[mid].state[0] = buf[0];
		//PlMdbDay[mid].state[1] = buf[1];
		//FlagDaySaved = 0;
		//PlMdbMonth[mid].state[0] = buf[0];
		//PlMdbMonth[mid].state[0] = buf[0];
		break;

	case 0xF001:  //重点用户电能量
		{
			sysclock_t clock;
			unsigned int offset;
			//unsigned char kmid, impnum;
			//unsigned short metpid;

			/*metpid = mid + PLC_BASEMETP + 1;

			impnum = ParaMix.impuser.num;
			if(0 == impnum) break;
			else if(impnum > MAX_IMPORTANT_USER) impnum = MAX_IMPORTANT_USER;

			for(kmid=0; kmid<impnum; kmid++) {
				if(metpid == ParaMix.impuser.metid[kmid]) break;
			}
			if(kmid >= impnum) break;*/

			if(mid >= MAX_IMPORTANT_USER) break;
			
			SysClockReadCurrent(&clock);
			offset = clock.hour;
			offset <<= 2;

			smallcpy(PlMdbImp[mid].ene+offset, buf, 4);
			FlagImpSaved = 0;
		}
		break;

	default:
		break;
	}
}
コード例 #10
0
/**
* @brief 市电状态监测
* @param pbuf 告警缓存区指针
*/
static void PowerMonitor(alarm_t *pbuf)
{
	int stat = GpioGetValue(GPIO_POWER_STATUS);

	#if 1
	if(stat) {  //power off
		if(0 == RunState.pwroff) {
			runstate_t *prun = RunStateModify();
			sysclock_t clock;

			PrintLog(LOGTYPE_ALARM, "power off!!\n");
			Sleep(200);

			prun->pwroff = 1;

			memset((unsigned char *)pbuf, 0, sizeof(alarm_t));
			pbuf->erc = 14;
			pbuf->len = 5;
			//记录停电时间	
			SysClockReadCurrent(&clock);
			prun->timepoweroff[0] = pbuf->min = clock.minute;
			prun->timepoweroff[1] = pbuf->hour = clock.hour;
			prun->timepoweroff[2] = pbuf->day = clock.day;
			prun->timepoweroff[3] = pbuf->mon = clock.month;
			prun->timepoweroff[4] = pbuf->year = clock.year;
			HexToBcd(&pbuf->min, 5);
			MakeAlarm(ALMFLAG_ABNOR, pbuf);
			
			if(TimerIdPowerOff >= 0) {
				SysStopCTimer(TimerIdPowerOff);
				TimerIdPowerOff = -1;
			}
			TimerIdPowerOff = SysAddCTimer(180, CTimerPowerOff, 0);
		}
		else {
			if(TimerIdPowerOff < 0)
				TimerIdPowerOff = SysAddCTimer(180, CTimerPowerOff, 0);
		}
	}
	else {  //power on
		if(RunState.pwroff) {
			sysclock_t clock;

			RunStateModify()->pwroff = 0;
			if(TimerIdPowerOff >= 0) {
				SysStopCTimer(TimerIdPowerOff);
				TimerIdPowerOff = -1;
			}

			memset((unsigned char *)pbuf, 0, sizeof(alarm_t));
			pbuf->erc = 14;
			pbuf->len = 5;
			//记录上次停电时间			
			pbuf->min = RunState.timepoweroff[0];
			pbuf->hour = RunState.timepoweroff[1];
			pbuf->day = RunState.timepoweroff[2];
			pbuf->mon = RunState.timepoweroff[3];
			pbuf->year = RunState.timepoweroff[4];
			HexToBcd(&pbuf->min, 5);

			SysClockReadCurrent(&clock);
			pbuf->data[0] = clock.minute;
			pbuf->data[1] = clock.hour;
			pbuf->data[2] = clock.day;
			pbuf->data[3] = clock.month;
			pbuf->data[4] = clock.year;
			HexToBcd(pbuf->data, 5);
			MakeAlarm(ALMFLAG_NORMAL, pbuf);
		}
	}
	#else
	runstate_t *prun = RunStateModify();

	prun->pwroff = 0;
	#endif
}
コード例 #11
0
static void *PlcTestTask(void *arg)
{
	const para_commport_t *pcfg = GetParaCommPort(COMMPORT_PLC);
	int readflag, endflag;

	Sleep(300);
	while(RunState.pwroff) Sleep(100);


	PltCurMetid = PLC_BASEMETP;
	PrdCurrent = -1;
	PltReadEnd = 0;
	endflag = 0;

	while(1) {
		if(PltTaskReseting) {
			PltTaskReseting = 0;
			ResetPltData();
			PrdCurrent = -1;
		}

		while(RunState.pwroff) Sleep(100);

		if(pcfg->flag & RDMETFLAG_ENABLE) {
			Sleep(50);
			continue;
		}

		PrdCheck();

		if(PrdCurrent < 0) {
			Sleep(200);
			continue;
		}

		if(!PltReadEnd && PLC_BASEMETP == PltCurMetid) endflag = 1;

		readflag = 0;
		for(; PltCurMetid<MAX_CPY_METID; PltCurMetid++) {
			if(ParaMeter[PltCurMetid].metp_id == 0) continue;
			if(ParaPlcMetp[PltCurMetid].stopped) continue;

			if(!PltReadFinished(PltCurMetid)) readflag = 1;
			if(readflag) {
				endflag = 0;
				break;
			}
		}
		if(PltCurMetid >= MAX_CPY_METID) {
			PltCurMetid = PLC_BASEMETP;
			CycCount++;
			if(!PltReadEnd && endflag) {
				sysclock_t clock;

				SysClockReadCurrent(&clock);
				PltFileData.prd[PrdCurrent].end_hour = clock.hour;
				PltFileData.prd[PrdCurrent].end_min = clock.minute;
				PltFileData.prd[PrdCurrent].end_sec = clock.second;

				PltReadEnd = 1;
			}
		}

		if(readflag) {
			PltReadMet(PltCurMetid);
			PltCurMetid++;
		}
		else Sleep(200);
	}
}
コード例 #12
0
static void PrdCheck(void)
{
	int prd, i;
	sysclock_t clock;
	unsigned short ctime;

	SysClockReadCurrent(&clock);
	ctime = clock.hour;
	ctime *= 60;
	ctime += clock.minute;

	{
		dbtime_t dbtime;

		SYSCLOCK_DBTIME(&clock, dbtime);
		dbtime.s.tick = 0;

		if(dbtime.u != PltFileDate.u) {
			ResetPltData();
			CycCount = 0;
			ReadMetsCount = OkMetsCount = 0;
			ReadMetsCount1 = OkMetsCount1 = 0;
			PltCurMetid = PLC_BASEMETP;
			CalculateMetCount();
			PltReadEnd = 0;

			PltFileDate.u = dbtime.u;
		}
	}

	for(prd=0; prd<PltConfig.prdcount; prd++) {
		if(ctime >= PltConfig.prdconfig[prd].start_time && ctime < PltConfig.prdconfig[prd].end_time) break;
	}
	if(prd >= PltConfig.prdcount) prd = -1;

	if(prd == PrdCurrent) return;

	if(PrdCurrent >= 0) {
		if(PltFileData.prd[PrdCurrent].end_hour) i = 1;
		else if(PltFileData.prd[PrdCurrent].end_min) i = 1;
		else if(PltFileData.prd[PrdCurrent].end_sec) i = 1;
		else i = 0;
		if(0 == i) {
			PltFileData.prd[PrdCurrent].end_hour = clock.hour;
			PltFileData.prd[PrdCurrent].end_min = clock.minute;
			PltFileData.prd[PrdCurrent].end_sec = clock.second;
		}

		if(ReadMetsCount > 0) {
			i = (OkMetsCount * 1000)/ReadMetsCount;
			if(i >= 0) PltFileData.prd[PrdCurrent].ok_rate = (unsigned short)i;
		}

		if(ReadMetsCount1 > 0) {
			i = (OkMetsCount1 * 1000)/ReadMetsCount1;
			if(i >= 0) PltFileData.prd[PrdCurrent].ok_rate_1 = (unsigned short)i;
		}

		PltFileData.invaid_prd = PrdCurrent+1;

		SavePltData(&clock);

		if((PrdCurrent+1) == PltConfig.prdcount) ResetPltData();
	}

	CycCount = 0;
	ReadMetsCount = OkMetsCount = 0;
	ReadMetsCount1 = OkMetsCount1 = 0;
	PltCurMetid = PLC_BASEMETP;
	CalculateMetCount();
	PltReadEnd = 0;

	if(prd >= 0) {
		PltFileData.prd[prd].start_hour = clock.hour;
		PltFileData.prd[prd].start_min = clock.minute;
		PltFileData.prd[prd].start_sec = clock.second;
	}

	PrdCurrent = prd;
}