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

📄 slaveedmi.c

📁 电力行业的DL645采集程序,嵌入式Linux环境
💻 C
📖 第 1 页 / 共 3 页
字号:
		{
			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 + -