?? iec.c
字號:
// with time tag CP56Time2a,ASDU_38 *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_EP_TD_1; *(p1+IEC104_OFFSET_VSQ) =0x1; if (pGlobal->Protocol_Version == XJ_IEC_1) { uInf104 =2*ucInf103+0x401; } else { uInf104 =ucInf103+0x1001; } *(p1+IEC104_OFFSET_CONTEXT+0) =*(p2+IEC103_OFFSET_CONTEXT+0);//DPI *(p1+IEC104_OFFSET_CONTEXT+1) =*(p2+IEC103_OFFSET_CONTEXT+1);// *(p1+IEC104_OFFSET_CONTEXT+2) =*(p2+IEC103_OFFSET_CONTEXT+2);//Relaitive time 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) =time.day; *(p1+IEC104_OFFSET_CONTEXT+8) =time.month; *(p1+IEC104_OFFSET_CONTEXT+9) =time.year; //7 for time,1 for dpi,2 for relative time *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN + 10;
ucInf103 += 0x100;
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; //single-point information without time tag,for general inspect,ASDU_40 case IEC103_TI_M_SP_NA_3: //double-point information without time tag,for general inspect,ASDU_42 case IEC103_TI_M_DP_NA_3: *(p1+IEC104_OFFSET_VSQ) =(*(p2+IEC103_OFFSET_VSQ)) | 0x80; if (ucTI103==IEC103_TI_M_SP_NA_3) { *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_SP_NA_1; uInf104 =ucInf103-148; } else { *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_DP_NA_1; if (pGlobal->Protocol_Version == XJ_IEC_1) { uInf104 =(ucInf103-149)*2+1; } else { uInf104 =ucInf103-148; } } for (i=0 ; i <(*(p2+IEC103_OFFSET_VSQ) & 0x7F) ; i++) { *(p1+IEC104_OFFSET_CONTEXT+i) =*(p2+IEC103_OFFSET_CONTEXT+i); } *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN +(*(p2+IEC103_OFFSET_VSQ) & 0x7F) ;
ucLen = (*(p2+IEC103_OFFSET_VSQ))&0x7F;
if(*(p2+IEC103_OFFSET_VSQ) & 0x80)
{
for(i=0;i<ucLen;i++)
{
ucInf103 = *(p2+IEC103_OFFSET_INF+2*i);
uInf_Modbus = FindPointInf(YX_Msg,ucADDR, ucSect, ucInf103);
if(uInf_Modbus>=0)
{
if(ucTI103==40)
YxState = *(p2+IEC103_OFFSET_INF+2*i+1)&1;
else
YxState = (*(p2+IEC103_OFFSET_INF+2*i+1)&3)-1;
RefreshDateData(YX_Msg, uInf_Modbus, &YxState);
}
}
}
else
{
for(i=0;i<ucLen;i++)
{
ucInf103 = *(p2+IEC103_OFFSET_INF)+i;
uInf_Modbus = FindPointInf(YX_Msg, ucADDR, ucSect, ucInf103);
if(uInf_Modbus>=0)
{
if(ucTI103==40)
YxState = *(p2+IEC103_OFFSET_CONTEXT+i)&1;
else
YxState = (*(p2+IEC103_OFFSET_CONTEXT+i)&3)-1;
RefreshDateData(YX_Msg, uInf_Modbus, &YxState);
}
}
} break; case IEC103_TI_C_GRC_NA_3: //ASDU_20 if (ucCOT103 == IEC103_COT_M_deactcon) { *(p1+IEC104_OFFSET_TI) =IEC104_TI_C_DC_NA_1; *(p1+IEC104_OFFSET_VSQ) =0x1; uCOT104 =IEC104_COT_M_PN | IEC104_COT_M_acton; for (i=0 ; i<3; i++) { uInf104 +=(SubDevice[iPort].SubStations[index].sub_ConfirmInf[i] << (i*8)); } *(p1+IEC104_OFFSET_CONTEXT) = (*(p2+IEC103_OFFSET_CONTEXT)) & 0x03; //execute result *(p1+IEC104_OFFSET_LEN) = MIN_IEC104_FRAMELEN + 1; } break; case IEC103_TI_C_DC_NA_3: //ASDU_64 case IEC103_TI_C_RC_NA_3: //ASDU_65 ucData = *(p2+IEC103_OFFSET_CONTEXT); if (pGlobal->Protocol_Version == XJ_IEC_1) { uInf104 = (ucInf103 -48)+ 0xB01; } else { if (ucTI103 == IEC103_TI_C_DC_NA_3) { uInf104 =(ucInf103-48)+0x6001; } else { uInf104 =(ucInf103-RC_BASE_103)+RC_BASE_104_2; } } if ((ucData & 0xC0) == 0xC0) //undo { uCOT104 =IEC104_COT_M_deactcon; } else { uCOT104 =IEC104_COT_M_acton; } if (ucCOT103 == IEC103_COT_M_deactcon) { uCOT104 |=0x40; } if (ucTI103 == IEC103_TI_C_DC_NA_3) { *(p1+IEC104_OFFSET_TI) =IEC104_TI_C_DC_NA_1; // double command } else { *(p1+IEC104_OFFSET_TI) =IEC104_TI_C_RC_NA_1;// regulating step command } *(p1+IEC104_OFFSET_VSQ) = 0x1; *(p1+IEC104_OFFSET_CONTEXT) = ucData; //DCC,RCC *(p1+IEC104_OFFSET_LEN) = MIN_IEC104_FRAMELEN+1; break; case IEC103_TI_C_CC_NA_3: ucData =*(p2+IEC103_OFFSET_CONTEXT); uInf104 =(ucInf103-48)+0x6001; if ((ucData & 0xC0) == 0xC0) //undo { uCOT104 =IEC104_COT_M_deactcon; } else { uCOT104 =IEC104_COT_M_acton; } if (ucCOT103 == IEC103_COT_M_deactcon) { uCOT104 |=0x40; } *(p1+IEC104_OFFSET_TI) =IEC104_TI_C_DC_NA_1; // double command *(p1+IEC104_OFFSET_VSQ) =0x1; ucData &=0x7; if (ucData>0) { ucData -=1; } ucData |=(*(p2+IEC103_OFFSET_CONTEXT) & 0xF8); *(p1+IEC104_OFFSET_CONTEXT) =ucData; //CCC *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN+1; break; case IEC103_TI_M_IT_NA_3: //integrated totals,ASDU_36 *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_IT_NA_1; uCOT104 =IEC104_COT_M_reqcogen; if (pGlobal->Protocol_Version == XJ_IEC_1) { uInf104 =0xC01; } else { uInf104 =0x6401; } ucLen =(*(p2+IEC103_OFFSET_VSQ)) & 0x7F; ucLen *=5; for (i= 0; i<ucLen; i++) { *(p1+IEC104_OFFSET_CONTEXT+i) =*(p2+IEC103_OFFSET_CONTEXT+i); } *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN+ucLen; break; case IEC103_TI_M_ST_TA_3: // step position information with time tag,ASDU_39 *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_ST_TB_1; if (pGlobal->Protocol_Version == XJ_IEC_1) { uInf104 =(ucInf103-76)+0xC81; } else { uInf104 =(ucInf103-76)+0x6601; } for (i=0 ; i<6 ; i++) { *(p1+IEC104_OFFSET_CONTEXT+i) =*(p2+IEC103_OFFSET_CONTEXT+i); } *(p1+IEC104_OFFSET_CONTEXT+6) =time.day; *(p1+IEC104_OFFSET_CONTEXT+7) =time.month; *(p1+IEC104_OFFSET_CONTEXT+8) =time.year; *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN + 9;//7 for time,2 for position break; case IEC103_TI_C_CI_NA_3: // counter interrogation command,ASDU_88 *(p1+IEC104_OFFSET_TI) =IEC104_TI_C_CI_NA_1; *(p1+IEC104_OFFSET_CONTEXT) =*(p2+IEC103_OFFSET_CONTEXT);//command if (ucCOT103 == 0x42) { uCOT104 =IEC104_COT_M_PN | IEC104_COT_M_acton; } else if (ucCOT103 == IEC103_COT_M_queryEND) { uCOT104 =IEC104_COT_M_actterm; } else { uCOT104 =IEC104_COT_M_acton; } *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN+1; break; case IEC103_TI_M_ST_NA_3: // step position information without time tag,ASDU_38 *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_ST_NA_1; *(p1+IEC104_OFFSET_VSQ) =(*(p2+IEC103_OFFSET_VSQ)) | 0x80;//information number if (pGlobal->Protocol_Version == XJ_IEC_1) { uInf104 =(ucInf103-76)+0xC81; } else { uInf104 =(ucInf103-76)+0x6601; } ucLen =(*(p2+IEC103_OFFSET_VSQ)) & 0x7F; ucLen *=2; for (i=0 ; i < ucLen ; i++) { *(p1+IEC104_OFFSET_CONTEXT+i) =*(p2+IEC103_OFFSET_CONTEXT+i); } *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN+ucLen; break; case IEC103_TI_C_SET_NA_3: //setting,ASDU_61 if ((ucInf103 == SET_S_PRE_RET) || (ucInf103 == SET_S_EXE_RET) || (ucInf103 == SET_S_UNDO_RET) || (ucInf103 == SET_A_QUERY)) { uInf104 =((*(p2+IEC103_OFFSET_CONTEXT) & 0x0f) << 8) +0x3001+(*(p2+IEC103_OFFSET_CONTEXT+1)); if (ucInf103 == SET_A_QUERY) { *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_ME_NB_1; ucLen =*(p2+IEC103_OFFSET_VSQ) & 0x7f; ucLen -=1; *(p1+IEC104_OFFSET_VSQ) =ucLen | 0x80; *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN+3*ucLen; if (ucCOT103 == IEC103_COT_M_actcon) { uCOT104 =IEC104_COT_M_req; } else if (ucCOT103 == IEC103_COT_M_deactcon) { uCOT104 =IEC104_COT_M_deactcon; } else if (ucCOT103 == IEC103_COT_M_queryEND) { *(p1+IEC104_OFFSET_LEN) =0; } for (i=0 ; i< ucLen ; i++) { *(p1+IEC104_OFFSET_CONTEXT+3*i) =*(p2+IEC103_OFFSET_CONTEXT+3*i+2); *(p1+IEC104_OFFSET_CONTEXT+3*i+1) =*(p2+IEC103_OFFSET_CONTEXT+3*i+3); *(p1+IEC104_OFFSET_CONTEXT+3*i+2) =0; } } else { ucLen =1; *(p1+IEC104_OFFSET_TI) =IEC104_TI_C_SE_NB_1; *(p1+IEC104_OFFSET_VSQ) =1; if (ucInf103 == SET_S_PRE_RET) { uCOT104 =IEC104_COT_M_acton; *(p1+IEC104_OFFSET_CONTEXT+2) =0x80; } else if (ucInf103 == SET_S_EXE_RET) { uCOT104 =IEC104_COT_M_acton; *(p1+IEC104_OFFSET_CONTEXT+2) =0x0; } else //set undo return { uCOT104 =IEC104_COT_M_deactcon; *(p1+IEC104_OFFSET_CONTEXT+2) =0x80; } *(p1+IEC104_OFFSET_CONTEXT) =*(p2+IEC103_OFFSET_CONTEXT+2); *(p1+IEC104_OFFSET_CONTEXT+1) =*(p2+IEC103_OFFSET_CONTEXT+2+1); *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN+3; } } break; case IEC103_TI_M_ASDU70:
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);
} if (ucCOT103 == IEC103_COT_M_per) { uInf104 =IEC_Phase_Sel(*(p2+IEC103_OFFSET_CONTEXT+13)); if (uInf104 !=ERROR_PHASE) { *(p1+IEC104_OFFSET_TI) =168; *(p1+IEC104_OFFSET_CONTEXT) =uInf104 & 0xff; *(p1+IEC104_OFFSET_CONTEXT+1) =0; offset =1; *(p1+IEC104_OFFSET_VSQ) =1; } else { *(p1+IEC104_OFFSET_TI) =166; *(p1+IEC104_OFFSET_CONTEXT) =*(p2+IEC103_OFFSET_CONTEXT); offset =0; *(p1+IEC104_OFFSET_VSQ) =1; } *(p1+IEC104_OFFSET_CONTEXT+offset+1) =*(p2+IEC103_OFFSET_CONTEXT+1); *(p1+IEC104_OFFSET_CONTEXT+offset+2) =*(p2+IEC103_OFFSET_CONTEXT+2); if (pGlobal->Protocol_Version == XJ_IEC_1) { uInf104 =2*ucInf103+0x401; } else { uInf104 =ucInf103+0x1001; } for (i=0 ; i< 7 ; i++) { *(p1+IEC104_OFFSET_CONTEXT+offset+3+i) =*(p2+IEC103_OFFSET_CONTEXT+5+i); } *(p1+IEC104_OFFSET_CONTEXT+offset+10) =(*(p2+IEC103_OFFSET_VSQ) & 0x7f) -1; for (i=0 ; i<(*(p1+IEC104_OFFSET_CONTEXT+offset+10) * 4) ; i++) { *(p1+IEC104_OFFSET_CONTEXT+offset+11+i) =*(p2+IEC103_OFFSET_CONTEXT+14+i); } *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN+(offset+11) +(*(p1+IEC104_OFFSET_CONTEXT+offset+10) * 4); } else { *(p1+IEC104_OFFSET_LEN) =0; } break; default : *(p1+IEC104_OFFSET_LEN) =0; break; } if ((*(p1+IEC104_OFFSET_LEN))<MIN_IEC104_FRAMELEN) { return 0; } else { *(p1+IEC104_OFFSET_SECT) =*(p2+IEC103_OFFSET_COMADDR); *(p1+IEC104_OFFSET_ADDR) =*(p2+IEC103_OFFSET_ADDR); *(p1+IEC104_OFFSET_INF) =uInf104 & 0xff; *(p1+IEC104_OFFSET_INF+1) =(uInf104 >> 8) & 0xff; *(p1+IEC104_OFFSET_INF+2) =(uInf104 >> 16) & 0xff; *(p1+IEC104_OFFSET_COT) =uCOT104 & 0xff; *(p1+IEC104_OFFSET_COT+1) =(uCOT104 >> 8) & 0xff; return (*(p1+1)+2); }}/*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 IEC_Frame_104To103(int iPort,unsigned char *puc103,unsigned char *puc104){ CurrentTime time; int i,m,GTError = 0; GW_Global *pGlobal = &gwGlobal; unsigned char sum, ucData, ucFCB =0; unsigned char ucTI104,ucTI103,ucInf103; unsigned char *p1 = puc103; unsigned char *p2 = puc104; unsigned char ucADDR = *(p2+IEC104_OFFSET_ADDR); int index = SUB_AddrToIndex(ucADDR); unsigned int uInf104 = (*(p2+IEC104_OFFSET_INF+1)) * 0x100 + (*(p2+IEC104_OFFSET_INF)); unsigned char ucCOT104 =*(p2+IEC104_OFFSET_COT); *p1 =*(p1+3) = START_CODE2; *(p1+IEC103_OFFSET_CODE) = 0x53; *(p1+IEC103_OFFSET_ADDR) = *(p2+IEC104_OFFSET_ADDR); *(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_SECT); *(p1+IEC103_OFFSET_FUN) = SUB_GetFUN(ucADDR); *(p1+IEC103_OFFSET_INF) = 0x0; ucFCB = SUB_GetFCB(ucADDR); ucTI104 = *(p2+IEC104_OFFSET_TI); switch(ucTI104) { case IEC104_TI_C_CS_NA_1: //clock synchronization command,ASDU_103 time = GetTime(); *(p1+IEC103_OFFSET_FUN) = 0xFF; *(p1+1) = *(p1+2) = MIN_IEC103_FRAMELEN+7; *(p1+IEC103_OFFSET_TI) = IEC103_TI_M_SYN_TA_3; *(p1+IEC103_OFFSET_COT) = IEC103_COT_M_synCLOCK; *(p1+IEC103_OFFSET_VSQ) = 0x81; *(p1+IEC103_OFFSET_CONTEXT) = LOBYTE(time.mSecond); *(p1+IEC103_OFFSET_CONTEXT+1) = HIBYTE(time.mSecond); *(p1+IEC103_OFFSET_CONTEXT+2) = LOBYTE(time.minute); *(p1+IEC103_OFFSET_CONTEXT+3) = LOBYTE(time.hour); *(p1+IEC103_OFFSET_CONTEXT+4) = LOBYTE(time.day); *(p1+IEC103_OFFSET_CONTEXT+5) = LOBYTE(time.month); *(p1+IEC103_OFFSET_CONTEXT+6) = LOBYTE(time.year); break; case IEC104_TI_C_IC_NA_1: //interrogation command,general inspect ,ASDU_100 *(p1+IEC103_OFFSET_FUN) = 0xFF; *(p1+1) = *(p1+2) = MIN_IEC103_FRAMELEN+1; *(p1+IEC103_OFFSET_TI) = IEC103_TI_C_IGI_NA_3; *(p1+IEC103_OFFSET_VSQ) = 0x81; *(p1+IEC103_OFFSET_COT) = IEC103_COT_M_totalQUERY; *(p1+IEC103_OFFSET_CONTEXT) = 0; break; case IEC104_TI_C_DC_NA_1: //double-point command,ASDU_46 if(SUB_DeviceOn(*(p2+IEC104_OFFSET_ADDR))) { ucData = *(p2+IEC104_OFFSET_CONTEXT); if( ((ucData&3)==0) || ((ucData&3)==3) ) return 0; if (((pGlobal->Protocol_Version == XJ_IEC_1) && (uInf104>=0xB01) && (uInf104<=0xB0C)) || ((pGlobal->Protocol_Version == XJ_IEC_2) && (uInf104>=0x6001) && (uInf104<=0x600C)) || ((pGlobal->Protocol_Version == XJ_IEC_2) && (uInf104 >= 0x6017) && (uInf104 <= 0x6019))) { *(p1+IEC103_OFFSET_TI) =IEC103_TI_C_DC_NA_3; //Select control *(p1+IEC103_OFFSET_COT) =IEC103_COT_M_remoteOP; if (pGlobal->Protocol_Version == XJ_IEC_1) { *(p1+IEC103_OFFSET_INF) =(uInf104-0xB01)+48; } else { *(p1+IEC103_OFFSET_INF) =(uInf104-0x6001)+48; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -