Exemple #1
0
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++;
	}
}
Exemple #2
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;
}