主题
模拟量与工程量例程 2:限幅 + 取整(夹住异常值再写进 D)
这一页只讲这一个例程。母页 b-03-analog-scaling 里留着例程 1,其余例程各自一页、在那一页的目录里点。
场景:传感器断线、干扰会出现离谱的读数,不能让它进控制逻辑;显示用的 D 寄存器也不适合放小数。
软元件
| 软元件 | 作用 |
|---|---|
D110 | 换算后的温度(带小数) |
D120 | 限幅后的温度 |
D130 | 取整后的温度(可直接显示 / 比较) |
块图(照着拖即可)
对应的 ddc.json(点「生成 JSON」得到的就是它;也可存成 .ddc.json 导入)
json
{
"version": 1,
"name": "限幅取整",
"scan_ms": 200,
"lines": [
{
"op": "assign",
"target": {"op":"ref","device":"D","addr":120},
"expr": {
"op": "limit",
"args": [
{"op":"ref","device":"D","addr":110},
{"op":"const","value":-40},
{"op":"const","value":70}
]
}
},
{
"op": "assign",
"target": {"op":"ref","device":"D","addr":130},
"expr": {"op":"bitget","bit":null,"args":[{"op":"ref","device":"D","addr":120}]}
}
]
}要点
- 限值运算把输入夹在上下限之间。它同时是断线保护:断线算出 -71℃ 会被夹成 -40,控制逻辑不会拿到荒唐的值。
- 「取位」块除了取位还能取整数部分(BIT 选"整数部分"),这是把带小数的计算结果写进 D 寄存器的标准做法。
- 限幅上下限要和量程一致(这里 -40~70),否则会把真实的超量程情况隐藏掉。
验证:D110 = 15.5 → D120 = 15.5、D130 = 15;D110 = -71 → D120 = -40;D110 = 95 → D120 = 70。
注意事项
- 取整会丢掉小数(0.5℃ 分辨率没了)。要保留小数就别取整,直接用带小数的中间值比较。
- 限幅上下限填成 0~100 而量程是 -40~70:负数被抬成 0,低温报警永远不会触发。
- 把限幅后的值写回同一个 D100(源和目的同地址):下一轮读到的是被夹过的值,原始读数再也读不回来。