主题
模拟量与工程量例程 3:多路温度取最高 / 最低
这一页只讲这一个例程。母页 b-03-analog-scaling 里留着例程 1,其余例程各自一页、在那一页的目录里点。
场景:三台机柜各一个温度点,按最热的那台控制风机,按最低温做防冻。「最大/最小值运算」两两串起来即可。
软元件
| 软元件 | 作用 |
|---|---|
D111 / D112 / D113 | 1# / 2# / 3# 温度(已换算) |
D140 | 最高温度(控制用) |
D141 | 最低温度(防冻用) |
Y0 | 风机 |
Y1 | 加热防冻 |
块图(照着拖即可)
对应的 ddc.json(点「生成 JSON」得到的就是它;也可存成 .ddc.json 导入)
json
{
"version": 1,
"name": "多路温度取舍",
"scan_ms": 200,
"lines": [
{
"op": "assign",
"target": {"op":"ref","device":"D","addr":140},
"expr": {
"op": "minmax",
"mode": "max",
"args": [
{
"op": "minmax",
"mode": "max",
"args": [{"op":"ref","device":"D","addr":111},{"op":"ref","device":"D","addr":112}]
},
{"op":"ref","device":"D","addr":113}
]
}
},
{
"op": "assign",
"target": {"op":"ref","device":"D","addr":141},
"expr": {
"op": "minmax",
"mode": "min",
"args": [
{
"op": "minmax",
"mode": "min",
"args": [{"op":"ref","device":"D","addr":111},{"op":"ref","device":"D","addr":112}]
},
{"op":"ref","device":"D","addr":113}
]
}
},
{
"op": "assign",
"target": {"op":"ref","device":"Y","addr":0},
"expr": {
"op": "cmp",
"cmp": ">=",
"args": [{"op":"ref","device":"D","addr":140},{"op":"const","value":35}]
}
},
{
"op": "assign",
"target": {"op":"ref","device":"Y","addr":1},
"expr": {
"op": "cmp",
"cmp": "<=",
"args": [{"op":"ref","device":"D","addr":141},{"op":"const","value":2}]
}
}
]
}要点
- 「最大/最小值运算」一次比较两个输入,三路就两两串一层(取两次最大)。
- 取最大做控制(最热点说了算),取最小做保护(最冷点先冻),这是暖通和机柜温控的常规做法。
- 想做"峰值保持"(记住历史最高)就把自身作为一路输入,配定时循环慢慢刷新(见 B2 例程 4)。
验证:三点写 22 / 31 / 26 → D140 = 31、Y0 = 0;把 D112 改成 36 → D140 = 36、Y0 = 1。
注意事项
- 某个传感器断线(被夹成 -40 或 0)会把"最小值"拉下来,防冻/加热被误触发。重要的点先做断线判断。
- 三路里有一路是别处也在写的寄存器:确认每个点只有采集的一方写。