📄 nz_sf.c
字号:
*(p1+TCP_OFFSET_ADDR) =SubDevice[iPort].SubStations[index].sub_address; return (*(p1+1)+2); case 2: *(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) = 2; //SOE在2号扇区 *(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_SF103(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); }void Send_SFBH_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 = SF103_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 = SF103_To_XJTCP(pucIEC104,pucIEC103); if(ret>0) WriteMsgToShareMem(iPort,ret,pucIEC104,EngineerStation,YX_Msg); } else { if (CONN_IsEngStation(NetGroup,index)) ret = SF103_To_XJTCP(pucIEC104,pucIEC103); else ret = SF103_To_XJ104(pucIEC104,pucIEC103); if(ret > 0) CONN_Send104Data(NetGroup,index,pucIEC104,ret); }}int SFBH_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_SFBH_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))) { ret =IEC_PackInspectEnd_TCP(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address,1, pSub->sub_FUN,pucCMD[IEC103_OFFSET_CONTEXT]); CONN_Send104Data(NetGroup,iConnect_inspect,IEC104DataBuf_M,ret); } iConnect_inspect=0xff; } if(SubDevice[iPort].SubStations[index].sub_DZendflag ==1) { SYS_Delay(20); SubDevice[iPort].SubStations[index].sub_DZendflag = 0; ucINF =100; ret = IEC_PackEND_TCP(IEC104DataBuf_M,SubDevice[iPort].SubStations[index].sub_address, ucGlobalCPU,SubDevice[iPort].SubStations[index].sub_FUN ,ucINF); CONN_Send104Data(NetGroup,iConnect_dz,IEC104DataBuf_M,ret); iConnect_dz=0xff; } break; default : ucCS =0; break; } if (ucCS & _ACD) //if has first user data { iSend = LocalIEC103Cmd(REQUIREFIRSTDATA, ucADDR, pucCMD); } else //if no first user data { pSub->sub_CS =REQUIRESECONDDATA; if(ucCS==0x0E) pSub->sub_CS=RESETCU; //装置回答链路未准备好,复位装置通信单元 } break; } else { pSub->sub_FailNum++; ucCS = 0; } } if (i==3) { if (pSub->sub_state == SUB_STATE_ONLINE) { pSub->sub_state =SUB_STATE_FAIL; } break; } }while(ucCS & _ACD); //loop until have no first user data return 0;}/////////////////////Modified by yanliming 2005.10.14 for DGT801////////////////////int Get_DGT801_Frame(unsigned char *pFrame, int iPort, int uIndex){ int CmdNum = 3 ; unsigned short CRC_Check; unsigned char CmdBuf[] = {0x3A, 0x63, 0x30 }; unsigned char ucAddr = SubDevice[iPort].SubStations[uIndex].sub_YX_NUM&0xff; unsigned char SubState = SubDevice[iPort].SubStations[uIndex].sub_state; unsigned char FunOrder = SubDevice[iPort].SubStations[uIndex].sub_FunOrder; *(pFrame+0) = ucAddr; if(SubState != SUB_STATE_ONLINE)//通讯没有恢复时,发送握手信息 { /* 00:地址 01:06H 02:00H CRC校验码 */ *(pFrame+1) = 0x06; *(pFrame+2) = 0x00; CRC_Check = DGT801CRC(pFrame, 3); *(pFrame+3) = HIBYTE(CRC_Check); *(pFrame+4) = LOBYTE(CRC_Check); return 5; } else { FunOrder = (FunOrder+1)%CmdNum; *(pFrame+1) = CmdBuf[FunOrder]; *(pFrame+2) = 0x00; CRC_Check = DGT801CRC(pFrame, 3); *(pFrame+3) = HIBYTE(CRC_Check); *(pFrame+4) = LOBYTE(CRC_Check); SubDevice[iPort].SubStations[uIndex].sub_FunOrder = FunOrder; return 5; }}int XJ104_To_DGT801(int iPort ,unsigned char *puc103,unsigned char *puc104){ int ret = puc104[1] + 2 ; memcpy(puc103, puc104, ret); return ret;}int XJTCP_To_DGT801(int iPort ,unsigned char *puc103, unsigned char *pucTCP){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -