📄 protocol.c
字号:
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[62]&0x08) TempYC = ~TempYC+1; WriteBuff[18] = HIBYTE(TempYC); WriteBuff[19] = LOBYTE(TempYC); TempYC = pData[41]*256 + pData[42];//无功功率 if(pData[62]&0x80) TempYC = ~TempYC+1; WriteBuff[20] = HIBYTE(TempYC); WriteBuff[21] = LOBYTE(TempYC); TempYC = pData[49]*256 + pData[50];//功率因数 if(pData[62]&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]; } 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[122]&0x08) TempYC = ~TempYC+1; WriteBuff[18] = HIBYTE(TempYC); WriteBuff[19] = LOBYTE(TempYC); TempYC = Get_GR100_32BITYC(&pData[79],YXNUM);//无功功率 if(pData[122]&0x80) TempYC = ~TempYC+1; WriteBuff[20] = HIBYTE(TempYC); WriteBuff[21] = LOBYTE(TempYC); TempYC = Get_GR100_32BITYC(&pData[95],1);//功率因数 if(pData[122]&0x08) TempYC = ~TempYC+1; WriteBuff[22] = HIBYTE(TempYC); WriteBuff[23] = LOBYTE(TempYC); for(i=0;i<2;i++) //视在功率,频率 { if(i==1) 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 ProcessMasterGR100(int iPort, unsigned char *pData){ int i, YC_Num = 21; int uInf_Modbus; unsigned char ucSect = 1; unsigned long ulInf = 0x4001; unsigned char ucAddr = pData[0]; 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, &pData[7+2*i]); } }}void Refresh_GR100_DD(int iPort, int uIndex, GR100_DD_DATA *pDD_Buff){ int i,j,nRecv,iDd = 7; unsigned long TempDD,TopWord; unsigned long HiWord,LoWord; unsigned short CRC16Check,Temp[2]; unsigned char SendBuff[16], pRecv[256]; unsigned char ucAddr = SubDevice[iPort].SubStations[uIndex].sub_address;//从机地址 unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type; SendBuff[0] = ucAddr ; SendBuff[1] = 0x03; SendBuff[2] = 0; SendBuff[3] = 41; SendBuff[4] = 0; switch(DevType) { case 0xF1: SendBuff[5] = iDd * 2; break; case 0xF2: SendBuff[5] = iDd * 4; break; } CRC16Check = CRC16(SendBuff, 6); SendBuff[6] = HIBYTE(CRC16Check); SendBuff[7] = LOBYTE(CRC16Check); for(i = 0; i < 3; i++) { SYS_Delay(50); COMM_SendBuff(iPort, SendBuff, 8); nRecv = Read_Modbus_Frame(iPort, ucAddr, pRecv); if (nRecv > 0) { switch(DevType) { case 0xF1: for(j = 0; j < iDd; j++) { LoWord = pRecv[3 + 4 * j]*256 + pRecv[4 + 4 * j] ;//modify by scm 06.05.02 高低字颠倒 HiWord = pRecv[5 + 4 * j]*256 + pRecv[6 + 4 * j] ; TempDD = HiWord*1000 + LoWord ; Temp[0]=TempDD & 0xFFFF; Temp[1]=(TempDD >> 16) & 0xFFFF; pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]); pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]); pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]); pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]); pDD_Buff->DD_Buff[4 + j * 5] = j; } break; case 0xF2: for(j = 0; j < iDd; j++) { TopWord = pRecv[9 + 8 * j]*256 + pRecv[10 + 8 * j] ; HiWord = pRecv[3 + 8 * j]*256 + pRecv[4 + 8 * j] ; LoWord = pRecv[5 + 8 * j]*256 + pRecv[6 + 8 * j] ; TempDD = TopWord*1000000 + HiWord*10000 + LoWord ; Temp[0]=TempDD & 0xFFFF; Temp[1]=(TempDD >> 16) & 0xFFFF; pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]); pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]); pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]); pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]); pDD_Buff->DD_Buff[4 + j * 5] = j; } break; } break; } if(SubDevice[iPort].SubStations[uIndex].sub_state != SUB_STATE_ONLINE) break; }}void Refresh_GR100ZGD_DD(int iPort, int uIndex, GR100_DD_DATA *pDD_Buff){ int i,j,nRecv,iDd = 7; unsigned long TempDD,TopWord; unsigned long HiWord,LoWord; unsigned short CRC16Check,Temp[2]; unsigned char SendBuff[16], pRecv[256]; unsigned char ucAddr = SubDevice[iPort].SubStations[uIndex].sub_address;//从机地址 unsigned char DevType = SubDevice[iPort].SubStations[uIndex].sub_type; SendBuff[0] = ucAddr ; SendBuff[1] = 0x03; SendBuff[2] = 0; SendBuff[3] = 50; SendBuff[4] = 0; switch(DevType) { case 0xF1: SendBuff[5] = 22; break; case 0xF2: SendBuff[5] = 44; break; } CRC16Check = CRC16(SendBuff, 6); SendBuff[6] = HIBYTE(CRC16Check); SendBuff[7] = LOBYTE(CRC16Check); for(i = 0; i < 3; i++) { SYS_Delay(50); COMM_SendBuff(iPort, SendBuff, 8); nRecv = Read_Modbus_Frame(iPort, ucAddr, pRecv); if (nRecv > 0) { switch(DevType) { case 0xF1: for(j = 0; j < iDd; j++) { LoWord = pRecv[3 + 4 * j]*256 + pRecv[4 + 4 * j] ;//modify by scm 06.05.02 高低字颠倒 HiWord = pRecv[5 + 4 * j]*256 + pRecv[6 + 4 * j] ; TempDD = HiWord*1000 + LoWord ; Temp[0]=TempDD & 0xFFFF; Temp[1]=(TempDD >> 16) & 0xFFFF; pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]); pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]); pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]); pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]); pDD_Buff->DD_Buff[4 + j * 5] = j; } break; case 0xF2: for(j = 0; j < iDd; j++) { TopWord = pRecv[9 + 8 * j]*256 + pRecv[10 + 8 * j] ; HiWord = pRecv[3 + 8 * j]*256 + pRecv[4 + 8 * j] ; LoWord = pRecv[5 + 8 * j]*256 + pRecv[6 + 8 * j] ; TempDD = TopWord*1000000 + HiWord*10000 + LoWord ; Temp[0]=TempDD & 0xFFFF; Temp[1]=(TempDD >> 16) & 0xFFFF; pDD_Buff->DD_Buff[0 + j * 5] = LOBYTE(Temp[0]); pDD_Buff->DD_Buff[1 + j * 5] = HIBYTE(Temp[0]); pDD_Buff->DD_Buff[2 + j * 5] = LOBYTE(Temp[1]); pDD_Buff->DD_Buff[3 + j * 5] = HIBYTE(Temp[1]); pDD_Buff->DD_Buff[4 + j * 5] = j; } break; } break; } if(SubDevice[iPort].SubStations[uIndex].sub_state != SUB_STATE_ONLINE) break; }}void GR100_Response_DD(int iPort, int iNetGroup, int iConnect, unsigned char *IEC104DataBuff, GR100_DD_DATA *pDD_Buff){ unsigned char uSPI,ucVSQ,ucLen; int ret, i, k, nGroup, uIndex, DdCount = 7, SubDgtNum = 8; unsigned long ulInf; unsigned char ucTI104, ucSect, ucADDR, ucContent; unsigned char *p104c = IEC104DataBuff; unsigned char IEC104DataBuf_M[256], ModbusBuff[16], COM_Recv[256], RetFlag[2]; unsigned short CRCValue, usYCAddr; ucTI104 = *(p104c + IEC104_OFFSET_TI); ucADDR = *(p104c + IEC104_OFFSET_ADDR); ucSect = *(p104c + IEC104_OFFSET_SECT); ulInf = *(p104c + IEC104_OFFSET_INF) + *(p104c + IEC104_OFFSET_INF + 1)*256; ucContent = *(p104c + IEC104_OFFSET_CONTEXT); uIndex = SUB_AddrToIndex( ucADDR ); usYCAddr = SubDevice[iPort].SubStations[uIndex].sub_YC_Addr; switch (ucTI104) { case IEC104_TI_C_DC_NA_1: //46:遥控,直控方式 ModbusBuff[0] = ucADDR; ModbusBuff[1] = 0x10; ModbusBuff[2] = (ulInf+904)/256;//起始地址 ModbusBuff[3] = (ulInf+904)%256; ModbusBuff[4] = 0x00;//寄存器数目 ModbusBuff[5] = 0x01; ModbusBuff[6] = 0x02;//字节数 ModbusBuff[7] = 0x00; ModbusBuff[8] = ucContent-1; CRCValue = CRC16(ModbusBuff,9); ModbusBuff[9] = HIBYTE(CRCValue); ModbusBuff[10] = LOBYTE(CRCValue); for (k=0;k<3;k++) { COMM_SendBuff(iPort,ModbusBuff, 11); SYS_Delay(200); ret = Read_Modbus_Frame(iPort,ucADDR,COM_Recv); if ( ret>0 ) { //直控执行结束,返回确认报文 RetFlag[0]=ucContent; ret=IEC_PackFrame_104(IEC104DataBuf_M,46/*类别标识*/,1/*可变结构限定词*/,7/*传输原因*/,ucADDR/*设备地址*/, 0x01/*扇区号*/,ulInf/*信息地址*/,1/*要转换的字节数*/,RetFlag/*要转换的字节的起始地址*/ ); CONN_Send104Data(iNetGroup,iConnect,IEC104DataBuf_M,ret); SYS_Delay(10); //直控过程结束,返回报文// ret=IEC_PackFrame_104(IEC104DataBuf_M,46/*类别标识*/,1/*可变结构限定词*/,10/*传输原因*/,ucADDR/*设备地址*/,// 0x01/*扇区号*/,ulInf/*信息地址*/,1/*要转换的字节数*/,RetFlag/*要转换的字节的起始地址*/ );// CONN_Send104Data(iNetGroup,iConnect,IEC104DataBuf_M,ret);// SYS_Delay(10); break; } SYS_Delay(200); } break; case IEC104_TI_C_CI_NA_1: //101电度量冻结 if(ucSect == 1) { ret = IEC_PackPowerHead_104( IEC104DataBuf_M, ucADDR, ucSect, 5);//回答电度量冻结确认 CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret ); SYS_Delay(10); if(SubDevice[iPort].SubStations[uIndex].sub_state != SUB_STATE_ONLINE)//装置通讯已中断 { for( i = 0; i < DdCount ; i++ ) pDD_Buff->DD_Buff[5*i+4] = i | 0x80; } else { if (usYCAddr == 63) { Refresh_GR100_DD(iPort, uIndex, pDD_Buff); } else if (usYCAddr == 64) { Refresh_GR100ZGD_DD(iPort, uIndex, pDD_Buff); } } ucVSQ = 0x80 | DdCount; ucLen = DdCount * 5; ret = IEC_PackFrame_104(IEC104DataBuf_M, 15, ucVSQ, 37, ucADDR, 1, 0x0C01, ucLen, pDD_Buff->DD_Buff); CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret ); SYS_Delay(10); ret = IEC_PackPowerEnd_104( IEC104DataBuf_M, ucADDR, ucSect, 5); //回答电度量数据结束 CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret ); SYS_Delay(10); } break; case IEC104_TI_C_IC_NA_1: //100:总召唤 ret = IEC_PackInspectHead_104( IEC104DataBuf_M, ucADDR, ucSect );//回答确认命令 CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret ); SYS_Delay(10); if(ucSect == 0) { uSPI = (SubDevice[iPort].SubStations[uIndex].sub_state==SUB_STATE_ONLINE) ? 0 : 1 ; ret = IEC_PackNode_104(IEC104DataBuf_M, ucADDR,IEC104_COT_M_introgen,uSPI);//装置通讯状态上送主站 CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret); SYS_Delay(10); } else if(ucSect == 1) { if (SubDevice[iPort].SubStations[uIndex].sub_state == SUB_STATE_ONLINE ) { ucVSQ = 0x80| SubDgtNum; ret=IEC_PackFrame_104(IEC104DataBuf_M,3/*类别标识*/,ucVSQ/*可变结构限定词*/,20/*传输原因*/,ucADDR/*设备地址*/, ucSect/*扇区号*/,1/*起始信息地址*/, SubDgtNum/*要转换的字节数*/,&SubDevice[iPort].SubStations[uIndex].sub_Data[0]); CONN_Send104Data(iNetGroup,iConnect,IEC104DataBuf_M,ret); SYS_Delay(10); } } ret = IEC_PackInspectEnd_104( IEC104DataBuf_M, ucADDR, ucSect );//回答结束报文 CONN_Send104Data(iNetGroup, iConnect, IEC104DataBuf_M, ret); SYS_Delay(10); break; }}int Get_TCWDXJ_Frame(unsigned char *pFrame,int iPort,int iIndex,int nGroup) //天辰温度巡检
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -