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

📄 slaveedmi.c

📁 电力行业的DL645采集程序,嵌入式Linux环境
💻 C
📖 第 1 页 / 共 3 页
字号:
					printf("FilterEDMIFrame OK\n");
#endif					
					pRespondFrame = (EDMICmdExpRespondType *)recvBuff;
					size = frameSize - 15;
					memcpy(pRespond, (INT8U *)(pRespondFrame->cmdData), size);
#if SLAVE_DEBUG_EN > 0
					printf("size %d\n", size);
#endif					
					return size;
				}
			}
		}
		usleep(SLAVE_WAIT_DELAY_TIME);
	}

	return 0;
}


void InitEdmiSn(void)
{
	gEdmiSn=0xffff;
}

void UpdateEdmiSn(void)
{
	gEdmiSn++;
}




int SlaveEdmiLogin(MpComProperty *mpProperty)
{
	INT32U EdmiAddr;
	int length;
	INT8U buff[100];
	INT8U user[9];
	INT8U pass[9];
	INT8U pRecvBuf[EDMI_FRAME_SIZE];
	int offset;
	int i,size;
	  
	InitEdmiSn();

	offset = 0;

	memset(user, 0, 9);
	memcpy(user, mpProperty->user, 8);
  
	memset(pass, 0, 9);
	memcpy(pass, mpProperty->pass, 8);
	
	memcpy(buff, user, strlen((char*)user));
	length = strlen((char*)user);
	buff[length++]=',';

	memcpy(buff+length,pass, strlen((char*)pass));
	length += strlen((char*)pass);
	buff[length]='\0';
	length++;

  MeterAddrType *pMeterAddr = (MeterAddrType*)mpProperty->addr;
	MaskEDMIAddr(pMeterAddr, &EdmiAddr);
	mPrintfHex((INT8U *)&EdmiAddr, 4);

	for(i=0; i<2; i++)
	{
		INT32U logSCR= 0x00;
		EDMISendFrame(EdmiAddr, logSCR, gEdmiSn, 'L', buff, length);
	  size=GetEDMICmdRespondData(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, pRecvBuf);
    if(size==1&&pRecvBuf[0]==EDMI_ACK)
		{
			UpdateEdmiSn();
			return 0;
		}
	  else if(size==2&&pRecvBuf[0]==EDMI_CAN)
			return -1;
	}

	return -1;
}
int EDMILogout(MpComProperty *mpProperty)
{
	INT32U EdmiAddr;
	INT8U dataBuff[EDMI_FRAME_SIZE];
	int size;

  MeterAddrType *pMeterAddr = (MeterAddrType*)mpProperty->addr;
	MaskEDMIAddr(pMeterAddr, &EdmiAddr);

	EDMISendFrame(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, 'X', dataBuff, 0);
	size=GetEDMICmdRespondData(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, dataBuff);
	if(size==1 && dataBuff[0]==EDMI_ACK)
	{
		UpdateEdmiSn();
		return SUCCESS;
	}
	else if(size==2 && dataBuff[0]==EDMI_CAN)
	{
		if(dataBuff[1] == ERROR_NOT_LOGIN)
			return SUCCESS;
		else
			return FAILED;	
	}
		
	return FAILED;
}


void  MaskEDMIAddr(MeterAddrType *pMeterAddr, INT32U *pEdmiAddr)
{
	*pEdmiAddr = mBcdToLong((INT8U*)pMeterAddr, 6);
}

int ReadEDMIRegData(MpComProperty *mpProperty, INT8U cmd,INT8U *pCmdData,int CmdDataLen, INT8U *pDataBuff)
{	
	int size;
	INT32U EdmiAddr;
	int i;
	INT8U dataBuff[EDMI_FRAME_SIZE];

#if SLAVE_DEBUG_EN > 0
	printf("ReadEDMIRegData\n");
#endif	

		if(SlaveEdmiLogin(mpProperty) != SUCCESS)
		{
				return 0;			
		}
	
	MeterAddrType *pMeterAddr = (MeterAddrType*)mpProperty->addr;
	MaskEDMIAddr(pMeterAddr, &EdmiAddr);

	#if SLAVE_DEBUG_EN > 0
		printf("EdmiAddr %x\n", EdmiAddr);
	#endif		

	for(i=0; i<2; i++)
	{
		EDMISendFrame(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, cmd, pCmdData, CmdDataLen);
		size = GetEDMICmdRespondData(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, dataBuff);
		if(size > 0)
		{
#if SLAVE_DEBUG_EN > 0
			printf("dataBuff %d:\n", size);
			mPrintfHex(dataBuff, size);
#endif			
			 if(size == 2 && dataBuff[0] == EDMI_CAN)
			{
				if(dataBuff[1] == ERROR_NOT_LOGIN)
				{
					if(SlaveEdmiLogin(mpProperty) == SUCCESS)
					{
						continue;
					}
				else
						return 0;
				}
				else
					return 0;
			 }
			 
			size -= (CmdDataLen+1);
			memcpy(pDataBuff, dataBuff + CmdDataLen + 1, size);
			UpdateEdmiSn();
#if SLAVE_DEBUG_EN > 0
			printf("data %d:\n", size);
			mPrintfHex(pDataBuff, size);
#endif				
			return size;
		}
		else
		{
			break;
		}
			
	}
	return 0;
}

