📄 net103.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 + -