📄 nz_sf.c
字号:
#include "include/mcuapi.h"//遥信,遥测,定值,压板投退,SOE#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 0xB08//===============================================================================#define DZSectionSwitch 2 // 定值区切换 #define DZChange 3 // 定值修改#define SoftTripCtl 6 // 软压板投退#define SignalReset 19 // 信号复归 #define settingNUM_max 20#define DZtotalnum 50#define ctlwordNUM_max 30//================================================================================unsigned char ucGlobalCPU;int iConnect_dz = 0xff;int iConnect_inspect = 0xff;//================================================================================// { unsigned char ucGroup , unsigned int uiGIN,// unsigned char ucInfTcp, unsigned long ulInf104 }const IEC_INF_CODE INF_List[]={ {15,0x13, 0x13,0x14}, //信号复归 {6,0x0601,0xab,0xac}, //主保护压板 {6,0x0602,0xac,0xad}, //距离保护压板 {6,0x0603,0xad,0xae}, //零序保护压板 {6,0x0604,0xae,0xaf}, //闭重三跳压板 {2,0x0201,0x64,0x65}, //切换到定值区0 {2,0x0201,0x65,0x66}, {2,0x0201,0x66,0x67}, {2,0x0201,0x67,0x68}, {2,0x0201,0x68,0x69}, {2,0x0201,0x69,0x6a}, {2,0x0201,0x6a,0x6b}, {2,0x0201,0x6b,0x6c}, //切换到定值区7 {0xff,0,0,0}};int NZ103_To_XJ104(unsigned char *puc104,unsigned char *puc103){ CurrentTime CurTime; GW_Global *pGlobal=&gwGlobal; int iPort,i,index; unsigned char ucTI104,ucTI103,ucInf103,ucCOT103,ucData; unsigned char *p1=puc104,*p2=puc103,ucADDR; unsigned long ulInf104,uBase; unsigned int uiCOT104,uiINF103; unsigned int num,offset,ucLen,wValue; ucADDR=*(p2+IEC103_OFFSET_ADDR); index = SUB_AddrToIndex(ucADDR); iPort = SUB_AddrToPort(ucADDR); ucTI103 = *(p2+IEC103_OFFSET_TI); ucInf103 = *(p2+IEC103_OFFSET_INF); ucCOT103 = *(p2+IEC103_OFFSET_COT); uiCOT104 = IEC_COT_103To104(*(p2+IEC103_OFFSET_COT)); ulInf104 = 0; if((ucInf103==0x1d)&&(ucCOT103==9)) //南自不上送总召唤结束帧,需自设一个总召唤结束标志 SubDevice[iPort].SubStations[index].sub_InspectEnd=1; //装置响应总召唤上送数据为固定的一张表,INF=0x1d是最后一个数据 *p1 = START_CODE2; *(p1+2) = 0; *(p1+3) = 0; *(p1+4) = 0; *(p1+5) = 0; *(p1+IEC104_OFFSET_LEN) = 0; *(p1+IEC104_OFFSET_VSQ) = *(p2+IEC103_OFFSET_VSQ) ^ 0x80; //SQ Bit reserve *(p1+IEC104_OFFSET_COT) = uiCOT104 & 0xff; *(p1+IEC104_OFFSET_COT+1) = (uiCOT104 >> 8) & 0xff; *(p1+IEC104_OFFSET_SECT) = 1; //*(p2+IEC103_OFFSET_COMADDR); *(p1+IEC104_OFFSET_ADDR) = SubDevice[iPort].SubStations[index].sub_address; switch(ucTI103) { case IEC103_TI_M_TM_TA_3://告警信号\保护动作\硬压板都用ASDU_1 CurTime = GetTime(); if(ucInf103>=80) //硬压板遥信状态报文或告警信号 { ulInf104 = (unsigned long)ucInf103; *(p1+IEC104_OFFSET_INF) =ulInf104&0xff; *(p1+IEC104_OFFSET_INF+1) =(ulInf104>>8)&0xff; *(p1+IEC104_OFFSET_INF+2) =(ulInf104>>16)&0xff; if(ucCOT103 ==1) { *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_DP_TB_1; //ASDU_31,0x1F for(i=0 ; i< 5 ; i++) { *(p1+IEC104_OFFSET_CONTEXT+i)=*(p2+IEC103_OFFSET_CONTEXT+i); } *(p1+IEC104_OFFSET_CONTEXT+5) = CurTime.day; *(p1+IEC104_OFFSET_CONTEXT+6) = CurTime.month; *(p1+IEC104_OFFSET_CONTEXT+7) = CurTime.year; *(p1+IEC104_OFFSET_LEN) = MIN_IEC104_FRAMELEN + 8;//7 for CurTime,1 for spi(dpi) } else if(ucCOT103==9) { *(p1+IEC104_OFFSET_TI) = 3; *(p1+IEC104_OFFSET_CONTEXT) = *(p2+IEC103_OFFSET_CONTEXT); *(p1+IEC104_OFFSET_LEN) = MIN_IEC104_FRAMELEN + 1; } } else //保护动作 ucInf103<80 { *(p1+IEC104_OFFSET_TI) = IEC104_TI_M_EP_TD_1; //ASDU_38 ulInf104 = (unsigned long)ucInf103; *(p1+IEC104_OFFSET_VSQ) =0x01; *(p1+IEC104_OFFSET_INF) =ulInf104&0xff; *(p1+IEC104_OFFSET_INF+1) =(ulInf104>>8)&0xff; *(p1+IEC104_OFFSET_INF+2) =(ulInf104>>16)&0xff; *(p1+IEC104_OFFSET_CONTEXT) =*(p2+IEC103_OFFSET_CONTEXT); //DPI *(p1+IEC104_OFFSET_CONTEXT+1) =0;//*(p2+IEC103_OFFSET_CONTEXT+1); *(p1+IEC104_OFFSET_CONTEXT+2) =0;//*(p2+IEC103_OFFSET_CONTEXT+2); 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) =CurTime.day; *(p1+IEC104_OFFSET_CONTEXT+8) =CurTime.month; *(p1+IEC104_OFFSET_CONTEXT+9) =CurTime.year; //7 for CurTime,1 for dpi,2 for relative CurTime *(p1+IEC104_OFFSET_LEN) =MIN_IEC104_FRAMELEN + 10; } break; case 10: // 闫黎明添加 if((*(p2+IEC103_OFFSET_INF)==241)&&(*(p2+IEC103_OFFSET_GIN) ==0x01))//读取保护测量值 { *(p1+IEC104_OFFSET_TI) =IEC104_TI_M_ME_NA_1; ucLen =(*(p2+IEC103_OFFSET_VSQ)) & 0x7F; *(p1+IEC104_OFFSET_VSQ) = 0x80|(*(p2+IEC103_OFFSET_VSQ)); ulInf104 = 0x4001+ucInf103; *(p1+IEC104_OFFSET_INF) =ulInf104 & 0xff; *(p1+IEC104_OFFSET_INF+1) =(ulInf104 >> 8) & 0xff; *(p1+IEC104_OFFSET_INF+2) =(ulInf104 >> 16) & 0xff; for (i=0 ; i< ucLen ; i++) { wValue = GetYCValue(p2+20+i*10); *(p1+IEC104_OFFSET_CONTEXT+i*3) =wValue%256; *(p1+IEC104_OFFSET_CONTEXT+i*3+1) =wValue/256; *(p1+IEC104_OFFSET_CONTEXT+i*3+2) =0; } *(p1+IEC104_OFFSET_LEN) = MIN_IEC104_FRAMELEN+3*ucLen; } break; default : break; } return (*(p1+IEC104_OFFSET_LEN)+2);}unsigned int GetYCValue(unsigned char *pFdata){ float fValue; unsigned int wValue; memcpy(&fValue,pFdata,4); fValue*=100; if(fValue<0) { if((fabs(fValue)-(long)fabs(fValue))>=0.5) fValue-=1; fValue=fabs(fValue); wValue=~((unsigned int)fValue) +1; } else { if(fValue-(long)fValue>=0.5) fValue+=1; wValue=(unsigned int)fValue; } return wValue;}/*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 XJ104_To_NZ103(int iPort,unsigned char *puc103,unsigned char *puc104){ CurrentTime CurTime; GW_Global *pGlobal =&gwGlobal; int i,index; unsigned char ucTI104,ucTI103,ucCOT104; unsigned char *p1=puc103,*p2=puc104,sum,ucData; unsigned int uiInfRcs; unsigned long ulInf104; unsigned char ucFCB=0; unsigned char ucADDR,ucGroup; ucADDR = *(p2+IEC104_OFFSET_ADDR); index = SUB_AddrToIndex(ucADDR); ucFCB = SUB_GetFCB(ucADDR); ulInf104 = ((unsigned long)*(p2+IEC104_OFFSET_INF+1)&0xff) * 0x100 +((unsigned long)*(p2+IEC104_OFFSET_INF)&0xff); ucCOT104= *(p2+IEC104_OFFSET_COT); ucTI104 = *(p2+IEC104_OFFSET_TI); *p1 =*(p1+3) =START_CODE2; *(p1+IEC103_OFFSET_CODE) =0x53; if(ucADDR!=BROADCAST_ADDR) { *(p1+IEC103_OFFSET_ADDR) = ucADDR; } else { *(p1+IEC103_OFFSET_ADDR) = 0xff; } *(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_ADDR) ; *(p1+IEC103_OFFSET_FUN) =SUB_GetFUN(*(p2+IEC104_OFFSET_ADDR)); *(p1+IEC103_OFFSET_INF) =0x0; switch(ucTI104) { case IEC104_TI_C_CS_NA_1: //clock synchronization command,ASDU_103 CurTime = GetTime(); *(p1+IEC103_OFFSET_CODE) =0x44; //*(p1+4) *(p1+IEC103_OFFSET_ADDR) =0xFF; *(p1+IEC103_OFFSET_TI) =6; //IEC103_TI_M_SYN_TA_3; *(p1+IEC103_OFFSET_COT) =8; //时间同步 *(p1+IEC103_OFFSET_COMADDR) =0xFF; *(p1+IEC103_OFFSET_FUN) =0xFF; *(p1+IEC103_OFFSET_INF) =0x00; *(p1+IEC103_OFFSET_CONTEXT) =CurTime.mSecond & 0xff; *(p1+IEC103_OFFSET_CONTEXT+1) =(CurTime.mSecond >> 8) & 0xff; *(p1+IEC103_OFFSET_CONTEXT+2) =CurTime.minute; *(p1+IEC103_OFFSET_CONTEXT+3) =CurTime.hour; *(p1+IEC103_OFFSET_CONTEXT+4) =CurTime.day; *(p1+IEC103_OFFSET_CONTEXT+5) =CurTime.month; *(p1+IEC103_OFFSET_CONTEXT+6) =CurTime.year; *(p1+1) = *(p1+2) = MIN_IEC103_FRAMELEN+7; break; case IEC104_TI_C_IC_NA_1: //interrogation command,general inspect ,ASDU_100,总召唤启动 SubDevice[iPort].SubStations[index].sub_SCN104 =*(p2+IEC104_OFFSET_CONTEXT); *(p1+IEC103_OFFSET_TI) =IEC103_TI_C_IGI_NA_3; //7 *(p1+IEC103_OFFSET_COT) =IEC103_COT_M_totalQUERY; //9 *(p1+IEC103_OFFSET_FUN) =0xFF; *(p1+IEC103_OFFSET_INF) =0x00; *(p1+IEC103_OFFSET_CONTEXT) =SubDevice[iPort].SubStations[index].sub_SCN104 ; //扫描序号? *(p1+1) = *(p1+2) =MIN_IEC103_FRAMELEN+1; break; case IEC104_TI_C_DC_NA_1: //double-point command,ASDU_46,双点遥控命令 if (SUB_DeviceOn( *(p2+IEC104_OFFSET_ADDR) ) ||*(p2+IEC104_OFFSET_ADDR)==0xff) { if( ((pGlobal->Protocol_Version == XJ_IEC_1)&&(ulInf104==0xb14)) ||((pGlobal->Protocol_Version == XJ_IEC_2)&&(ulInf104==0x6014)) ) //信号复归 { *(p1+IEC103_OFFSET_TI) =20; //IEC103_TI_C_GRC_NA_3;一般命令 *(p1+IEC103_OFFSET_COT) =20; *(p1+IEC103_OFFSET_INF) =19; *(p1+IEC103_OFFSET_CONTEXT) =*(p2+IEC104_OFFSET_CONTEXT); *(p1+IEC103_OFFSET_CONTEXT+1) =0; //SII *(p1+1)=*(p1+2) =MIN_IEC103_FRAMELEN+2; } } break; default : return 0; } 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; }}/*=====================================================================*//*unsigned char num: 定值个数/*unsigned char offset:/*=====================================================================*/void DZValue103_TCP(unsigned char num,unsigned char offset,unsigned char *p1,unsigned char *p2){ float d; unsigned char *pucDZtype; unsigned int i,j,k,uiWidth; pucDZtype = DZtype_buf; for(i=0;i<num;i++) { uiWidth =(*(p2+offset+4))*(*(p2+offset+5)); if(*(p2+offset+3)==0x07) //数据1 { *(pucDZtype+offset1+i+1) = DZTYPE_7_4; d = CtoF(p2+offset+6); *(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int)d & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ( (unsigned int)d >> 8 ) & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+2) = 0x10; if( ( d*1000) <= 0xffff ) { d = d*1000; *(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int)d & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ((unsigned int)d >> 8 ) & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+2) = 0x13; } else if( ( d*100) <= 0xffff ) { d = d*100; *(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int) d & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ( (unsigned int)d >> 8 ) & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+2) = 0x12; } else if( ( d*10) <= 0xffff ) { d = d*10; *(p1+TCP_OFFSET_CONTEXT+2+i*3) = (unsigned int)d & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+1) = ( (unsigned int)d >> 8 ) & 0xff ; *(p1+TCP_OFFSET_CONTEXT+2+i*3+2) = 0x11; } } else if(*(p2+offset+3)==0x03&&(*(p2+offset+4)==0x02)) //数据2 { *(p1+TCP_OFFSET_CONTEXT+2+i*3) =*(p2+offset+6); *(p1+TCP_OFFSET_CONTEXT+2+i*3+1) =*(p2+offset+6+1); *(p1+TCP_OFFSET_CONTEXT+2+i*3+2) =0x10; *(pucDZtype+offset1+i+1) = DZTYPE_3_2; } else if(*(p2+offset+3)==0x03&&(*(p2+offset+4)==0x01)) //控制字 { *(p1+TCP_OFFSET_CONTEXT+2+i*3) =*(p2+offset+6); *(p1+TCP_OFFSET_CONTEXT+2+i*3+1) =0; *(p1+TCP_OFFSET_CONTEXT+2+i*3+2) =0x00; *(pucDZtype+offset1+i+1) = DZTYPE_3_1; } offset+= (6+uiWidth ); } offset1+=num; } /*=====================================================================*//*FUNCTION :将IEC103协议转为TCP103/*PARAMETER:pucTCP/* puc103/*RETURN :TCP103总的字节个数/*=====================================================================*/int NZ103_To_XJTCP(unsigned char *pucTCP, unsigned char *puc103){ CurrentTime CurTime; int index,iPort; unsigned int i,pos; unsigned char ucADDR,totalnum =0,offset; unsigned char ucTI,ucCOT103,ucInf103; unsigned char *p1=pucTCP,*p2=puc103; static unsigned char error=0; CurTime = GetTime(); ucCOT103=*(p2+IEC103_OFFSET_COT); ucInf103=*(p2+IEC103_OFFSET_INF); ucADDR = *(p2+IEC103_OFFSET_ADDR); iPort = SUB_AddrToPort(ucADDR); index = SUB_AddrToIndex(ucADDR); *p1 = START_CODE2; //Start Code *(p1+1) = *(p2+1)+4 ; //Frame length *(p1+TCP_OFFSET_CODE) = 0; *(p1+TCP_OFFSET_CODE+1) = 0; *(p1+TCP_OFFSET_CODE+2) = 0; *(p1+TCP_OFFSET_CODE+3) = 0; *(p1+TCP_OFFSET_VSQ) = *(p2+IEC103_OFFSET_VSQ); *(p1+TCP_OFFSET_COMADDR) = 1; *(p1+TCP_OFFSET_ADDR) = SubDevice[iPort].SubStations[index].sub_address; *(p1+TCP_OFFSET_FUN) = SubDevice[iPort].SubStations[index].sub_FUN; *(p1+TCP_OFFSET_INF) = ucInf103; ucTI = *(p2+IEC103_OFFSET_TI); //南自装置没有总召唤结束报文,但报文顺序固定,0x1d是最后一个信息 if((ucInf103==0x1d)&&(ucCOT103==9)) SubDevice[iPort].SubStations[index].sub_InspectEnd=1; switch(ucTI) { case 5: case 23: return 0; case 10: //通用分类命令响应 if((*(p2+IEC103_OFFSET_INF)==241)&&(*(p2+IEC103_OFFSET_GIN) ==0x04)) // WBH500中GIN_Group=4:定值组,响应读定值,定值序号从1开始 { *(p1+TCP_OFFSET_TI) =61; *(p1+TCP_OFFSET_CONTEXT) =ucDZcpu+0x01; //定值区号:当前区 SubDevice[iPort].SubStations[index].sub_RII =*(p2+IEC103_OFFSET_RII); if(*(p2+IEC103_OFFSET_COT)==43) //无定值回答 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -