主题
时序与定时例程 5:按时段自动启停(系统时钟)
这一页只讲这一个例程。母页 b-02-timing 里留着例程 1,其余例程各自一页、在那一页的目录里点。
场景:设备只在上班时间运行,下班和周末自动停。「系统时钟」块取设备当前时间参与判断。
软元件
| 软元件 | 作用 |
|---|---|
系统时钟·时 | 当前小时 0~23 |
系统时钟·周 | 周日 = 1 … 周六 = 7 |
Y0 | 设备 |
块图(照着拖即可)
对应的 ddc.json(点「生成 JSON」得到的就是它;也可存成 .ddc.json 导入)
json
{
"version": 1,
"name": "时段启停",
"scan_ms": 200,
"lines": [
{
"op": "if",
"cond": {
"op": "and",
"args": [
{
"op": "and",
"args": [
{
"op": "cmp",
"cmp": ">=",
"args": [{"op":"clock","part":"week"},{"op":"const","value":2}]
},
{
"op": "cmp",
"cmp": "<=",
"args": [{"op":"clock","part":"week"},{"op":"const","value":6}]
}
]
},
{
"op": "and",
"args": [
{
"op": "cmp",
"cmp": ">=",
"args": [{"op":"clock","part":"hour"},{"op":"const","value":8}]
},
{
"op": "cmp",
"cmp": "<",
"args": [{"op":"clock","part":"hour"},{"op":"const","value":18}]
}
]
}
]
},
"then": [
{
"op": "assign",
"target": {"op":"ref","device":"Y","addr":0},
"expr": {"op":"const","value":1}
}
],
"else": [
{
"op": "assign",
"target": {"op":"ref","device":"Y","addr":0},
"expr": {"op":"const","value":0}
}
]
}
]
}要点
- 「系统时钟」可取年、月、日、时、分、秒、周(周日 = 1),取出来就是一个数,直接参与比较。
- 时段判断的本质是"时"和"周"两个条件的与/或组合。跨零点必须改成或(22:00~06:00 写成
时 ≥ 22 或 时 < 6)。 - 需要精确到分钟(8:30 开机)时写成
时 > 8或 (时 = 8且分 ≥ 30)。
验证:设备时间设成周二 9:00 → Y0 = 1;设成 20:00 → Y0 = 0;设成周日(周 = 1)9:00 → Y0 = 0。
注意事项
- 时钟不准,时段全错:设备 RTC 靠电池/网络校时,时间不对时整个时段逻辑失效,先核对设备时间。
- 跨零点写成"与"(
时 ≥ 22 且 时 < 6):永远不成立,设备再也不会开。 - 只判断小时不判断周:周末也在跑。