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

📄 slavesimens.c

📁 本人设计的DL/T645规约电能表的抄表和电表模拟软件
💻 C
📖 第 1 页 / 共 4 页
字号:
	INT8U buff[20];	char SearchStr[10];	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 + -