static void PltReadMet(unsigned short metid) { plc_dest_t dest; unsigned char databuf[4]; unsigned short mid = metid - PLC_BASEMETP; PrintLog(LOGTYPE_DOWNLINK, "read met%d ...\n", metid); if(0 == CycCount) ReadMetsCount1++; MakePlcDest(metid, &dest); if(PlcRead(&dest, 0x9010, databuf, 4) > 0) { DebugPrint(LOGTYPE_DOWNLINK, "9010=%02X%02X%02X.%02X\n", databuf[3], databuf[2], databuf[1], databuf[0]); PltFileData.prd[PrdCurrent].mets[mid].sec = PlcState[metid].oktime.second; PltFileData.prd[PrdCurrent].mets[mid].min = PlcState[metid].oktime.minute; PltFileData.prd[PrdCurrent].mets[mid].hour = PlcState[metid].oktime.hour; PltFileData.prd[PrdCurrent].mets[mid].routes = PlcState[metid].routes & 0x0f; PltFileData.prd[PrdCurrent].mets[mid].routes |= (PlcState[metid].quality<<4) & 0xf0; smallcpy(PltFileData.prd[PrdCurrent].mets[mid].ene, databuf, 4); OkMetsCount++; if(0 == CycCount) OkMetsCount1++; } }
/** * @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; }