EPICS-for-Dummies

The Toolbox

The catalogue. Every significant piece of the EPICS ecosystem, what it does, who maintains it, and where to get it.

How to use this section: don’t read it top to bottom. Skim this index once so the names become familiar, then come back when you have a specific problem. Nobody deploys all of this — a small beamline runs Base, asyn, StreamDevice, autosave and Phoebus, and that’s a complete control system.

Where things live

Organisation What’s there
github.com/epics-base Base, PVXS, p4p, pvaPy, epicsCoreJava, ci-scripts — core, maintained by the core developers
github.com/epics-modules Support modules: asyn, autosave, calc, motor, modbus, iocStats, sscan, busy, and ~60 more
github.com/epics-extensions Host-side tools: ca-gateway, MEDM, EDM, VDCT, StripTool
github.com/areaDetector Detector and camera drivers — its own organisation, that’s how many there are
github.com/ControlSystemStudio Phoebus and the Java services (archiver, alarm, save/restore, scan)
github.com/ChannelFinder ChannelFinder, recsync, pvinfo
github.com/Olog The Olog electronic logbook
github.com/epics-containers Container-based deployment, ibek, PVI
github.com/paulscherrerinstitute StreamDevice, pcaspy, s7plc, and much else from PSI
github.com/DiamondLightSource pythonSoftIOC, aioca, and Diamond’s module ecosystem
github.com/slaclab PyDM, Badger, and SLAC’s stack
github.com/EPICS-synApps synApps — a curated, tested bundle of the above
epics-controls.org The community’s front door, including the module directories

The categories

Page Answers the question
Base & IOCs What’s in the core, and what tools come with it?
Soft Support Modules How do I add records, persistence, statistics, calculations?
Hardware Support Modules How do I talk to this specific device?
PLCs & Fieldbus How do I talk to industrial equipment?
Motion Control How do I move something?
Detectors & Imaging How do I take pictures and handle the data rate?
Timing Systems How do things happen at the same time across the facility?
Client Libraries How do I write a program that talks to EPICS?
Operator Interfaces How do I build screens?
Web Interfaces How do I see PVs in a browser?
Archiving How do I know what happened yesterday?
Alarms How does an operator find out something’s wrong?
Directory Services Which IOC serves this PV, and what else is like it?
Save & Restore How do I get back to a known configuration?
Electronic Logbooks Who did what, when, and why?
Gateways How do I cross a network boundary safely?
Scanning & Automation How do I run a sequence without a human?
Simulation & Testing How do I develop without the hardware, and test what I wrote?
Scientific Data How does experiment data get from detector to publication?
Physics & Optimisation How do accelerator physicists drive the machine?
Deployment & Operations How do I run 300 IOCs without going mad?
Observability Is the control system itself healthy?

Quick index: “I need a tool that…”

