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

📄 islave.c

📁 电力行业的DL645采集程序,嵌入式Linux环境
💻 C
字号:

#define ARM_SLAVE_GLOBALS
#include "cfg_ISlave.h"

int  SlaveSampleOneIdData(MpComProperty *mpProperty, INT16U id, INT8U *pbuf, INT16U bufsize, INT16U *psize);
int  SlaveGetSampleIDTab(INT8U protocol, const SampleIdType **pSampleIdTab, INT16U *pIdNum);

int SlaveInitMPPort(MpComProperty *mpProperty)
{
	INT8U uart;
	INT32U baud;
	INT8U databits;
	char  parity;
	INT8U stopbits;
	
#if SLAVE_DEBUG_EN > 0	  
	printf("\n SlaveInitMPPort\n");
#endif
	
	stopbits = mpProperty->nStopBit;
	parity 	 = mpProperty->parity;
	uart 			 = mpProperty->nComPort;
  databits = mpProperty->nDataBit;
  baud 		 = mpProperty->nBPS;
	
	if(baud > 19200 || baud < 300)
			baud = 1200;
  
	if(databits > 8 || databits < 6)
			databits = 8;
			
#if SLAVE_DEBUG_EN > 0	  
		printf("\n API_SetUartAttr uart %d, baud %d", uart, baud);
		printf("\n databits %d, stopbits %d, parity %d\n", databits, stopbits, parity);
#endif

	switch(mpProperty->nProtocol)
	{
			case SLAVE_645:
					return Init645Com(uart,baud,databits,parity,stopbits);
			break;
			case SLAVE_SIEMENS_B:
		  case SLAVE_SIEMENS_D:
		 		 return InitSimensCom(uart,baud,databits,parity,stopbits);
	}
	return E_PROTOCOL_NOEXIST;
}

int SlaveReadData(MpComProperty *mpProperty, INT16U id, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
		switch(mpProperty->nProtocol)
		{
			case SLAVE_645:
						return Slave645ReadData(mpProperty, id, pbuf, bufsize, psize);
				break;
			case SLAVE_SIEMENS_D:
			case SLAVE_SIEMENS_B:
					 return SlaveSiemensReadData(mpProperty, id, pbuf, bufsize, psize);
			break;
			
			default:
				break;
		}
	#if SLAVE_DEBUG_EN > 0	  
		printf("\n SlaveReadData end\n");
	#endif
		return E_PROTOCOL_NOEXIST;
}

int  SlaveSendFrame(int fd, INT8U *pbuf, INT16U bufsize,INT32U nWaitmScnd)
{
	if(fd > 0)
	{
		if(ComSend (fd,pbuf, bufsize, nWaitmScnd) == bufsize)
			return SUCCESS;
		else 
			return E_COM_SEND;
	}
	return E_COM_OTHER;
}

int SlaveRecvFrame(int fd, INT8U *pbuf, INT16U bufsize, INT16U *psize,INT32U nWaitmScnd)
{
	if(fd > 0)
	{
		*psize = ComRecv ( fd,pbuf, bufsize, nWaitmScnd);
		if(*psize > 0)
		{
#if SLAVE_DEBUG_EN > 0	  			
			mPrintfHex(pbuf,*psize);
#endif			
		}
		return SUCCESS;
	}
	return E_COM_OTHER;
}

int SlaveSampleData(MpComProperty *mpProperty, INT8U *pbuf,INT16U bufsize,INT16U *psize)
{
	const  SampleIdType *pSampleIdTab;
	INT16U idNum;
	INT16U i;
	INT16U size;
	INT16U id;
	INT8U  iddata[SLAVE_ONEID_DATA_SIZE];

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

#if SLAVE_DEBUG_EN	 > 0
		printf("state is 1\n");
#endif	
		if(SlaveGetSampleIDTab(mpProperty->nProtocol, &pSampleIdTab, &idNum) == SUCCESS)
		{
#if SLAVE_DEBUG_EN	 > 0
			printf("SampleIDTab OK\n");
#endif	
			for(i = 0; i < idNum; i++)
			{
				id = pSampleIdTab->id;
#if SLAVE_DEBUG_EN	 > 0
				printf("id is %x\n", id);
#endif	
				if(SlaveSampleOneIdData(mpProperty, id, iddata, SLAVE_ONEID_DATA_SIZE, &size) != SUCCESS)
				{
					if(i == 0)
					{
#if SLAVE_DEBUG_EN	 > 0
						printf("SlaveSampleOneIdData %x ERROR\n", id);
#endif	
						break;
					}
					else
					{
						memset(iddata, 0xff, pSampleIdTab->size);
					}
				}
#if SLAVE_DEBUG_EN	 > 0
				printf("IdData %x OK\n", id);
#endif	
				memcpy(pbuf + pSampleIdTab->offset, iddata, pSampleIdTab->size);
				pSampleIdTab ++;
			}
			if(i >= idNum)
			{
#if SLAVE_DEBUG_EN	 > 0
				printf("\n SlaveSampleData OK\n");
#endif			
				return SUCCESS;
			}		
		}
			return FAILED;
}
		
