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

📄 nz_sf.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
				*(p1+TCP_OFFSET_VSQ)        =0x81;                                          				*(p1+TCP_OFFSET_COT)        =21;				*(p1+TCP_OFFSET_INF)        =100;				*(p1+TCP_OFFSET_CONTEXT+1)  =0;				*(p1+TCP_OFFSET_LEN)        =MIN_TCP_FRAMELEN+2;  			}			else                             //有定值回答			{				offset=14;				totalnum                    =*(p2+IEC103_OFFSET_NGD)& 0x3f;				*(p1+TCP_OFFSET_VSQ)        =totalnum+1;				*(p1+TCP_OFFSET_COT)        =20;				*(p1+TCP_OFFSET_INF)        =100;				*(p1+TCP_OFFSET_COMADDR)  =ucDZcpu>>4;				*(p1+TCP_OFFSET_CONTEXT+1)  =*(p2+IEC103_OFFSET_GIN+1)-1;    //定值1在当前区的位置顺序号 0?1 				DZValue103_TCP(totalnum,offset,p1,p2) ;				*(p1+TCP_OFFSET_LEN) =MIN_TCP_FRAMELEN+2+totalnum*3;				if( (*(p2+IEC103_OFFSET_NGD)& 0x80) == 0 )                                                         				{					SubDevice[iPort].SubStations[index].sub_DZendflag =1; 				} 			} 			return (*(p1+1)+2);   		}		else 			return 0;                                                                                               	case 1:		if(ucInf103>=80) //响应总召唤送硬压板遥信状态报文或告警信号   		{			for(i=pos=IEC103_OFFSET_TI; i<(*(p2+1)-2+IEC103_OFFSET_TI); i++)//IEC103_OFFSET_TI=6;			{   				if (i==IEC103_OFFSET_COT)				{					*(p1+pos++) =*(p2+i);					*(p1+pos++) =0;				}				else if (i==IEC103_OFFSET_COMADDR)				{					*(p1+pos++) =*(p2+i);					*(p1+pos++) =*(p2+IEC103_OFFSET_ADDR);				}				else					*(p1+pos++) =*(p2+i);			}    			*(p1+TCP_OFFSET_COMADDR)  =1;			*(p1+TCP_OFFSET_ADDR)  =SubDevice[iPort].SubStations[index].sub_address;			return (*(p1+1)+2); 		}		else   //保护动作  		{ 			*(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)  =1;			*(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_NZ103(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); }int IEC_PackEND_TCP(unsigned char *pucTCP,unsigned char ucADDR,unsigned char ucCPU,unsigned char ucFUN,unsigned char ucINF){	unsigned char *p=pucTCP;	*(p+0)                = 0x68;	*(p+1)                = MIN_TCP_FRAMELEN+2;	*(p+TCP_OFFSET_TI)   = 61;	*(p+TCP_OFFSET_VSQ)   = 0x81;	*(p+TCP_OFFSET_COT)   = 10;	*(p+TCP_OFFSET_COT+1)  = 0;	*(p+TCP_OFFSET_ADDR)      = ucADDR;	*(p+TCP_OFFSET_COMADDR)     =ucCPU;	*(p+TCP_OFFSET_FUN)      =ucFUN;	*(p+TCP_OFFSET_INF)         =ucINF;	*(p+TCP_OFFSET_CONTEXT)     =ucDZcpu+0x01;	*(p+TCP_OFFSET_CONTEXT+1) =0;	return 16;}float CtoF(unsigned char *puc103){	float a;	unsigned char i,*px ;	void *pf;	px = puc103;                                   /*px指针指向数组ch*/	pf = &a;                                       /*指针指向浮点数*/	for(i=0;i<4;i++)	{ 		*((char *)pf+i) = *(px+i);                /*强制void 型指针转成char型,因为void型指针不能运算*/	}                               	return a;}int Data_NeedBroadCast_103(unsigned char ucCOT103,int iConnect){	if ( (ucCOT103 == IEC103_COT_M_per)   //IEC103_COT_M_per=1		||(ucCOT103 == IEC103_COT_M_resetFCB) //3		||(ucCOT103 == IEC103_COT_M_resetCU)  //4		||(ucCOT103 == IEC103_COT_M_setup)  //5		||(ucCOT103 == IEC103_COT_M_powerON) //6		||(ucCOT103 == IEC103_COT_M_cyc)		||(ucCOT103 == IEC103_COT_M_disturbD)		||(iConnect == 0xff) )	{		return 1;	}	else	{		return 0;	}}void Send_NZBH_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 = NZ103_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 = NZ103_To_XJTCP(pucIEC104,pucIEC103);		if(ret>0)			WriteMsgToShareMem(iPort,ret,pucIEC104,EngineerStation,YX_Msg);	}	else	{		if (CONN_IsEngStation(NetGroup,index))			ret = NZ103_To_XJTCP(pucIEC104,pucIEC103);		else			ret = NZ103_To_XJ104(pucIEC104,pucIEC103);		if(ret > 0)			CONN_Send104Data(NetGroup,index,pucIEC104,ret);	}}int NZBH_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_NZBH_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)))

⌨️ 快捷键说明

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