📄 nz_sf.c
字号:
int ret = pucTCP[1] + 2 ; memcpy(puc103, pucTCP, ret); return ret;}int DGT801_Command_Handle(int iPort,int NetGroup,int iConnect,unsigned char *pucCMD,unsigned char iLen){ CurrentTime CurTime; unsigned long ulInf ; int m, ret, PER_NUM = 64; unsigned char ucVSQ, ConLen; unsigned char CmdBuff[256],IEC104DataBuf_M[256]; unsigned char ucADDR = *(pucCMD+IEC104_OFFSET_ADDR); int index = SUB_AddrToIndex(ucADDR); unsigned char ucTI104 = *(pucCMD+IEC104_OFFSET_TI); SUB_Station *pSub = &SubDevice[iPort].SubStations[index]; switch(ucTI104) { case IEC104_TI_C_CS_NA_1: //clock synchronization command,ASDU_103 CurTime = GetTime(); CmdBuff[0] = 0xFF; CmdBuff[1] = 0x3E; CmdBuff[2] = 0x07; CmdBuff[3] = HEX_TO_BCD(CurTime.year%100) ; CmdBuff[4] = 0x20 ; CmdBuff[5] = HEX_TO_BCD(CurTime.month) ; CmdBuff[6] = HEX_TO_BCD(CurTime.day) ; CmdBuff[7] = HEX_TO_BCD(CurTime.hour) ; CmdBuff[8] = HEX_TO_BCD(CurTime.minute) ; CmdBuff[9] = HEX_TO_BCD(CurTime.second) ; CmdBuff[10] = HIBYTE(DGT801CRC(CmdBuff, 10)); CmdBuff[11] = LOBYTE(DGT801CRC(CmdBuff, 10)); COMM_SendBuff(iPort, CmdBuff, 12);
SYS_Delay(600); break; case IEC104_TI_C_IC_NA_1: //interrogation command,general inspect ,ASDU_100 for( m=0; m<256/PER_NUM; m++ ) { ucVSQ = 0x80 | PER_NUM ; ConLen = PER_NUM ; ulInf = PER_NUM*m+1 ; ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/, 0x01/*扇区号*/,ulInf/*信息地址*/,ConLen/*要转换的字节数*/,&pSub->sub_Data[0]); CONN_Send104Data(NetGroup, iConnect, IEC104DataBuf_M, ret); SYS_Delay(10); } break; }}int Read_DGT801_Frame(int iPort, unsigned char ucADDR,unsigned char *pRecv) { unsigned short CRC_Check; int k, iError = 0, len = 0, nRecv = 0; unsigned char iRead[EveryRead]; if( ComDataCome(iPort, 1000) >0 ) { while(nRecv<270) { len = read(COM[iPort], iRead, sizeof(iRead)); if(len>0) { iError = 0 ; if(nRecv+len>270) break; memcpy(pRecv+nRecv,iRead,len); nRecv += len; if(pRecv[0]==ucADDR) {
if(pRecv[2]==0xff)
{
if(nRecv>=pRecv[3]+pRecv[4]*256+7)
{
nRecv = pRecv[3]+pRecv[4]*256+7;
break;
}
} else if(nRecv>=pRecv[2]+5) { nRecv = pRecv[2]+5; break; } } } else { iError ++ ; if(iError >30) break; SYS_Delay(10); } } } if(nRecv>0) { PrintDebugInfo(iPort, Recv_Data, pRecv, nRecv); CRC_Check = DGT801CRC(pRecv, nRecv-2); //计算校验 if( (pRecv[nRecv-2]==HIBYTE(CRC_Check)) && (pRecv[nRecv-1]==LOBYTE(CRC_Check)) ) { return nRecv; } else return Error_Recv; } return 0;}void Process_DGT801_Recv(int nPort, int uIndex, unsigned char *pRecv){ CurrentTime CurTime; int i,ret, k,uInf_Modbus = -1; unsigned long ulInf = 0x4001; unsigned short TempMs,TmpValue; int YC_Num, YX_Num1=160, YX_Num2,number; unsigned char ucVSQ, ConvertNum, ucSect = 1, ucTempYX; unsigned char CurYX, TempYc[4], TempDgt[512], TempBuff[16]; unsigned char ConvertBuff[256], IEC104DataBuf_M[256]; unsigned char ucAddr = SubDevice[nPort].SubStations[uIndex].sub_address; unsigned char FunCode = pRecv[1]; SUB_Station *pSub = &SubDevice[nPort].SubStations[uIndex]; switch(FunCode) { case 0xAA: //保护动作信号、出口、压板、开入量等状态
if(pRecv[2]==0x38)//48路保护信号,16路保护出口,32路开入量,64路压板
{
for(i=0;i<64;i++)
{
TempDgt[i] = GetDigital(pRecv+3, i)+1;
}
for(i=0;i<8;i++)
{
ucTempYX = pRecv[11+i];
for(k=0;k<4;k++)
{
if((ucTempYX&0x03)==0x01)
TempDgt[64+4*i+k] = 2;
if((ucTempYX&0x03)==0x02)
TempDgt[64+4*i+k] = 1;
ucTempYX >>= 2;
}
}
for(i=0;i<64;i++)
{
TempDgt[96+i] = GetDigital(pRecv+19, i)+1;
}
if(pSub->sub_DgtFlag==0)
{
for(i=0;i<160;i++)
{
pSub->sub_Data[i]=TempDgt[i];
uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
if( uInf_Modbus >=0 )
{
CurYX = TempDgt[i] - 1;
RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
}
}
pSub->sub_DgtFlag = 1;
}
else
{
CurTime = GetTime();
for(i=0;i<160;i++)
{
if(TempDgt[i] != pSub->sub_Data[i]) //如果有遥信变位
{
uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
if( uInf_Modbus >=0 )
{
CurYX = TempDgt[i] - 1;
RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
}
pSub->sub_Data[i] = TempDgt[i];//遥信转存
if(CONN_COMMU_Enable())
{
ConvertBuff[0] = TempDgt[i];
ConvertBuff[1] = LOBYTE( CurTime.mSecond );
ConvertBuff[2] = HIBYTE( CurTime.mSecond );
ConvertBuff[3] = LOBYTE( CurTime.minute );
ConvertBuff[4] = LOBYTE( CurTime.hour );
ConvertBuff[5] = LOBYTE( CurTime.day );
ConvertBuff[6] = LOBYTE( CurTime.month );
ConvertBuff[7] = LOBYTE( CurTime.year );
ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,
ucSect/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);
WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);
}
}
}
}
}
if(pRecv[2]==0x50)//96路保护信号,32路出口,64路开入,128路压板
{
for(i=0;i<128;i++)
{
TempDgt[i] = GetDigital(pRecv+3, i)+1;
}
for(i=0;i<16;i++)
{
ucTempYX = pRecv[19+i];
for(k=0;k<4;k++)
{
if((ucTempYX&0x03)==0x01)
TempDgt[64+4*i+k] = 2;
if((ucTempYX&0x03)==0x02)
TempDgt[64+4*i+k] = 1;
ucTempYX >>= 2;
}
}
for(i=0;i<128;i++)
{
TempDgt[192+i] = GetDigital(pRecv+35, i)+1;
}
if(pSub->sub_DgtFlag==0)
{
for(i=0;i<320;i++)
{
pSub->sub_Data[i]=TempDgt[i];
uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
if( uInf_Modbus >=0 )
{
CurYX = TempDgt[i] - 1;
RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
}
}
pSub->sub_DgtFlag = 1;
}
else
{
CurTime = GetTime();
for(i=0;i<320;i++)
{
if(TempDgt[i] != pSub->sub_Data[i]) //如果有遥信变位
{
uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i+1);
if( uInf_Modbus >=0 )
{
CurYX = TempDgt[i] - 1;
RefreshDateData(YX_Msg, uInf_Modbus, &CurYX );
}
pSub->sub_Data[i] = TempDgt[i];//遥信转存
if(CONN_COMMU_Enable())
{
ConvertBuff[0] = TempDgt[i];
ConvertBuff[1] = LOBYTE( CurTime.mSecond );
ConvertBuff[2] = HIBYTE( CurTime.mSecond );
ConvertBuff[3] = LOBYTE( CurTime.minute );
ConvertBuff[4] = LOBYTE( CurTime.hour );
ConvertBuff[5] = LOBYTE( CurTime.day );
ConvertBuff[6] = LOBYTE( CurTime.month );
ConvertBuff[7] = LOBYTE( CurTime.year );
ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/,
ucSect/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff);
WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg);
}
}
}
}
} break; case 0x63: //模拟通道
if(pRecv[2]==0xff)
{
YC_Num = (pRecv[3]+pRecv[4]*256)/4;
for (i=0;i<YC_Num;i++) //YC
{
TmpValue = (pRecv[5 + 4*i]>>4)*10 + pRecv[5 + 4*i]&0x0F
+ ((pRecv[6 + 4*i]>>4)&0x07)*1000 + (pRecv[6 + 4*i]&0x0F)*100;
TmpValue *=10 ;//扩大10倍上送
TmpValue += (pRecv[8 + 4*i]>>4);
TempYc[0] = HIBYTE(TmpValue);
TempYc[1] = LOBYTE(TmpValue);
uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i);
if( uInf_Modbus >=0 )
RefreshDateData(YC_Msg, uInf_Modbus, &TempYc[0]);
ConvertBuff[3*i+0] = TempYc[1];
ConvertBuff[3*i+1] = TempYc[0];
ConvertBuff[3*i+2] = 0;
}
ucVSQ = 0x80|YC_Num;//信息字数目
ConvertNum = YC_Num*3;
if(CONN_COMMU_Enable())
{
ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,ConvertBuff);
WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg);
}
}
else
{
YC_Num = pRecv[2]/4;
for (i=0;i<YC_Num;i++) //YC
{
TmpValue = (pRecv[3 + 4*i]>>4)*10 + pRecv[3 + 4*i]&0x0F
+ ((pRecv[4 + 4*i]>>4)&0x07)*1000 + (pRecv[4 + 4*i]&0x0F)*100;
TmpValue *=10 ;//扩大10倍上送
TmpValue += (pRecv[6 + 4*i]>>4);
TempYc[0] = HIBYTE(TmpValue);
TempYc[1] = LOBYTE(TmpValue);
uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i);
if( uInf_Modbus >=0 )
RefreshDateData(YC_Msg, uInf_Modbus, &TempYc[0]);
ConvertBuff[3*i+0] = TempYc[1];
ConvertBuff[3*i+1] = TempYc[0];
ConvertBuff[3*i+2] = 0;
}
ucVSQ = 0x80|YC_Num;//信息字数目
ConvertNum = YC_Num*3;
if(CONN_COMMU_Enable())
{
ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,ConvertBuff);
WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg);
}
} break; case 0xA7: //保护事件 TempBuff[0] = 2; //信息元素(双点) TempBuff[1] = TempBuff[2] = 0; //相对时间 TempMs = BCD_2_HEX(pRecv[12])*1000 + ((pRecv[14]*256 + pRecv[13])*10/6)%1000; TempBuff[3] = (unsigned char)(TempMs&0xff); //毫秒低 TempBuff[4] = (unsigned char)(TempMs>>8); //毫秒高 TempBuff[5] = BCD_2_HEX(pRecv[11]); //分 TempBuff[6] = BCD_2_HEX(pRecv[10]); //时 TempBuff[7] = BCD_2_HEX(pRecv[9]); //日 TempBuff[8] = BCD_2_HEX(pRecv[8]); //月 TempBuff[9] = BCD_2_HEX(pRecv[6]); //年 ret = IEC_PackFrame_104(IEC104DataBuf_M,38/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/, 0x01/*扇区号*/,pRecv[5]+1/*信息地址*/,10/*要转换的字节数*/,TempBuff); WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg); break; case 0xA0: //保护投退状态 YX_Num2 = pRecv[2]/3; if(pSub->sub_DGT801==0) { pSub->sub_DGT801 = 1; for(i=0; i<YX_Num2; i++) {
number = pRecv[3+3*i]+pRecv[4+3*i]*256; TempDgt[number] = pRecv[5+3*i]+1; pSub->sub_Data[320+number]=TempDgt[number]; uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, number+0x1000); if( uInf_Modbus >=0 ) { CurYX = TempDgt[number] - 1; RefreshDateData(YX_Msg, uInf_Modbus, &CurYX ); } } } else { CurTime = GetTime(); for(i=0; i<YX_Num2; i++) {
number = pRecv[3+3*i]+pRecv[4+3*i]*256; TempDgt[number] = pRecv[5+3*i]+1; if(TempDgt[number] != pSub->sub_Data[320+number]) //如果有遥信变位 { uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, number+0x1000); if( uInf_Modbus >=0 ) { CurYX = TempDgt[number] - 1; RefreshDateData(YX_Msg, uInf_Modbus, &CurYX ); } pSub->sub_Data[320+number] = TempDgt[number];//遥信转存 if(CONN_COMMU_Enable()) { ConvertBuff[0] = TempDgt[number]; ConvertBuff[1] = LOBYTE( CurTime.mSecond ); ConvertBuff[2] = HIBYTE( CurTime.mSecond ); ConvertBuff[3] = LOBYTE( CurTime.minute ); ConvertBuff[4] = LOBYTE( CurTime.hour ); ConvertBuff[5] = LOBYTE( CurTime.day ); ConvertBuff[6] = LOBYTE( CurTime.month ); ConvertBuff[7] = LOBYTE( CurTime.year ); ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/, ucSect/*扇区号*/,(number+0x1000)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff); WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg); } } } } break; }}
//南自94规约,云南雷打滩水电站
int XJ104_To_NZ94(int iPort ,unsigned char *puc103,unsigned char *puc104)
{
int ret = puc104[1] + 2 ;
memcpy(puc103, puc104, ret);
return ret;
}
int NZ94_Command_Handle(int iPort,int NetGroup,int iConnect,unsigned char *pucCMD,
unsigned char iLen,unsigned char *puc104)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -