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

📄 connect.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 4 页
字号:
										A_ClientSocket[i].IEC_Flag &= (~IEC104_FLAG_START);										break;											case 0x07:	//STARTDT										RecvBuff[2] = 0x0b;										A_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START;										CONN_SendBuff(A_ClientSocket[i].Socket_fd, RecvBuff, 6);										SYS_Delay(10);										if(A_ClientSocket[i].lport == OPERATOR_PORT)										{											for(k=1;k<=8;k++)											{												if(COM_Para[k].Protocol!=0)												{													for(j=0;j<SubDevice[k].SubTotalNum;j++)													{														if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE)															ucPI = 0;														else															ucPI = 1;														ret	= IEC_PackNode_104(SendBuff,SubDevice[k].SubStations[j].sub_address,3,ucPI);														CONN_Send104Data(0,i,SendBuff,ret);														SYS_Delay(10);													}												}											}										}										else										{											for(k=1;k<=8;k++)											{												if(COM_Para[k].Protocol!=0)												{													for(j=0;j<SubDevice[k].SubTotalNum;j++)													{														if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE)															ucPI = 1;														else															ucPI = 2;														ret	= IEC_PackNode_TCP(SendBuff,SubDevice[k].SubStations[j].sub_address,IEC103_COT_M_per,SubDevice[k].SubStations[j].sub_FUN,ucPI);														CONN_Send104Data(0,i,SendBuff,ret);														SYS_Delay(10);													}												}											}										}										break;									case 0x01:										if (RecvBuff[3]==0)										{											A_ClientSocket[i].IEC_Flag &=(~IEC104_FLAG_WAIT_S);											A_ClientSocket[i].count_I_Send=0;										}										break;									default :										break;									}								}									if(nRecv>=14 )								{									A_ClientSocket[i].IEC_Flag |= IEC104_FLAG_RETURN_S;									A_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START;									A_ClientSocket[i].count_I_Recv += 1;									uiCount	= RecvBuff[3]*0x100 + RecvBuff[2];									if (uiCount != A_ClientSocket[i].Conn_RecvCount)									{										A_ClientSocket[i].IEC_Flag |= IEC104_ERR_RECV;									}									A_ClientSocket[i].Conn_RecvCount+=2;									TempBuff[0] = i;		//A网,第一个字节高四位为0000,低四位为iConnect;									memcpy(TempBuff+1, RecvBuff, nRecv);									if ((A_ClientSocket[i].lport == OPERATOR_PORT) && 										(RecvBuff[IEC104_OFFSET_TI] == IEC104_TI_C_IC_NA_1) && 										(RecvBuff[IEC104_OFFSET_ADDR] == 0xff))									{										for(m=1;m<=8;m++)										{											if(COM_Para[m].Protocol!=0)											{												for(n=0;n<SubDevice[m].SubTotalNum;n++)												{													TempBuff[IEC104_OFFSET_ADDR+1]=SubDevice[m].SubStations[n].sub_address; 													Save_Net104Data_To_Memory(m,TempBuff,nRecv+1);												}											}										}									}									else									{										nPort = SUB_AddrToPort(RecvBuff[IEC104_OFFSET_ADDR]);										if((nPort>=1)&&(nPort<=8))										{											if (CONN_Need_RT(0,i,RecvBuff))											{
												//PrintDebugInfo(CurDebugPort,Send_Data,RecvBuff,nRecv);												//优先级高的下行命令存放在 iPort*1000 起始的共享内存区												Save_Net104Data_To_Memory(nPort,TempBuff,nRecv+1);											}											else											{												//优先级低的下行命令存放在 100000 + iPort*10000 起始的共享内存区												Save_Call104Data_To_Memory(nPort,TempBuff,nRecv+1);											}										}									}									//--------------------是否为校时命令----------------------									if ((A_ClientSocket[i].lport == OPERATOR_PORT) && (RecvBuff[6] == IEC104_TI_C_CS_NA_1))//操作员站来的校时命令									{										timeBAK.mSecond	= RecvBuff[IEC104_OFFSET_CONTEXT+1] * 0x100+RecvBuff[IEC104_OFFSET_CONTEXT] ;			//change local time																timeBAK.second		= timeBAK.mSecond/1000;												timeBAK.minute		= RecvBuff[IEC104_OFFSET_CONTEXT+2] & 0x3f;										timeBAK.hour		= RecvBuff[IEC104_OFFSET_CONTEXT+3] & 0x1f;										timeBAK.day			= RecvBuff[IEC104_OFFSET_CONTEXT+4] & 0x1f;										timeBAK.month		= RecvBuff[IEC104_OFFSET_CONTEXT+5] & 0x0f;										timeBAK.year		= RecvBuff[IEC104_OFFSET_CONTEXT+6] & 0x7f;										if(memcmp(OpeTimeBuff,RecvBuff+15,7)!=0)										{											memcpy(OpeTimeBuff,RecvBuff+15,7);											SetTime(timeBAK);										}										CONN_PackCount(0,i,RecvBuff);										RecvBuff[IEC104_OFFSET_COT]	=IEC104_COT_M_acton;											A_ClientSocket[i].Conn_SendCount += 2;										CONN_SendBuff(A_ClientSocket[i].Socket_fd, RecvBuff, MIN_IEC104_FRAMELEN+9);									}									else if ((A_ClientSocket[i].lport == ENGINEER_PORT) && (RecvBuff[6] == IEC103_TI_M_SYN_TA_3))//工程师站来的校时命令									{										timeBAK.mSecond	= RecvBuff[TCP_OFFSET_CONTEXT+1] * 0x100 + RecvBuff[TCP_OFFSET_CONTEXT] ;				//change local time				 										timeBAK.second		= timeBAK.mSecond/1000;												timeBAK.minute		= RecvBuff[TCP_OFFSET_CONTEXT+2] & 0x3f;										timeBAK.hour		= RecvBuff[TCP_OFFSET_CONTEXT+3] & 0x1f;										timeBAK.day			= RecvBuff[TCP_OFFSET_CONTEXT+4] & 0x1f;										timeBAK.month		= RecvBuff[TCP_OFFSET_CONTEXT+5] & 0x0f;										timeBAK.year		= RecvBuff[TCP_OFFSET_CONTEXT+6] & 0x7f;										if(memcmp(EngTimeBuff,RecvBuff+15,7)!=0)										{											memcpy(EngTimeBuff,RecvBuff+15,7);											SetTime(timeBAK);										}										CONN_PackCount(0,i,RecvBuff);										A_ClientSocket[i].Conn_SendCount += 2;										CONN_SendBuff(A_ClientSocket[i].Socket_fd, RecvBuff, MIN_TCP_FRAMELEN+9);									}									else									{										SendBuff[0] = START_CODE2;										SendBuff[1] = 0x04;										SendBuff[2] = 0x01;										SendBuff[3] = 0x00;										SendBuff[4] = LOBYTE(A_ClientSocket[i].Conn_RecvCount);										SendBuff[5] = HIBYTE(A_ClientSocket[i].Conn_RecvCount);										CONN_SendBuff(A_ClientSocket[i].Socket_fd, SendBuff, 6);									}								}							}						}					}					else if (PreRead==0)  //客户端断开了连接					{						if((A_ClientSocket[i].lport==OPERATOR_PORT)||(A_ClientSocket[i].lport==ENGINEER_PORT))						{							A_Flag--;						}						FD_CLR(A_ClientSocket[i].Socket_fd,&A_Sockset);						close(A_ClientSocket[i].Socket_fd);						Conn_Clear(0,i);					}					else					{						getsockopt(A_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_ERROR, &optval, &optlen);					}				}			}		}		add_socket(&A_Sockset, &A_ListenSocket[0], &A_ClientSocket[0]);		//////////////////////////////////////////处理A网的连接,数据接收结束//////////////////////////////////////////////////	}}void *B_NetRecv(void * tmp){	struct linger lingero;	int optval, optlen = sizeof(int);		int i,j,k,m,n,PreRead;	int ret,nRecv,uiCount;	int nPort,B_Maxfd=0;	int client_len,iCon_Number;	unsigned char ucPI;	SOCKET Client_Temp;	CurrentTime timeBAK;	unsigned char TempBuff[256];	unsigned char SendBuff[256],RecvBuff[256];	unsigned char OpeTimeBuff[32],EngTimeBuff[32];	struct timeval TimeOut;	fd_set B_Sockset;	struct sockaddr_in client_addr;	client_len = sizeof(client_addr);		NetInit(1);	FD_ZERO(&B_Sockset);	for(i=0;i<ListenPort_Num;i++)	{		FD_SET(B_ListenSocket[i],&B_Sockset);		B_Maxfd = max(B_Maxfd,B_ListenSocket[i]+1);	}	while(1)	{		CurNetB ++ ;		CheckNetConnected(1);		//////////////////////////////////////////处理B网的连接,数据接收/////////////////////////////////////////////////////////		for(i=0;i<MAX_CLIENT;i++)		{			if(B_ClientSocket[i].inUse)			{				B_ClientSocket[i].timeout_T1++;				if (B_ClientSocket[i].timeout_T1>=TIMEOUT_TIMES)				{					if((B_ClientSocket[i].lport==OPERATOR_PORT)||(B_ClientSocket[i].lport==ENGINEER_PORT))					{						B_Flag--;					}					FD_CLR(B_ClientSocket[i].Socket_fd,&B_Sockset);					close(B_ClientSocket[i].Socket_fd);					Conn_Clear(1,i);				}			}		}		TimeOut.tv_sec  = SELECT_S;		TimeOut.tv_usec = SELECT_US;//		if(select(B_Maxfd,&B_Sockset,NULL,NULL,&TimeOut) != 0)		{			for(k=0;k<ListenPort_Num;k++)			{				if( (FD_ISSET(B_ListenSocket[k], &B_Sockset)) && ( ( i=GetFreeConnect(1) ) >= 0 ) )				{					getsockopt(B_ListenSocket[k], SOL_SOCKET, SO_ERROR, &optval, &optlen);					Client_Temp = accept(B_ListenSocket[k],(struct sockaddr *)&client_addr,&client_len);					if(Client_Temp<0)					{						printf("accept error \n");					}					else						{						fcntl(Client_Temp, F_SETFL, fcntl(Client_Temp, F_GETFL, 0) | O_NONBLOCK); 						B_ClientSocket[i].Socket_fd=Client_Temp;						B_ClientSocket[i].inUse =1;						switch(k)						{						case 0:							B_Flag++;							B_ClientSocket[i].lport =OPERATOR_PORT;							break;						case 1:							B_Flag++;							B_ClientSocket[i].lport=ENGINEER_PORT;							break;						case 2:							B_ClientSocket[i].lport=MCUSET_PORT;							break;						case 3:							B_ClientSocket[i].lport=DEBUG_PORT;							break;						}						FD_SET(Client_Temp, &B_Sockset);						B_Maxfd = max(B_Maxfd, Client_Temp+1);												getsockopt(B_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_ERROR, &optval, &optlen);						optlen = sizeof(lingero);						lingero.l_onoff=1;						lingero.l_linger=1;						setsockopt(B_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_LINGER, &lingero, optlen);						}				}			}			for(i=0;i<MAX_CLIENT;i++)			{				if( (B_ClientSocket[i].inUse) && (FD_ISSET(B_ClientSocket[i].Socket_fd,&B_Sockset)) )				{					getsockopt(B_ClientSocket[i].Socket_fd, SOL_SOCKET, SO_ERROR, &optval, &optlen);					PreRead = recv(B_ClientSocket[i].Socket_fd, TempBuff, sizeof(TempBuff), MSG_DONTWAIT | MSG_PEEK);//Not Clean Buffer					if (PreRead>0) 					{						B_ClientSocket[i].timeout_T1=0;						nRecv = RecvDataFromNet(B_ClientSocket[i].Socket_fd,RecvBuff);						if(nRecv>0)						{							if(B_ClientSocket[i].lport==MCUSET_PORT)							{								if((nRecv == 6 )&&(RecvBuff[2]==0x43))								{									RecvBuff[2]=0x83;									CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6);								}								else								{									ProcessParameters(1,i,RecvBuff);								}							}							else if(B_ClientSocket[i].lport==DEBUG_PORT)							{								if((nRecv == 6 )&&(RecvBuff[2]==0x43))								{									RecvBuff[2]=0x83;									CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6);								}								else								{									ProcessDebugParameters(1,i,RecvBuff);								}							}							else							{								if(nRecv==6)								{									switch( RecvBuff[2] )									{									case 0x43:	//TESTFR										RecvBuff[2]=0x83;										CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6);										B_ClientSocket[i].NeedCheck = 1;										break;									case 0x13:	//STOPDT										RecvBuff[2]=0x23;										B_ClientSocket[i].IEC_Flag &= (~IEC104_FLAG_START);										CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6);										break;									case STOPDT_CONFIRM:										B_ClientSocket[i].IEC_Flag &=(~IEC104_FLAG_START);										break;										case 0x07:	//STARTDT										RecvBuff[2] = 0x0B;										B_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START;										CONN_SendBuff(B_ClientSocket[i].Socket_fd, RecvBuff, 6);										SYS_Delay(10);										if(B_ClientSocket[i].lport == OPERATOR_PORT)										{											for(k=1;k<=8;k++)											{												if(COM_Para[k].Protocol!=0)												{													for(j=0;j<SubDevice[k].SubTotalNum;j++)													{														if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE)															ucPI = 0;														else															ucPI = 1;														ret	= IEC_PackNode_104(SendBuff,SubDevice[k].SubStations[j].sub_address,3,ucPI);														CONN_Send104Data(1,i,SendBuff,ret);														SYS_Delay(10);													}												}											}										}										else										{											for(k=1;k<=8;k++)											{												if(COM_Para[k].Protocol!=0)												{													for(j=0;j<SubDevice[k].SubTotalNum;j++)													{														if (SubDevice[k].SubStations[j].sub_state == SUB_STATE_ONLINE)															ucPI = 1;														else															ucPI = 2;														ret	= IEC_PackNode_TCP(SendBuff,SubDevice[k].SubStations[j].sub_address,IEC103_COT_M_per,SubDevice[k].SubStations[j].sub_FUN,ucPI);														CONN_Send104Data(1,i,SendBuff,ret);														SYS_Delay(10);													}												}											}										}										break;									case 0x01:										if (RecvBuff[3]==0)										{											B_ClientSocket[i].IEC_Flag &=(~IEC104_FLAG_WAIT_S);											B_ClientSocket[i].count_I_Send=0;										}										break;									default :										break;									}								}									if(nRecv>=14)								{									B_ClientSocket[i].IEC_Flag |= IEC104_FLAG_RETURN_S;									B_ClientSocket[i].IEC_Flag |= IEC104_FLAG_START;									B_ClientSocket[i].count_I_Recv += 1;									uiCount	= RecvBuff[3]*0x100 + RecvBuff[2];									if (uiCount != B_ClientSocket[i].Conn_RecvCount)									{										B_ClientSocket[i].IEC_Flag |= IEC104_ERR_RECV;									}									B_ClientSocket[i].Conn_RecvCount+=2;									TempBuff[0] = 0x10+i;	//B网,第一个字节高四位为0001,低四位为iConnect;									memcpy(TempBuff+1, RecvBuff, nRecv);									if ((B_ClientSocket[i].lport == OPERATOR_PORT) && (RecvBuff[IEC104_OFFSET_TI] == IEC104_TI_C_IC_NA_1) && (RecvBuff[IEC104_OFFSET_ADDR] == 0xff)) //来自操作员站或者远动站的总召唤命令										{										for(m=1;m<=8;m++)										{											if(COM_Para[m].Protocol!=0)											{												for(n=0;n<SubDevice[m].SubTotalNum;n++)												{													TempBuff[IEC104_OFFSET_ADDR+1]=SubDevice[m].SubStations[n].sub_address; 													Save_Net104Data_To_Memory(m,TempBuff,nRecv+1);												}											}										}									}									else									{										nPort = SUB_AddrToPort(RecvBuff[IEC104_OFFSET_ADDR]);										if((nPort>=1)&&(nPort<=8))										{											if(CONN_Need_RT(1,i,RecvBuff))											{												Save_Net104Data_To_Memory(nPort,TempBuff,nRecv+1);											}											else											{												Save_Call104Data_To_Memory(nPort,TempBuff,nRecv+1);											}

⌨️ 快捷键说明

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