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

📄 net103.cpp

📁 基于linux下的故障录波前置程序
💻 CPP
字号:
#include<pthread.h>#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include <semaphore.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netinet/if_ether.h> #include <sys/types.h>#include <sys/stat.h>#include<string.h>#include"Net103.h"#include"ForeNet.h"#include"IEC61850.h"#define BUFSIZE     1024extern pthread_t gnetthreadid;extern pthread_mutex_t netmutex;extern void GetActiveValue(int serial,float *value);extern void GetNsActiveValue(int serial,float *value);extern int GetYcNum();extern int GetNsYcNum();extern void  SendRecordWaveStart();extern void   SendRecordWaveEnd();extern int GetNsYxNum();extern void RecordWave(long  curpoint,long num,UBYTE type);extern void RecordCfgFile();extern void SendCreateFile();extern void GetCurNsPos(long *pos);extern void GetNsValueYx(int serial,long cur,long id,UBYTE *ucvalue);static int hUdp;static int addrlen;struct sockaddr_in server_addr;static UBYTE udpbuffer[BUFSIZE];static int mmm;void OrangizeTotoal(){	UBYTE sndbuf[1024];	int i;	float tmpvalue;	int startl,starth;	unsigned short value;	UBYTE yxvalue;	sndbuf[0] = 0x07;	sndbuf[1] = 0x81;	sndbuf[2] = 0x09;	sndbuf[3] = GetYcNum()+GetNsYcNum();	sndbuf[4] = GetNsYxNum();	for(i = 0;i<GetYcNum();i++)		{		GetActiveValue(i+1,&tmpvalue);		value = (unsigned short)(tmpvalue*100);	//	value = 1000+mmm;	//	mmm+=2;		sndbuf[5+i*2] = value&0x0ff;		sndbuf[6+i*2]= value>>8;			}	startl = 5+GetYcNum()*2;	starth = 6+GetYcNum()*2;	for(i = 0;i<GetNsYcNum();i++)	{		GetNsActiveValue(i+1,&tmpvalue);		value = (unsigned short)tmpvalue*100;		sndbuf[startl+i*2] = value&0x0ff;		sndbuf[starth+i*2]= value>>8;	}	startl += GetNsYcNum()*2;	long pos;	GetCurNsPos(&pos);	for(i = 0;i<GetNsYxNum();i++)	{		GetNsValueYx(i+1,pos,1,&yxvalue);		sndbuf[startl+i] = yxvalue;	}	sndbuf[startl+GetNsYxNum()] = 0x16;	SendSlaveCommand(sndbuf,startl+GetNsYxNum()+1);	return;	}void CloseUdpSocket(){	if(hUdp<0)		return;	else		close(hUdp);}void SendSlaveCommand(UBYTE *buffer,int length){		pthread_mutex_lock(&netmutex);		if(hUdp<=0)		return ;		int nwrite = sendto(hUdp,(char *)buffer,length,0,(struct sockaddr *)&server_addr,addrlen);		if(nwrite<0)	{#ifdef _DEBUG		perror("Send FAILURE");#endif		pthread_mutex_unlock(&netmutex);		return;	}		pthread_mutex_unlock(&netmutex);	return;	}/////////////////////////////////////////////////////////////////////////// 函数名       : DoSlaveCommand// 功能描述     : 处理后台来的命令// 参数         : UBYTE *buffer// 参数         : int length// 返回值       : void /////////////////////////////////////////////////////////////////////////void DoSlaveCommand(UBYTE *buffer,int length){	UBYTE sndbuf[255];	long pos;	switch(*(buffer+2))	{		case 0x01:		exit(1);		break;			case 0x03:                           //启动高速#ifdef _DEBUG		printf("Receive HighSpeed !\n");#endif		sndbuf[0] = 0x07;		sndbuf[1] = 0x81;		sndbuf[2] = 0x04;		sndbuf[3] = 0x16;		SendSlaveCommand(sndbuf,4);				  SendRecordWaveStart();		  SendRecordWaveStart();		GetCurNsPos(&pos);		RecordCfgFile();          	RecordWave(pos,1000,HIGHSPEED);	  	sleep(1);	  	if((pos+3800*4)>YCID)	  		pos  = pos +3800*4 -YCID;		else			pos += 3800*4;         	 RecordWave(pos,3800, LOWSPEED);			SendCreateFile();		  SendRecordWaveEnd();		  SendRecordWaveEnd();			break;	case 0x07:                          //修改定值确认#ifdef _DEBUG		printf("Receive Edit LoacalValue !\n");#endif		sndbuf[0] = 0x07;		sndbuf[1] = 0x81;		sndbuf[2] = 0x08;		sndbuf[3] = 0x16;		SendSlaveCommand(sndbuf,4);		break;	default:		break;				}	return ;}/////////////////////////////////////////////////////////////////////////// 函数名       : UdpTask// 功能描述     : UDP主任务,完成和后台的通讯// 参数         : void// 返回值       : void /////////////////////////////////////////////////////////////////////////void Net103Loop(void){	fd_set readset,timeset;	struct timeval tv;	int MaxFd = 0;	int optval = 1;	struct sockaddr_in local_addr,server;	int	   i;	socklen_t addrlength = sizeof(struct sockaddr_in);	addrlen = sizeof(server_addr);	UDPERR:	hUdp =socket(AF_INET, SOCK_DGRAM, 0);	if (hUdp < 0)	{		close(hUdp);#ifdef _DEBUG		printf("Udp Socket Bind FAILURE! ALREADY CLOSED!\n");#endif		goto UDPERR;	}		bzero(&local_addr,sizeof(local_addr));		local_addr.sin_family = AF_INET;	local_addr.sin_port = htons(1032);	local_addr.sin_addr.s_addr = INADDR_ANY;	bzero(&server_addr,sizeof(server_addr));		server_addr.sin_family = AF_INET;	server_addr.sin_port = htons(1032);	server_addr.sin_addr.s_addr = INADDR_BROADCAST;		setsockopt(hUdp,SOL_SOCKET,SO_BROADCAST,(char *)&optval,sizeof(optval));	if(-1==bind(hUdp, (struct sockaddr *)&local_addr, sizeof(local_addr)))	{		close(hUdp);#ifdef _DEBUG			//	printf("Udp Socket Bind FAILURE!\n");#endif				goto UDPERR;	}			FD_ZERO(&readset);		while(1)	{		tv.tv_sec = 1;//15		tv.tv_usec = 0;				FD_SET(hUdp, &readset);				switch (select(hUdp+1 , &readset, NULL, NULL,&tv))		{		case -1:			{				close(hUdp);#ifdef _DEBUG				printf("Udp Socket Select Error!\n");#endif					goto UDPERR;				}			break;					case 0:  			OrangizeTotoal();			break;					default:			if (FD_ISSET(hUdp,&readset))			{       				int  length = recvfrom(hUdp, udpbuffer, BUFSIZE, 0, (struct sockaddr *)&server,&addrlength);												if (length<0)					continue;								DoSlaveCommand(udpbuffer,length);			}						break;		}					}	}int Net103Start(){	int ret = pthread_create(&gnetthreadid, NULL, (void *(*)(void*))Net103Loop, NULL);  //read the data from pipe	if(ret)	{#ifdef _DEBUG		printf("Net103 Thread Create Failued!\n");#endif		return 0;	}	else		return 1;}

⌨️ 快捷键说明

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