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

📄 slavesimens.c

📁 电力行业的DL645采集程序,嵌入式Linux环境
💻 C
📖 第 1 页 / 共 4 页
字号:
	int SearchStrLen;


	*(pRcvData+len)='\0';


	//正向有功总电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n20(", (INT8U *)(pSiemensData->E));

	//上月正向有功总电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n20*", (INT8U *)(pSiemensData->LastMonthE));

	
	//正向有功费率电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n8.1(", (INT8U *)(pSiemensData->RateE.FengE));
	GetZMDEnergy(pRcvData, (INT8U *)"\n8.2(", (INT8U *)(pSiemensData->RateE.PingE));	
	GetZMDEnergy(pRcvData, (INT8U *)"\n8.3(", (INT8U *)(pSiemensData->RateE.GuE));

	//上月正向有功费率电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n8.1*", (INT8U *)(pSiemensData->LastMonthRateE.FengE));
	GetZMDEnergy(pRcvData, (INT8U *)"\n8.2*", (INT8U *)(pSiemensData->LastMonthRateE.PingE));
	GetZMDEnergy(pRcvData, (INT8U *)"\n8.3*", (INT8U *)(pSiemensData->LastMonthRateE.GuE));

	//正向无功总电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n22(", (INT8U *)(pSiemensData->NoE));

	//上月正向无功总电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n22*", (INT8U *)(pSiemensData->LastMonthNoE));

	//正向无功费率电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n9.1(", (INT8U *)(pSiemensData->RateNoE.FengE));
	GetZMDEnergy(pRcvData, (INT8U *)"\n9.2(", (INT8U *)(pSiemensData->RateNoE.PingE));
	GetZMDEnergy(pRcvData, (INT8U *)"\n9.3(", (INT8U *)(pSiemensData->RateNoE.GuE));
	
	//上月正向无功费率电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n9.1*", (INT8U *)(pSiemensData->LastMonthRateNoE.FengE));
	GetZMDEnergy(pRcvData, (INT8U *)"\n9.2*", (INT8U *)(pSiemensData->LastMonthRateNoE.PingE));
	GetZMDEnergy(pRcvData, (INT8U *)"\n9.3*", (INT8U *)(pSiemensData->LastMonthRateNoE.GuE));



	//------------------------------------------------------------
	// 2005.4.9 add
	//反向有功峰电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n38.1(", (INT8U *)(pSiemensData->RateNE.FengE));

	//反向有功平电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n38.2(", (INT8U *)(pSiemensData->RateNE.PingE));

	//反向有功谷电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n38.3(", (INT8U *)(pSiemensData->RateNE.GuE));

	//反向有功总电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n21(", (INT8U *)(pSiemensData->NE));
	//------------------------------------------------------------

	//反向无功总电能//
	GetZMDEnergy(pRcvData, (INT8U *)"23(",  (INT8U *)(pSiemensData->NNoE));

	//上月反向无功总电能//
	GetZMDEnergy(pRcvData, (INT8U *)"\n23*",  (INT8U *)(pSiemensData->LastMonthNNoE));

	if(SearchSiemens(pRcvData, (INT8U *)"\n10*")==TRUE)
	{
		//上月正向有功总需量
		GetMaxRqu(pRcvData, (INT8U *)"\n10*", (INT8U *)(pSiemensData->LastMonthMaxRqu), (INT8U *)(pSiemensData->LastMonthMaxRquT));
		
	}
	
	if(SearchSiemens(pRcvData, (INT8U *)"\n6.0(")==TRUE)
	{
		//正向有功总需量
		GetMaxRqu(pRcvData, (INT8U *)"\n6.0(", (INT8U *)(pSiemensData->MaxRqu), (INT8U *)(pSiemensData->MaxRquT));
		//上月正向有功总需量
		GetMaxRqu(pRcvData, (INT8U *)"\n6.0*", (INT8U *)(pSiemensData->LastMonthMaxRqu), (INT8U *)(pSiemensData->LastMonthMaxRquT));
		
	}
	else if(SearchSiemens(pRcvData, (INT8U *)"\n6(")==TRUE)
	{
		//正向有功总需量
		GetMaxRqu(pRcvData, (INT8U *)"\n6(", (INT8U *)(pSiemensData->MaxRqu), (INT8U *)(pSiemensData->MaxRquT));
		//上月正向有功总需量
		GetMaxRqu(pRcvData, (INT8U *)"\n6*", (INT8U *)(pSiemensData->LastMonthMaxRqu), (INT8U *)(pSiemensData->LastMonthMaxRquT));
	
	}

	
	//正向有功费率需量//
	GetMaxRqu(pRcvData, (INT8U *)"6.1(", (INT8U *)(pSiemensData->RateMaxRqu.feng), (INT8U *)(pSiemensData->RateMaxRquT.feng));
	GetMaxRqu(pRcvData, (INT8U *)"6.2(", (INT8U *)(pSiemensData->RateMaxRqu.ping), (INT8U *)(pSiemensData->RateMaxRquT.ping));
	GetMaxRqu(pRcvData, (INT8U *)"6.3(", (INT8U *)(pSiemensData->RateMaxRqu.gu), (INT8U *)(pSiemensData->RateMaxRquT.gu));
	

	//上月正向有功费率需量//
	GetMaxRqu(pRcvData, (INT8U *)"\n6.1*", (INT8U *)(pSiemensData->LastMonthRateMaxRqu.feng), (INT8U *)(pSiemensData->LastMonthRateMaxRquT.feng));
	GetMaxRqu(pRcvData, (INT8U *)"\n6.2*", (INT8U *)(pSiemensData->LastMonthRateMaxRqu.ping), (INT8U *)(pSiemensData->LastMonthRateMaxRquT.ping));
	GetMaxRqu(pRcvData, (INT8U *)"\n6.3*", (INT8U *)(pSiemensData->LastMonthRateMaxRqu.gu), (INT8U *)(pSiemensData->LastMonthRateMaxRquT.gu));




	//实时电压//
	if(SearchSiemens(pRcvData, (INT8U *)"\nL1(")==TRUE)
	{
		GetVoltage(pRcvData, (INT8U *)"\nL1(", (INT8U *)(pSiemensData->V.a));
		GetVoltage(pRcvData, (INT8U *)"\nL2(", (INT8U *)(pSiemensData->V.b));
		GetVoltage(pRcvData, (INT8U *)"\nL3(", (INT8U *)(pSiemensData->V.c));
	}
	else
	{
		GetVoltage(pRcvData, (INT8U *)"\nL.1(", (INT8U *)(pSiemensData->V.a));
		GetVoltage(pRcvData, (INT8U *)"\nL.2(", (INT8U *)(pSiemensData->V.b));
		GetVoltage(pRcvData, (INT8U *)"\nL.3(", (INT8U *)(pSiemensData->V.c));
	}
	
	GetCurrent(pRcvData, (INT8U *)"\nA(", (INT8U *)(pSiemensData->I.a));
	GetCurrent(pRcvData, (INT8U *)"\nB(", (INT8U *)(pSiemensData->I.b));
	GetCurrent(pRcvData, (INT8U *)"\nC(", (INT8U *)(pSiemensData->I.c));

	GetVoltageDeg(pRcvData, (INT8U *)"\n31.1(", (INT8U *)(pSiemensData->Vdeg.a));
	GetVoltageDeg(pRcvData, (INT8U *)"\n31.2(", (INT8U *)(pSiemensData->Vdeg.b));
	GetVoltageDeg(pRcvData, (INT8U *)"\n31.3(", (INT8U *)(pSiemensData->Vdeg.c));

	GetCurrentDeg(pRcvData,(INT8U *) "\n51.1(", (INT8U *)(pSiemensData->Ideg.a));
	GetCurrentDeg(pRcvData, (INT8U *)"\n51.2(", (INT8U *)(pSiemensData->Ideg.b));
	GetCurrentDeg(pRcvData, (INT8U *)"\n51.3(", (INT8U *)(pSiemensData->Ideg.c));	

	//时间//
	strcpy(SearchStr, "\n12(");
	ptr = (INT8U *)strstr((char *)pRcvData, SearchStr);
	SearchStrLen = strlen(SearchStr);
	if(ptr!= NULL)
	{
		ptr+=SearchStrLen;
		pSiemensData->Date[3]=((*ptr-'0')<<4)|(*(ptr+1)-'0');
		buff[2]=(*ptr-'0')*10+(*(ptr+1)-'0');
		ptr+=3;
		pSiemensData->Date[2]=((*ptr-'0')<<4)|(*(ptr+1)-'0');
		buff[1]=(*ptr-'0')*10+(*(ptr+1)-'0');
		ptr+=3;
		pSiemensData->Date[1]=((*ptr-'0')<<4)|(*(ptr+1)-'0');
		buff[0]=(*ptr-'0')*10+(*(ptr+1)-'0');
		pSiemensData->Date[0]= mGetWeek(buff[2],buff[1],buff[0]);
	}
	else
	{
		memset((INT8U *)(pSiemensData->Date), 0xff, 4);
	}

	
	strcpy(SearchStr, "\n11(");
	ptr = (INT8U *)strstr((char *)pRcvData, SearchStr);
	SearchStrLen=strlen(SearchStr);
	if(ptr!= NULL)
	{
		ptr+=SearchStrLen;
		pSiemensData->Time[2]=((*ptr-'0')<<4)|(*(ptr+1)-'0');
		ptr+=3;
		pSiemensData->Time[1]=((*ptr-'0')<<4)|(*(ptr+1)-'0');
		ptr+=3;
		pSiemensData->Time[0]=((*ptr-'0')<<4)|(*(ptr+1)-'0');
	}
	else
	{
		memset((INT8U *)(pSiemensData->Time), 0xff, 3);
	}

}

