主题
时序与定时例程 6:一用一备轮换(每次启动换一台)
这一页只讲这一个例程。母页 b-02-timing 里留着例程 1,其余例程各自一页、在那一页的目录里点。
场景:两台泵/风机,平时只开一台,每次启动换另一台让磨损均匀;当前这台故障就自动落到另一台。
软元件
| 软元件 | 作用 |
|---|---|
X0 / X1 | 开泵 / 停泵请求 |
M60 | 运行需求 |
D610 | 轮换标志(0 = 1 号,1 = 2 号) |
M61 / M62 | 1 号 / 2 号故障 |
Y0 / Y1 | 1 号泵 / 2 号泵 |
块图(照着拖即可)
对应的 ddc.json(点「生成 JSON」得到的就是它;也可存成 .ddc.json 导入)
json
{
"version": 1,
"name": "一用一备轮换",
"scan_ms": 200,
"lines": [
{
"op": "assign",
"target": {"op":"ref","device":"M","addr":60},
"expr": {
"op": "rs",
"id": "rs_run",
"args": [{"op":"ref","device":"X","addr":0},{"op":"ref","device":"X","addr":1}]
}
},
{
"op": "if",
"cond": {"op":"edge","edge":"rise","id":"e_rot","args":[{"op":"ref","device":"M","addr":60}]},
"then": [
{
"op": "assign",
"target": {"op":"ref","device":"D","addr":610},
"expr": {
"op": "arith",
"a": "-",
"args": [{"op":"const","value":1},{"op":"ref","device":"D","addr":610}]
}
}
],
"else": []
},
{
"op": "assign",
"target": {"op":"ref","device":"Y","addr":0},
"expr": {
"op": "and",
"args": [
{"op":"ref","device":"M","addr":60},
{
"op": "and",
"args": [
{
"op": "cmp",
"cmp": "==",
"args": [{"op":"ref","device":"D","addr":610},{"op":"const","value":0}]
},
{"op":"not","args":[{"op":"ref","device":"M","addr":61}]}
]
}
]
}
},
{
"op": "assign",
"target": {"op":"ref","device":"Y","addr":1},
"expr": {
"op": "and",
"args": [
{"op":"ref","device":"M","addr":60},
{
"op": "and",
"args": [
{
"op": "cmp",
"cmp": "==",
"args": [{"op":"ref","device":"D","addr":610},{"op":"const","value":1}]
},
{"op":"not","args":[{"op":"ref","device":"M","addr":62}]}
]
}
]
}
}
]
}要点
- 轮换靠
1 - D610做状态翻转(0↔1),配合「脉冲触发」保证一次启动只翻一次——这就是二分频。 - 故障只做"屏蔽选中":故障泵不会在这轮被选中,但轮换顺序不变,修好后下次照样轮到它。
- D610 默认 0;必要上电初始化里赋值一次,保证每次下发后都从 1 号开始。
验证:X0 一次 → Y0 = 1;X1 停止后再 X0 → Y1 = 1;把 M61 置 1(1 号故障)后再启动 → Y1 = 1。
注意事项
- 不用「脉冲触发」直接翻转:运行期间每个扫描周期翻一次,两台泵以 200 毫秒的频率来回切。
- 用「或」代替轮换让两台同时启动:那是一用一备变成"双投",压力/流量会翻倍。
- 故障信号接的是常闭点却当"1 = 故障"用:逻辑反了,故障泵反而被优先选中。