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

📄 nz_sf.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
		*(p1+TCP_OFFSET_ADDR)  =SubDevice[iPort].SubStations[index].sub_address;		return (*(p1+1)+2); 	case 2:		*(p1+TCP_OFFSET_TI) = 2;  //ASDU_2		*(p1+TCP_OFFSET_COT) = *(p2+IEC103_OFFSET_COT); 		*(p1+TCP_OFFSET_COT+1) =0; 		*(p1+TCP_OFFSET_COMADDR)  = 2; //SOE在2号扇区		*(p1+TCP_OFFSET_ADDR)  =SubDevice[iPort].SubStations[index].sub_address;		*(p1+TCP_OFFSET_INF)   = *(p2+IEC103_OFFSET_INF);		*(p1+TCP_OFFSET_CONTEXT)= *(p2+IEC103_OFFSET_CONTEXT);		*(p1+TCP_OFFSET_CONTEXT+1)=0;		*(p1+TCP_OFFSET_CONTEXT+2)=0;		*(p1+TCP_OFFSET_CONTEXT+3)=0;		*(p1+TCP_OFFSET_CONTEXT+4)=0;		for(i=5;i<11;i++)		{			*(p1+TCP_OFFSET_CONTEXT+i)  = *(p2+IEC103_OFFSET_CONTEXT+i-4);		}		*(p1+TCP_OFFSET_LEN)=MIN_TCP_FRAMELEN+10;		return (*(p1+1)+2);	default :		return 0;         }     }/*=====================================================================*//*FUNCTION :将TCP103协议转为IEC103/*PARAMETER:pucTCP/*          puc103/*RETURN   :IEC103总的字节个数/*=====================================================================*/int XJTCP_To_SF103(int iPort ,unsigned char *pucIEC103,unsigned char *pucTCP){		float d;	int    i,offset,index;	unsigned int  totalnum=0;	unsigned int  uiInfRcs;	unsigned char ucInfTcp;	unsigned char ucTI,ucCOTtcp;	unsigned char ucGroup,ucADDR;	unsigned char ucFCB =0;	unsigned char DZindex,DZchar,sum;	unsigned char *p1=pucIEC103,*p2=pucTCP;	static unsigned char count  =0;		ucADDR	= *(p2+TCP_OFFSET_ADDR);	index		= SUB_AddrToIndex(ucADDR);	ucFCB		= SUB_GetFCB(ucADDR);	*p1     = *(p1+3)           =START_CODE2;   //起始符	*(p1+IEC103_OFFSET_CODE) =0x53;	if(ucADDR!=BROADCAST_ADDR)	{ 		*(p1+IEC103_OFFSET_ADDR)=ucADDR;	}		DZsend_buf[0] = DZsend_buf[3] = START_CODE2; 	DZsend_buf[IEC103_OFFSET_CODE]  = 0x53; 	DZsend_buf[IEC103_OFFSET_ADDR]  = *(p2+TCP_OFFSET_ADDR);	ucInfTcp  =*(p2+TCP_OFFSET_INF);		ucTI  =*(p2+TCP_OFFSET_TI);	switch(ucTI)	{ 		//南自WBH500装置只有一个定值区且不能修改定值,软压板是定值区中的控制字	case 61:      // 通用分类服务,调定值		if( *(p2+TCP_OFFSET_INF) == 100) //调1个定值区的全部定值 		{			if(*(p2+TCP_OFFSET_CONTEXT)&0x0f==15)			{				ucDZcpu = *(p2+TCP_OFFSET_CONTEXT)&0xf0;				*(p1+IEC103_OFFSET_CODE) =0x60;				*(p1+IEC103_OFFSET_TI)      =21;				*(p1+IEC103_OFFSET_VSQ)     =0x81;				*(p1+IEC103_OFFSET_COT)     =42;				*(p1+IEC103_OFFSET_COMADDR) =*(p2+TCP_OFFSET_ADDR);				*(p1+IEC103_OFFSET_FUN)     =254;    //0xfe; 				*(p1+IEC103_OFFSET_INF)     =241;    //0xf1; 读1个组的全部条目的值或属性 				*(p1+IEC103_OFFSET_RII)     =0;				*(p1+IEC103_OFFSET_NGD)     =0x01;   //通用分类标识数目. 				*(p1+IEC103_OFFSET_GIN)     =0x04;   //定值的组的标识,针对WBH500而言.				*(p1+IEC103_OFFSET_GIN+1)   =0x00;   //定值序号   				*(p1+IEC103_OFFSET_KOD)     =0x01;   //实际值				*(p1+1)= *(p1+2)            =13;				break;			}			else 			{				return 0;  			}		}		else		{			return 0;		}		break; 	default :     //一般的IEC103		if(*(p2+1)>MIN_TCP_FRAMELEN)		{ 			*(p1+1)=*(p1+2) =*(p2+1)-6+2;      //长度 						for (i=IEC103_OFFSET_TI,offset =TCP_OFFSET_TI;i<(*(p1+1)+4) ; i++)			{				if(i==IEC103_OFFSET_COT)   //COT				{					*(p1+i) =*(p2+TCP_OFFSET_COT);					offset +=2;				}				else				{					if(i==IEC103_OFFSET_COMADDR) //COMMADDR					{						*(p1+i) =*(p2+TCP_OFFSET_COMADDR);						offset +=2;					}					else						*(p1+i) =*(p2+offset++);				}			}			break;		}		else		{			return 0;  		}	}	SUB_SetFCB(p1,ucFCB);	sum =0;	for(i =0 ;i <*(p1+1) ;i++)		sum +=*(p1+i+4);	*(p1+i+4) = sum & 0xff;	*(p1+i+5) = END_CODE;	return (*(p1+1)+6); }void Send_SFBH_DataUp(int iPort,int NetGroup,int index,unsigned char *pucIEC104,unsigned char *pucIEC103){	int ret ;	unsigned char ucAddr = *(pucIEC103+IEC103_OFFSET_ADDR);	unsigned char ucCOT103 = *(pucIEC103+IEC103_OFFSET_COT);	if (Data_NeedBroadCast_103(ucCOT103,index))	{		ret = SF103_To_XJ104(pucIEC104,pucIEC103);		if( ret > 0 )		{			if ((*(pucIEC104+6)==9)||(*(pucIEC104+6)==50))				WriteMsgToShareMem(iPort,ret,pucIEC104,OperatorStation,YC_Msg);			else				WriteMsgToShareMem(iPort,ret,pucIEC104,OperatorStation,YX_Msg);		}		ret = SF103_To_XJTCP(pucIEC104,pucIEC103);		if(ret>0)			WriteMsgToShareMem(iPort,ret,pucIEC104,EngineerStation,YX_Msg);	}	else	{		if (CONN_IsEngStation(NetGroup,index))			ret = SF103_To_XJTCP(pucIEC104,pucIEC103);		else			ret = SF103_To_XJ104(pucIEC104,pucIEC103);		if(ret > 0)			CONN_Send104Data(NetGroup,index,pucIEC104,ret);	}}int SFBH_Command_Handle(int iPort,int NetGroup,int iConnect,unsigned char *pucCMD,unsigned char iLen){	unsigned char IEC104DataBuf_M[256];	unsigned char IEC103DataBuf_M[256];	unsigned char ucCS=0,ucSPI;	GW_Global   *pGlobal  =&gwGlobal;	SUB_Station   *pSub      =NULL;	int iSend = iLen;	int i,j,k,ret,index;	unsigned char ucADDR,ucIndex,ucCPU=0;	unsigned long ulDataTime;	unsigned char ucIFormatConfirm=0;	unsigned char ucFUN,ucINF;	if(pucCMD[0] == START_CODE1)		ucADDR =pucCMD[2];	else		ucADDR =pucCMD[IEC103_OFFSET_ADDR];	index=SUB_AddrToIndex(ucADDR);	if ((index >= 0) && (index < SUB_MAX))	{		pSub = &SubDevice[iPort].SubStations[index];	}	if (CONN_Validate(iConnect) && (!CONN_IsEngStation(NetGroup,iConnect)) 		&& (pucCMD[IEC103_OFFSET_TI]==IEC103_TI_C_IGI_NA_3) && (pucCMD[0] == START_CODE2))  //make general inspect confirm	{		if (pSub != NULL)		{			iConnect_inspect=iConnect;			ret =IEC_PackInspectHead_104(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,ucGlobalCPU);			SYS_Delay(10);			CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);			if (ucGlobalCPU == 0)			{				ucSPI = (pSub->sub_state != SUB_STATE_OFFLINE) ? 0 : 1 ;				SYS_Delay(10); 				ret =IEC_PackNode_104(IEC104DataBuf_M, SubDevice[iPort].SubStations[index].sub_address,	IEC104_COT_M_introgen,ucSPI);				CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,IEC104DataBuf_M[1]+2);				if (pSub->sub_state != SUB_STATE_ONLINE)				{					SYS_Delay(10);					ret =IEC_PackInspectEnd_104(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,0);					CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);					SYS_Delay(10);				}				return 0;			}		}	}	if (CONN_Validate(iConnect) && (CONN_IsEngStation(NetGroup,iConnect)) 		&& (pucCMD[IEC103_OFFSET_TI]==IEC103_TI_C_IGI_NA_3) && (pucCMD[0] == START_CODE2)) 	{		if (pSub != NULL)		{			iConnect_inspect=iConnect;			if (ucGlobalCPU == 0)     //for sect 0			{				ucSPI = (pSub->sub_state != SUB_STATE_OFFLINE) ? 1 : 2 ;				SYS_Delay(10);				ret =IEC_PackNode_TCP(IEC104DataBuf_M, SubDevice[iPort].SubStations[index].sub_address,	IEC103_COT_M_totalQUERY,pSub->sub_FUN,ucSPI);				CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);				if (pSub->sub_state != SUB_STATE_ONLINE)				{					SYS_Delay(10);					ret =IEC_PackInspectEnd_TCP(IEC104DataBuf_M, SubDevice[iPort].SubStations[index].sub_address, 0,	pSub->sub_FUN,pucCMD[IEC103_OFFSET_CONTEXT]);					CONN_Send104Data(NetGroup,iConnect,IEC104DataBuf_M,ret);					SYS_Delay(10);				}				return 0;			}		}	}	if ((pucCMD[IEC103_OFFSET_TI]==IEC103_TI_M_SYN_TA_3)  && (pucCMD[0] == START_CODE2))	{		if ((pucCMD[IEC103_OFFSET_COMADDR] == 0xfe) && (pucCMD[IEC103_OFFSET_ADDR] == 0xff))		{			return 0;		} 	}	if (ucADDR !=BROADCAST_ADDR)	{		if (pSub == NULL)		{			return 0;		}	}	do	{		for (i =0; i< 3 ; i++)		{			COMM_SendBuff(iPort,pucCMD,iSend);			if (ucADDR == BROADCAST_ADDR)  //if broadcast command,need no answer			{				if (pSub != NULL)				{					pSub->sub_B_CMDNum++;				}				SYS_Delay(10);				return 1;			}			ret =ReadFrame(iPort,ucADDR,IEC103DataBuf_M);			pSub->sub_C_CMDNum++;			if (ret>0)			{				pSub->sub_M_CMDNum++;				SUB_ResetFCB(pSub);				if (pSub->sub_state == SUB_STATE_OFFLINE)				{					ret =IEC_PackNode_104(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,IEC104_COT_M_spont,0);					CONN_Broad104Data(IEC104DataBuf_M,ret); 					ret =IEC_PackNode_TCP(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,IEC103_COT_M_per,0,1);					CONN_SendToEng(IEC104DataBuf_M,ret);				}				pSub->sub_state  =SUB_STATE_ONLINE;				switch(IEC103DataBuf_M[0])				{				case START_CODE1:					ucCS = IEC103DataBuf_M[1] ;      //receive code status					break;				case START_CODE2:					ucCS = IEC103DataBuf_M[4] ;      //receive code status					if(pSub->sub_FUN==0)						pSub->sub_FUN = IEC103DataBuf_M[IEC103_OFFSET_FUN];					Send_SFBH_DataUp(iPort,NetGroup,iConnect,IEC104DataBuf_M,IEC103DataBuf_M); //数据经转换后上送至操作员站、工程师站					if(SubDevice[iPort].SubStations[index].sub_InspectEnd==1)					{						SubDevice[iPort].SubStations[index].sub_InspectEnd=0;						if (CONN_Validate(iConnect_inspect) && (!CONN_IsEngStation(NetGroup,iConnect_inspect)))						{							ret =IEC_PackInspectEnd_104(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,1);							CONN_Send104Data(NetGroup,iConnect_inspect,IEC104DataBuf_M,ret);						}						else if (CONN_Validate(iConnect_inspect) && (CONN_IsEngStation(NetGroup,iConnect_inspect)))						{							ret =IEC_PackInspectEnd_TCP(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,1,								pSub->sub_FUN,pucCMD[IEC103_OFFSET_CONTEXT]);							CONN_Send104Data(NetGroup,iConnect_inspect,IEC104DataBuf_M,ret);						}						iConnect_inspect=0xff;					}					if(SubDevice[iPort].SubStations[index].sub_DZendflag ==1) 					{						SYS_Delay(20);						SubDevice[iPort].SubStations[index].sub_DZendflag = 0;						ucINF =100;						ret   = IEC_PackEND_TCP(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,							ucGlobalCPU,SubDevice[iPort].SubStations[index].sub_FUN ,ucINF);	                     						CONN_Send104Data(NetGroup,iConnect_dz,IEC104DataBuf_M,ret);						iConnect_dz=0xff;					}  								break;				default :					ucCS =0;					break;					}				if (ucCS & _ACD)		//if has first user data				{					iSend = LocalIEC103Cmd(REQUIREFIRSTDATA, ucADDR, pucCMD);				}				else								//if no first user data				{					pSub->sub_CS =REQUIRESECONDDATA;					if(ucCS==0x0E) 	pSub->sub_CS=RESETCU;			//装置回答链路未准备好,复位装置通信单元				}				break;						}			else			{				pSub->sub_FailNum++;				ucCS = 0;			}		}		if (i==3)		{			if (pSub->sub_state == SUB_STATE_ONLINE)			{				pSub->sub_state =SUB_STATE_FAIL;			}			break;		}	}while(ucCS & _ACD);	//loop until have no first user data	return 0;}/////////////////////Modified by yanliming 2005.10.14 for DGT801////////////////////int Get_DGT801_Frame(unsigned char *pFrame, int iPort, int uIndex){	int CmdNum = 3 ;	unsigned short CRC_Check; 	unsigned char CmdBuf[] = {0x3A, 0x63, 0x30 };	unsigned char ucAddr = SubDevice[iPort].SubStations[uIndex].sub_YX_NUM&0xff;	unsigned char SubState = SubDevice[iPort].SubStations[uIndex].sub_state;	unsigned char FunOrder = SubDevice[iPort].SubStations[uIndex].sub_FunOrder;	*(pFrame+0) = ucAddr;	if(SubState != SUB_STATE_ONLINE)//通讯没有恢复时,发送握手信息	{	/*	00:地址	01:06H	02:00H	CRC校验码		*/		*(pFrame+1) = 0x06;		*(pFrame+2) = 0x00;		CRC_Check = DGT801CRC(pFrame, 3);		*(pFrame+3) = HIBYTE(CRC_Check);		*(pFrame+4) = LOBYTE(CRC_Check);		return 5;	}	else	{		FunOrder = (FunOrder+1)%CmdNum;		*(pFrame+1) = CmdBuf[FunOrder];		*(pFrame+2) = 0x00;		CRC_Check = DGT801CRC(pFrame, 3);		*(pFrame+3) = HIBYTE(CRC_Check);		*(pFrame+4) = LOBYTE(CRC_Check);		SubDevice[iPort].SubStations[uIndex].sub_FunOrder = FunOrder;		return 5;	}}int	XJ104_To_DGT801(int iPort ,unsigned char *puc103,unsigned char *puc104){	int ret = puc104[1] + 2 ;	memcpy(puc103, puc104, ret);	return ret;}int	XJTCP_To_DGT801(int iPort ,unsigned char *puc103, unsigned char *pucTCP){

⌨️ 快捷键说明

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