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

📄 iec.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "include/Iec.h"#include "include/Timer.h"#include "include/SubData.h"#include "include/UserFunc.h"#define	INVALIDATE_TI						0xFF#define	INVALIDATE_INF					0xFF#define	INVALIDATE_COT					0xFF#define OFF_INF_DC							0xB01			// double control #define OFF_INF_DC_ME					0xAD1			// double control ,measure#define OFF_INF_SEP_VALUE				0xB08typedef	struct	STRUCT_PHASE_SEL{	unsigned char	m_PS_103;	unsigned int		m_PS_104;}	PHASE_SEL_CODE;typedef	struct{	unsigned char	m_TI_IEC103;	unsigned char	m_TI_IEC104;}	IEC_TI_CODE;typedef struct{	unsigned char	m_COT_IEC103;	unsigned int 	m_COT_IEC104;}IEC_COT_CODE;#define	ERROR_PHASE				0#define PROS_AN                 0x0003          /* AN */ #define PROS_BN                 0x0005          /* BN */#define PROS_CN                 0x0009          /* CN */  #define PROS_AB                 0x0006          /* AB */#define PROS_BC                 0x000C          /* BC */#define PROS_CA                 0x000A          /* CA */ #define PROS_ABN                0x0007          /* ABN */#define PROS_BCN                0x000D          /* BCN */#define PROS_CAN                0x000B          /* CAN */ #define PROS_ABC                0x000E          /* ABC */ const	PHASE_SEL_CODE	Phase_Sel_Table[]={	{0x3,0x2},//AN	{0x5,0x4},//BN	{0x9,0x8},//CN	{0x6,0x6},//AB	{0xC,0xC},//BC	{0xA,0xA},//CA	{0x7,0x6},//ABN	{0xD,0xC},//BCN	{0xB,0xA},//CAN	{0xE,0x1},//ABC	{0xFF,0xFF},};const	IEC_TI_CODE	 C_TI_Code_List[]={	{0x3D,0x3D},// setting operation	{IEC103_TI_M_SYN_TA_3,IEC104_TI_C_CS_NA_1},//clock synchronization command	{IEC103_TI_C_IGI_NA_3,IEC104_TI_C_IC_NA_1},//interrogation command,general inspect 	{IEC103_TI_C_GRC_NA_3,IEC104_TI_C_DC_NA_1},//	{IEC103_TI_C_VER_1	 ,0x6				 },//load version	{62,62}	,//load fault report		{IEC103_TI_C_DC_NA_3,IEC104_TI_C_DC_NA_1},//	{IEC103_TI_C_RC_NA_3,IEC104_TI_C_RC_NA_1},// regulating step command	{IEC103_TI_C_CI_NA_3,IEC104_TI_C_CI_NA_1},//freeze 												  /*											  {IEC103_TI_M_TM_TA_3	,IEC104_TI_M_DP_TB_1},//ASDU_1											  {IEC103_TI_M_TMR_TA_3	,IEC104_TI_M_SP_TB_1},//ASDU_2											  {IEC103_TI_M_MEI_NA_3	,IEC104_TI_M_ME_NA_1},//ASDU_3											  {IEC103_TI_M_TME_TA_3	,IEC104_TI_M_ME_TD_1},//ASDU_4											  {IEC103_TI_M_IRC_NA_3	,0xff				},//ASDU_5											  {IEC103_TI_M_TGI_NA_3	,0xff				},//ASDU_8,											  */	{INVALIDATE_TI			,INVALIDATE_TI},//end mark ,don't modify it};const	IEC_TI_CODE	M_TI_Code_List[]={	{IEC103_TI_M_IRC_NA_3,0x5},//send Version	{IEC103_TI_M_SYN_TA_3,IEC104_TI_C_CS_NA_1},//clock synchronization command	{IEC103_TI_M_TGI_NA_3,IEC104_TI_C_IC_NA_1},//general inspect end	{IEC103_TI_M_TM_TA_3 ,IEC104_TI_M_DP_TB_1},//double change with time tag,for general protection 	{IEC103_TI_M_TMR_TA_3,IEC104_TI_M_EP_TD_1},//	{IEC103_TI_M_SP_NA_3,IEC104_TI_M_SP_NA_1},//single point information without time tag,for measure&control	{IEC103_TI_M_SP_TA_3,IEC104_TI_M_SP_TB_1},//single point information with time tag,for measure&control	{IEC103_TI_M_DP_NA_3,IEC104_TI_M_DP_NA_1},//double point information without time tag ,for measure&control	{IEC103_TI_M_DP_TA_3,IEC104_TI_M_DP_TB_1},//double point information with time tag,for measur&control	{IEC103_TI_M_MEII_NA_3,IEC104_TI_M_ME_NA_1},//measure value	{IEC103_TI_M_MEVII_NA_3,IEC104_TI_M_ME_NA_1},//measure value for measure & control	{IEC103_TI_M_IT_NA_3,IEC104_TI_M_IT_NA_1},//integrated totals	{IEC103_TI_C_DC_NA_3,IEC104_TI_C_DC_NA_1},// double command	{IEC103_TI_C_RC_NA_3,IEC104_TI_C_RC_NA_1},// regulating step command	{IEC103_TI_M_ST_NA_3,IEC104_TI_M_ST_NA_1},// step position information without time tag	{IEC103_TI_M_ST_TA_3,IEC104_TI_M_ST_TB_1},// step position information with time tag CP56Time2a	{IEC103_TI_C_CI_NA_3,IEC104_TI_C_CI_NA_1},	{INVALIDATE_TI			,INVALIDATE_TI},//end mark ,don't modify it};const IEC_COT_CODE	C_COT_Code_List[]={	{9,6},	{8,8},	{9,9},	{20,20},	{31,31},	{40,40},	{42,42},	{0xff,0xff},};const IEC_COT_CODE	M_COT_Code_List[]={	{IEC103_COT_M_per		,IEC104_COT_M_spont},	//break	{IEC103_COT_M_cyc		,IEC104_COT_M_cyc},		//cycle	{IEC103_COT_M_resetFCB	,IEC104_COT_M_init},	{IEC103_COT_M_resetCU	,IEC104_COT_M_init},	{IEC103_COT_M_setup		,IEC104_COT_M_init},	{IEC103_COT_M_powerON	,IEC104_COT_M_init},	{IEC103_COT_M_testMODE	,IEC104_COT_M_spont},	{IEC103_COT_M_synCLOCK	,IEC104_COT_M_acton},	{IEC103_COT_M_totalQUERY,IEC104_COT_M_introgen},	{IEC103_COT_M_queryEND	,IEC104_COT_M_actterm},	{IEC103_COT_M_localOP	,IEC104_COT_M_init},	{IEC103_COT_M_remoteOP	,IEC104_COT_M_acton},	{IEC103_COT_M_actcon		,IEC104_COT_M_acton},	{IEC103_COT_M_deactcon	,IEC104_COT_M_deact},	{IEC103_COT_M_disturbD	,IEC104_COT_M_spont},	{IEC103_COT_M_GenActCon	,IEC104_COT_M_spont},	{IEC103_COT_M_Gendeactcon ,IEC104_COT_M_spont},	{IEC103_COT_M_opendeactcon,	0x47},	{IEC103_COT_M_countdectcon ,0x47},	{IEC103_COT_M_intro5		,IEC104_COT_M_spont},	{IEC103_COT_M_intro6		,IEC104_COT_M_spont},	{0xff,0xff},};const	unsigned char RT_TCPTI_List[]={	IEC103_TI_M_SYN_TA_3, //ASDU_6		IEC103_TI_C_GRC_NA_3, //ASDU_20		IEC103_TI_C_SET_NA_3, //ASDU_61		IEC103_TI_C_DC_NA_3,  //ASDU_64		IEC103_TI_C_RC_NA_3,		IEC103_TI_C_VER_1,    //ASDU_60		0xff,};const	unsigned char RT_104TI_List[]={	IEC104_TI_C_CS_NA_1, //ASDU_103		IEC104_TI_C_DC_NA_1, //ASDU_46		IEC104_TI_C_RC_NA_1, //ASDU_47		IEC104_TI_C_SE_NA_1, //ASDU_48		IEC104_TI_C_SE_NB_1, //ASDU_49		IEC104_TI_C_SE_NC_1, //ASDU_50		IEC104_TI_C_RD_NA_1, //ASDU_102		IEC104_TI_C_SC_NA_1, //ASDU_45		0xff,};unsigned int IEC_Phase_Sel(unsigned char ucPhase103);int	IEC_RT_104(unsigned char ucTI){	int i;	for (i=0 ; RT_104TI_List[i] != 0xff ; i++)	{		if (RT_104TI_List[i] == ucTI)		{			return 1;		}	}	return 0;}int	IEC_RT_103(unsigned char ucTI){	int i;	for (i=0 ; RT_TCPTI_List[i] != 0xff ; i++)	{		if (RT_TCPTI_List[i] == ucTI)		{			return 1;		}	}	return 0;}unsigned int IEC_Phase_Sel(unsigned char ucPhase103){	unsigned int uPhase104 =ERROR_PHASE;	int i;	for (i=0; Phase_Sel_Table[i].m_PS_103 !=0xff ;i++)	{		if (Phase_Sel_Table[i].m_PS_103 == ucPhase103)		{			return Phase_Sel_Table[i].m_PS_104;		}	}	return ERROR_PHASE;}/*Breaker Control Command(DCC) Bit Function*//*BIT	 (07	 06)		(05 04 03 02)		(01 00)		*//*		  0-exective		impulse time		0-unuseful  *//*		  1-unuseful							1-open		*//*		  2-select								2-close		*//*		  3-undo								3-RFU(Reserve for Future Use)  */ /*FUNCTION	:change data form IEC103 protocol to IEC104 protocol(for operator&remote station)*//*INPUT PARAMETER:   puc104			--dest data buffer address*//*					 puc103			--source data buffer address*//*OUTPUT		 :   				--length of dest data buffer*/int	   IEC_Frame_103To104(unsigned char *puc104,unsigned char *puc103){	CurrentTime time;	GW_Global	*pGlobal = &gwGlobal;	unsigned char ucTI104,ucTI103,ucInf103,ucCOT103,ucData;	unsigned char ucADDR,TempYC[2],YxState;	unsigned long uInf104;	unsigned int  uCOT104;	unsigned long uBase;	int i,m,index,offset,iPort,uInf_Modbus;	unsigned char ucLen=0;	unsigned char *p1 = puc104;	unsigned char *p2 = puc103;	unsigned char ucSect = *(p2+IEC103_OFFSET_COMADDR);		ucTI103		= *(p2+IEC103_OFFSET_TI);	ucInf103	= *(p2+IEC103_OFFSET_INF);	ucCOT103	= *(p2+IEC103_OFFSET_COT);	uCOT104	= IEC_COT_103To104(*(p2+IEC103_OFFSET_COT));	*p1	=START_CODE2;	*(p1+2)	=0;	*(p1+3) =0;	*(p1+4)	=0;	*(p1+5) =0;	*(p1+IEC104_OFFSET_VSQ)		= *(p2+IEC103_OFFSET_VSQ) ^ 0x80;			//SQ Bit reserve	ucADDR						= *(p2+IEC103_OFFSET_ADDR);	index							= SUB_AddrToIndex(ucADDR);	iPort							= SUB_AddrToPort(ucADDR);	uInf104							= 0;	*(p1+IEC104_OFFSET_LEN)		= 0;	time = GetTime();	switch(ucTI103)	{	case IEC103_TI_M_TME_TA_3:				// measure value with relative time tag,ASDU_4.		*(p1+IEC104_OFFSET_TI)		= IEC104_TI_M_EP_TF_1;		*(p1+IEC104_OFFSET_VSQ)		= 1;		*(p1+IEC104_OFFSET_COT)		= IEC104_COT_M_spont;		*(p1+IEC104_OFFSET_COT+1)	= 0;		break;	case IEC103_TI_M_IRC_NA_3:			//load version,ASDU_5		break;	case IEC103_TI_M_MEII_NA_3:			//measure value,ASDU_9	case IEC103_TI_M_MEVII_NA_3:		//measure value for measure&control,ASDU_50		*(p1+IEC104_OFFSET_TI)		=IEC104_TI_M_ME_NA_1;		ucLen =(*(p2+IEC103_OFFSET_VSQ)) & 0x7F;		if(*(p2+IEC103_OFFSET_VSQ) & 0x80)		{			*(p1+IEC104_OFFSET_VSQ)	=ucLen;			for (i=0 ; i< ucLen ; i++)			{				ucInf103 = *(p2+IEC103_OFFSET_INF+3*i);				if (pGlobal->Protocol_Version == XJ_IEC_1)				{					uBase	=0x701;				}				else				{					uBase	=0x4001;				}				/*				WFB-822: ASDU_9(INF=148,COM=1):				Ia,Ib,Ic,Ua,Ub,Uc,P,Q,f				ASDU_50(INF=101,COM=2):				UAB,UBC,UCA,COS,U2,3U0,CLA,CLB,CLC				if((ucADDR==8)&&(ucTI103==9))				{				printf("ASDU_9 : ucInf103=%d \n",ucInf103);				for(m=0;m<*(puc103+1)+6;m++)				{				printf("%02X ",*(puc103+m));				}				printf("\n");				}				printf("ASDU_%d : ucInf103=%d \n",ucTI103,ucInf103);				*/				if(ucInf103<148)				{					uInf104 =uBase+(ucInf103-92);				}				else				{					uInf104 =uBase+(ucInf103-148);				}				*(p1+IEC104_OFFSET_INF+i*6+0)	= uInf104 & 0xff;				*(p1+IEC104_OFFSET_INF+i*6+1)	= (uInf104 >> 8) & 0xff;				*(p1+IEC104_OFFSET_INF+i*6+2)	= (uInf104 >> 16) & 0xff;				*(p1+IEC104_OFFSET_INF+i*6+3)	= *(p2+IEC103_OFFSET_INF+3*i+1);				*(p1+IEC104_OFFSET_INF+i*6+4)	= *(p2+IEC103_OFFSET_INF+3*i+2);				*(p1+IEC104_OFFSET_INF+i*6+5)	= 0;				uInf_Modbus = FindPointInf(YC_Msg, ucADDR, ucSect, ucInf103);				if( uInf_Modbus >=0 ) 				{					TempYC[0] = *(p2+IEC103_OFFSET_INF+3*i+2);					TempYC[1] = *(p2+IEC103_OFFSET_INF+3*i+1);					RefreshDateData(YC_Msg, uInf_Modbus, &TempYC[0]);				}			}			uInf104	= (*(p1+IEC104_OFFSET_INF+2) << 16) + (*(p1+IEC104_OFFSET_INF+1) << 8)	+ (*(p1+IEC104_OFFSET_INF));			*(p1+IEC104_OFFSET_LEN)	= MIN_IEC104_FRAMELEN + 6*ucLen - 3;		}		else		{			*(p1+IEC104_OFFSET_VSQ)		= 0x80 | (*(p2+IEC103_OFFSET_VSQ));			if   (pGlobal->Protocol_Version	== XJ_IEC_1)			{				uBase	=0x701;			}			else			{				uBase	=0x4001;			}			if (ucInf103<148)			{				uInf104 =uBase+(ucInf103-92);			}			else			{				uInf104 =uBase+(ucInf103-148);			}			*(p1+IEC104_OFFSET_INF+0)	= uInf104 & 0xff;			*(p1+IEC104_OFFSET_INF+1)	= (uInf104 >> 8) & 0xff;			*(p1+IEC104_OFFSET_INF+2)	= (uInf104 >> 16) & 0xff;			for (i=0 ; i< ucLen ; i++)			{				*(p1+IEC104_OFFSET_CONTEXT+i*3+0)	= *(p2+IEC103_OFFSET_CONTEXT+i*2);				*(p1+IEC104_OFFSET_CONTEXT+i*3+1)	= *(p2+IEC103_OFFSET_CONTEXT+i*2+1);				*(p1+IEC104_OFFSET_CONTEXT+i*3+2)	= 0;				uInf_Modbus = FindPointInf(YC_Msg, ucADDR, ucSect, ucInf103+i);				if( uInf_Modbus >=0 ) 				{					TempYC[0] = *(p2+IEC103_OFFSET_CONTEXT+i*2+1);					TempYC[1] = *(p2+IEC103_OFFSET_CONTEXT+i*2);					RefreshDateData(YC_Msg, uInf_Modbus, &TempYC[0]);				}			}			*(p1+IEC104_OFFSET_LEN)	=MIN_IEC104_FRAMELEN+3*ucLen;		}		break;	case IEC103_TI_M_SYN_TA_3:				//clock synchronization command,ASDU_6											/*											*(p1+IEC104_OFFSET_TI)	=IEC104_TI_C_CS_NA_1;											*(p1+IEC104_OFFSET_VSQ)		=1;											uCOT104		=IEC104_COT_M_acton;											for (i=0 ; i<7 ; i++)											{											*(p1+IEC104_OFFSET_CONTEXT+i)	=*(p2+IEC103_OFFSET_CONTEXT+i);											}											*(p1+IEC104_OFFSET_LEN)	=MIN_IEC104_FRAMELEN+7;		*/		*(p1+IEC104_OFFSET_LEN)	=0;		break;	case IEC103_TI_M_TGI_NA_3:							//general inspect end,ASDU_8		*(p1+IEC104_OFFSET_TI)		=IEC104_TI_C_IC_NA_1;		*(p1+IEC104_OFFSET_VSQ)		=0x1;		*(p1+IEC104_OFFSET_CONTEXT)	=IEC104_QOI;				//QOI		*(p1+IEC104_OFFSET_LEN)		=MIN_IEC104_FRAMELEN +1;		break;	case IEC103_TI_M_TM_TA_3:				//Frame with time tag,ASDU_1		*(p1+IEC104_OFFSET_VSQ)	=(*(p2+IEC103_OFFSET_VSQ)) & 0x7f;		if ((ucCOT103 == IEC103_COT_M_actcon)			|| (ucCOT103 == IEC103_COT_M_deactcon))			//direct control confirm/deny		{			*(p1+IEC104_OFFSET_TI)		=IEC104_TI_C_DC_NA_1;			if (ucCOT103 == IEC103_COT_M_actcon)			{				uCOT104	=IEC104_COT_M_acton;			}			else			{				uCOT104	=IEC104_COT_M_deact;			}						for (i=0 ; i<3; i++)			{				uInf104	+= (SubDevice[iPort].SubStations[index].sub_ConfirmInf[i] << (i*8));			}			*(p1+IEC104_OFFSET_VSQ)	= 0x1;			*(p1+IEC104_OFFSET_CONTEXT)	=*(p2+IEC103_OFFSET_CONTEXT) & 0x7f;		//execute result			*(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN + 1;		}		else		{			if(pGlobal->Protocol_Version	== XJ_IEC_1)			{				uInf104	=2*ucInf103+1;			}			else			{				uInf104 =ucInf103+1;			}			if (ucCOT103 == IEC103_COT_M_totalQUERY)			{				*(p1+IEC104_OFFSET_TI)	=IEC104_TI_M_DP_NA_1;		//ASDU_3				*(p1+IEC104_OFFSET_CONTEXT)	=*(p2+IEC103_OFFSET_CONTEXT);				*(p1+IEC104_OFFSET_LEN) 	=MIN_IEC104_FRAMELEN + 1;//1 for spi(dpi)			}			else			{				*(p1+IEC104_OFFSET_TI)	=IEC104_TI_M_DP_TB_1;		//ASDU_31				for (i=0 ; i< 5 ; i++)			//spi(dpi),time				{					*(p1+IEC104_OFFSET_CONTEXT+i)	=*(p2+IEC103_OFFSET_CONTEXT+i);				}				*(p1+IEC104_OFFSET_CONTEXT+5)	=time.day;	//add time				*(p1+IEC104_OFFSET_CONTEXT+6)	=time.month;				*(p1+IEC104_OFFSET_CONTEXT+7)	=time.year;				*(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN + 8;//7 for time,1 for spi(dpi)			}		}
		uInf_Modbus = FindPointInf(YX_Msg, ucADDR, ucSect, ucInf103);
		if(uInf_Modbus>=0)
		{
			YxState = (*(p2+IEC103_OFFSET_CONTEXT)&3)-1;
			RefreshDateData(YX_Msg, uInf_Modbus, &YxState);
		}
		break;	case IEC103_TI_M_SP_TA_3:				//single-point information with time tag,ASDU_41	case IEC103_TI_M_DP_TA_3:				//double-point information with time tag,ASDU_43		*(p1+IEC104_OFFSET_VSQ)	=(*(p2+IEC103_OFFSET_VSQ)) & 0x7f;		if (ucTI103	== IEC103_TI_M_SP_TA_3)		//ASDU_41		{			*(p1+IEC104_OFFSET_TI)			=IEC104_TI_M_SP_TB_1;	//ASDU_30			uInf104	=ucInf103-148;		}		else		{					*(p1+IEC104_OFFSET_TI)	=IEC104_TI_M_DP_TB_1;	//ASDU_31			if   (pGlobal->Protocol_Version	== XJ_IEC_1)			{				uInf104	=(ucInf103-149)*2+1;			}			else			{				uInf104	=ucInf103-148;			}		}		for (i=0 ; i< 5 ; i++)			//spi(dpi),time		{			*(p1+IEC104_OFFSET_CONTEXT+i)	=*(p2+IEC103_OFFSET_CONTEXT+i);		}		*(p1+IEC104_OFFSET_CONTEXT+5)	=time.day;	//add time		*(p1+IEC104_OFFSET_CONTEXT+6)	=time.month;		*(p1+IEC104_OFFSET_CONTEXT+7)	=time.year;		*(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN + 8;//7 for time,1 for spi(dpi)

		ucLen = (*(p2+IEC103_OFFSET_VSQ))&0x7F;
		for(i=0;i<ucLen;i++)
		{
			ucInf103	= *(p2+IEC103_OFFSET_INF+6*i);
			uInf_Modbus = FindPointInf(YX_Msg,ucADDR, ucSect, ucInf103);
			if(uInf_Modbus>=0)
			{
				if(ucTI103==41)
					YxState = *(p2+IEC103_OFFSET_INF+6*i+1)&1;
				else
					YxState = (*(p2+IEC103_OFFSET_INF+6*i+1)&3)-1;
				RefreshDateData(YX_Msg, uInf_Modbus, &YxState);
			}
		}		break;				case IEC103_TI_M_TMR_TA_3:				//Frame with relative time tag,ASDU_2		// event of protection equipment

⌨️ 快捷键说明

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