int SlaveGetSampleIDTab(INT8U protocol, const SampleIdType **pSampleIdTab, INT16U *pIdNum)
{
	switch(protocol)
	{
		case SLAVE_645:
		case SLAVE_WS_645:
		case SLAVE_HND:
		case SLAVE_HUALONG:
		case SLAVE_LONGDIAN:
		case SLAVE_XUJI:
		case SLAVE_KELU:
		case SLAVE_SANXING:
		case SLAVE_HUALI:
		case SLAVE_GB645_PARTS:
		case SLAVE_GB645_SINGLE:
			*pSampleIdTab = gDL645SampleId;
			*pIdNum = DL645_SAMPLE_ID_TABLE_SIZE;
			break;
		case SLAVE_WS:
			*pSampleIdTab = gDL645SampleId;
			*pIdNum = DL645_SAMPLE_ID_TABLE_SIZE;
			break;
		default :
			*pSampleIdTab = gDL645SampleId;
			*pIdNum = DL645_SAMPLE_ID_TABLE_SIZE;
			break;
	}
	return SUCCESS;
}

int SlaveSampleOneIdData(MpComProperty *mpProperty, INT16U id, INT8U *pbuf, INT16U bufsize, INT16U *psize)
{
	int retvalue ;
	int fd;

#if SLAVE_DEBUG_EN	 > 0
	printf("\n SlaveSampleOneIdData\n");
	printf("\n id %x\n", id);
#endif
	fd = SlaveInitMPPort(mpProperty);
	retvalue = SlaveReadData(mpProperty, id, pbuf, bufsize, psize);
	CloseCom(fd);
	return retvalue;
}

/*****************************************************************************************
	645协议采样数据ID表
*****************************************************************************************/

const SampleIdType gDL645SampleId[DL645_SAMPLE_ID_TABLE_SIZE] = 
{
	{0x901f, SAMPLE_METER_DATA_OFFSET+ 0,   20},

	{0x902f, SAMPLE_METER_DATA_OFFSET+ 20,  20},

//	{0x907f, SAMPLE_METER_DATA_OFFSET+ 40,    12},

//	{0x908f, SAMPLE_METER_DATA_OFFSET+ 52,    12},
	
	{0x911f, SAMPLE_METER_DATA_OFFSET+64,  20},

	{0x912f, SAMPLE_METER_DATA_OFFSET+84,  20}, 

	{0x913f, SAMPLE_METER_DATA_OFFSET+104,  20},
	
	{0x914f, SAMPLE_METER_DATA_OFFSET+124, 20}, 
	
	{0x915f, SAMPLE_METER_DATA_OFFSET+144, 20},

	{0x916f, SAMPLE_METER_DATA_OFFSET+164, 20},


//	{0x917f, SAMPLE_METER_DATA_OFFSET+ 184,    12},


//	{0x918f, SAMPLE_METER_DATA_OFFSET+ 196,    12},
	
	{0xa010, SAMPLE_METER_DATA_OFFSET+ 208,   3 },
	{0xa020, SAMPLE_METER_DATA_OFFSET+ 211,   3 },
	{0xb010, SAMPLE_METER_DATA_OFFSET+ 214,   4 },
	{0xb020, SAMPLE_METER_DATA_OFFSET+ 218,   4 },

	{0xb210, SAMPLE_METER_DATA_OFFSET+ 222,   4 },
	{0xb211, SAMPLE_METER_DATA_OFFSET+ 226,   4 },	
	{0xb212, SAMPLE_METER_DATA_OFFSET+ 230,   2 },
	{0xb213, SAMPLE_METER_DATA_OFFSET+ 232,   2 },	
	
	{ 0xb61f, SAMPLE_METER_DATA_OFFSET+234,  6 },


	{ 0xb62f, SAMPLE_METER_DATA_OFFSET+240,  6 },


	{ 0xb63f, SAMPLE_METER_DATA_OFFSET+246, 12 },


	{ 0xb64f, SAMPLE_METER_DATA_OFFSET+258,  8 },


//	{ 0xb65f, SAMPLE_METER_DATA_OFFSET+266,  8 },
	
	{ 0xc020, SAMPLE_METER_DATA_OFFSET+274,  1},
	{ 0xc021, SAMPLE_METER_DATA_OFFSET+275,  1},
	{ 0xc022, SAMPLE_METER_DATA_OFFSET+276,  1},	

	{ 0xc030, SAMPLE_METER_DATA_OFFSET+277,  3 },
	{ 0xc031, SAMPLE_METER_DATA_OFFSET+280,  3 },

	{ 0xc117, SAMPLE_METER_DATA_OFFSET+283,  2 },

	{ 0xc33f, SAMPLE_METER_DATA_OFFSET+285, 24 }

};

const SampleIdType gSlaveSampleExtId[SLAVE_SAMPLE_EXT_ID_TABLE_SIZE] = 
{
	{0x9410,  0,  4},
	{0x9420,  4,  4},
	{0x9530,  8,  4},
	{0x9540, 12,  4},
	{0x9550, 16,  4},
	{0x9560, 20,  4}, 

	{0xa410, 24,  3 },
	{0xa420, 27,  3 },
	{0xb410, 30,  4 },
	{0xb420, 34,  4 }
};


⌨️ 快捷键说明

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