| I need to… | Use | | --- | --- | | serve a PV with no hardware | `softIoc` / `softIocPVA` ([Base](/EPICS-for-Dummies/docs/toolbox/base-and-iocs.html)) | | talk to a serial or TCP instrument | [StreamDevice](/EPICS-for-Dummies/docs/toolbox/plc-and-fieldbus.html#streamdevice) over [asyn](/EPICS-for-Dummies/docs/toolbox/soft-support-modules.html#asyn) | | talk to an Allen-Bradley PLC | [ether_ip](/EPICS-for-Dummies/docs/toolbox/plc-and-fieldbus.html#ether_ip-allen-bradley) | | talk to a Siemens PLC | [s7plc](/EPICS-for-Dummies/docs/toolbox/plc-and-fieldbus.html#s7plc) or [opcua](/EPICS-for-Dummies/docs/toolbox/plc-and-fieldbus.html#opc-ua) | | talk to anything with Modbus | [modbus](/EPICS-for-Dummies/docs/toolbox/plc-and-fieldbus.html#modbus) | | move a motor | [motor](/EPICS-for-Dummies/docs/toolbox/motion.html) | | run a camera or detector | [areaDetector](/EPICS-for-Dummies/docs/toolbox/detectors-and-imaging.html) | | survive an IOC reboot with settings intact | [autosave](/EPICS-for-Dummies/docs/toolbox/soft-support-modules.html#autosave) | | build an operator screen | [Phoebus](/EPICS-for-Dummies/docs/toolbox/operator-interfaces.html#phoebus) or [PyDM](/EPICS-for-Dummies/docs/toolbox/operator-interfaces.html#pydm) | | put a screen in a browser | [DBWR](/EPICS-for-Dummies/docs/toolbox/web-interfaces.html#dbwr-display-builder-web-runtime) + [PVWS](/EPICS-for-Dummies/docs/toolbox/web-interfaces.html#pvws-pv-web-socket) | | plot history | [Archiver Appliance](/EPICS-for-Dummies/docs/toolbox/archiving.html#epics-archiver-appliance) + [Grafana plugin](/EPICS-for-Dummies/docs/toolbox/archiving.html#grafana-integration) | | annunciate alarms | [Phoebus alarm system](/EPICS-for-Dummies/docs/toolbox/alarms.html#phoebus-alarm-system) | | find PVs by property | [ChannelFinder](/EPICS-for-Dummies/docs/toolbox/directory-services.html) | | know which IOC owns a PV | [recsync](/EPICS-for-Dummies/docs/toolbox/directory-services.html#recsync) → ChannelFinder | | snapshot and restore machine settings | [save & restore](/EPICS-for-Dummies/docs/toolbox/save-and-restore.html) | | log who wrote what | [caPutLog](/EPICS-for-Dummies/docs/toolbox/logbooks.html#caputlog) | | keep a shift log | [Olog](/EPICS-for-Dummies/docs/toolbox/logbooks.html#olog) or [ELOG](/EPICS-for-Dummies/docs/toolbox/logbooks.html#psi-elog) | | expose PVs read-only to another network | [CA Gateway](/EPICS-for-Dummies/docs/toolbox/gateways.html#ca-gateway) / [p4p gateway](/EPICS-for-Dummies/docs/toolbox/gateways.html#p4p-pva-gateway) | | write a state machine in the IOC | [Sequencer / SNL](/EPICS-for-Dummies/docs/toolbox/scanning-and-automation.html#sequencer-snl) | | run a multi-dimensional scan | [sscan](/EPICS-for-Dummies/docs/toolbox/scanning-and-automation.html#sscan), [scan server](/EPICS-for-Dummies/docs/toolbox/scanning-and-automation.html#phoebus-scan-server), or [Bluesky](/EPICS-for-Dummies/docs/toolbox/scientific-data.html#bluesky) | | script EPICS from Python | [PyEpics](/EPICS-for-Dummies/docs/toolbox/client-libraries.html#pyepics), [caproto](/EPICS-for-Dummies/docs/toolbox/client-libraries.html#caproto), [p4p](/EPICS-for-Dummies/docs/toolbox/client-libraries.html#p4p), [aioca](/EPICS-for-Dummies/docs/toolbox/client-libraries.html#aioca) | | write modern C++ against PVA | [PVXS](/EPICS-for-Dummies/docs/toolbox/client-libraries.html#pvxs) | | fake a device that doesn't exist yet | [Lewis](/EPICS-for-Dummies/docs/toolbox/simulation-and-testing.html#lewis), [pcaspy](/EPICS-for-Dummies/docs/toolbox/simulation-and-testing.html#pcaspy) | | write an IOC in Python | [pythonSoftIOC](/EPICS-for-Dummies/docs/toolbox/simulation-and-testing.html#pythonsoftioc) | | keep an IOC running and consoled | [procServ](/EPICS-for-Dummies/docs/toolbox/deployment-and-operations.html#procserv) | | deploy IOCs as containers | [epics-containers](/EPICS-for-Dummies/docs/toolbox/deployment-and-operations.html#epics-containers) + [ibek](/EPICS-for-Dummies/docs/toolbox/deployment-and-operations.html#ibek) | | get a tested set of modules | [synApps](/EPICS-for-Dummies/docs/toolbox/deployment-and-operations.html#synapps) | | monitor IOC health | [iocStats](/EPICS-for-Dummies/docs/toolbox/soft-support-modules.html#iocstats-and-deviocstats) → [Grafana/Prometheus](/EPICS-for-Dummies/docs/toolbox/observability.html) | | write experiment data as NeXus/HDF5 | [areaDetector HDF5 plugin](/EPICS-for-Dummies/docs/toolbox/detectors-and-imaging.html#file-writing-plugins) or [Bluesky](/EPICS-for-Dummies/docs/toolbox/scientific-data.html#bluesky) | | optimise machine performance online | [Xopt](/EPICS-for-Dummies/docs/toolbox/physics-and-optimization.html#xopt), [Badger](/EPICS-for-Dummies/docs/toolbox/physics-and-optimization.html#badger), [Ocelot](/EPICS-for-Dummies/docs/toolbox/physics-and-optimization.html#ocelot) |

A note on choosing

You will repeatedly face “there are four tools for this”. General guidance:

Prefer what your facility already runs. The operational cost of a second archiver, or a second GUI toolkit, dwarfs any technical advantage. Being the only person running a tool means being its sole maintainer.

Prefer what’s actively maintained. Check the commit history, not the README. Several widely-installed EPICS tools have not had a commit in years — sometimes because they’re finished, sometimes because they’re abandoned, and the distinction matters when you hit a bug.

Prefer no code. A StreamDevice protocol file beats C device support. A calc record beats a Python script. Declarative configuration survives staff turnover; clever code does not.

Prefer the boring option for anything operational. Novelty is fine in analysis tooling, where a failure costs an afternoon. In the path between an operator and a magnet, choose the thing that has been running somewhere else for ten years.