如何采集雷达流量计(SCJ-LL21)数据

描述

1.雷达流量计介绍
雷达流量计是一种很常用的非接触测流流量计,一般采用RS485通讯接口,SCJ-LL21雷达流量计采用标准的Modbus-RTU协议;

设备采用标准RS485接口,波特率9600,8个数据位,1个停止位,无校验,协议默认为标准Modbus-RTU协议,功能码03H;

        设备默认的从机地址为1,地址可以通过将设备连接电脑,使用配置助手进行修改;

2.雷达流量计寄存器说明

单片机

注意:一般建议读取寄存器3002空高(设备到水面高度),由采集器来计算水深(安装高度-空高=水深),如果需要使用设备内水深,请通过RS485连接电脑后,使用“ 配置助手.exe”设置水位计安装高度,之后才能输出准确的水深;

3.读取雷达流量计示例:
读取空高与流速
主机发送:01 03 0B BA 00 02 E7 CA

设备返回:01 03 04 03 9F 02 2C CA E4

解释:      03 9F 0x039F => 927 空高:927mm,也就是0.927m

        02 2C 0x022C => 556 流速:556mm/s,也就是0.556m/s

②读取空高

主机发送:01 03 0B BA 00 01 A7 CB

        设备返回:01 03 02 03 9D 79 1D

                  解释:     03 9D 0x039D => 925 空高:925mm,也就是0.925m

③读取流速

主机发送:01 03 0B BB 00 01 F6 0B

        设备返回:01 03 02 09 E9 7F 9A

                  解释:     09 E9 0x09E9 => 2537 流速:2537mm/s,也就是2.537m/s

4.编写程序读取SCJ-LL21雷达流量计的数据。
首先进行modbus-rtu主机接口初始化

单片机

实现uart串口底层接口

 
//RS485发送接口
static bool RS485_CH1_SendData(u8 DataBuff[], u16 DataLen)
{
UARTx_EnableRx(RS485_CH1_UART_CH, FALSE);          //RS485发送数据前关闭接收
UARTx_SendData(RS485_CH1_UART_CH, DataBuff, DataLen);       //串口发送数据
UARTx_EnableRx(RS485_CH1_UART_CH, TRUE);          //发送完成后启动接收

return TRUE;
}


//RS485接收数据接口
static int RS485_CH1_ReadData(u8** pDataBuff, u8 ByteTimeOutMs, u16 TimeOutMs, u16* pReceiveDelayMs)
{
u32 cnt = 0;
u16 TempTime;

if (ByteTimeOutMs < 1) ByteTimeOutMs = 1;          //字节超时时间,2个帧之间的间隔最小时间
TimeOutMs /= ByteTimeOutMs;
TimeOutMs += 1;
TempTime = TimeOutMs;
while (TimeOutMs--)
{
 cnt = UARTx_GetRxCnt(RS485_CH1_UART_CH);
 OSTimeDlyHMSM(0, 0, 0, ByteTimeOutMs);
 if ((cnt > 0) && (cnt == UARTx_GetRxCnt(RS485_CH1_UART_CH)))
 {
  if (pReceiveDelayMs != NULL) //需要返回延时
  {
   *pReceiveDelayMs = (TempTime - TimeOutMs) * ByteTimeOutMs;
  }
  *pDataBuff = sg_RS485_CH1_Buff;           //接收缓冲区

  return cnt;
 }   
}

return 0;
}


//RS485清除接收缓冲区
static void RS485_CH1_ClearData(void)
{
UARTx_ClearRxCnt(RS485_CH1_UART_CH); //清除串口缓冲区
}

 

//通过modbus-rtu协议读取雷达流量计数据

 

/*************************************************************************************************************************
* 函数   : SENSORS_ERROR  FL_SCJ_LL21_Coll(MODBUS_HANDLE* pModbusHandle, u8 num, FL_SENSOR_DATA* pSensorData)
* 功能   : 采集流量计数据
* 参数   : pModbusHandle:modbus句柄;num:流速计编号0-1;pSensorData:采集的传感器数据
* 返回   : 采集状态 SENSORS_ERROR
* 依赖   : 底层通信驱动
* 作者   : http://www.scj-water.com/
* 时间   : 2022-07-11
* 最后修改时间  :  2022-07-11
* 说明   :  
*************************************************************************************************************************/
SENSORS_ERROR  FL_SCJ_LL21_Coll(MODBUS_HANDLE* pModbusHandle, u8 num, FL_SENSOR_DATA* pSensorData)
{
u32 temp;
MRTU_ERROR m_error;
u8 retry;
u16 RegDataBuff[8];

if(num > (FL_SENSOR_COUNT -1)) return SENSORS_NON_ERROR;
FL_SensorData_SetInvalidValue(pSensorData);     //传感器数据初始化为无效

for (retry = 0; retry < 3; retry++)
{
 m_error = MODBUS_HOST_ReadMultReg(pModbusHandle, HOLD_REG_03H, GetFlowmeterSensorAddr(num), 3000+2, 7, RegDataBuff); //主机读取从机多个指定寄存器
 if (m_error == MRTU_OK)
 {
  pSensorData->FlowVelocity = abs((s16)RegDataBuff[1]); //水流速度,单位mm/s-取绝对值
  pSensorData->WaterDepth = RegDataBuff[0];    //空高,单位mm
  pSensorData->FlowDirection = RegDataBuff[6] ? 1 : 0; //平均流向

  return SENSORS_OK;
 }
 else
 {
  SYS_DelayMS(150);
 }
}

return SENSORS_COMM_ERROR;
}



————————————————

                           版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                       
原文链接:https://blog.csdn.net/WTRExpert/article/details/146973163;

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分