SL651-2014,SL651-2014规约,SL651-2014报文格式

网站导航

开发相关(SCJ)

当前位置: 首页 > 开发相关(SCJ)
遥测终端机SL651-2014报文打包
时间:2025-03-31 13:44:08 点击次数:

遥测终端机SL651-2014报文打包

水测家遥测终端机SCJ-RTU01使用的SL651-2014规约进行水文气象数据传输,通常主要通过4G或者有线以太网方式。


image.png

常用的报文格式如上图,比如加报,定时报等,格式一样,只是传输的间隔以及功能码不一样。

image.png

image.png



报文示例如下

7E 7E //帧头

58  //中心站地址

20 23 08 03 09 //测站编码

1A 20 //密码

33  //功能码-加报报

00 58  //报文上下行标识及长度

02 //报文起始符 

00 01 流水号

23 08 03 10 01 37 发报时间

F1 F1 20 23 08 03 09 测站编码

48 类型

F0 F0 23 08 03 10 01 采集时间

39 23 00 00 30 00  水位Z

28 36 00 00 05 00 00 00 瞬时流量Q1

27 36 00 00 05 00 00 00 总瞬时流量Q=Q1

36 1B 00 10 00 瞬时流速VA

3C 1B 00 30 00 流量计1水深

C1 55 00 00 00 00 00 00 02 50 00 00  流量计累计流量-自定义要素

45 20 00 00 00 01 遥测站状态

38 12 12 04 供电电压

C9 11 00 51 设备温度

7A 08 00 信号强度-自定义要素

CA 10 00 57 电池电量-自定义要素

03 //正文结束

20 05 //校验码




加报报正文打包格式如下



/*************************************************************************************************************************

* 函数 : u16 SL651_AlarmPackage(SL651_2014_HANDLE *pSl651_Handle, u8 *pPackBuff, REAL_TIMER_TYPE *pCollTime,ESS_DATA_TYPE *pData, u16 SerialNumber, SL651_ALARM_TYPE AlarmStatus)

* 功能 : 遥测站加报报数据打包

* 参数 : pSl651_Handle:协议栈句柄;pPackBuff:报文正文指针;pCollTime:观测时间;pData:实时数据指针;SerialNumber:流水号;AlarmStatus:报警定义

* 返回 : 长度

* 依赖 : 无

* 作者 : www.scj-water.com

* 时间 : 2014-09-10

* 最后修改时间 : 2016-08-25

* 说明 : 2016-08-25:修改为独立流水号,非全局

2017-09-15:增加报警定义,报警报文只发送触发报警的数据

*************************************************************************************************************************/ 

u16 SL651_AlarmPackage(SL651_2014_HANDLE *pSl651_Handle, u8 *pPackBuff, REAL_TIMER_TYPE *pCollTime,ESS_DATA_TYPE *pData, u16 SerialNumber, SL651_ALARM_TYPE AlarmStatus)

{

u16 ByteNum = 0;


if(pSl651_Handle->ID != SL651_2014_INIT_ID) ERROR_S("SL651-2014协议栈没有初始化的句柄!\r\n");

if(SerialNumber == 0) //需要自动流水号

{

SerialNumber = pSl651_Handle->pHW_IF->GetSerialNumber(); //获取流水号,之前已经自增过了

}

ByteNum += SL651_SetSerialNumber(&pPackBuff[ByteNum],SerialNumber); //写入流水号

ByteNum += SL651_SetPackTime(&pPackBuff[ByteNum]); //写入发报时间6B

ByteNum += SL651_TelAddrEssData(&pPackBuff[ByteNum], pSl651_Handle->SendDataTelAttr.TelNumber); //写入地址标识符以及地址数据

pPackBuff[ByteNum ++] = (u8)pSl651_Handle->SendDataTelAttr.TelType; //写入遥测站分类码

ByteNum += SL651_TimeEssData(&pPackBuff[ByteNum], pCollTime); //写入观测时间

switch(AlarmStatus)

{

case SL651_WA1_ALARM : //水位计1水位报警

{

ByteNum += SL651_Write_SL651_ID_Z(&pPackBuff[ByteNum],pData->WaterLevel[0]); //水位计1数据//写入瞬时水位1

ByteNum += SL651_AlarmPackageSetAlarm(&pPackBuff[ByteNum], pData->TelAlarm); //遥测站报警状态

//写入瞬时水位2

//ByteNum += SL651_Write_SL651_ID_ZB(&pPackBuff[ByteNum],pData->WaterLevel[1]); //水位计2数据

//ByteNum += SL651_Write_SL651_ID_PD(&pPackBuff[ByteNum],pCollTime,pData,FALSE); //写入雨量相关数据

ByteNum += SL651_RealEssData(&pPackBuff[ByteNum], SL651_ID_VT, pData->SupplyVoltage/10, 2, 2); //电源电压

return ByteNum;

}

case SL651_WA2_ALARM : //水位计2水位报警

{

ByteNum += SL651_Write_SL651_ID_ZB(&pPackBuff[ByteNum],pData->WaterLevel[1]); //水位计2数据

//ByteNum += SL651_Write_SL651_ID_Z(&pPackBuff[ByteNum],pData->WaterLevel[0]); //水位计1数据//写入瞬时水位1

//ByteNum += SL651_Write_SL651_ID_PD(&pPackBuff[ByteNum],pCollTime,pData,FALSE); //写入雨量相关数据

ByteNum += SL651_AlarmPackageSetAlarm(&pPackBuff[ByteNum], pData->TelAlarm); //遥测站报警状态

ByteNum += SL651_RealEssData(&pPackBuff[ByteNum], SL651_ID_VT, pData->SupplyVoltage/10, 2, 2); //电源电压

return ByteNum;

}

case SL651_RAIN_ALARM : //雨量计报警

{

ByteNum += SL651_Write_SL651_ID_PD(&pPackBuff[ByteNum],pCollTime,pData,FALSE); //写入雨量相关数据

//ByteNum += SL651_Write_SL651_ID_Z(&pPackBuff[ByteNum],pData->WaterLevel[0]); //水位计1数据//写入瞬时水位1

//ByteNum += SL651_Write_SL651_ID_ZB(&pPackBuff[ByteNum],pData->WaterLevel[1]); //水位计2数据

ByteNum += SL651_AlarmPackageSetAlarm(&pPackBuff[ByteNum], pData->TelAlarm); //遥测站报警状态

ByteNum += SL651_RealEssData(&pPackBuff[ByteNum], SL651_ID_VT, pData->SupplyVoltage/10, 2, 2); //电源电压

return ByteNum;

}

default:

{

ByteNum += SL651_Write_SL651_ID_PD(&pPackBuff[ByteNum], pCollTime, pData, TRUE); //写入雨量相关数据

ByteNum += SL651_Write_SL651_ID_Z(&pPackBuff[ByteNum],pData->WaterLevel[0]); //水位计1数据//写入瞬时水位1

ByteNum += SL651_Write_SL651_ID_ZB(&pPackBuff[ByteNum],pData->WaterLevel[1]); //水位计2数据

}break;

}


return ByteNum;

}





/*************************************************************************************************************************

* 函数 : DCP_ERROR SL651_SendFrame(SL651_2014_HANDLE *pSl651_Handle,u16 DataLen, SL651_FUN_TYPE Fun)

* 功能 : 数据帧打包发送

* 参数 : pSl651_Handle:协议栈句柄;DataLen:数据包长度;Fun:功能码

* 返回 : DCP_ERROR

* 依赖 : 无

* 作者 : www.scj-water.com

* 时间 : 2014-12-09

* 最后修改时间 : 2016-08-24

* 说明 : 将数据包打包并发送数据

*************************************************************************************************************************/

DCP_ERROR SL651_SendFrame(SL651_2014_HANDLE *pSl651_Handle,u16 DataLen, SL651_FUN_TYPE Fun)

{

SL651_FRAME *pFrame;

u16 crc16;

// u32 TimeOut = 0;

u16 temp;

pFrame = (SL651_FRAME *)pSl651_Handle->pPackDataBuff;

//数据打包

pFrame->SOH[0] = SL651_HEX_SOH; //帧起始符

pFrame->SOH[1] = SL651_HEX_SOH; //帧起始符

pFrame->CenterAddr = pSl651_Handle->SendDataTelAttr.CentralAddr ; //中心站地址

memcpy(pFrame->TelAddr, pSl651_Handle->SendDataTelAttr.TelNumber, 5); //遥测站地址

pFrame->Password[0] = pSl651_Handle->SendDataTelAttr.Passward>>8; //密码

pFrame->Password[1] = (u8)pSl651_Handle->SendDataTelAttr.Passward; //密码

pFrame->Fun = (u8)Fun; //功能码

temp = SL651_MARK_UP | (DataLen & 0xfff);

pFrame->MarkLen[0] = temp>>8; //标识符,上行,报文长度

pFrame->MarkLen[1] = (u8)temp; //标识符,上行,报文长度

pFrame->STX = SL651_ASCII_STX; //报文起始字符

//报文正文已经复制到缓冲区

pFrame->Data[DataLen] = SL651_ASCII_ETX; //报文结束,无后续报文

crc16 = DCP_ExtIF_Modbus_CRC16((u8 *)pSl651_Handle->pPackDataBuff, DataLen+SL651_HEADER_SIZE+1); //进行CRC16校验

pFrame->Data[DataLen+1] = crc16>>8;

pFrame->Data[DataLen+2] = (u8)crc16; //CRC16

//发送数据

#if SL651_DBUG

{

u16 i;

SL651_ERROR_S("\r\nRTU发送数据帧[%d](%d)(CRC=0x%04X):\r\n", pSl651_Handle->SendDataTelAttr.CentralIndex+1,  DataLen+SL651_HEADER_SIZE+1+2,crc16);

for(i = 0;i < DataLen+SL651_HEADER_SIZE+1+2;i ++)

{

SL651_ERROR_S("%02X ",pSl651_Handle->pPackDataBuff[i]);

}

SL651_ERROR_S("\r\n\r\n");

}

#endif//SL651_DBUG


SL651_ERC_Add(SL651_ERC16); //发报记录

if(pSl651_Handle->pHW_IF->SendData(pSl651_Handle->pPackDataBuff, DataLen+SL651_HEADER_SIZE+1+2) == FALSE)

{

return DCP_LINGK_ERROR; //服务器断开了连接

}


return DCP_OK;

}





如果您有任何问题,请跟我们联系!

欢迎来电:18571629282

Copyright © 2024 武汉水测家科技有限公司 版权所有  鄂ICP备2022002065号-1   --WTRExpert English website--

XML地图

QQ在线咨询
销售(微信同号)
18571629282
技术(微信同号)
13871206075