简介:面向RDI垂直式与水平式ADCP设备用户、水文与河流生态科研人员及技术维护团队的一份命令配置与数据输出说明文档。聚焦设备首次投用、重新配置、故障排查时参数查询等场景,系统梳理CR、CF、BA、BC、BE、BP等固定命令的作用与取值,EX坐标转换、EB航向偏差、向导命令BX/BP/BN的设置逻辑,并讲解ASCII输出文件的三行头部结构、水深分箱数据与回波强度字段的格式规范。资源包共1个docx文件,约682KB,内容以命令解析表、格式说明与WinRiver II操作流程串联,便于随查随用。目前已有506人学习下载。读者可据此理解各参数背后的物理意义,掌握从设备配置到数据后处理、流量报告生成的完整链路,提升野外测量与长期监测中的数据解析能力。
1. 装好一套 RDI ADCP 环境:别急着敲命令,先弄清版本和软件搭配
第一次接手 RDI ADCP 的电脑,桌面上往往躺着三个不同年份的 WinRiver II 快捷方式,串口线插上去以后,报出来的是乱码。心里想着“不就是装个软件、发几条命令吗”,结果第一回就卡在波特率和固件匹配上。设备是垂直式还是水平式、固件是哪一版、WinRiver II 用的是哪一版,这三件事没对齐,后面 CR1、CF11110 发下去,设备照样一声不吭。这套环境看着简单,其实处处是坑:命令少写一位、波特率差一档、串口被别的采集程序占用,都会让你在河边现场耗上半天。这篇就把 RDI ADCP 命令配置与 ASCII 输出这套环境从头装一遍,适合第一次上手设备的新人,也适合需要重新核对参数的老操作员。
2. 环境准备:WinRiver II 与串口链路怎么配
2.1 先定软件和固件版本,别拿新旧混着上
RDI ADCP 的上位机软件主要是 WinRiver II,这套软件负责下发配置命令、采集 PD0 原始数据,并在后处理阶段导出 ASCII 文件。装之前先把三样东西确认清楚:ADCP 的型号(垂直式还是水平式)、设备固件版本、WinRiver II 的安装包版本。我一般会先去设备铭牌和出厂测试报告上找固件号,再对照软件安装包里的 Release Notes,看它支持到哪个固件段。固件太老、软件太新,常见表现是设备能连上,但向导命令跑不完,或者 EX、WM 这类命令发下去没回显。
安装 WinRiver II 的机器建议是 Windows 10 或 Windows 11 的 64 位系统,内存 8 GB 起步,硬盘留出至少 20 GB 给原始数据文件。软件本身对显卡没要求,但串口驱动要单独装:RDI 设备走的是 USB 转串口方案,驱动装不好,设备管理器里会显示一个带感叹号的未知设备,或者干脆识别成别的串口芯片。安装顺序上,我是先装串口驱动、确认 COM 口能正常枚举,再装 WinRiver II,最后插设备。反过来的话,软件装完再插设备,有时候会被系统自动匹配到一个不匹配的驱动。
装完软件第一次启动,先别急着连设备,进配置页面把单位、坐标系统、语言这些基础项过一遍。单位决定了后面 ASCII 输出里速度是 cm/s 还是 ft/s、深度是米还是英尺,一旦测量开始再改,前后数据就没法直接拼。坐标系统默认是地球坐标,对应 EX11xxx 这一档,后面第 3 章会细说。
2.2 串口链路与通信参数
设备的通信参数在软件里配,常见的是波特率、数据位、停止位、校验位。RDI 的 RiverRay 这类设备内部还带 GPS 模块,GPS 的波特率由 SF 命令单独设置,3 到 9 分别对应 4800 到 115200 和自动。这一点很容易被忽略:主通信口和 GPS 口是两条线,配错一条,表现是流量数据正常但导航数据整段为空。
下面是我一般在设备连接前先跑一遍的串口自检命令,在 Windows 的 PowerShell 里执行,用来确认设备到底枚举在哪个 COM 口、驱动是不是正常:
# 列出当前所有串口设备,确认 ADCP 枚举在哪个 COM 口 Get-WmiObject Win32_SerialPort | Select-Object DeviceID, Description, PNPDeviceID # 查看该串口的工作参数(波特率等),部分驱动不返回全部字段 Get-WmiObject Win32_SerialPortConfiguration | Select-Object DeviceID, BaudRate, BitsPerByte, StopBits, Parity第一段命令列出的 DeviceID 就是 COM 口号,Description 里一般能看到 USB Serial Port 之类的描述,如果显示的是未知设备或者描述对不上,基本可以判定驱动没装对。第二段命令读的是驱动上报的参数,有些虚拟串口驱动会返回空值,这时候不用纠结,直接在设备管理器里看端口属性的高级页更准。
还有一种情况是设备能被识别,但一打开就报“端口被占用”。ADCP 采集期间,串口同一时刻只能被一个进程持有,常见的占用者是后台没退干净的采集软件、串口调试助手,或者某些同步工具。排查办法是关掉所有可能占口的程序,再在 PowerShell 里用下面这段确认端口是否可独占打开:
# 尝试独占打开串口,成功说明端口空闲,失败会抛出异常 try { $port = New-Object System.IO.Ports.SerialPort "COM3", 9600, "None", 8, "One" $port.Open() Write-Host "端口可独占打开,当前空闲" $port.Close() } catch { Write-Host "端口打开失败:" $_.Exception.Message }这里的参数要和设备实际配置一致,波特率先按出厂默认的 9600 试,打不开再逐档往上试。代码里的"COM3"换成 2.1 一步查出来的实际口号,9600换成设备当前波特率。注意Open()之后一定要Close(),不然下一次采集又要报占用。
2.3 现场网络与数据落地目录
WinRiver II 采集出来的原始文件是 PD0 格式,ASCII 文件是后处理阶段从 PD0 导出的,两者不要放在同一个目录里混着管。我的习惯是在数据盘建三层目录:raw放 PD0 原始文件、ascii放导出的 ASCII、config放每次测量的配置文件模板。理由是后处理阶段经常要回头重导 ASCII,原始文件必须保持只读,一旦被覆盖就再也回不去了。
现场如果还要接 GPS 和测深仪,串口会占掉两到三个口,这时候要提前把口分配好并写在配置模板里,别等到河边再临时插拔。测深仪的 DBT 数据、GPS 的 GGA/VTG 数据都会进 PD0 文件,导航 ID 分别是 0x2100、0x2101、0x2102、0x2104 这几档,后面做数据解码时要用到。
3. 配置命令落地:从 CR1 到向导命令的完整参数表
3.1 出厂默认与流量控制:CR1、CF11110 怎么下
给一台状态不明的 ADCP 配置参数,第一条命令一定是 CR1。它的作用是恢复出厂默认值,把设备拉回一个“已知”状态。现场翻车的场景我见过不少:上一拨人改过 EX 坐标标志、改过盲区,没留记录,下一拨人上来就发 WM 和 WN,结果出来的剖面全是错的。先发 CR1,等于先把黑匣子清零,后面每改一项都有据可查。
紧接着是 CF11110,这条命令控制五件事:自动集成循环、自动呯循环、二进制数据输出、启用串行输出、禁用数据记录。逐位看,第一位管集成循环,第二位管呯循环,第三位是二进制输出,第四位是串行输出,第五位是数据记录开关。配置阶段发 CF11110,目的是让设备按二进制格式往外吐数据,同时关掉设备内部记录,把记录这件事交给上位机,避免设备存储写满之后行为异常。
这两条发完,先别继续往下灌参数,读一次回显确认设备状态。常见做法是发一条简单的查询命令,看返回的头部信息里固件号和当前配置是否符合预期。如果 CR1 之后设备毫无反应,先回头查第 2 章的串口和波特率,别在命令层面反复试。
3.2 底跟踪与水跟踪参数:BA、BC、BE、BP、WE、WF、WM、WP
底跟踪和水跟踪是 ADCP 的两套测量逻辑,参数之间互相牵连,单独调一个往往不解决问题。下面这张表是我配置时常用的核心参数和取值,来源是设备的标准配置,实际项目里按水深和流速再微调:
| 命令 | 含义 | 典型取值 | 调整依据 |
|---|---|---|---|
| BA30 | 有效底检测的最小振幅 | 30 counts | 底质反射弱时适当降低 |
| BC220 | 底跟踪最小相关幅度 | 220 counts | 含沙量高时适当提高 |
| BE100 | 底跟踪最大误差速度 | 100 mm/s | 船速快时放宽 |
| BP1 | 每个集合的底跟踪呯数 | 1 | 一般保持 1 |
| WE1500 | 水跟踪最大误差速度 | 1500 mm/s | 流速大时放宽 |
| WF50 | 发射后盲区 | 50 cm | 受换能器深度影响 |
| WM1 | 水跟踪模式 | 1 | 通用剖面模式 |
| WP1 | 每个集合的水跟踪呯数 | 1 | 一般保持 1 |
BA 和 BC 这两个值最容易被拍脑袋改。BA 太低,水体里的悬浮物会被误判成底;BA 太高,软泥河床直接丢底。BC 同理,相关幅度门槛设高了,含沙量大的河段底跟踪会断续。我的做法是先按表里的默认值跑一个短断面,看底跟踪的连续性和误差速度,再决定往哪边调,一次只动一个参数。
WF 这个盲区参数和换能器入水深度是绑定的。换能器典型入水深度约 20 cm,盲区设在 50 cm,意味着第一个深度单元从换能器下方 50 cm 才开始,这一段的水流数据是拿不到的。如果现场把换能器放得很浅,盲区还按 50 cm 设,等于白白丢掉一层有效数据;反过来放得深、盲区设小了,发射脉冲的余响会污染第一个单元。
发命令的方式有两种:一种是在 WinRiver II 的配置向导里填参数,软件自动生成命令序列;另一种是直接开一个终端手工发。手工发的好处是能逐条看回显,坏处是顺序错了设备状态会很怪。我一般先用向导跑一遍,再把生成的命令序列导出来存档,下次同类断面直接照着改数值。
3.3 坐标转换 EX 命令:五位标志位逐位拆开
EX 命令是整套配置里最需要逐位理解的一条,它决定原始径向波束数据怎么变换成有物理意义的坐标。命令格式是 EX 加五位标志,每一位管一件事,默认配置是 EX11111。
前两位决定坐标系统:EX00xxx 是不做变换,输出的是 1、2、3、4 四个波束的径向坐标,航向、纵摇、横摇都不参与;EX01xxx 是仪器坐标,输出相对于 ADCP 的 X、Y、Z 矢量;EX10xxx 是船舶坐标,矢量相对于船体,航向未应用;EX11xxx 是地球坐标,输出东、北、垂直三个分量,航向已应用。做流量测量基本都用地球坐标,因为后面算叉积要在东西南北的框架里做。
第三位是倾斜补偿,置 1 表示变换时使用纵摇和横摇。船在河面上不可能绝对水平,纵摇横摇不补偿,垂直速度里会混进水平分量的投影。第四位允许三波束解算,某个波束的相关性低于 WC 设定的阈值时,用剩下三个波束反推速度,代价是误差变大,好处是少丢数据。第五位允许 bin 映射,把深度单元映射到更规整的网格上。
这里有个反直觉的点:EX 的位序是从左往右数,和某些老文档里的描述方向相反。我见过有人把 EX11111 理解成“最后一位是倾斜”,配出来垂直速度整段偏移。判断办法很直接,改一位、看输出、对物理量,别靠记忆。
3.4 剖面结构与向导命令:WN、WS、WV、TP、BX
剖面结构参数决定数据的空间分辨率和时间分辨率。WN 是深度单元数量,WS 是单元大小,两者乘起来大致覆盖最大水深。举个例子,WN50 配 WS50,单元厚度 0.5 m、共 50 层,理论覆盖 25 m 水深,实际还要扣掉盲区和底部旁瓣层。如果现场水深超过这个范围,底部数据会整段丢失,而且不会报错,只是最后一层有效 bin 的位置提前了。
WV 是模糊速度,设的是水流速度和 ADCP 速度之间允许的最大相对径向速度。这个值设小了,流速大的时候会出现速度模糊,表现出来是剖面里某几层的速度突然跳到反方向;设大了,噪声容忍度上升。170 cm/s 是常见起点,实测流速接近这个量级时往上放。
TP 是呯间隔,典型值 0.2 s,直接决定每个集合的时间分辨率和最大可测流速范围。呯间隔太短,前后两个脉冲的回波会互相干扰;太长,集合时间拉长,走航测量的空间分辨率下降。TE 是集合间隔,设成零表示连续采集不等待。
向导命令里 BX 是最大底部搜索限制,WF 是发射后盲区,WM 是水跟踪模式,WN 和 WS 由 WinRiver II 根据输入的最大水深自动推荐。这里必须提醒一句:自动推荐值只是起点,换能器入水深度、河床坡度、含沙量都会影响实际效果,自动值跑完一定要人工核对一遍。自动配置省的是时间,不是判断。
4. 数据输出落地:ASCII 结构与 PD0 导航数据
4.1 ASCII 文件的生成流程
ASCII 输出不是采集时自动生成的,是后处理阶段从 PD0 文件里导出来的。流程是先在 WinRiver II 里加载测量文件,回到配置菜单选全部 ASCII 输出或部分 ASCII 输出,再勾选是否输出背散射强度或回波强度数据,然后对目标断面做回放或重新处理,最后写出文件。
这里有个容易误解的点:ASCII 文件里包含的是 WinRiver II 作为工作集的全部选定数据,包括被标记为“坏”的 bin。也就是说,ASCII 不做质量筛选,深度列里所有 WN 设定的 bin 都会出现,好坏都在。后处理时必须自己按误差速度和相关性过滤,别默认导出来的都是好数据。
文件开头固定写三行头信息,第一行和第二行是附注,可以在断面上右键添加记录录入;第三行是配置摘要,包含 WS 深度单元厚度、WF 盲区、ADCP 入水深度、WN 层数、WP 每集合呯数、集合时间。这三行是判断这份 ASCII 和现场配置是否对得上的唯一依据,导出后第一件事就是核对第三行。
4.2 逐列读 ASCII:前六行是头,第七行起是 bin
ASCII 文件的列结构分两段。前六行是头部信息,包含年月日时分秒、集合时间、集合编号、纵摇、横摇、罗经修正航向、平均温度。第七行开始按 bin 深度往下排,每一行对应一个深度单元,列里依次是深度、速度大小、速度方向、东向分量、北向分量、垂直分量、误差速度、四个波束的强度、百分比良好。
坏数据的填充值是固定的:速度是 -32768,流量是 2147483647,经纬度是 30000。写解析脚本时这三个值必须先剔掉,不然后面求平均、画剖面全被带偏。字段之间用一个或多个空格分隔,没有短划线也没有补位符,所以按空白字符切分比按固定列宽更稳。
下面这段 Python 是我解析 ASCII 文件时的骨架,只保留关键逻辑:
# 读取 WinRiver II 导出的 ASCII 文件,跳过前六行头,逐 bin 解析 BAD_VELOCITY = -32768 def parse_ascii(path): rows = [] with open(path, "r", encoding="utf-8", errors="ignore") as f: lines = f.readlines() # 前六行是头部:时间、姿态、温度等,单独留出来 header = lines[:6] # 第七行起为 bin 数据,按空白切分,避免依赖固定列宽 for line in lines[6:]: parts = line.split() if len(parts) < 7: continue # 不足七列的行不是有效 bin 行 depth = float(parts[0]) velocity = float(parts[1]) if velocity == BAD_VELOCITY: continue # 坏数据直接丢弃,不参与统计 rows.append({ "depth": depth, "velocity": velocity, "direction": float(parts[2]), "east": float(parts[3]), "north": float(parts[4]), "vertical": float(parts[5]), "error": float(parts[6]), }) return header, rows这段代码的取参逻辑是:lines[:6]拿头部,lines[6:]拿 bin 行,parts[0]到parts[6]依次对应深度到误差速度这七列。BAD_VELOCITY的判断必须放在计算之前,因为 -32768 参与任何运算都会污染结果。实际项目里还要加一步按误差速度过滤,误差超过 WE 设定值的 bin 一样不能用。
4.3 PD0 导航数据结构与 NMEA 字符串
PD0 是原始二进制格式,导航数据在固定前导之后按 ID 区分:0x2100 是通用 NMEA 结构,0x2101 是 DBT 测深仪,0x2102 是 GGA,0x2104 是 VTG。每种数据类型的字节长度是固定的,比如底跟踪数据 85 字节,DBT 38 字节,GGA 97 字节。解码时要先找到固定前导,再按 ID 偏移定位,最后按长度截取。
NMEA 字符串本身是 ASCII,格式是$开头、逗号分隔字段、*后跟两位十六进制校验和、CR LF结尾。校验和是$和*之间所有字符的 8 位异或。现场如果 GPS 数据整段为空,先查 NMEA 字符串的校验和是否对得上,校验失败软件会直接丢弃整句,表现就是导航列全是空字段。
5. 避坑与排查:现场最容易翻车的五个点
5.1 现象:设备能连上,但向导命令跑不完
原因通常是固件版本和 WinRiver II 版本不匹配,或者串口波特率只对上了主口、GPS 口没对上。解决顺序是先核对固件与软件支持列表,再单独验证 GPS 口的 SF 设置,把主通信和 GPS 分两条链路测。
5.2 现象:底跟踪断续,流量数据时有时无
多半是 BA 或 BC 设得不合适。含沙量大的河段 BC 门槛偏低会让相关幅度噪声混进来,软泥河床则要把 BA 往下调。处理办法是固定其他参数,只改一个值,跑短断面看连续性,别一次改三四个参数,改完根本不知道是哪个起的作用。
5.3 现象:剖面最后一层有效 bin 位置提前,底部数据丢失
WN 和 WS 的乘积没覆盖实际水深,或者 WF 盲区设得太大。先按实测水深重算 WN 乘 WS,再核对换能器入水深度与 WF 的关系。注意这个错误不会报异常,只能靠看最后一层 bin 的深度判断。
5.4 现象:ASCII 导出后速度列出现大量异常值
坏数据填充值没剔干净,或者坐标系统配错导致速度分量符号整体反向。先检查 -32768 有没有被过滤,再核对 EX 前两位是不是地球坐标,最后看航向偏差 EB 有没有配。
5.5 现象:GPS 导航列整段为空
一般是 NMEA 校验和失败,或者导航 ID 对应的数据类型在 PD0 里压根没写入。先确认 GPS 口波特率,再用校验和算法逐句验证,最后检查采集时 GPS 是否有定位状态。
6. 装完怎么验证:用一段短断面把整条链路跑通
验证这套环境别指望一次长断面,我的做法是先找一段水流平稳、水深 5 到 10 米的短断面,跑两到三个来回,专门用来验链路。
第一步验串口和命令回显:连上设备后发 CR1 和 CF11110,看回显是否完整。第二步验姿态和航向:静止状态下读纵摇、横摇,数值应该接近零且不跳变,罗经修正航向在静止时漂移应该很小。第三步验底跟踪:看底跟踪的连续性和误差速度,误差速度稳定在 BE 设定值以内才算过。第四步验 ASCII 导出:导出一份文件,打开核对第三行头信息里的 WS、WF、WN 是否和现场配置一致。第五步验数据合理性:把 ASCII 里的东向、北向速度分量做矢量合成,和现场预估流速比一比,量级差太多说明坐标变换有问题。
验证通过的标准我列成了一张表,照着打勾就行:
| 检查项 | 通过标准 | 不通过先查 |
|---|---|---|
| 命令回显 | CR1、CF11110 均有完整回显 | 串口、波特率 |
| 静止姿态 | 纵摇横摇接近零,无跳变 | 设备安装水平度 |
| 底跟踪 | 连续,误差速度小于 BE | BA、BC 取值 |
| ASCII 头 | 第三行与现场配置一致 | 导出时的配置模板 |
| 流速量级 | 与现场预估同量级 | EX 坐标标志、EB 航向偏差 |
| 导航数据 | GGA、VTG 字段非空且校验通过 | GPS 口波特率、NMEA 校验 |
这套流程我一般压在一个小时内跑完,跑完才敢上正式断面。有一次赶时间省掉了静止姿态校验,结果整段测量的垂直速度里混着横摇分量,回来重导数据才发现,等于白跑一趟。从那以后我每次配完 ADCP,都强制走一遍这份短断面验证清单,哪怕设备是昨天刚配好的同一台。希望这套流程能帮到你,少在河边多耗那几个小时。
本文还有配套的精品资源,点击获取