📄 nz_sf.c
字号:
*(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 + -