int SiemensAddressConvert(MeterAddrType *pMeterAddr,INT8U *pAddress)
{
	INT8U i;
	INT8U *ptr;
	INT8U a,b;
	int addrlen;
	
	ptr = (INT8U *)pMeterAddr;

	addrlen = 0;

	for(i=0; i<6; i++)
	{
		a = ptr[5-i];
		
		
		
		b = a>>4;
		
		if(!(b == 0 && addrlen == 0))
		{	
			if(b<=9)
				*(pAddress+(addrlen++)) = b+'0';
			else
				return 0;
		}

		b = a&0x0f;
		if(!(b == 0 && addrlen == 0))
		{	
			if(b<=9)
				*(pAddress+(addrlen++)) = b+'0';
			else
				return 0;
		}
		
	}
	

	return addrlen;
}

BOOL IsSiemensDataValid(INT8U *pMeterModleInfo, INT8U *pRcvData, int len)
{
#if SLAVE_DEBUG_EN > 0	  
	printf("IsSiemensDataValid \n");
#endif		
		
	if(memcmp(pMeterModleInfo, (INT8U *)"ZFB", strlen("ZFB"))==0)
	{
		return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"20(");
	}
	else if(memcmp(pMeterModleInfo, (INT8U *)"ZMB", strlen("ZMB"))==0)
	{
		return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"20(");
	}
	else if(memcmp(pMeterModleInfo, (INT8U *)"\\2ZMD", strlen("\\2ZMD"))==0
		||memcmp(pMeterModleInfo, (INT8U *)"ZMD", strlen("ZMD"))==0)
	{
		return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"\n20(");
	}
	else if(memcmp(pMeterModleInfo, (INT8U *)"\\2ZFD", strlen("\\2ZMD"))==0
		||memcmp(pMeterModleInfo, (INT8U *)"ZMD", strlen("ZMD"))==0)
	{     
		return IsSiemensEnergyDataValid(pRcvData, (INT8U *)"\n20(");
	}
	
	return FALSE;
}

void DealWithRcvData(INT8U *pMeterModleInfo, INT8U *pRcvData, int len, SiemensDataType *pSiemensData,INT8U *ll)
	
{
     INT8U   lstat;
#if SLAVE_DEBUG_EN > 0	  
/*	int i;
	printf("DealWithRcvData datalen=%d\n",len);
	pRcvData[len] = 0;
	for(i=0;i<len;i++)
	{
		printf("%c", pRcvData[i]);
		API_IO_WDI();
	}*/
#endif	
   // mPrintfHex((int *)ll,2);
   lstat=*ll;
//    printf("lstat==");
//    mPrintfHex((INT8U *)ll,1);

	memset((INT8U *)pSiemensData, 0xff, sizeof(SiemensDataType));
	
	strcpy((char *)(pSiemensData->MeterModelInfo), (char *)pMeterModleInfo);

	if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZFB", strlen("ZFB"))==0)
	{
		DealWithSiemensZFB410(pRcvData, len, pSiemensData,lstat);
	}
	else if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZMB", strlen("ZMB"))==0)
	{
		DealWithSiemensZFB410(pRcvData, len, pSiemensData,lstat);
	}
	else if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"\\2ZMD", strlen("\\2ZMD"))==0
		||memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZMD", strlen("ZMD"))==0)
	{ 
		DealWithSiemensZFD405(pRcvData, len, pSiemensData);
	}
	else if(memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"\\2ZFD", strlen("\\2ZMD"))==0
		||memcmp((INT8U *)(pSiemensData->MeterModelInfo), (INT8U *)"ZMD", strlen("ZMD"))==0)
	{   
		DealWithSiemensZFD405(pRcvData, len, pSiemensData);


	}
	}

int  SiemensReadDataFromMeter(MpComProperty *mpProperty, SiemensDataType *pSiemensData)
{     
	INT16U  length;
	//INT8U  lstat;
	INT8U SiemensAddr[12];
	INT8U *ll;
	SiemensMeterInfoType SiemensMeterInfo;
	int addrlen;

	memset((INT8U *)pSiemensData, 0xff, sizeof(SiemensDataType));
	MeterAddrType *pMeterAddr = (MeterAddrType*)mpProperty->addr;
		addrlen = SiemensAddressConvert(pMeterAddr, SiemensAddr);
//	if(addrlen <= 0)
//	{
//		return E_NO_SUCH_DATA;
//	}
	memset(gSiemensRxBuff, 0, SIEMENS_FRAME_SIZE);
	length=SiemensReadMeter( SiemensAddr, addrlen, &SiemensMeterInfo, gSiemensRxBuff, SIEMENS_FRAME_SIZE-1,(INT8U *)ll);
	 if(length>0)
	{
		DealWithRcvData((INT8U *)(SiemensMeterInfo.model), gSiemensRxBuff, length, pSiemensData,(INT8U *)ll);
		return SUCCESS;
	}
	
	return E_NO_SUCH_DATA;
}

int  SlaveSiemensGetDataFromBuff(MpComProperty *mpProperty, INT16U dataId, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
	INT8U *ptr;
	int a;
	SiemensDataType *pSiemensData;

#if SLAVE_DEBUG_EN > 0	  
	printf("SlaveSiemensGetDataFromBuff\n");
#endif	
	*psize = 0;
   int mp = mpProperty->nMp;
  pSiemensData = (SiemensDataType *)&(gSlaveDataBuff[mp].data[0]);
	ptr = (INT8U *)&(pSiemensData->E[0]);
#if SLAVE_DEBUG_EN > 0	  
	printf("Slave Data Buff:\n");
	mPrintfHex(ptr, sizeof(SiemensDataType));
#endif	
	a = mBinarySearch(dataId, (INT8U *)SiemensIdTable, sizeof(SiemensTableType), SIEMENS_ID_TABLE_SIZE);
	if(a < 0)
	{
		return E_NO_SUCH_DATA;
	}
	
	memcpy(pbuf, ptr + SiemensIdTable[a].offset, SiemensIdTable[a].itemsize);
	*psize = SiemensIdTable[a].itemsize;
#if SLAVE_DEBUG_EN > 0	  
	printf("Slave Data:\n");
	mPrintfHex(pbuf, *psize);
#endif	
	return SUCCESS;
}


int SlaveSiemensReadData(MpComProperty *mpProperty, INT16U dataId, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
	
	int readflag = 0;
	INT8U retvalue;
	int dtime;
	int timeout = 500;
  time_t curTime;
	time(&curTime);
	
	int mp = mpProperty->nMp;
	
	dtime = difftime(curTime,gSlaveDataBuff[mpProperty->nMp].accessTime);
	if(dtime <  timeout)
	{
		readflag = 1;
	}
readflag = 1;
	if(readflag == 1)
	{
		retvalue = SiemensReadDataFromMeter(mpProperty, (SiemensDataType *)&(gSlaveDataBuff[mp].data[0]));
		if(retvalue != SUCCESS)
		{
			return retvalue;
		}
		
		time(&curTime);
		memcpy((INT8U *)&(gSlaveDataBuff[mp].accessTime), (INT8U *)&curTime, sizeof(time_t));
		return SlaveSiemensGetDataFromBuff(mpProperty, dataId, pbuf, bufsize, psize);
	}

	//time(&curTime);
//	memcpy((INT8U *)&(gSlaveDataBuff[mp].accessTime), (INT8U *)&curTime, sizeof(time_t));
	retvalue = SlaveSiemensGetDataFromBuff(mpProperty, dataId, pbuf, bufsize, psize);
	
	return retvalue;

}

//	DateTimeType dateTime;
//	DateTimeType bufDateTime;	
	//int readflag = 0;
//	INT8U retvalue;
//	time_t startTime,curTime;
//
//	time(&startTime);
//	time(&curTime);
//	int dtime;
//	//difftime 返回精确到秒
//SiemensDataType *pSiemensData;
//	dtime = difftime(curTime,startTime);
//
//	if(dtime >=0)
//	{
//		retvalue = SiemensReadDataFromMeter(mpProperty, &pSiemensData);
//		if(retvalue != SUCCESS)
//		{
//			return retvalue;
//		}
//	}
//	else
//	{
//			retvalue = SlaveSiemensGetDataFromBuff(mpProperty, dataId, pbuf, bufsize, psize);	
//	}
//	return retvalue;
//}


BOOL IsSiemensReadId(INT16U id)
{
	if((id>=0x9010&&id<=0x913f) ||(id>=0x9410&&id<=0x953f) ||(id>=0xa010&&id<=0xa13f) ||
		(id>=0xa410&&id<=0xa53f) ||(id>=0xb010&&id<=0xb13f) ||(id>=0xb410&&id<=0xb53f) ||
		(id>=0xb611&& id<=0xb62f) || (id>=0xb650&&id<=0xb65f)||(id ==0xc010&& id ==0xc011) ||
		(id ==0xb210 || id == 0xb212 || id == 0xb214) || (id >=0xb660 && id<=0xb66f))
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}	
}
//
//BOOL IsSlaveSiemensId(INT16U id)
//{
//	int a;
//
//	a = BinarySearch(id, (INT8U *)SiemensIdTable, sizeof(SiemensTableType), SIEMENS_ID_TABLE_SIZE);
//	if(a>=0)
//		return TRUE;
//	else 
//		return FALSE;
//}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -