/** * @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; }
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; }
/** * @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; }
/** * @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; }
/** * @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); }
/** * @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]; }
/** * @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); }
/** * @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; }
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; } }
/** * @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 }
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); } }
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; }