Control Expert Β· Track 08 Β· M580 redundancy

Two Brains, Zero Downtime

Water plants, power grids, refineries β€” some processes simply must not stop. Hot Standby runs two identical M580 CPUs: a primary in control and a standby shadowing it, their memory synced every scan over a dedicated link. Kill the primary and the standby takes over bumplessly β€” the process never notices. Try to break it.

🟒 primary🟑 standby⚑ bumpless
01 Β· The redundant pair

Synced every scan, ready to take over

CPU A is primary, controlling a tank-level process; CPU B is standby, receiving A's full memory image every scan over the sync link. The tank fills and the active CPU holds the level. Press πŸ’₯ Fail the primary β€” watch B promote itself to primary within a scan, the level control continue without a blip, and the switchover get logged.

PRIMARY
🧠
CPU A
controlling Β· level β€”
STANDBY
🧠
CPU B
shadowing Β· level β€”
tank level
40%
held by CPU A
process uptime
00:00

The magic is the synced memory: because the standby already holds the primary's exact state β€” every timer, counter and step β€” it resumes mid-process, not from a cold start. Repair the failed CPU and it rejoins as the new standby, ready for next time.

02 Β· The rules of redundancy

What keeps it bumpless

πŸ”„ State sync every scan. The primary copies its full data image to the standby over a dedicated fibre link at the end of each scan β€” so the standby is at most one scan behind.

πŸ‘‘ One commander at a time. Only the primary drives the outputs. The standby watches silently; promotion is instant and exclusive, so the field never sees two masters.

πŸ”Œ Shared RIO. Both CPUs see the same Remote I/O ring (Track 07), so whichever is primary already owns the live I/O β€” no rewiring on switchover.

πŸͺͺ Identical apps. Both run the same logic; you download once and HSBY keeps them matched. A logic mismatch blocks the pair from going redundant.

03 Β· Check yourself

Why bumpless?

When the primary fails, the standby resumes the process mid-stride β€” timers and counters intact β€” instead of restarting from zero. What makes that possible?