//int ReadEDMIRegData(INT8U cmd,INT8U *pCmdData,int CmdDataLen,MeterAddrType *pSlaveAddr, INT8U *pUser, INT8U *pPassword, INT8U *pDataBuff)
//{	
//	INT16U size;
//	INT32U EdmiAddr;
////	INT16U testNod;	
//	int i;
//
//
//	MaskEDMIAddr(pSlaveAddr, &EdmiAddr );
//
//
////	for(i=0; i<3; i++)
////	{
////		
////		EDMIWriteFrame(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, cmd, pCmdData, CmdDataLen);
////		size=GetEDMICmdRespondData(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, gEDMIRecvBuff);
////		printHex(gEDMIRecvBuff, size);
////		if(size>0)
////		{
////			
////			 if(size==2&&gEDMIRecvBuff[0]==EDMI_CAN)
////			{
////				if(gEDMIRecvBuff[1]==ERROR_NOT_LOGIN)
////				{
////					if(EDMILogin(pSlaveAddr, pUser, pPassword )==TRUE)
////					{
//////						gEdmiLoginFlag=1;
////						continue;
////					}
////					else
////						return 0;
////				}
////				else
////					return 0;
////			 }
////			 
////      printf("EDMI:size=%d,CmdDataLen=%d\n", size,CmdDataLen);
////      //PrintHexBytes(gEDMIRecvBuff)
////			size -= (CmdDataLen+1);
////			memcpy(pDataBuff, gEDMIRecvBuff+CmdDataLen+1, size);
////#ifdef DEBUG_PRINT
////			printf("read data is:\n");
////			printHex(pDataBuff, size);
////#endif
////			UpdateEdmiSn();
////			return size;
////		}
//////		if(size>0)
//////		{
//////			printf("size=%d\n", size);
//////			size -= (CmdDataLen+1);
//////			memcpy(pDataBuff, gEDMIRecvBuff+CmdDataLen+1, size);
//////			
////// 	  }
//////			 
////
//////#ifdef DEBUG_PRINT
//////
//////#endif
//////			UpdateEdmiSn();
//////			return size;
////	}
//	return -1;
//		
//}
//			
////}
////	ExitMeterOp();
//	//return 0;
////}


