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

📄 iec.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 3 页
字号:
				if (ucCOT104==IEC104_COT_M_deact)   //undo control				{					ucData |= IEC103_UNDO;				}				else if (*(p2+IEC104_OFFSET_CONTEXT) & IEC104_SE)				{					ucData |= IEC103_SE;				}			}			/*			else if 		//CCC,ASDU_67			{			*(p1+IEC103_OFFSET_TI)	=IEC103_TI_C_CC_NA_3;		//Select control			*(p1+IEC103_OFFSET_COT)	=IEC103_COT_M_remoteOP;			*(p1+IEC103_OFFSET_INF)	=(uInf104-0x6001)+48;			ucData=*(p2+IEC104_OFFSET_CONTEXT) & 0x07;				ucData +=1;			if (ucCOT104==IEC104_COT_M_deact)   //undo control			{			ucData |=IEC103_UNDO;			}			else if (*(p2+IEC104_OFFSET_CONTEXT) & IEC104_SE)			{			ucData |=IEC103_SE;			}				}			*/			else			{				if (ucCOT104 == IEC104_COT_M_act)				{					*(p1+IEC103_OFFSET_COT)		=IEC103_COT_M_actcon;				}				else				{					*(p1+1)	=*(p1+2)	=0;					break;				}				for (i=0 ; i<3; i++)				{					SubDevice[iPort].SubStations[index].sub_ConfirmInf[i] =*(p2+IEC104_OFFSET_INF+i);				}				*(p1+IEC103_OFFSET_TI)		=IEC103_TI_C_GRC_NA_3;		//direct control				if (pGlobal->Protocol_Version == XJ_IEC_1)				{					*(p1+IEC103_OFFSET_INF)		=uInf104-0xB01;				}				else				{					*(p1+IEC103_OFFSET_INF)		=uInf104-0x6001;				}				ucData &=0x03;			}			*(p1+IEC103_OFFSET_CONTEXT) 	= ucData;			*(p1+IEC103_OFFSET_CONTEXT+1) = 0;			*(p1+1)	= *(p1+2)					= MIN_IEC103_FRAMELEN+2;		}		break;	case IEC104_TI_C_RC_NA_1:		// regulating step command,ASDU_47		*(p1+IEC103_OFFSET_TI)		=IEC103_TI_C_RC_NA_3;		//		*(p1+IEC103_OFFSET_COT)		=IEC103_COT_M_remoteOP;		if (pGlobal->Protocol_Version == XJ_IEC_1)		{			*(p1+IEC103_OFFSET_INF)		=(uInf104-RC_BASE_104_1)+RC_BASE_103;		}		else		{			*(p1+IEC103_OFFSET_INF)		=(uInf104-RC_BASE_104_2)+RC_BASE_103;		}		ucData=*(p2+IEC104_OFFSET_CONTEXT) & 0x3;		if (ucCOT104==IEC104_COT_M_deact)   //undo control		{			ucData |=IEC103_UNDO;		}		else if (*(p2+IEC104_OFFSET_CONTEXT) & IEC104_SE)		{			ucData |=IEC103_SE;		}				*(p1+IEC103_OFFSET_CONTEXT)	=ucData;		*(p1+IEC103_OFFSET_CONTEXT+1)=0;		*(p1+1)	=*(p1+2)	=MIN_IEC103_FRAMELEN+2;		break;		case IEC104_TI_C_CI_NA_1:// counter interrogation command,ASDU_101		ucData=*(p2+IEC104_OFFSET_CONTEXT);		if (ucData & 0x1)		{			*(p1+IEC103_OFFSET_CONTEXT)	=0x05;		}		ucData &=0x80;		*(p1+IEC103_OFFSET_CONTEXT)	|=ucData;		*(p1+IEC103_OFFSET_TI)		=IEC103_TI_C_CI_NA_3;		*(p1+IEC103_OFFSET_VSQ)		=0x81;		*(p1+IEC103_OFFSET_COT)		=IEC103_COT_M_cyc;		*(p1+IEC103_OFFSET_INF)		=0;		*(p1+IEC103_OFFSET_CONTEXT+1)=0;		*(p1+1)	=*(p1+2)	=MIN_IEC103_FRAMELEN+2;		break;	case IEC104_TI_C_RD_NA_1: // read command, ASDU_102		*(p1+1)	=*(p1+2)			=MIN_IEC103_FRAMELEN+2;		*(p1+IEC103_OFFSET_TI)		=IEC103_TI_C_SET_NA_3;//Setting,ASDU_61		*(p1+IEC103_OFFSET_VSQ)		=0x81;		*(p1+IEC103_OFFSET_COT)		=IEC103_COT_M_actcon;		*(p1+IEC103_OFFSET_INF)		=SET_A_QUERY;		ucData	=*(p2+IEC104_OFFSET_SECT);		ucData  =(ucData << 4) & 0xf0;		if (uInf104 == 0x3801)		{			ucData	|=0x0f;		}		else		{			ucData |=((unsigned char)((uInf104 -0x3001)/0x100));		}		*(p1+IEC103_OFFSET_CONTEXT)=ucData;		*(p1+IEC103_OFFSET_CONTEXT+1)=0;		break;	case IEC104_TI_C_SE_NB_1:		*(p1+1) =*(p1+2)	=MIN_IEC103_FRAMELEN+5;		*(p1+IEC103_OFFSET_TI)		=IEC103_TI_C_SET_NA_3;//Setting,ASDU_61		*(p1+IEC103_OFFSET_VSQ)		=0x2;		*(p1+IEC103_OFFSET_COT)		=IEC103_COT_M_actcon;		ucData	=*(p2+IEC104_OFFSET_SECT);		ucData  =(ucData << 4) & 0xf0;		if (uInf104 >= 0x3801)		{			ucData |=0x0f;		}		else		{			ucData |=((unsigned char)((uInf104 -0x3001)/0x100));		}		*(p1+IEC103_OFFSET_CONTEXT)=ucData;		*(p1+IEC103_OFFSET_CONTEXT+1)=			((unsigned char)((uInf104 -0x3001)%0x100));//setting sequence				if (ucCOT104 == IEC104_COT_M_act)		{			if (*(p2+IEC104_OFFSET_CONTEXT+2) & 0x80)	//Select			{				*(p1+IEC103_OFFSET_INF) =SET_S_PRE;			}			else			{				*(p1+IEC103_OFFSET_INF) =SET_S_EXE;			}					}		else		{			*(p1+IEC103_OFFSET_INF)		=SET_S_UNDO;		}		for (i=0; i<3; i++)		{			*(p1+IEC103_OFFSET_CONTEXT+2+i)=*(p2+IEC104_OFFSET_CONTEXT+i);		}		break;	default :		*(p1+1)=*(p1+2)=0;		break;	}	if ((*(p1+1))>=MIN_IEC103_FRAMELEN)	{		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);	}	else	{		return 0;	}}/*FUNCTION	:change data form IEC103 protocol to TCP103 protocol(for engineer station)*//*INPUT PARAMETER:   pucTCP				--dest data buffer address*//*					 puc103 			--source data buffer address*//*OUTPUT		 :   					--length of dest data buffer*/int	IEC_Frame_103ToTCP(unsigned char *pucTCP, unsigned char *puc103){	int i,offset;	unsigned char *p1 = pucTCP;	unsigned char *p2 = puc103;	if ((*(p2+6)==0x58)||(*(p2+6)==0x24)) return 0;				//电度不需要发送到工程师站	*p1	= START_CODE2;									//Start Code	*(p1+1) = *(p2+1) - 2 + 4 + 2;								//Frame length	for (i=offset=IEC103_OFFSET_TI; i<(*(p2+1)+4) ; i++)	{		if (i==IEC103_OFFSET_COT)		{			*(p1+offset++)	=*(p2+i);			*(p1+offset++)	=0;		}		else	if (i==IEC103_OFFSET_COMADDR)		{			*(p1+offset++)	=*(p2+i);			*(p1+offset++)	=*(p2+IEC103_OFFSET_ADDR);		}		else		{			*(p1+offset++)	=*(p2+i);		}	}	return (*(p1+1)+2);}/*FUNCTION	:change data form TCP103 protocol to IEC103 protocol(for engineer station)*//*INPUT PARAMETER:   pucIEC103			--dest data buffer address*//*					 pucTCP 			--source data buffer address*//*OUTPUT		 :   					--length of dest data buffer*/int	IEC_Frame_TCPTo103(int iPort,unsigned char *pucIEC103,   unsigned char *pucTCP){	int i,offset;	unsigned char sum, ucFCB =0;	unsigned char ucTITCP,ucTI103,ucInf103;		unsigned char *p1 = pucIEC103;	unsigned char *p2 = pucTCP;	*p1	=*(p1+3)=START_CODE2;								//Start Code	*(p1+1) =*(p1+2)=*(p2+1)-4+2-2;							//Frame length	*(p1+IEC103_OFFSET_CODE)	=0x53;						//CS	*(p1+IEC103_OFFSET_ADDR)	=*(p2+TCP_OFFSET_ADDR);		//device address	ucFCB =SUB_GetFCB(*(p1+IEC103_OFFSET_ADDR));	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++);		}			}	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);}/*FUNCTION :change cot from IEC103 to IEC104*//*INPUT PARAMETER:	ucCOT103	--IEC103 cause of transmission*//*RETURN		 :				--IEC104 cause of tranimission*/unsigned int  IEC_COT_103To104(unsigned char ucCOT103){	int i;	for (i=0; M_COT_Code_List[i].m_COT_IEC103 !=0xff ;i++)	{		if (M_COT_Code_List[i].m_COT_IEC103 == ucCOT103)		{			return M_COT_Code_List[i].m_COT_IEC104;		}	}	return 0;}/*FUNCTION :change Cause of Transmission from IEC104 to IEC103*//*INPUT PARAMETER:  ucCOT104	--IEC104 cause of transmission*//*RETURN		 :				--IEC103 cause of tranimission*/unsigned char IEC_COT_104To103(unsigned int uiCOT104){	int i;	for (i=0; C_COT_Code_List[i].m_COT_IEC104 !=0xff ;i++)	{		if (C_COT_Code_List[i].m_COT_IEC103 == uiCOT104)		{			return C_COT_Code_List[i].m_COT_IEC104;		}	}	return 0;}int IEC_PackFrame_TCP(unsigned char *pucTCP,unsigned char ucTI,					  unsigned char  ucVSQ ,unsigned char ucCOT,					  unsigned char  ucADDR,unsigned char ucSect,					  unsigned char  ucFUN ,unsigned char ucINF,					  unsigned char  ucLen ,unsigned char *pucContext){	int i;	unsigned char *p=pucTCP;	*p =START_CODE2;	*(p+TCP_OFFSET_LEN)			=MIN_TCP_FRAMELEN+ucLen;	*(p+TCP_OFFSET_TI)			=ucTI;	*(p+TCP_OFFSET_VSQ)			=ucVSQ;	*(p+TCP_OFFSET_COT)			=ucCOT;	*(p+TCP_OFFSET_COT+1)		=0x0;	*(p+TCP_OFFSET_COMADDR)		=ucSect;	*(p+TCP_OFFSET_ADDR)		=ucADDR;	*(p+TCP_OFFSET_FUN)			=ucFUN;	*(p+TCP_OFFSET_INF)			=ucINF;	for (i=0; i<ucLen ; i++)	{		*(p+TCP_OFFSET_CONTEXT+i)	=*(pucContext + i);	}	return (*(p+TCP_OFFSET_LEN)+2);}int IEC_PackFrame_104(unsigned char *puc104,unsigned char ucTI,					  unsigned char  ucVSQ ,unsigned int  uiCOT,					  unsigned char  ucADDR,unsigned char ucSect,					  unsigned long  ulINF ,unsigned char ucLen,					  unsigned char *pucContext){	int i;	unsigned char *p=puc104;	*p =START_CODE2;	*(p+IEC104_OFFSET_LEN)		=MIN_IEC104_FRAMELEN+ucLen;	*(p+IEC104_OFFSET_TI)		=ucTI;	*(p+IEC104_OFFSET_VSQ)		=ucVSQ;						*(p+IEC104_OFFSET_COT)		=uiCOT & 0xff;	*(p+IEC104_OFFSET_COT+1)	=(uiCOT >> 8) & 0xff;	*(p+IEC104_OFFSET_SECT)	=ucSect;	*(p+IEC104_OFFSET_ADDR)		=ucADDR;	*(p+IEC104_OFFSET_INF)		=ulINF & 0xff;	*(p+IEC104_OFFSET_INF+1)	=(ulINF >>  8) & 0xff;	*(p+IEC104_OFFSET_INF+2)	=(ulINF >> 16) & 0xff;	for (i=0; i<ucLen ; i++)	{		*(p+IEC104_OFFSET_CONTEXT+i)	=*(pucContext + i);	}	return (*(p+IEC104_OFFSET_LEN)+2);}/*int IEC_PackEvent_TCP(unsigned char *pucTCP,unsigned char ucCOT,unsigned char  ucADDR,unsigned char ucSect,*/					/*FUNCTION:	Pack device commuciation state report with IEC103_TCP protocol for engineer station*//*INPUT PARAMETER:	pucTCP		--dest data buffer address *//*					ucAddr		--device address		   *//*					ucCOT		--cause of transmission	   *//*					ucDPI		--double-point information *//*OUTPUT		:			length of data buffer		   */int IEC_PackNode_TCP(unsigned char *pucTCP ,unsigned char ucAddr,					 unsigned char  ucCOT  ,unsigned char ucFUN ,					 unsigned char  ucDPI){	CurrentTime CurTime;	unsigned char *p=pucTCP;	IEC_PackFrame_TCP(pucTCP,IEC103_TI_M_TM_TA_3,0x81,		ucCOT,ucAddr,0,ucFUN,0xC0,1,&ucDPI);	*(p+TCP_OFFSET_LEN)			=MIN_TCP_FRAMELEN+4+2;	//1 for SPI,4 for times,1 for SIN	CurTime=GetTime();	*(p+TCP_OFFSET_CONTEXT+1)	= CurTime.year;/////////////////////////////???修改	*(p+TCP_OFFSET_CONTEXT+5)	=0;	return (*(p+TCP_OFFSET_LEN)+2);}/*FUNCTION:	Pack device commuciation state report with IEC104 protocol for operator&remote station*//*INPUT PARAMETER:	pucIEC104	--dest data buffer address *//*					ucAddr		--device address		   *//*					ucCOT		--cause of transmission	   *//*					ucSPI		--single-point information *//*RETURN		:			length of data buffer		   */int IEC_PackNode_104(unsigned char *pucIEC104,unsigned char ucAddr, unsigned char  ucCOT	 ,unsigned char ucSPI){	CurrentTime CurTime;	unsigned char *p = pucIEC104;	IEC_PackFrame_104(pucIEC104, IEC104_TI_M_SP_NA_1, 0x01, ucCOT, ucAddr, SECT_MONITOR, 0x01, 1, &ucSPI);	if (ucCOT == IEC104_COT_M_introgen)	{		*(p+IEC104_OFFSET_TI)		= IEC104_TI_M_SP_NA_1;		*(p+IEC104_OFFSET_LEN)		= MIN_IEC104_FRAMELEN+1;	}	else	{		*(p+IEC104_OFFSET_TI)		= IEC104_TI_M_SP_TB_1;		*(p+IEC104_OFFSET_COT)		= IEC104_COT_M_spont;		*(p+IEC104_OFFSET_LEN)		= MIN_IEC104_FRAMELEN+8;			//1 for SPI,7 for time		CurTime = GetTime();		*(p+IEC104_OFFSET_CONTEXT+1) = LOBYTE( CurTime.mSecond );		*(p+IEC104_OFFSET_CONTEXT+2) = HIBYTE( CurTime.mSecond );		*(p+IEC104_OFFSET_CONTEXT+3) = LOBYTE( CurTime.minute );		*(p+IEC104_OFFSET_CONTEXT+4) = LOBYTE( CurTime.hour );		*(p+IEC104_OFFSET_CONTEXT+5) = LOBYTE( CurTime.day );		*(p+IEC104_OFFSET_CONTEXT+6) = LOBYTE( CurTime.month );		*(p+IEC104_OFFSET_CONTEXT+7) = LOBYTE( CurTime.year );	}	return (*(p+IEC104_OFFSET_LEN)+2);}int IEC_PackPowerHead_104(unsigned char *puc104,unsigned char ucADDR,						  unsigned char  ucSect,unsigned char ucQCC){	return IEC_PackFrame_104(puc104,IEC104_TI_C_CI_NA_1,0x1,IEC104_COT_M_acton,ucADDR,ucSect,0x0,0x1,&ucQCC);}int IEC_PackPowerEnd_104(unsigned char *puc104,unsigned char ucADDR,						 unsigned char  ucSect,unsigned char ucQCC){	return IEC_PackFrame_104(puc104,IEC104_TI_C_CI_NA_1,		0x1,IEC104_COT_M_actterm,ucADDR,ucSect,0x0,1,&ucQCC);}/*FUNCTION	:Pack general inspect confirm report with IEC104 protocol*//*INPUT	PARAMETER:	puc104		--dest address of data *//*					ucADDR		--device address to packed *//*					ucSect		--sect to packed			*//*RETURN :						--length of packed data buffer*/int IEC_PackInspectHead_104(unsigned char *puc104,unsigned char ucADDR,							unsigned char ucSect){	unsigned char ucData =IEC104_QOI;	return IEC_PackFrame_104(puc104,IEC104_TI_C_IC_NA_1,		0x1,IEC104_COT_M_acton,ucADDR,ucSect,0x0,1,&ucData);}/*FUNCTION	:Pack general inspect end report with IEC104 protocol*//*INPUT	PARAMETER:	puc104		--dest address of data *//*					ucADDR		--device address to packed *//*					ucSect		--sect to packed			*//*RETURN :						--length of packed data buffer*/int IEC_PackInspectEnd_104(unsigned char *puc104,unsigned char ucADDR,						   unsigned char ucSect){	unsigned char ucData =IEC104_QOI;	return IEC_PackFrame_104(puc104,IEC104_TI_C_IC_NA_1,		0x1,IEC104_COT_M_actterm,ucADDR,ucSect,0x0,1,&ucData);}/*FUNCTION :pack general inspect end report with TCP-103 protocol*//*INPUT PARAMETER:	puc103		---dest address of data*//*					ucADDR		---device address to packed*//*					ucCPU		---sect to packed		*//*RETURN:						---length of packed data buffer*/int IEC_PackInspectEnd_TCP(unsigned char *pucTCP,unsigned char ucADDR,						   unsigned char ucSect,unsigned char ucFUN,						   unsigned char ucSCN){	return IEC_PackFrame_TCP(pucTCP,IEC103_TI_M_TGI_NA_3,		0x81,IEC103_COT_M_queryEND,ucADDR,ucSect,ucFUN,0x0,1,&ucSCN);}/*FUNCTION:check if data(with IEC103 protocol) need to be send to all connection*//*INPUT PARAMETER:		ucCOT103	--cause of transmission	*//*OUTPUT					0			--needn't 				*//*							1			--need					*/int IEC_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;	}}

⌨️ 快捷键说明

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