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