📄 protocol.c
字号:
{ int YC_Num = *(pData+2)/2; int i, ret, nGroup, Yc_Group, uInf_Modbus; unsigned char ucAddr = *pData; unsigned char ucSect=1, ucVSQ, ConvertNum; unsigned char ConvertBuff[512], IEC104DataBuf_M[256]; SUB_Station *pSub = &SubDevice[iPort].SubStations[0]; int SubYC = pSub->sub_YC_NUM+1 ;//modify for soe int RequierOrder = pSub->sub_FunOrder; unsigned long ulInf = 0x4000 + RequierOrder*120; if(SubYC%120) Yc_Group = SubYC/120 + 1 ; else Yc_Group = SubYC/120 ; if(pSub->sub_FunOrder==0)//modify for soe { Check_SOEInfo(iPort,pData[3]*256+pData[4]); } for(i=0;i<YC_Num;i++) { ConvertBuff[3*i+0] = pData[4+2*i]; ConvertBuff[3*i+1] = pData[3+2*i]; ConvertBuff[3*i+2] = 0; uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i); if( uInf_Modbus >=0 ) { RefreshDateData(YC_Msg, uInf_Modbus, &pData[3+2*i]); } } pSub->sub_FunOrder = (pSub->sub_FunOrder+1)%Yc_Group; if( CONN_COMMU_Enable() ) { nGroup = YC_Num/60; for(i=0; i<nGroup; i++) { ulInf += i*60; ucVSQ = 0x80|60; ConvertNum = 60*3; ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,&ConvertBuff[i*3*60]); WriteMsgToShareMem(iPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg); } if(YC_Num%60) { ulInf += i*60; ucVSQ = 0x80|(YC_Num%60); ConvertNum = (YC_Num%60)*3; ret = IEC_PackFrame_104(IEC104DataBuf_M,9,ucVSQ,1,ucAddr,0x01,ulInf,ConvertNum,&ConvertBuff[i*3*60]); WriteMsgToShareMem(iPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg); } }}void CheckYXChange(int nPort,unsigned char *DgtStore,unsigned char *pRecv){ int i,ret, uInf_Modbus; unsigned long uInf; unsigned char ucSect,CurYX,TempDgt; unsigned char ConvertBuff[8],IEC104DataBuf_M[256]; unsigned char ucAddr = pRecv[0]; int YX_Num = 512 + SubDevice[nPort].SubStations[0].sub_YX_NUM; CurrentTime CurTime = GetTime(); if(SubDevice[nPort].SubStations[0].sub_DgtFlag==0) { SubDevice[nPort].SubStations[0].sub_DgtFlag = 1; for(i=0; i<YX_Num; i++) { DgtStore[i] = GetDigital(pRecv+3, i)+1; if (i<512) { ucSect = 2; uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i + 1); } else { ucSect = 3; uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, i - 512 + 1); } if( uInf_Modbus >=0 ) { CurYX = DgtStore[i] - 1; RefreshDateData(YX_Msg, uInf_Modbus, &CurYX ); } } } else { for(i=0;i<YX_Num;i++) { TempDgt = GetDigital(pRecv+3, i)+1; if(TempDgt != DgtStore[i]) //如果有遥信变位 { DgtStore[i] = TempDgt;//遥信转存 ConvertBuff[0] = TempDgt; 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 ); if (i<512) { ucSect = 2; uInf = i+1; ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/, 0x02/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff); } else { ucSect = 3; uInf = i - 512 + 1; ret=IEC_PackFrame_104(IEC104DataBuf_M,31/*类别标识*/,1/*可变结构限定词*/,3/*传输原因*/,ucAddr/*设备地址*/, 0x03/*扇区号*/,(i-512+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff); } uInf_Modbus = FindPointInf(YX_Msg, ucAddr, ucSect, uInf); if( uInf_Modbus >=0 ) { CurYX = TempDgt - 1; RefreshDateData(YX_Msg, uInf_Modbus, &CurYX ); } if(CONN_COMMU_Enable()) { WriteMsgToShareMem(nPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg); } } } }}int Get_GR100_Frame(unsigned char *pFrame,int iPort , int uIndex) //珠海格瑞{ unsigned short CRCResult; unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type; unsigned char ucAddr= SubDevice[iPort].SubStations[uIndex].sub_address; pFrame[0] = ucAddr ; pFrame[1] = 0x03 ; pFrame[4] = 0x00 ; switch(SubDevice[iPort].SubStations[uIndex].sub_FunOrder) { case 0://YC pFrame[2] = 0x00 ; pFrame[3] = 0x0A ; //从40011开始 switch(DevType) { case 0xF1: pFrame[5] = 31 ; //读取31个寄存器 break; case 0xF2: pFrame[5] = 62 ; //读取62个寄存器 break; } break; case 1://YX pFrame[2] = 0x03 ; pFrame[3] = 0x85 ; //从40902开始 pFrame[5] = 8 ; //读取8个寄存器 break; } SubDevice[iPort].SubStations[uIndex].sub_FunOrder = (SubDevice[iPort].SubStations[uIndex].sub_FunOrder+1)%2; CRCResult = CRC16(pFrame,6); pFrame[6] = HIBYTE(CRCResult); pFrame[7] = LOBYTE(CRCResult); return 8 ; }int Get_GR100ZGD_Frame(unsigned char *pFrame,int iPort , int uIndex) //珠海格瑞,针对竹格多{ unsigned short CRCResult; unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type; unsigned char ucAddr= SubDevice[iPort].SubStations[uIndex].sub_address; pFrame[0] = ucAddr ; pFrame[1] = 0x03 ; pFrame[4] = 0x00 ; switch(SubDevice[iPort].SubStations[uIndex].sub_FunOrder) { case 0://YC pFrame[2] = 0x00 ; pFrame[3] = 0x0A ; //从40011开始 switch(DevType) { case 0xF1: pFrame[5] = 40 ; //读取40个寄存器 break; case 0xF2: pFrame[5] = 80 ; //读取80个寄存器 break; } break; case 1://YX pFrame[2] = 0x03 ; pFrame[3] = 0x85 ; //从40902开始 pFrame[5] = 8 ; //读取8个寄存器 break; } SubDevice[iPort].SubStations[uIndex].sub_FunOrder = (SubDevice[iPort].SubStations[uIndex].sub_FunOrder+1)%2; CRCResult = CRC16(pFrame,6); pFrame[6] = HIBYTE(CRCResult); pFrame[7] = LOBYTE(CRCResult); return 8 ; }unsigned short Get_GR100_32BITYC(unsigned char *pData, int Power){ unsigned long LongYC; unsigned short HIREG, LOREG, RetValue; HIREG = (unsigned short)pData[0]*256 + (unsigned short)pData[1]; LOREG = (unsigned short)pData[2]*256 + (unsigned short)pData[3]; LongYC = (unsigned long)HIREG*10000 + (unsigned long)LOREG; RetValue = (unsigned short)(LongYC/Power); return RetValue;}void Process_GR100_Recv(int iPort, unsigned char *pData, int uIndex){ int i,k,YC_Num =15, Power = 1; int ret,uInf_Modbus = -1; unsigned short TempYC; unsigned long ulInf = 0x4001; unsigned char ucVSQ, ConvertNum, CurYX, ucSect=1; unsigned char WriteBuff[64],ConvertBuff[256],IEC104DataBuf_M[256],TempDgt[32]; unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type; unsigned short YXNUM = SubDevice[iPort].SubStations[uIndex].sub_YX_NUM; unsigned short YCNUM = SubDevice[iPort].SubStations[uIndex].sub_YC_NUM; CurrentTime CurTime = GetTime(); unsigned char ucAddr = pData[0]; if(pData[2] == 0x10)//YX { if(SubDevice[iPort].SubStations[uIndex].sub_DgtFlag==0) { SubDevice[iPort].SubStations[uIndex].sub_DgtFlag = 1; for(i=0;i<8;i++) { TempDgt[i] = pData[2*i+4] + 1; SubDevice[iPort].SubStations[uIndex].sub_Data[i]=TempDgt[i]; uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 1, i+1); if( uInf_Modbus >=0 ) { CurYX = TempDgt[i] - 1; RefreshDateData(YX_Msg, uInf_Modbus, &CurYX ); } } } else { CurTime = GetTime(); for(i=0;i<8;i++) { TempDgt[i] = pData[2*i+4] + 1; if(TempDgt[i] != SubDevice[iPort].SubStations[uIndex].sub_Data[i]) //如果有遥信变位 { uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 1, i+1); if( uInf_Modbus >=0 ) { CurYX = TempDgt[i] - 1; RefreshDateData(YX_Msg, uInf_Modbus, &CurYX ); } SubDevice[iPort].SubStations[uIndex].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/*设备地址*/, 1/*扇区号*/,(i+1)/*信息地址*/,8/*要转换的字节数*/,ConvertBuff); WriteMsgToShareMem(iPort,ret,IEC104DataBuf_M,OperatorStation,YX_Msg); } } } } } else//YC { switch(DevType) { case 0xF1: //(如果没有零序电压则符号寄存器字节为:pData[62]) { for(i=0;i<6;i++) WriteBuff[i] = pData[3+i]; for(i=0;i<6;i++) WriteBuff[6+i] = pData[11+i]; for(i=0;i<6;i++) WriteBuff[12+i] = pData[19+i]; TempYC = pData[33]*256 + pData[34];//有功功率 if(pData[64]&0x08) TempYC = ~TempYC+1; WriteBuff[18] = HIBYTE(TempYC); WriteBuff[19] = LOBYTE(TempYC); TempYC = pData[41]*256 + pData[42];//无功功率 if(pData[64]&0x80) TempYC = ~TempYC+1; WriteBuff[20] = HIBYTE(TempYC); WriteBuff[21] = LOBYTE(TempYC); TempYC = pData[49]*256 + pData[50];//功率因数 if(pData[64]&0x08) TempYC = ~TempYC+1; WriteBuff[22] = HIBYTE(TempYC); WriteBuff[23] = LOBYTE(TempYC); WriteBuff[24] = pData[57];//视在功率 WriteBuff[25] = pData[58]; WriteBuff[26] = pData[59];//零序电压 WriteBuff[27] = pData[60]; WriteBuff[28] = pData[61];//频率 WriteBuff[29] = pData[62]; } break; case 0xF2: //(如果没有零序电压则符号寄存器字节为:pData[122]) { for(i=0;i<3;i++) //相电压 { TempYC = Get_GR100_32BITYC(&pData[4*i+3],YXNUM); WriteBuff[2*i+0] = HIBYTE(TempYC); WriteBuff[2*i+1] = LOBYTE(TempYC); } for(i=0;i<3;i++) //线电压 { TempYC = Get_GR100_32BITYC(&pData[4*i+19],YXNUM); WriteBuff[2*i+6] = HIBYTE(TempYC); WriteBuff[2*i+7] = LOBYTE(TempYC); } for(i=0;i<3;i++) //相电流 { TempYC = Get_GR100_32BITYC(&pData[4*i+35],Power)*YCNUM; WriteBuff[2*i+12] = HIBYTE(TempYC); WriteBuff[2*i+13] = LOBYTE(TempYC); } TempYC = Get_GR100_32BITYC(&pData[63],YXNUM);//有功功率 if(pData[126]&0x08) TempYC = ~TempYC+1; WriteBuff[18] = HIBYTE(TempYC); WriteBuff[19] = LOBYTE(TempYC); TempYC = Get_GR100_32BITYC(&pData[79],YXNUM);//无功功率 if(pData[126]&0x80) TempYC = ~TempYC+1; WriteBuff[20] = HIBYTE(TempYC); WriteBuff[21] = LOBYTE(TempYC); TempYC = Get_GR100_32BITYC(&pData[95],1);//功率因数 if(pData[126]&0x08) TempYC = ~TempYC+1; WriteBuff[22] = HIBYTE(TempYC); WriteBuff[23] = LOBYTE(TempYC); for(i=0;i<3;i++) //视在功率,零序电压,频率 { if(i==2) TempYC = Get_GR100_32BITYC(&pData[4*i+111],1);//频率原值上送 else TempYC = Get_GR100_32BITYC(&pData[4*i+111],YXNUM); WriteBuff[2*i+24] = HIBYTE(TempYC); WriteBuff[2*i+25] = LOBYTE(TempYC); } } break; } if((WriteGR100Data)&&(uIndex==0)) memcpy(GR100_Data+2, WriteBuff, YC_Num*2); for(i=0; i<YC_Num; i++) { uInf_Modbus = FindPointInf(YC_Msg, ucAddr, ucSect, ulInf+i); if( uInf_Modbus >=0 ) { RefreshDateData(YC_Msg, uInf_Modbus, &WriteBuff[2*i]); } ConvertBuff[3*i+0] = WriteBuff[2*i+1]; ConvertBuff[3*i+1] = WriteBuff[2*i+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(iPort,ret,IEC104DataBuf_M,OperatorStation,YC_Msg); } }}void Process_GR100ZGD_Recv(int iPort, unsigned char *pData, int uIndex)//针对竹格多电站{ int i,k,YC_Num =14, Power = 1; int ret,uInf_Modbus = -1; unsigned short TempYC; unsigned long ulInf = 0x4001; unsigned char ucVSQ, ConvertNum, CurYX, ucSect=1; unsigned char WriteBuff[64],ConvertBuff[256],IEC104DataBuf_M[256],TempDgt[32]; unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type; unsigned short YXNUM = SubDevice[iPort].SubStations[uIndex].sub_YX_NUM; unsigned short YCNUM = SubDevice[iPort].SubStations[uIndex].sub_YC_NUM; CurrentTime CurTime = GetTime(); unsigned char ucAddr = pData[0]; if(pData[2] == 0x10)//YX { if(SubDevice[iPort].SubStations[uIndex].sub_DgtFlag==0) { SubDevice[iPort].SubStations[uIndex].sub_DgtFlag = 1; for(i=0;i<8;i++) { TempDgt[i] = pData[2*i+4] + 1; SubDevice[iPort].SubStations[uIndex].sub_Data[i]=TempDgt[i]; uInf_Modbus = FindPointInf(YX_Msg, ucAddr, 1, i+1); if( uInf_Modbus >=0 ) { CurYX = TempDgt[i] - 1; RefreshDateData(YX_Msg, uInf_Modbus, &CurYX ); } } } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -