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

📄 slaveedmi.c

📁 本人设计的DL/T645规约电能表的抄表和电表模拟软件
💻 C
📖 第 1 页 / 共 3 页
字号:
		for(i = 0; i < 5; i++)		{			if(LCId >= 0x9010 && LCId<=0xb02f)			{				offset=mBinarySearch(LCId&(~0x0400), (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);				}			else			{				offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);			}								if(offset>=0)			{				RegAddr = EdmiIdTable[offset].IdAddr;				if((LCId >= 0x9010 && LCId<=0xb02f) && (LCId&0x0400)!=0)		//monthly id				{					RegAddr = (RegAddr&(~0x0020L));				}				RegNum = 1;								len=ReadEDMIData(RegAddr, mpProperty, buff);					if(len<=0)				{					return E_NO_SUCH_DATA;				}				c = ByteOrder_l(*(INT32U *)buff);				a = *(float *)&c;				//				a=fabs(a);				if(a < 0)				{					a = a*(-1);				}				a/=10;				c=(INT32U )a;				if(a-c>0.5)					c++;				mLongToBcd(c, pBuff+datalen, 4);				datalen += 4;			}			LCId ++;		}		*psize = datalen;		return SUCCESS;	}	}int EdmiReadDemand(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff,INT16U bufsize,		INT16U  *psize){		int offset;	int i;	INT16U startid; 	INT8U buff[100];	INT16U size;	int idsize;	int datalen;	*psize=0;	offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);	if(offset<0)		offset=mBinarySearch(LCId-0x0400, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);	if(offset>=0)	{		if((LCId&0x000f)!=0x0f)		{			return EdmiReadDemandOneIdData(mpProperty, LCId, pBuff, psize);		}		else		{			startid = LCId&0xfff0;			datalen = 0;			for(i = 0; i < 5; i++)			{				//idsize = LCGetIDDataSize(startid);				if(EdmiReadDemandOneIdData(mpProperty, startid, buff, &size) == SUCCESS)				{					memcpy(pBuff + datalen, buff, idsize);				}				else				{					memset(pBuff + datalen, 0xff, idsize);				}				datalen += idsize;				startid ++;			}			*psize = datalen;		}		return SUCCESS;	}	else	{		return E_NO_SUCH_DATA;	}}int EdmiReadInstantaneousData(MpComProperty *mpProperty,INT16U LCId, INT8U *pBuff, INT16U *pLength){	int i;	int idnum;	INT16U size;	INT16U startid;	INT16U idsize;	int datalen;	INT8U buff[100];	if((LCId & 0x000f) != 0x000f)	{		return EdmiReadInstantaneousOneIdData(mpProperty, LCId, pBuff, pLength);	}	else	{		switch(LCId)		{			case 0xb61f:				idnum = 3;				startid = 0xb611 ;				idsize = 2;				break;			case 0xb62f:				idnum = 3;				startid = 0xb621;				idsize = 2;				break;			case 0xb63f:				idnum = 4;				startid = 0xb630;				idsize = 3;				break;			case 0xb64f:				idnum = 4;				startid = 0xb640;				idsize = 2;				break;			case 0xb65f:				idnum = 1;				startid = 0xb650;				idsize = 2;				memset(pBuff + 2, 0xff, 6);				break;			default:				return E_NO_SUCH_DATA;		}		*pLength = 0;		datalen = 0;		for(i = 0; i < idnum; i++)		{			size = 0;			if(EdmiReadInstantaneousOneIdData(mpProperty, startid, buff, &size) == SUCCESS)			{				memcpy(pBuff + datalen, buff, idsize);			}			else			{				memset(pBuff + datalen, 0xff, idsize);			}			datalen += idsize;			startid ++;		}		*pLength = datalen;	}	return SUCCESS;		}int IsEdmiReadId( INT16U LCId)    {	if((LCId>=0x9010&&LCId<=0x916f)||(LCId>=0xa010&&LCId<=0xb02f)||(LCId>=0xb611&&LCId<=0xb650))		return TRUE;	else		return FALSE;;} int IsEdmiWriteId( INT16U LCId){		if(LCId==0x1830||LCId==0x1840||(LCId>=0x1854&&LCId<=0x185a)||(LCId>=0x1860&&LCId<=0x1868)||(LCId>=0x18c0&&LCId<=0x18c8)||(LCId>=0x18cc&&LCId<=0x18d4))		return TRUE;	else if((LCId>=0x4009&&LCId<=0x400d)||LCId==0x400f)			//??	//		return TRUE;	else		return FALSE;}int SlaveEdmiReadData(MpComProperty *mpProperty, INT16U dataId, INT8U *pbuf, INT16U bufsize, INT16U *psize){		*psize = 0;		int nRet = -1;			printf("EDMI Get DataID is %x\n",dataId);		if((dataId>=0x9010&&dataId<=0x916f)||(dataId>=0x9410&&dataId<=0x956f))			nRet = EdmiReadEnergy(mpProperty, dataId,pbuf, bufsize,psize);		else if((dataId>=0xa010&&dataId<=0xb02f)||(dataId>=0xa410&&dataId<=0xb42f))			nRet = EdmiReadDemand(mpProperty,dataId,pbuf, bufsize,psize);		else if(dataId>=0xb611&&dataId<=0xb650)			nRet = EdmiReadInstantaneousData(mpProperty,dataId,pbuf,psize);		else if(dataId == 0xc010 || dataId == 0xc011)			nRet = ReadEdmiMeterDateTime(mpProperty,dataId, pbuf, psize);		else	  {	    nRet = 4;	    memset(pbuf,0,nRet);	  }		return nRet;}int IsSlaveEdmiId(INT16U id){	int a; 	a = mBinarySearch(id, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);	if(a>=0)		return TRUE;	else 		return FALSE;}int EdmiReadDemandOneIdData(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff, INT16U *pLength){	int offset;	INT32U RegAddr;	INT8U RegNum;	int len;	float a;	INT32U c;	INT8U buff[180];	*pLength=0;	offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);	if(offset<0)		offset=mBinarySearch(LCId-0x0400, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);	if(offset>=0)	{		RegAddr = EdmiIdTable[offset].IdAddr;		if((LCId&0x0f00)>=0x0400)		//monthly id		{			RegAddr = (RegAddr&0xff0f)|0x0020;		}				if((LCId&0x000f) != 0x0f)		{			RegNum = 1;			len = ReadEDMIData(RegAddr, mpProperty, buff);				if(len<=0)				return E_NO_SUCH_DATA;		}		else 		{			return E_NO_SUCH_DATA;		}		if((LCId&0xf000)==0xa000)		{					{				//在下面加入需量数据转换的代码//				c=ByteOrder_l(*(INT32U *)buff);				a=*(float *)&c;//				a=fabs(a);				if(a < 0)				{					a = a*(-1);				}				a *= 10;				c=(INT32U )a;								if(a-c>0.5)					c++;				mLongToBcd(c, pBuff, 3);				*pLength = 3;			}		}		else if((LCId&0xf000)==0xb000)		{			{								//在下面加入需量时间数据转换的代码//				pBuff[0] =  mByte2Bcd(buff[4]);	//minute				pBuff[1] =  mByte2Bcd(buff[3]);	//hour				pBuff[2] =  mByte2Bcd(buff[0]);	//day				pBuff[3] =  mByte2Bcd(buff[1]);	//month			}			*pLength = 4;		}		return SUCCESS;	}	else	{		return E_NO_SUCH_DATA;	}}int EdmiReadInstantaneousOneIdData(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff, INT16U *pLength){	int offset;	INT32U RegAddr;	INT8U RegNum;	int len;	float a;	INT32U c;	INT8U buff[200];	*pLength=0;	offset=mBinarySearch(LCId, (INT8U *)EdmiIdTable, sizeof(EdmiTableType), EDMI_TABLE_SIZE);	if(offset>=0)	{		RegAddr = EdmiIdTable[offset].IdAddr;		RegNum = 1;		len = ReadEDMIData(RegAddr,mpProperty,  buff);		if(len<=0)			return E_NO_SUCH_DATA;				}	else	{		return E_NO_SUCH_DATA;	}	switch(LCId)			{		case 0xb611:		case 0xb612:		case 0xb613:			c=ByteOrder_l(*(INT32U *)(buff));			a=*(float *)&c;//			a=fabs(a);			if(a < 0)			{				a = a*(-1);			}			c=(INT32U )a;			if(a-c>0.5)				c++;			mLongToBcd(c, pBuff, 2);			*pLength = 2;			break;		case 0xb621:				//L10.21		case 0xb622:		case 0xb623:			c=ByteOrder_l(*(INT32U *)(buff));			a=*(float *)&c;//			a=fabs(a);			if(a < 0)			{				a = a*(-1);			}			a*=100;					//L10.25			c=(INT32U )a;			if(a-c>0.5)				c++;			mLongToBcd(c, pBuff, 2);			*pLength = 2;			break;		case 0xb630:		//active power total	//L10.21		case 0xb631:		//active powerA		case 0xb632:		//active powerB		case 0xb633:		//active powerC			c=ByteOrder_l(*(INT32U *)(buff));						a=*(float *)&c;//			a=fabs(a);			if(a < 0)			{				a = a*(-1);			}			a*=10;			c=(INT32U )a;			if(a-c>0.5)				c++;			mLongToBcd(c, pBuff, 3);			*pLength = 3;			break;		case 0xb640:		//reactive power total	//L10.21		case 0xb641:		//reactive powerA		case 0xb642:		//reactive powerB		case 0xb643:		//reactive powerC			c=ByteOrder_l(*(INT32U *)(buff));		//L10.25			a=*(float *)&c;//			a=fabs(a);			if(a < 0)			{				a = a*(-1);			}			a/=10;			c=(INT32U )a;			if(a-c>0.5)				c++;			mLongToBcd(c, pBuff, 2);			*pLength = 2;			break;		case 0xb650:		//power factor			{				c=ByteOrder_l(*(INT32U *)(buff));				a=*(float *)&c;//				a=fabs(a);				if(a < 0)				{					a = a*(-1);				}				a*=1000;				c=(INT32U )a;				if(a-c>0.5)					c++;				mLongToBcd(c, pBuff, 2);				*pLength = 2;			}			break;		default:			break;	}	return SUCCESS;	}int ReadEdmiMeterDateTime(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff, INT16U *pLength){	INT32U RegAddr;	INT8U buff[200];	*pLength = 0;		RegAddr=0xf03d;		if(ReadEDMIData(RegAddr,mpProperty, buff)>0)	{		if(LCId == 0xc010 )		{			pBuff[3] = buff[2];			pBuff[2] = buff[1];			pBuff[1] = buff[0];			pBuff[0] = mGetWeek(mBcd2Byte(buff[2]), mBcd2Byte(buff[1]), mBcd2Byte(buff[0]));			*pLength = 4;			return SUCCESS;		}		else if(LCId == 0xc011)		{			pBuff[0] = buff[5];			pBuff[1] = buff[4];			pBuff[2] = buff[3];			*pLength = 3;			return SUCCESS;		}		else			return E_NO_SUCH_DATA;	}	else		return E_NO_SUCH_DATA;}

⌨️ 快捷键说明

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