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;
全部0条评论
快来发表一下你的评论吧 !