int ReadEDMIMultRegData(INT8U cmd,INT8U *pCmdData,int CmdDataLen,MeterAddrType *pSlaveAddr, INT8U *pUser, INT8U *pPassword, INT8U *pDataBuff)
{	
//	INT16U size;
//	INT32U EdmiAddr;
//	///INT16U testNod;	
//	int i;


	//MaskEDMIAddr(pSlaveAddr, &EdmiAddr );

	//ClearSlaveInBuffer();

	
//	for(i=0; i<READ_METER_TRY; i++)
//	{
//		//InitEdmiUart();
//		EDMIWriteFrame(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, cmd, pCmdData, CmdDataLen);
//		//size=GetEDMICmdRespondData(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, gEDMIDataBuff);
////		InitSlave();
////printHex(gEDMIDataBuff, size);
//		if(size>0)
//		{
//			
//			 if(size==2&&gEDMIDataBuff[0]==EDMI_CAN)
//			{for(i=0; i<3; i++)
//	{
//		
//		EDMIWriteFrame(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, cmd, pCmdData, CmdDataLen);
//		size=GetEDMICmdRespondData(EdmiAddr, EDMI_SRC_ADDR, gEdmiSn, gEDMIRecvBuff);
//		printHex(gEDMIRecvBuff, size);
//		if(size>0)
//		{
//			
//			 if(size==2&&gEDMIRecvBuff[0]==EDMI_CAN)
//			{
//				if(gEDMIRecvBuff[1]==ERROR_NOT_LOGIN)
//				{
//					if(EDMILogin(pSlaveAddr, pUser, pPassword )==TRUE)
//					{
////						gEdmiLoginFlag=1;
//						continue;
//					}
//					else
//						return 0;
//				}
//				else
//					return 0;
//			 }
//			 
//      printf("EDMI:size=%d,CmdDataLen=%d\n", size,CmdDataLen);
//      //PrintHexBytes(gEDMIRecvBuff)
//			size -= (CmdDataLen+1);
//			memcpy(pDataBuff, gEDMIRecvBuff+CmdDataLen+1, size);
//#ifdef DEBUG_PRINT
//			printf("read data is:\n");
//			printHex(pDataBuff, size);
//#endif
//			UpdateEdmiSn();
//			return size;
//		}
////		if(size>0)
////		{
////			printf("size=%d\n", size);
////			size -= (CmdDataLen+1);
////			memcpy(pDataBuff, gEDMIRecvBuff+CmdDataLen+1, size);
////			
//// 	  }
////			 
//
////#ifdef DEBUG_PRINT
////
////#endif
////			UpdateEdmiSn();
////			return size;
//	}
//				if(gEDMIDataBuff[1]==ERROR_NOT_LOGIN)
//				{
//					if(EDMILogin(pSlaveAddr, pUser, pPassword)==TRUE)
//					{
////						gEdmiLoginFlag=1;
//						continue;
//					}
//					else
//						return 0;
//				}
//				else
//					return 0;
//			 }
			 
//printf("size=%d\n", size);
//			size -= (4+1);
//	//memcpy(pDataBuff, gEDMIDataBuff+4+1, size);
//#ifdef DEBUG_PRINT
//			printf("read data is:\n");
//			printHex(pDataBuff, size);
//#endif
//			UpdateEdmiSn();
//			return size;
//		}
//			
//	}
//	ExitMeterOp();
	return 0;
}


int ReadEDMIData(INT32U Addr, MpComProperty *mpProperty, INT8U *pDataBuff)
{	
	INT8U buff[50];
	int cmdsize;
	INT16U tmp;

	tmp = ByteOrder_i(Addr);
	buff[0] = (INT8U)(tmp&0xff);
	buff[1] = (INT8U)((tmp>>8)&0xff);
	cmdsize=2;
	return ReadEDMIRegData( mpProperty,'R', buff, cmdsize,  pDataBuff);	
}

int EdmiReadEnergy(MpComProperty *mpProperty, INT16U LCId, INT8U *pBuff,INT16U bufsize,INT16U *psize)
{
		int offset;
	int i;
	INT32U RegAddr;
	INT8U RegNum;
	int len;
	int datalen;
	float a;
	INT32U c;
	INT8U buff[170];


#if SLAVE_DEBUG_EN > 0
	printf("EdmiReadEnergy\n");
#endif	

	*psize=0;
	len = 0;

	if((LCId&0x000f)!=0x0f)
	{
		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 SLAVE_DEBUG_EN > 0
			printf("len = %d:\n", len);
			mPrintfHex(buff, len);
#endif	
			if(len <= 0)
			{
				return E_NO_SUCH_DATA;
			}

			datalen = 0;

			c=ByteOrder_l(*(INT32U *)buff);
#if SLAVE_DEBUG_EN > 0
			printf("c:\n");
			mPrintfHex((INT8U *)&c, 4);
#endif			
			a = *(float *)&c;
#if SLAVE_DEBUG_EN > 0
			printf("a = %f\n", a);
#endif			

//			a=fabs(a);
			if(a < 0)
			{
				a = a*(-1);
			}
			a/=10;
#if SLAVE_DEBUG_EN > 0
			printf("a = %f\n", a);
#endif			
			c=a;
#if SLAVE_DEBUG_EN > 0
			printf("c = %d\n", c);
#endif			
			if(a-c > 0.5)
			{
				c++;
			}
#if SLAVE_DEBUG_EN > 0
			printf("c = %d\n", c);
#endif				
			mLongToBcd(c, pBuff, 4);
			datalen = 4;
#if SLAVE_DEBUG_EN > 0
			printf("Energy data\n");
			mPrintfHex(pBuff, 4);
#endif
			*psize = datalen;
			return SUCCESS;
		}
		else
		{
			return E_NO_SUCH_DATA;
		}
	}
	else
	{
		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)
		{
			return E_NO_SUCH_DATA;
		}
			
		LCId = LCId&0xfff0;
		memset(pBuff, 0xff, 5*4);
		datalen = 0;
		for(i = 0; i < 5; i++)

⌨️ 快捷键说明

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