4–20mA 换算工程量:公式、反算,以及量程上下限为什么不能贴着工艺值设
4–20mA 换算成工程量,公式谁都会写。真正容易出问题的是另外两件事:量程上下限设在哪,以及超出 4–20 的那部分电流怎么解读。
这篇先把公式和代码写清楚,再讲量程设定的三条经验。
换算公式
设量程下限 LRV 对应 4mA、上限 URV 对应 20mA:
工程量 = LRV + (I − 4) / 16 × (URV − LRV) 电流 = 4 + 16 × (工程量 − LRV) / (URV − LRV)defma_to_value(ma,lrv,urv):"""4–20mA → 工程量(线性)。"""returnlrv+(ma-4.0)/16.0*(urv-lrv)defvalue_to_ma(value,lrv,urv):"""工程量 → 4–20mA,不做限幅,便于看出超量程有多远。"""return4.0+16.0*(value-lrv)/(urv-lrv)URV < LRV的反向量程也成立,公式不用改。
超出 4–20 的电流是什么意思
按 NAMUR NE43 的约定,回路电流不是只有 4–20 这一段:
| 电流 | 含义 |
|---|---|
| ≥ 21.0 mA | 故障(高报警方向) |
| 20.5–21.0 mA | 未定义区,正常不应出现 |
| 20.0–20.5 mA | 测量值超上限,仍是有效测量 |
| 4.0–20.0 mA | 正常量程 |
| 3.8–4.0 mA | 测量值低于下限,仍是有效测量 |
| 3.6–3.8 mA | 未定义区 |
| ≤ 3.6 mA | 故障(低报警方向) |
defclassify(ma):ifma<=3.6:return"fault-low"ifma<3.8:return"undefined-low"ifma<4.0:return"under-range"ifma<=20.0:return"normal"ifma<=20.5:return"over-range"ifma<21.0:return"undefined-high"return"fault-high"DCS 侧至少要把 “fault” 和 “over/under-range” 分开处理:前者是仪表在说"我坏了",后者是仪表在说"工艺超出了你给我的量程"。把两者都当成"超量程"报警,等于把故障信息丢掉了。
量程设定的三条经验
1. 上限不要贴着工艺最高值
如果 URV 恰好等于工艺的最高值,工艺一冲高,输出就钉在 20.5mA,DCS 看到的是一条平线——恰好在最需要看到数据的时候,看不到数据。
上限要给工艺的"异常但可能出现"的值留余量。一个参照:某蒸发结晶装置,设计工况晶浆密度约 1.27~1.29 g/cm³,最不利工况约 1.361 g/cm³,量程上限取 1.37。
2. 下限不要贴着正常值,也不要为了"包住清水"而放得太低
同一个装置,清母液基线约 1.153 g/cm³。量程下限取 1.13,留了 0.02 的余量——母液密度是按文献折算的估算值,实测可能偏低,没有余量的话,清母液基线会掉进 3.8mA 的超量程带。
另一头,冲洗时管里是清水,约 1.0 g/cm³,远低于 1.13,输出会进 3.8mA 那一档。这是正确行为,不是故障:冲洗期间应当在 DCS 侧用泵或阀的信号把读数屏蔽掉。
有人会想:干脆把下限放到 1.0,清水也在量程内。代价是量程变宽、分辨率变差,见下一条。
3. 量程宽度决定模拟量的分辨率
模拟量回路的误差是按电流算的。假设整条回路(变送输出 + AI 卡)合计 ±0.1% × 16mA = ±16 μA:
defma_error_to_value(err_ua,lrv,urv):returnerr_ua/1000.0/16.0*(urv-lrv)ma_error_to_value(16,1.13,1.37)# 量程 0.24 → ±0.00024 g/cm³ma_error_to_value(16,1.00,2.00)# 量程 1.00 → ±0.00100 g/cm³量程宽四倍,回路带来的误差也大四倍。所以量程要按控制需要来定,不是越宽越保险。
如果同时需要宽范围和高分辨率,用数字通讯读原始值:Modbus 直接传 32 位浮点,不受 4–20mA 量程的限制。模拟量留给控制回路和联锁,数字量给记录和诊断。
两个常见的"对不上"
一、百分比和电流对不上。
带 HART 的仪表,命令 2、3 返回的回路电流通常是承载 HART 信号的那一路(例如回路 1),而"量程百分比"跟随的是被映射到主变量的那一路。如果回路 1 被配成输出温度、回路 2 输出浓度,读到的电流和百分比就分属两个回路。先查输出分配,再怀疑仪表。
二、故障方向和 DCS 组态相反。
NE43 的故障电流可以配置成高报警(≥21mA)或低报警(≤3.6mA)。DCS 按"高报警"组态、仪表却配成低报警时,一次传感器故障会被 DCS 当成一个很低的正常读数,不报警。
有的仪表通过 HART 命令 15 返回当前的报警方向(alarm select),它跟随仪表配置,不是固定值。投运时读一次、和 DCS 组态核对一次,花不了一分钟。
测试
deftest_round_trip():forvin(1.13,1.25,1.37):assertabs(ma_to_value(value_to_ma(v,1.13,1.37),1.13,1.37)-v)<1e-12deftest_classify_edges():assertclassify(3.5)=="fault-low"assertclassify(3.9)=="under-range"assertclassify(12.0)=="normal"assertclassify(20.3)=="over-range"assertclassify(21.5)=="fault-high"小结
- 上限给异常工况留余量,下限给基线留余量
- 冲洗、停泵造成的 3.8mA 是正确行为,在 DCS 侧屏蔽,不要为它放宽量程
- 量程宽度直接决定模拟量分辨率;要精度,读数字量
- 投运时核对两件事:电流和百分比是不是同一路,故障方向和 DCS 组态是否一致
本文由西安派声信息科技有限公司技术团队整理,内容来自实际固件与现场记录。
文中提到的量程上下限、报警方向(HART 命令 15)与回路说明:
- GitCode —— https://gitcode.com/Pisonics/ps7000-hart
- Gitee —— https://gitee.com/pisonics/ps7000-hart
- GitHub —— https://github.com/Pisonics/ps7000-hart