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

📄 nz_sf.c

📁 泵站系统屏与屏之间的通信
💻 C
📖 第 1 页 / 共 5 页
字号:
#include    "include/mcuapi.h"//遥信,遥测,定值,压板投退,SOE#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	    0xB08//===============================================================================#define DZSectionSwitch        		2   // 定值区切换 #define DZChange          			3          // 定值修改#define SoftTripCtl            		6   // 软压板投退#define SignalReset            		19           // 信号复归 #define settingNUM_max             	20#define DZtotalnum            		50#define ctlwordNUM_max              30//================================================================================unsigned char ucGlobalCPU;int iConnect_dz = 0xff;int iConnect_inspect = 0xff;//================================================================================// { unsigned char   ucGroup , unsigned int     uiGIN,//   unsigned char   ucInfTcp, unsigned long  ulInf104 }const IEC_INF_CODE INF_List[]={ 	{15,0x13, 0x13,0x14}, 		//信号复归 	{6,0x0601,0xab,0xac}, 	//主保护压板	{6,0x0602,0xac,0xad}, 	//距离保护压板	{6,0x0603,0xad,0xae}, 	//零序保护压板	{6,0x0604,0xae,0xaf}, 		//闭重三跳压板		{2,0x0201,0x64,0x65}, 	//切换到定值区0	{2,0x0201,0x65,0x66},	{2,0x0201,0x66,0x67},	{2,0x0201,0x67,0x68},	{2,0x0201,0x68,0x69},	{2,0x0201,0x69,0x6a},	{2,0x0201,0x6a,0x6b},	{2,0x0201,0x6b,0x6c},		//切换到定值区7	{0xff,0,0,0}};int NZ103_To_XJ104(unsigned char *puc104,unsigned char *puc103){	CurrentTime CurTime;	GW_Global *pGlobal=&gwGlobal;	int iPort,i,index;	unsigned char ucTI104,ucTI103,ucInf103,ucCOT103,ucData;	unsigned char *p1=puc104,*p2=puc103,ucADDR;	unsigned long ulInf104,uBase;	unsigned int  uiCOT104,uiINF103;	unsigned int  num,offset,ucLen,wValue;		ucADDR=*(p2+IEC103_OFFSET_ADDR);	index = SUB_AddrToIndex(ucADDR);	iPort = SUB_AddrToPort(ucADDR);		ucTI103  = *(p2+IEC103_OFFSET_TI);	ucInf103 = *(p2+IEC103_OFFSET_INF);	ucCOT103 = *(p2+IEC103_OFFSET_COT);	uiCOT104 = IEC_COT_103To104(*(p2+IEC103_OFFSET_COT));	ulInf104 = 0;	if((ucInf103==0x1d)&&(ucCOT103==9))   //南自不上送总召唤结束帧,需自设一个总召唤结束标志		SubDevice[iPort].SubStations[index].sub_InspectEnd=1;   //装置响应总召唤上送数据为固定的一张表,INF=0x1d是最后一个数据		*p1 = START_CODE2;	*(p1+2) = 0;	*(p1+3) = 0;	*(p1+4) = 0;	*(p1+5) = 0;	*(p1+IEC104_OFFSET_LEN)  = 0;	*(p1+IEC104_OFFSET_VSQ)  = *(p2+IEC103_OFFSET_VSQ) ^ 0x80; //SQ Bit reserve	*(p1+IEC104_OFFSET_COT)  = uiCOT104 & 0xff;	*(p1+IEC104_OFFSET_COT+1) = (uiCOT104 >> 8) & 0xff;	*(p1+IEC104_OFFSET_SECT) = 1;    //*(p2+IEC103_OFFSET_COMADDR);	*(p1+IEC104_OFFSET_ADDR) = SubDevice[iPort].SubStations[index].sub_address;	switch(ucTI103)	{	case IEC103_TI_M_TM_TA_3://告警信号\保护动作\硬压板都用ASDU_1		CurTime = GetTime();		if(ucInf103>=80)			//硬压板遥信状态报文或告警信号		{			ulInf104 = (unsigned long)ucInf103;			*(p1+IEC104_OFFSET_INF)  =ulInf104&0xff;			*(p1+IEC104_OFFSET_INF+1) =(ulInf104>>8)&0xff;			*(p1+IEC104_OFFSET_INF+2) =(ulInf104>>16)&0xff;			if(ucCOT103 ==1)			{				*(p1+IEC104_OFFSET_TI) =IEC104_TI_M_DP_TB_1;  //ASDU_31,0x1F				for(i=0 ; i< 5 ; i++)   				{					*(p1+IEC104_OFFSET_CONTEXT+i)=*(p2+IEC103_OFFSET_CONTEXT+i);				}				*(p1+IEC104_OFFSET_CONTEXT+5) = CurTime.day; 				*(p1+IEC104_OFFSET_CONTEXT+6) = CurTime.month;				*(p1+IEC104_OFFSET_CONTEXT+7) = CurTime.year;				*(p1+IEC104_OFFSET_LEN) = MIN_IEC104_FRAMELEN + 8;//7 for CurTime,1 for spi(dpi)			}			else if(ucCOT103==9)			{				*(p1+IEC104_OFFSET_TI)      = 3;  				*(p1+IEC104_OFFSET_CONTEXT) = *(p2+IEC103_OFFSET_CONTEXT);				*(p1+IEC104_OFFSET_LEN)     = MIN_IEC104_FRAMELEN + 1;			} 		}		else //保护动作 ucInf103<80       		{			*(p1+IEC104_OFFSET_TI) = IEC104_TI_M_EP_TD_1;  //ASDU_38			ulInf104 = (unsigned long)ucInf103;			*(p1+IEC104_OFFSET_VSQ)     =0x01; 			*(p1+IEC104_OFFSET_INF)		=ulInf104&0xff;			*(p1+IEC104_OFFSET_INF+1)  =(ulInf104>>8)&0xff;			*(p1+IEC104_OFFSET_INF+2)  =(ulInf104>>16)&0xff;						*(p1+IEC104_OFFSET_CONTEXT)    =*(p2+IEC103_OFFSET_CONTEXT);  //DPI			*(p1+IEC104_OFFSET_CONTEXT+1)  =0;//*(p2+IEC103_OFFSET_CONTEXT+1);			*(p1+IEC104_OFFSET_CONTEXT+2)  =0;//*(p2+IEC103_OFFSET_CONTEXT+2);			for (i=0 ; i<4 ; i++)			{				*(p1+IEC104_OFFSET_CONTEXT+3+i) = *(p2+IEC103_OFFSET_CONTEXT+5+i); //skip fault number			}			*(p1+IEC104_OFFSET_CONTEXT+7) =CurTime.day;			*(p1+IEC104_OFFSET_CONTEXT+8) =CurTime.month;			*(p1+IEC104_OFFSET_CONTEXT+9) =CurTime.year;			//7 for CurTime,1 for dpi,2 for relative CurTime			*(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN + 10;		}		break;	case 10: // 闫黎明添加		if((*(p2+IEC103_OFFSET_INF)==241)&&(*(p2+IEC103_OFFSET_GIN) ==0x01))//读取保护测量值		{			*(p1+IEC104_OFFSET_TI) =IEC104_TI_M_ME_NA_1;			ucLen =(*(p2+IEC103_OFFSET_VSQ)) & 0x7F;			*(p1+IEC104_OFFSET_VSQ) = 0x80|(*(p2+IEC103_OFFSET_VSQ));			ulInf104 = 0x4001+ucInf103;			*(p1+IEC104_OFFSET_INF) =ulInf104 & 0xff;			*(p1+IEC104_OFFSET_INF+1) =(ulInf104 >> 8) & 0xff;			*(p1+IEC104_OFFSET_INF+2) =(ulInf104 >> 16) & 0xff;			for (i=0 ; i< ucLen ; i++)			{				wValue = GetYCValue(p2+20+i*10);				*(p1+IEC104_OFFSET_CONTEXT+i*3)  =wValue%256;				*(p1+IEC104_OFFSET_CONTEXT+i*3+1) =wValue/256;				*(p1+IEC104_OFFSET_CONTEXT+i*3+2) =0;			}			*(p1+IEC104_OFFSET_LEN) = MIN_IEC104_FRAMELEN+3*ucLen;		}		break;	default :		break;	}	return (*(p1+IEC104_OFFSET_LEN)+2);}unsigned int GetYCValue(unsigned char *pFdata){	float fValue;	unsigned int wValue;	memcpy(&fValue,pFdata,4);	fValue*=100;	if(fValue<0)	{		if((fabs(fValue)-(long)fabs(fValue))>=0.5)			fValue-=1;		fValue=fabs(fValue);		wValue=~((unsigned int)fValue) +1;	}	else	{		if(fValue-(long)fValue>=0.5)			fValue+=1;		wValue=(unsigned int)fValue;	}	return wValue;}/*FUNCTION :change data form IEC104 protocol to IEC103 protocol(for operator&remote station)*//*INPUT PARAMETER:   pucIEC103  --dest data buffer address*//*      pucIEC104   --source data buffer address*//*OUTPUT   :         --length of dest data buffer*/int XJ104_To_NZ103(int iPort,unsigned char *puc103,unsigned char *puc104){	CurrentTime   CurTime;	GW_Global   *pGlobal =&gwGlobal;	int           i,index;	unsigned char ucTI104,ucTI103,ucCOT104;	unsigned char *p1=puc103,*p2=puc104,sum,ucData;	unsigned int  uiInfRcs;	unsigned long ulInf104;	unsigned char ucFCB=0;	unsigned char ucADDR,ucGroup;		ucADDR = *(p2+IEC104_OFFSET_ADDR);	index = SUB_AddrToIndex(ucADDR);	ucFCB = SUB_GetFCB(ucADDR);	ulInf104 = ((unsigned long)*(p2+IEC104_OFFSET_INF+1)&0xff) * 0x100 		+((unsigned long)*(p2+IEC104_OFFSET_INF)&0xff);	ucCOT104= *(p2+IEC104_OFFSET_COT);	ucTI104  = *(p2+IEC104_OFFSET_TI);		*p1 =*(p1+3) =START_CODE2;	*(p1+IEC103_OFFSET_CODE) =0x53;	if(ucADDR!=BROADCAST_ADDR)	{		*(p1+IEC103_OFFSET_ADDR) = ucADDR;	}	else	{		*(p1+IEC103_OFFSET_ADDR)  = 0xff;	}	*(p1+IEC103_OFFSET_VSQ)   =*(p2+IEC104_OFFSET_VSQ) ^ 0x80;	*(p1+IEC103_OFFSET_COT)   =IEC_COT_104To103(*(p2+IEC104_OFFSET_COT));	*(p1+IEC103_OFFSET_COMADDR) =*(p2+IEC104_OFFSET_ADDR) ;	*(p1+IEC103_OFFSET_FUN)   =SUB_GetFUN(*(p2+IEC104_OFFSET_ADDR));	*(p1+IEC103_OFFSET_INF)   =0x0;	switch(ucTI104)	{	case IEC104_TI_C_CS_NA_1:           //clock synchronization command,ASDU_103		CurTime = GetTime();		*(p1+IEC103_OFFSET_CODE)      	=0x44;  //*(p1+4)		*(p1+IEC103_OFFSET_ADDR)    		=0xFF;		*(p1+IEC103_OFFSET_TI)   			=6;    //IEC103_TI_M_SYN_TA_3;		*(p1+IEC103_OFFSET_COT)   		=8;    //时间同步		*(p1+IEC103_OFFSET_COMADDR) 	=0xFF;		*(p1+IEC103_OFFSET_FUN)   		=0xFF;		*(p1+IEC103_OFFSET_INF)   		=0x00;		*(p1+IEC103_OFFSET_CONTEXT)  	=CurTime.mSecond & 0xff;		*(p1+IEC103_OFFSET_CONTEXT+1) =(CurTime.mSecond >> 8) & 0xff;		*(p1+IEC103_OFFSET_CONTEXT+2) =CurTime.minute;		*(p1+IEC103_OFFSET_CONTEXT+3) =CurTime.hour;		*(p1+IEC103_OFFSET_CONTEXT+4) =CurTime.day;		*(p1+IEC103_OFFSET_CONTEXT+5) =CurTime.month;		*(p1+IEC103_OFFSET_CONTEXT+6) =CurTime.year;		*(p1+1) = *(p1+2) = MIN_IEC103_FRAMELEN+7;  		break;   	case IEC104_TI_C_IC_NA_1:        //interrogation command,general inspect ,ASDU_100,总召唤启动		SubDevice[iPort].SubStations[index].sub_SCN104   =*(p2+IEC104_OFFSET_CONTEXT); 		*(p1+IEC103_OFFSET_TI)       		=IEC103_TI_C_IGI_NA_3;         //7		*(p1+IEC103_OFFSET_COT)       		=IEC103_COT_M_totalQUERY;      //9		*(p1+IEC103_OFFSET_FUN)       		=0xFF;		*(p1+IEC103_OFFSET_INF)      		=0x00;		*(p1+IEC103_OFFSET_CONTEXT)   	=SubDevice[iPort].SubStations[index].sub_SCN104 ;    //扫描序号?		*(p1+1)  = *(p1+2)    					=MIN_IEC103_FRAMELEN+1; 		break; 	case IEC104_TI_C_DC_NA_1:        //double-point command,ASDU_46,双点遥控命令		if (SUB_DeviceOn( *(p2+IEC104_OFFSET_ADDR) ) ||*(p2+IEC104_OFFSET_ADDR)==0xff)		{                                                                              			if( ((pGlobal->Protocol_Version == XJ_IEC_1)&&(ulInf104==0xb14)) ||((pGlobal->Protocol_Version == XJ_IEC_2)&&(ulInf104==0x6014)) )  //信号复归                                                     			{                                                                                           				*(p1+IEC103_OFFSET_TI)  		=20;     //IEC103_TI_C_GRC_NA_3;一般命令                   				*(p1+IEC103_OFFSET_COT)  	=20;   				*(p1+IEC103_OFFSET_INF)     	=19;          				*(p1+IEC103_OFFSET_CONTEXT) =*(p2+IEC104_OFFSET_CONTEXT);                              				*(p1+IEC103_OFFSET_CONTEXT+1) =0;    //SII				*(p1+1)=*(p1+2)             =MIN_IEC103_FRAMELEN+2;                                    			}                                                                                           		}                                                                            		break;                                                                                      	default :		return 0; 	}	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;	}}/*=====================================================================*//*unsigned char num:   定值个数/*unsigned char offset:/*=====================================================================*/void DZValue103_TCP(unsigned char num,unsigned char offset,unsigned char *p1,unsigned char *p2){	float d;	unsigned char *pucDZtype;	unsigned int i,j,k,uiWidth;	pucDZtype = DZtype_buf;	for(i=0;i<num;i++)	{		uiWidth =(*(p2+offset+4))*(*(p2+offset+5));		if(*(p2+offset+3)==0x07)                        //数据1		{ 			*(pucDZtype+offset1+i+1) = DZTYPE_7_4; 			d = CtoF(p2+offset+6);			*(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int)d & 0xff ; 			*(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ( (unsigned int)d >> 8 ) & 0xff ;  			*(p1+TCP_OFFSET_CONTEXT+2+i*3+2) =  0x10; 			if( ( d*1000) <= 0xffff )			{				d = d*1000;				*(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int)d & 0xff ; 				*(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ((unsigned int)d >> 8 ) & 0xff ; 				*(p1+TCP_OFFSET_CONTEXT+2+i*3+2) = 0x13;   							}                             			else if( ( d*100) <= 0xffff )			{				d = d*100;				*(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int) d  & 0xff ; 				*(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ( (unsigned int)d >> 8 ) & 0xff ; 				*(p1+TCP_OFFSET_CONTEXT+2+i*3+2) = 0x12;							}                                       			else if( ( d*10) <= 0xffff )			{				d = d*10;				*(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int)d & 0xff ; 				*(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ( (unsigned int)d >> 8 ) & 0xff ; 				*(p1+TCP_OFFSET_CONTEXT+2+i*3+2) =  0x11;			}		}		else if(*(p2+offset+3)==0x03&&(*(p2+offset+4)==0x02))      //数据2		{			*(p1+TCP_OFFSET_CONTEXT+2+i*3) =*(p2+offset+6);			*(p1+TCP_OFFSET_CONTEXT+2+i*3+1) =*(p2+offset+6+1);             			*(p1+TCP_OFFSET_CONTEXT+2+i*3+2) =0x10;  			*(pucDZtype+offset1+i+1) = DZTYPE_3_2; 					}  		else if(*(p2+offset+3)==0x03&&(*(p2+offset+4)==0x01))      //控制字		{						*(p1+TCP_OFFSET_CONTEXT+2+i*3)   =*(p2+offset+6);			*(p1+TCP_OFFSET_CONTEXT+2+i*3+1) =0;             			*(p1+TCP_OFFSET_CONTEXT+2+i*3+2) =0x00;  			*(pucDZtype+offset1+i+1)   = DZTYPE_3_1; 		}       		offset+= (6+uiWidth );	}	offset1+=num;  } /*=====================================================================*//*FUNCTION :将IEC103协议转为TCP103/*PARAMETER:pucTCP/*          puc103/*RETURN   :TCP103总的字节个数/*=====================================================================*/int NZ103_To_XJTCP(unsigned char *pucTCP, unsigned char *puc103){	CurrentTime  CurTime;	int index,iPort;	unsigned int  i,pos;	unsigned char  ucADDR,totalnum =0,offset;	unsigned char ucTI,ucCOT103,ucInf103;	unsigned char *p1=pucTCP,*p2=puc103;	static unsigned char error=0;		CurTime = GetTime();	ucCOT103=*(p2+IEC103_OFFSET_COT);	ucInf103=*(p2+IEC103_OFFSET_INF);	ucADDR = *(p2+IEC103_OFFSET_ADDR);	iPort  = SUB_AddrToPort(ucADDR);	index = SUB_AddrToIndex(ucADDR);	*p1                       = START_CODE2;   //Start Code	*(p1+1)                   = *(p2+1)+4 ;  //Frame length	*(p1+TCP_OFFSET_CODE)     = 0;	*(p1+TCP_OFFSET_CODE+1)   = 0;	*(p1+TCP_OFFSET_CODE+2)   = 0;	*(p1+TCP_OFFSET_CODE+3)   = 0;    *(p1+TCP_OFFSET_VSQ)      = *(p2+IEC103_OFFSET_VSQ);	*(p1+TCP_OFFSET_COMADDR)  = 1;	*(p1+TCP_OFFSET_ADDR)     = SubDevice[iPort].SubStations[index].sub_address;	*(p1+TCP_OFFSET_FUN)      = SubDevice[iPort].SubStations[index].sub_FUN;	*(p1+TCP_OFFSET_INF)      = ucInf103;	ucTI = *(p2+IEC103_OFFSET_TI);	//南自装置没有总召唤结束报文,但报文顺序固定,0x1d是最后一个信息	if((ucInf103==0x1d)&&(ucCOT103==9))		SubDevice[iPort].SubStations[index].sub_InspectEnd=1;	switch(ucTI)	{ 	case 5:	case 23:		return 0;	case 10:    //通用分类命令响应 		if((*(p2+IEC103_OFFSET_INF)==241)&&(*(p2+IEC103_OFFSET_GIN) ==0x04))			// WBH500中GIN_Group=4:定值组,响应读定值,定值序号从1开始		{			*(p1+TCP_OFFSET_TI)        =61;  			*(p1+TCP_OFFSET_CONTEXT)  =ucDZcpu+0x01;  //定值区号:当前区			SubDevice[iPort].SubStations[index].sub_RII  =*(p2+IEC103_OFFSET_RII); 			if(*(p2+IEC103_OFFSET_COT)==43)  //无定值回答 			{

⌨️ 快捷键说明

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