?? iec.c
字號:
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 + -