接入 PLC 或上位机时,很多人会先问一句"支持 Modbus 吗",然后就按标准 Modbus 的经验去写程序。可一体显示型数字式气体质量流量控制器有个容易被忽略的特点:它同时支持两种通信方式——自拟 RS485 协议和标准 Modbus RTU,设备能自己识别并解析。 这意味着同一条 485 总线上、同一台设备,你既可以按我司自拟格式发报文,也可以直接用标准 Modbus 工具读写。这对现场非常方便,但也带来一个真实的坑:两套协议长得完全不像,报文格式、校验方式、地址范围全都不一样,用错一边就是"一帧都不回"。 这篇文章把两套协议拆到字节层面,配上可以直接照抄的报文示例,最后给出一份按现场排查顺序排好的易错点清单。
一、先搞清楚:这台设备到底有几种"说话方式"
同一台设备上,有三组设置互相独立,初学时最容易混在一起:
| 设置项 | 菜单名 | 取值 |
|---|---|---|
| 通信协议 | PRTL | 自拟 RS485 或标准 Modbus RTU |
| 通信地址 | ADDR | 总线上的编号,出厂默认 1 |
| 通信波特率 | BAUD | 9600 / 19200 / 38400 / 57600,默认 9600 |
这三项都能通过上位机软件设置,也能在 LCD 主菜单上改。菜单路径是主菜单里的 ADDR、BAUD、PRTL、GAS 四项。 串口参数固定为:9600 波特率(可改)、8 数据位、无奇偶校验、1 停止位,也就是常说的 8N1。改波特率时上位机和设备要同时改,否则就是完全无响应。 还有一项同样关键、却常被忘掉的设置——控制模式:
| 控制模式 | 16 进制 | 含义 |
|---|---|---|
| 模拟控制 | 0x00 | 由 0-5V / 4-20mA 设定流量 |
| 通信控制 | 0x01 | 由上位机经通信设定流量 |
| 本地 LCD 面板控制 | 0x02 | 用设备本机面板设定 |
这一项决定了上位机的设定指令到底起不起作用。 设备处在"模拟控制"时,你用软件去设流量,设备会安静地不响应——这不是通信坏了,是模式不对:设定通道被模拟量输入占着,通信指令进不来。故障排查里"设定没有控制信号"这一条,首要原因就是设定方式与控制模式不匹配。
二、自拟 RS485 协议:定长 16 位、以 0x77 结尾
这是弗罗迈自定义的协议格式,结构非常规整——每一帧固定 16 个字节(32 位十六进制字符),各字段位置固定:
| 字段 | 长度 | 说明 |
|---|---|---|
| 本机地址 | 2 位 | 0x00–0xFF,十进制 0–255,默认 1 |
| 一级命令 | 2 位 | 0x01–0x07,指示操作哪一类参数 |
| 二级命令 | 2 位 | 同一级下的细分操作 |
| 读写控制 | 2 位 | 0x01 读取,0x02 设定 |
| 数据 | 6 位 | 6 位十六进制数 |
| 协议尾 | 2 位 | 固定 0x77 |
一级命令的分工:
| 一级命令 | 功能 | 常见二级命令 |
|---|---|---|
| 0x01 | 波特率 | 0x01 读 / 0x02 写 |
| 0x02 | 本机地址 | 0x01 读 / 0x02 写 |
| 0x03 | 气体类型 | 0x01 读 / 0x02 写 |
| 0x04 | 工作(控制)模式 | 0x01 读 / 0x02 写 |
| 0x05 | 阀控模式 | 0x01 读 / 0x02 写 |
| 0x06 | 流量 | 0x01 实时流量读 / 0x02 写设定 |
读和写的区别只体现在两处:读写控制位(0x01 读 / 0x02 写),以及响应帧的第三位会变成"命令回显 + 状态"。例如读取实时流量: 发送 `01 06 01 01 000000 77`,设备返回 `01 06 02 001388 77`。 返回帧的第 3 位是 0x02 而不是 0x01——这是"读写控制位"的位置在响应中变成了状态位(0x02 表示"这是数据")。这一处不看懂,读程序就会把响应解析错。 流量值怎么算 返回的数据位是百分比放大 10000 倍的整数:
| 数据位 | 十进制 | 对应百分比 |
|---|---|---|
| `0x0000` | 0 | 0% |
| `0x2710` | 10000 | 100% |
| `0x1388` | 5000 | 50% |
所以拿到 `001388` 时,先除以 10000 得到百分比,再乘以该机的标称满量程。注意这里永远是百分比,不是工程单位。 举个完整的算例:满量程 100 SLPM 的机型,实时反馈 50%,实际流量就是 50 SLPM。要换成 SLPM 或 SCCM,得靠你自己乘满量程。 顺带说清一个常被忽略的量纲问题:流量设定值和反馈值都用同一套百分比基准,所以"设 50%、读回 50%"只是说明控制到位了,不代表实际流量精确等于满量程的一半——满量程本身取的是哪个量程档、当前气体是不是氮气标定,都会影响实际值。 累积流量为什么要读两次 累积流量是跨两个命令读取的,这是自拟协议里最需要留意的一处:二级命令 `0x02` 读累积流量高三位,二级命令 `0x03` 读累积流量低三位。 两次读取的时间间隔必须小于 2 秒,实际操作按 1 秒内完成更稳。超过间隔,两次读到的可能已经不是同一笔累积量,拼出来的数就是错的——而且错得不明显:数值看起来正常,实际是把两个不同时刻的数据硬拼在了一起。 一组完整示例: 发 `01 06 02 01 000000 77` 回 `01 06 02 02 000009 77`,发 `01 06 03 01 000000 77` 回 `01 06 03 02 EF07A0 77`。 两次返回值拼接得到 `0x9EF07A0`,转成十进制再除以 10000,得到累积值 16666,单位与系统单位对应。 清零更简单:对二级命令 `0x02` 或 `0x03` 任意一个发清零指令即可,不必两个都发。
三、Modbus RTU:标准协议,直接对接主流工控生态
选 Modbus RTU 的最大价值是生态:PLC、组态软件、第三方 Modbus 调试工具都能直接用,不需要自己写协议解析。 请求帧是标准 Modbus RTU 结构:
| 字段 | 长度 | 请求帧各字段 |
|---|---|---|
| 地址位 | 1 字节 | 从站地址 0x01–0xF7 |
| 功能码 | 1 字节 | 0x03 读 / 0x06 写 |
| 寄存器地址 | 2 字节 | 高字节在前 |
| 数据 | 2 字节 | 寄存器数量或设定值 |
| CRC | 2 字节 | Modbus CRC16,前低后高 |
两处 CRC 字段都注明了「前低后高」——这是本设备的报文格式,即 CRC 的低字节写在前面,字节序的完整说明见本节末尾。 响应帧多一个字节数字段:
| 字段 | 长度 | 响应帧各字段 |
|---|---|---|
| 地址位 | 1 字节 | 从站地址,与请求相同 |
| 功能码 | 1 字节 | 0x03 或 0x06,与请求相同 |
| 字节数 | 1 字节 | 指示后续数据字节数 |
| 数据 | 由字节数决定 | 寄存器值 |
| CRC | 2 字节 | Modbus CRC16,前低后高 |
功能码只用两个:0x03 读保持寄存器、0x06 写单个寄存器。 寄存器地址表
| 寄存器 | 功能 | 读 / 写功能码 |
|---|---|---|
| 0x0001 | 实时流量 | 0x03 读 / 0x06 写 |
| 0x0002 | 累积流量 | 0x03 读 / 0x06 清零 |
| 0x0003 | 波特率 | 0x03 读 / 0x06 写 |
| 0x0004 | 本机地址 | 0x03 读 / 0x06 写 |
| 0x0005 | 气体类型 | 0x03 读 / 0x06 写 |
| 0x0006 | 控制模式 | 0x03 读 / 0x06 写 |
| 0x0007 | 阀工作模式 | 0x03 读 / 0x06 写 |
可以直接照抄的报文 下面每条都带算好的 CRC,可直接粘进调试工具验证。注意 CRC 是"前低位、后高位"——低字节写在前面,详见本节末尾的字节序说明。写指令(0x06)成功后从机会原样回显请求帧。
| 读操作 | 请求报文 | 返回数据 |
|---|---|---|
| 读实时流量 | `01 03 00 01 00 01 D5CA` | `13 88`=50% |
| 读累积流量 | `01 03 00 02 00 06 6408` | `9EF07A0`=16666 |
| 读本机地址 | `01 03 00 04 00 01 C5CB` | `0x0001`=1 号机 |
| 读波特率 | `01 03 00 03 00 01 740A` | `0x00`=9600 |
| 读气体类型 | `01 03 00 05 00 01 940B` | `0x4304`=氮气 |
| 读控制模式 | `01 03 00 06 00 01 640B` | `0x00`=模拟控制 |
| 读阀状态 | `01 03 00 07 00 01 35CB` | `0x02`=关闭 |
| 写操作 | 请求报文 | 写入内容 |
|---|---|---|
| 设定流量 100% | `01 06 00 01 27 10 C236` | 写 100% |
| 设定流量 50% | `01 06 00 01 13 88 D55C` | 写 50% |
| 清零累积流量 | `01 06 00 02 00 00 280A` | 原样回显 |
| 改地址为 16 号 | `01 06 00 04 00 10 C9C7` | 原样回显 |
| 改波特率 57600 | `01 06 00 03 00 03 39CB` | 原样回显 |
| 改气体为空气 | `01 06 00 05 43 00 A8FB` | 写 0x4300 |
| 改控制模式为通信控制 | `01 06 00 06 00 01 A80B` | 写 0x01 |
| 改控制模式为本地 LCD | `01 06 00 06 00 02 E80A` | 写 0x02 |
| 阀状态置阀控 | `01 06 00 07 00 03 780A` | 写 0x03 |
| 阀状态置关闭 | `01 06 00 07 00 02 B9CA` | 写 0x02 |
| 阀状态置清洗 | `01 06 00 07 00 01 F9CB` | 写 0x01 |
表里只列了请求帧与关键返回数据,几条典型响应的完整帧是:读实时流量 `01 03 02 13 88 B512`,读累积流量 `01 03 06 00 00 09 EF 07 A0 1154`,读本机地址 `01 03 02 00 01 7984`。写指令(0x06)成功后从机会原样回显请求帧。 累积流量的读法在两种协议下不同:Modbus RTU 一次读 3 个寄存器即可拿到完整 4 字节数据;自拟 RS485 协议要分两条命令读高、低三位再拼接,两次间隔必须小于 2 秒。 CRC 字节序:本设备采用前低位、后高位 这是初学者最容易栽的一处。CRC 算出来是一个 16 位数,但放进报文时要拆成两个字节——而这两个字节谁在前、谁在后,不同厂家和资料有两种不同的表达方式,一种叫"前低位、后高位",另一种叫"前高位、后低位"。本设备的报文格式采用前低位、后高位,也就是低字节写在前面。 拿"设定流量 100%"这条举例:帧体是 `01 06 00 01 27 10`,算出的 CRC 寄存器值是 0x36C2,其中低字节是 `0xC2`、高字节是 `0x36`。按本设备的前低位、后高位填进报文就是 `C2 36`,连起来写成 `01 06 00 01 27 10 C236`。 两种表达方式的对照:
| 字节序 | 填入结果 | 本设备是否适用 |
|---|---|---|
| 前低位、后高位 | `C2 36` | 适用 |
| 前高位、后低位 | `36 C2` | 不适用 |
两种写法指的是同一个 16 位数的两种排列,不是两种不同的算法——算出来的 CRC 值本身是一样的,差别只在于往报文里填的时候先放哪一半。本设备按前低位、后高位解析,如果你的程序填成了 `36 C2`,校验就会一直不通过。遇到这种情况不用怀疑算法,先把两个字节调个头试试。 CRC 算法本身则是另一组要固定的参数:初值 0xFFFF、多项式 0xA001、逐位右移、不进位——这三条决定了算出来的值,只要有一条对不上,结果就不同。所以最稳的做法是拿上面"设定流量 100% = `C236`"这条做基准:先让你的程序算出 `C236`,再去接设备;算不出 `C236` 就先别上机,上了也是白等超时。 顺带说一句,寄存器地址本身是高字节在前(`0x0001` 写成 `00 01`),这和 CRC 的字节序是两回事——地址字节序不能跟着 CRC 一起颠倒。 气体码 气体类型用一个 16 位码表示,完整气体码表随产品说明书提供,下面是常用的几个:
| 气体 | 气体码 | 备注 |
|---|---|---|
| 空气 | 0x4300 | 常见基准气体 |
| 氩气 | 0x4302 | 偶数位递增 0x0002 |
| 氮气 | 0x4304 | 出厂默认标定气体 |
| 氧气 | 0x4306 | 常用 |
| 甲烷 | 0x4308 | 常用 |
| 氢气 | 0x4310 | 常用 |
| 氦气 | 0x4316 | 常用 |
| 氨气 | 0x4318 | 常用 |
气体码只能取产品说明书气体码表内的值,超出范围的设定视为无效、设置不生效。设备内置 60 多种常用气体和 10 种非标气体,需要完整气体码表的可在官网资料下载页取对应型号说明书。
四、两套协议怎么选
| 对比项 | 自拟 RS485 | Modbus RTU |
|---|---|---|
| 报文长度 | 固定 16 位 | 按功能码可变 |
| 校验方式 | 0x77 尾码 + 定长 | 标准 CRC16 |
| 上位机要求 | 需自行按协议格式实现解析 | 通用 Modbus 工具即可 |
| 生态兼容 | 仅支持我司协议的设备 | PLC/组态软件通用 |
| 有效地址范围 | 0x00–0xFF(0–255) | 0x01–0xF7(1–247) |
地址范围这条要特别记住:自拟协议下地址可以设到 255,Modbus RTU 下有效范围是 0x01–0xF7。同一批设备从自拟协议切到 Modbus RTU,地址如果设成 248 以上就会无效。 通用建议:新项目、有 PLC 或组态软件,直接用 Modbus RTU;只有在既有系统已经按我司自拟协议写好程序、或者使用的第三方设备只认自拟格式时,才用自拟协议。
五、多台组网怎么接
常见的三种典型接法: 单台接电脑:设备侧接 DB9 母头,电脑侧经 485 转 USB 转换器连接,供电用标配 24V 电源适配器。
2–4 台:用四路机箱选件,集中供电、集中通信,机箱各路分别接一台设备,最后一根 485 转 USB 线接电脑。这样既省电脑侧的 USB 口,系统也更紧凑。此时必须逐台区分地址位,否则两台同地址会互相抢答。 5 台及以上:增加四路机箱数量,机箱之间用 RS485EXT 扩展信号互连,其余接法不变,整体仍是一台电脑控制。
DB9 接线定义里,与通信相关的两针要认准:4 脚 RXD485+(黄色) 和 9 脚 TXD485-(灰色)。这两个名字是站在设备自己的角度标的——它接收的是正极、发送的是负极。 这里就是 RS485 最经典的翻车点:不同厂家对 A/B、D+/D− 的命名习惯不一致,有的以接收端为基准、有的以发送端为基准。接反了的表现是"偶尔能通、偶尔不能通",或者完全无响应。 排查方法很简单——把这两根线对调试一次;如果对调后能通,就说明命名基准不一致。 另外 1 脚是阀控信号(开路为阀控、接地为强制关闭、接供电电压为强制清洗),2 脚是模拟输出反馈、6 脚是模拟设定——这两脚只在模拟模式下有响应。
六、8 个现场易错点
按现场实际发生频次排序,从上往下查:
① 控制模式不对,软件设了没反应。 设备在"模拟控制"时用软件设定流量,设备不响应——设定通道被模拟量占着,通信指令进不来。先读 0x0006 确认当前模式,需要软件控制就写成 0x01。这一条排第一,因为它最容易被误判成"通信坏了"。 ② 阀状态操作顺序错。 处在"清洗"状态后不要直接转"阀控",应先切到"关闭",再转"阀控",才能达到最佳控制性能。跳过中间步骤会出现阀门响应迟钝或控制不稳。
③ 累积流量两次读取间隔太长。 必须小于 2 秒,建议按 1 秒内完成执行。间隔太长拼出来的数是错的,而且错得不明显——数值看起来正常,实际是两次不同时间点的数据被硬拼在一起。 ④ 流量当成工程单位用。 通信读回的是百分比 × 10000,不是 SLPM。要拿工程值必须自己乘满量程。把 5000 当成"5000 SLPM"是这类接口最常见的理解偏差。
⑤ 累积流量忘了除以 10000。 同上,累积值也是放大 10000 倍的整数,除以 10000 才是真实值。 ⑥ 设定值低于有效下限。 流量设定的有效范围是满量程的 1%–100%。设到 1% 这个边界值时阀门开度极小、响应迟钝,实际应用建议从 2% 起设,给阀门留出可控的调节余量。
⑦ 气体码设错或超出范围。 气体码只能取说明书气体码表内的值,超范围视为无效设定。更隐蔽的情况是码设对了但气体不对——比如实际通氩气却设成氮气,流量换算就会整体偏。 ⑧ CRC 没有代算,抄错一个字节整帧作废。 CRC 不是可选项,每一帧都要单独算——地址、功能码、寄存器、数据任一字节改了,CRC 都要跟着重算。它本身算法不难(初值 0xFFFF、多项式 0xA001),但有两个坑最常见:一是字节序——不同厂家和资料对 CRC 两个字节的排列有两种表达方式,一种前低位后高位、一种前高位后低位,本设备采用前低位、后高位,填反了就一直校验不过;二是十六进制与十进制混着算,把寄存器地址当十进制填进去。
算好之后可以拿这几条已验证的报文对照检查自己的实现对不对:
| 用途 | 功能码 | 报文 |
|---|---|---|
| 设定流量 100% | 0x06 | `01 06 00 01 27 10 C236` |
| 设定流量 50% | 0x06 | `01 06 00 01 13 88 D55C` |
| 清零累积流量 | 0x06 | `01 06 00 02 00 00 280A` |
| 读本机地址 | 0x03 | `01 03 00 04 00 01 C5CB` |
| 读实时流量 | 0x03 | `01 03 00 01 00 01 D5CA` |
如果你自己算出来的 CRC 和这几条对不上,先查字节序,再查是否把 16 位数值拆成了高低字节颠倒。
七、动手前的检查清单
按这个顺序走一遍,能避开绝大部分现场问题:
1. 确认走哪套协议——设备 PRTL 设置与上位机发送格式必须一致,一台设备只按一种解析; 2. 确认控制模式——读 0x0006,需要软件控制则设为 0x01;
3. 确认参数一致——波特率(8N1)、地址、协议三者与上位机完全对齐; 4. 先用一条最简单的读指令试通——读本机地址(0x0004),返回应与设定地址一致。这一条通了,说明物理层、协议、地址、CRC 全部正确;
5. 再逐项加功能——读流量、读累积、写设定、读累积,确认每一步都返回预期值; 6. 累积流量按"两次读、间隔小于 2 秒"或"Modbus 一次读 3 寄存器"来写;
7. 工程值自己换算——百分比 ÷ 10000 × 满量程,单位才正确。
最后补两条使用前提:每次开机先通电预热 10 分钟以上,确保系统处于最佳工作状态;接线完成后要确认无错接漏接——错接会造成设备故障。多台组网时,终端电阻与总线拓扑也按标准 RS485 规范处理。 数字化控制带来的价值是明确的:一根总线挂多台设备,柜内走线大幅简化,上位机还能读回设定值、气体类型、阀状态这些模拟通道传不回来的信息。但这些价值的前提是协议层不搞错——上面八条,每一条都对应着一种具体的"看起来是通信故障、其实是别的问题"。 先从读本机地址开始,把最简单的一条指令走通,后面的都是重复。
如需咨询选型或索取产品资料,欢迎联系深圳弗罗迈测控系统有限公司:
联系人:豆经理 | 电话:18038183381
邮箱:doufeijin@hotmail.com | 官网:www.flowmethod.net
