The questions newcomers ask, in roughly the order they ask them.
No, but you probably should once — the build system is something you’ll interact with constantly, and 30 minutes of watching it work pays off. Alternatives:
conda install -c conda-forge epics-base — fast, and how a lot of Python-side people work.apt install epics-dev on Debian/Ubuntu via epicsdeb.A week to serve and read your own PVs. A month to write an IOC for real hardware with someone reviewing it. Six months to a year to have opinions about database design, and that’s the point at which you stop needing guides like this one.
For a great deal of IOC work, none — databases are declarative and StreamDevice protocols are text files. Beyond that: Python for clients, scripting, and tests; C for classic device support; C++ for asynPortDriver and areaDetector; Java if you touch Phoebus or the services; Perl if you go digging in the build system. Nobody knows all of these on day one.
tech-talk, the main EPICS mailing list. Read the archive first — it’s a huge, well-indexed corpus and your question is probably in it. When you do post, include your Base version, module versions, platform, the actual error text, and what you already tried. The core developers read that list and answer, which is genuinely unusual for software of this age.
Learn with CA: more tools, more examples, more of everything you’ll encounter. Use PVA when you need what it adds — structured data, images with metadata attached, tables, RPC-style calls, or a service that requires it. An EPICS 7 IOC serves both from the same records, so this is not a lock-in decision. See Protocols.
Nearly. A record is a set of PVs: the record’s own name maps to its .VAL field, and every other field is addressable too (MyRecord.EGU, MyRecord.HIGH). One record can also answer to several names via alias(). So: records live inside IOCs, PVs are what the network sees.
Because you’re ignoring severity. Comms failure sets INVALID, usually leaving the last value or zero in VAL. A screen or script that reads only the number cannot tell “0.0, correct” from “0.0, meaningless”. Always check SEVR/STAT — caget -a shows them. This is the single most common category of “the control system lied to me”.
Many small ones, biased toward one IOC per device or per crate. Failure domains stay small, restarts are cheap, and ownership is clear. The counter-pressure is real though: several hundred IOCs need deployment tooling and monitoring, and records that must interlock with each other are simpler in one IOC than across two. See the example facility’s reasoning.
autosave runs inside an IOC and exists to survive reboots: it periodically writes values to a local file and restores them at iocInit, invisibly. save & restore is a facility service for deliberate configurations: “the settings we ran the 2 keV experiment with”, compared and restored by operators, with history. You want both. They solve different problems.
caget says “Channel connect timed out” but the IOC is definitely runningIn order of likelihood:
EPICS_CA_ADDR_LIST unset while the IOC is on a different subnet — broadcasts don’t route.dbl on the IOC console; a typo in the name looks identical to a network fault.iocInit failed, so it serves nothing. Read its startup log.EPICS_CA_ADDR_LIST=<ioc-ip> with EPICS_CA_AUTO_ADDR_LIST=NO.Fuller list: Troubleshooting, or the Error Message Index if you have an error string to paste.
Whichever answers a client’s search first wins, per client. Different clients get different IOCs; readings become mysteriously inconsistent and irreproducible. Base logs a warning about duplicate names when it notices, but you must be watching. This is a bug with no upside — prevented by a naming convention plus a directory service that makes collisions visible.
Check SCAN first — Passive means “nobody has asked”, and it’s the default. Then check that whatever should be triggering it actually is: an input link with PP, an FLNK from another record, I/O Intr with a driver that supports it, or a periodic rate. Then check SEVR/STAT for INVALID, which means processing is happening and failing.
Yes, and increasingly people do. pythonSoftIOC (Diamond) and caproto’s server are the main routes; pcaspy for quick fakes; pyDevice to call Python from inside a conventional IOC. Excellent for simulation, tests, aggregation, and slow devices. For hard real-time hardware loops, stay in C/C++.
By protocol: Allen-Bradley → ether_ip; Siemens S7 → s7plc or OPC UA; anything with OPC UA → the opcua module; Beckhoff → ADS or OPC UA; generic → Modbus. Decide with the PLC engineer which side owns which logic, and write it down — that boundary being fuzzy causes more grief than any protocol detail.
No.
!!! danger “Not ever” Personnel protection and machine protection belong in certified PLCs or hard-wired logic designed to IEC 61508 / IEC 61511. EPICS has no safety certification, no deterministic network latency, and no failure analysis suitable for a safety case. EPICS monitors and displays those systems. See Machine Protection.
Tens of thousands is routine. The limits you actually hit are CPU (record processing rate × record count) and the number of monitored channels × update rate × client count. An IOC pushing 50 000 monitors a second to 40 clients is doing more work than one holding a million idle records. Measure with iocStats rather than guessing.
Cheaper than you fear if you use monitor-based (event-driven) archiving with sensible deadbands, and ruinous if you scan everything at 10 Hz. The example facility’s archiving plan works the arithmetic end to end: ~415 000 PVs, ~24 TB/year, and where every term comes from.
Not to learn, and not for a test stand. Those are dependencies of the services — the Phoebus alarm system needs Kafka, Olog and ChannelFinder want Elasticsearch, the Archiver Appliance wants MySQL/MariaDB for configuration. A single IOC plus a GUI needs none of it. Add each service when you have the problem it solves.
Yes. Base 7 releases regularly, PVXS and p4p are current work, epics-containers is reshaping deployment, and Phoebus is under continuous development. There are annual collaboration meetings and codeathons. It’s a 35-year-old codebase with a live community — the interesting kind of old.
Because “you need a naming convention” teaches nothing, and watching a naming convention get chosen — with its constraints, its compromises, and the 60-character CA limit pressing on it — teaches a lot. The Helios Light Source exists so every architectural claim in this guide has to survive contact with a concrete machine.
Trust it as a map. It’s written by someone learning EPICS, so where it disagrees with docs.epics-controls.org or a project’s own README, believe them and file an issue here.