Your PLC knows what a valve is doing this millisecond. Your ERP knows what the company sold last quarter. Between them is a canyon, and the bridge across it is the MES: the system that turns "make 500 donuts" into dispatched work, live OEE, and a birth certificate for every unit. This is the speed-run from "what's an MES?" to running a shift and reading its scorecard.
Industry stacks a factory into levels (the ISA-95 / Purdue model). The bottom reacts in milliseconds; the top plans in months. MES is Level 3, the translator that takes a business order from above and turns it into executed, measured production below. Tap a level to see who lives there and what it cares about.
🕳️ The gap is real. ERP says "production order #4471, due Friday." The PLC says "output Q2.3 is TRUE." Neither knows the other's language. MES is the only layer that speaks both orders and I/O.
📋 Without MES that translation happens on a clipboard, a whiteboard, and a spreadsheet someone updates at 5pm. MES makes it live, accurate, and automatic.
This acronym trips up everyone who has just learned "MES". MOM (Manufacturing Operations Management) is the proper name for the whole of Level 3, not a rival to MES. ISA-95 Part 3 defines it as the activities that coordinate personnel, equipment and material in manufacturing, and splits it into four domains. MES is the production one. That's the entire relationship: MOM is the scope; MES is the room you already toured.
↓ the same eight activities, re-read in production language
🪄 The trick worth keeping: all four rooms have identical furniture. Define → resource → schedule → dispatch → execute → collect → track → analyse. Learn that loop once and you can read a maintenance system, a lab system or a warehouse system on sight, because it's the production loop wearing different nouns. That symmetry is deliberate, and it's the most useful thing in the whole standard.
⚠️ Now for the genuinely nasty part: "MOM" means two different things, and nobody warns you about it:
Which one is meant? Look at what's next to it. Beside ERP and MES → the house. Beside production, quality and inventory → the maintenance room. To avoid the whole mess, many people write the four domains as POM · QOM · MOM · IOM and keep "MOM" for the house only.
Then there is the question everyone actually asks: so is MES just MOM with a new sticker? There are three honest answers in circulation:
🤝 "Same thing"
In everyday shop-floor talk they're used interchangeably, and you will rarely be corrected. That is fine in a corridor conversation, but not in a specification.
📐 "MOM is wider" ← the standard's view
MOM is the architectural scope of Level 3; MES is the production-execution slice of it. This is the reading ISA-95 and MESA back, and the one to use in writing.
🏷️ "It's a rebrand"
Partly true! What the market called "MES" kept growing into quality, maintenance and warehouse work, so suites were renamed MOM to match what they'd already become.
So much for the shape of it. What does a MOM platform actually do all day? It has four capabilities, and each one is only possible because the four domains share one data model instead of sitting in separate silos:
👁️ Real-time visibility
Machine health, material supply and workforce productivity, live, via IoT sensors and digital twins. You see the floor as it is this minute, instead of as it was in "the 5pm spreadsheet".
📋 Process standardisation
Digital workflows and e-signatures replace paper batch records, so the operator physically cannot skip a step and compliance stops depending on somebody remembering.
🧠 Advanced analytics
AI over the pooled history: predictive maintenance (fix the bearing before it fails), dynamic scheduling, cost optimisation. All of it needs maintenance + production data together, hence one platform.
🪜 Vertical integration
Physical resources wired straight to business applications, giving an unbroken path from sensor to boardroom. This is the digital thread, and MOM is the layer that makes it continuous.
🔑 The thread running through all four: killing data silos. A bolt-on MES + a separate CMMS + a separate LIMS can each be excellent and still can't answer "does the fryer make more scrap in the week before a bearing fails?" because no single system holds both halves. That question is the entire argument for MOM.
🔧 Why a PLC programmer should care. All four rooms want data from the same interface block you build in section 10, and once you see that, you stop under-scoping it. Your GoodCount feeds Production. Your FaultCode feeds Maintenance (that's MTBF). A measurement you log feeds Quality (that's SPC). Your CurrentLot consumption feeds Inventory. One tidy contract, four customers.
🧭 One-liner: MOM is everything that happens on Level 3: production, quality, maintenance and inventory. MES is the room where the order gets made. Same floor, different amount of it.
MES drowns you in three-letter words on day one. The whole vocabulary is below; tap any card to flip it from jargon to plain English. Come back here whenever a term trips you up later in the lesson.
Strip away the jargon and an MES exists to answer five questions the PLC and ERP can't, all day, automatically:
OEE (Overall Equipment Effectiveness) is the headline metric MES produces. It's three honest fractions multiplied together: Availability × Performance × Quality. Because they multiply, a "pretty good" 90% on each collapses to a mediocre 73% overall. Drag the sliders and watch where the losses go.
World-class is widely cited as ~85% (≈ 90% availability × 95% performance × 99.9% quality). Most plants that have never measured discover they're nearer 40–60%. The difference is the "hidden factory" you already own.
This is the whole thing working. A work order drops in: make 600 glazed donuts. MES dispatches it to the line, watches the three machines, counts good and scrapped units, computes OEE live, and writes a traceable record. Press Start shift, then sabotage it: inject a breakdown, a slow-down, or a bad batch and watch each one bite a different part of OEE. This is what a clipboard can never do.
Every line in that black log is data MES captured automatically: a timestamp, a reason code, a lot number. At shift end it becomes the OEE scorecard and the traceability record, with no clipboard and no "I think it was around 2pm."
Traceability (a.k.a. genealogy) means that for any finished unit, MES can tell you every material lot, machine, operator, setting and timestamp that touched it, and it can run that trace backwards or forwards.
⬅️ Backward trace
"This boxed donut failed a customer test. What flour lot, fryer, and operator made it?" One query answers it in seconds. The recall scope shrinks from a whole month to one 40-minute batch.
➡️ Forward trace
"Flour lot #L-2291 is contaminated. Which finished pallets contain it, and where did they ship?" MES lists exactly the affected units. Recall only those, not everything.
📜 Why it's law
In food, pharma, auto and aerospace, genealogy isn't optional: regulators (FDA, etc.) require you to prove what went into each unit. MES is how you prove it without a warehouse of paper.
The three get confused constantly. The clean split is time horizon and question asked:
| SCADA / HMI | MES | ERP | |
|---|---|---|---|
| ISA-95 level | Level 2 | Level 3 | Level 4 |
| Question | "What is the process doing now?" | "How is the order running, and prove it?" | "What did the business do, and what's next?" |
| Time horizon | Milliseconds–seconds | Seconds–shift | Days–months |
| Cares about | Tags, alarms, trends, control | Orders, OEE, genealogy, dispatch, WIP | Finance, inventory, planning, customers |
| If it goes down | You lose live view/control | You lose tracking & traceability (line may run) | You can't invoice or plan |
| Donut line | "Fryer temp 178 °C, motor on" | "Order #71: 412/600 made, OEE 68%, lot L-2291" | "Ship 600 to Acme Fri; bill €900" |
🧭 One-liner: SCADA watches the machine, ERP runs the business, MES runs the order and is the only one that can prove what actually happened on the floor. (Widen MES to all four Level-3 domains and you've got MOM.)
MES is useless in isolation; its value comes from being wired to both neighbours. Two standards do most of that work:
⬆️ Up to ERP: ISA-95 / B2MML
ISA-95 is the model for MES↔ERP integration; B2MML (Business To Manufacturing Markup Language) is its XML implementation, a shared vocabulary for production orders, schedules, material and results, so SAP and the MES agree on what "an order" is.
⬇️ Down to the floor: OPC UA & MQTT
OPC UA, or Sparkplug B over MQTT as a separate route, is how MES reads PLC/SCADA tags securely and vendor-neutrally. The data is self-describing, so the MES can subscribe to "good count" or "fault reason" without a custom driver per machine.
🧵 The buzzword tying it together: the digital thread, one connected data trail from customer order (ERP) → executed work & genealogy (MES) → live signals (SCADA/PLC) and back. MES is the spool that thread winds onto.
"MES reads the PLC" sounds like magic until it's your job, and then it turns out to be a tidy, deliberate handful of steps. You never let the MES poke random memory addresses; you build it a clean, named interface and publish exactly that. The recipe below is the real one, in the order you do it.
1 · Build a dedicated MES interface block. In the PLC, make one well-named structure/DB, e.g. stMES_Interface, holding only what MES needs: OrderID, TargetQty, GoodCount, RejectCount, MachineState, FaultCode, CurrentLot, Heartbeat. Never expose your whole tag database. This contract is the only thing MES sees.
2 · Maintain the data in logic. Increment GoodCount/RejectCount on each part, latch FaultCode with a reason code when you stop, set MachineState (run/idle/down), and toggle a Heartbeat bit every cycle so MES can tell "value is 0" from "PLC is dead." Timestamps have to be right, so keep the PLC clock synced (NTP).
3 · Turn on a server and publish those symbols. Enable the controller's OPC UA server and mark only the interface block's members as accessible/published. (Or publish them as an MQTT Sparkplug B edge node.) Set access rights: counts read-only, order fields writable by MES.
4 · Design a handshake for orders coming down. MES writes OrderID + TargetQty, then sets OrderReady. The PLC reads them, loads the job, and sets OrderAck. MES clears OrderReady; the PLC clears OrderAck. That four-step "ready/ack" dance prevents half-written orders and race conditions.
5 · Test it with a client before MES connects. Point an OPC UA test client (UaExpert) at the server, browse the address space, confirm you see GoodCount ticking and can write a test OrderID. Prove the interface works in isolation, then hand the endpoint + credentials to the MES integrator.
6 · Lock it down. OPC UA with certificates + a named user (not anonymous), read-only wherever possible, and the MES/historian on a segmented network, not a flat line with the internet. (See the IT/OT Security lesson.)
// The MES interface block — the ONLY thing you publish TYPE stMES_Interface : STRUCT OrderID : STRING; // ← written by MES TargetQty : DINT; // ← written by MES OrderReady : BOOL; // ← MES: "new order is valid" OrderAck : BOOL; // → PLC: "got it, loaded" GoodCount : DINT; // → read-only to MES RejectCount : DINT; // → read-only MachineState : INT; // → 0=idle 1=run 2=down FaultCode : INT; // → the downtime reason code CurrentLot : STRING; // → for genealogy Heartbeat : BOOL; // → toggles every scan = "I'm alive" END_STRUCT END_TYPE
🧰 Which tool, on which platform
| Platform | Expose the data with… | Common bridge / middleware |
|---|---|---|
| Beckhoff TwinCAT 3 | TF6100 OPC UA Server (mark symbols), or TF6701 IoT for MQTT; ADS underneath | UaExpert to test |
| Siemens S7-1500 / TIA Portal | Built-in OPC UA server: flag tags "accessible from OPC UA" | UaExpert; SIMATIC tag tables |
| Rockwell Logix | Logix tags over EtherNet/IP (CIP) | KEPServerEX / FactoryTalk Linx as the OPC bridge; FactoryTalk Transaction Manager → DB |
| CODESYS-based | CODESYS OPC UA Server + symbol configuration | UaExpert |
| Any / mixed fleet | per controller, as above | Kepware, Ignition (OPC UA + MQTT/Sparkplug + UNS), Node-RED for prototyping, an MQTT broker for the Unified Namespace |
🧭 Two valid paths: PLC → OPC UA → MES directly, or PLC → SCADA (Ignition / WinCC / FactoryTalk View) → MES, where SCADA already holds the tags and a historian. The PLC programmer's job is the same either way: publish a clean, named interface, not raw addresses.
Tape this above the desk. If you remember nothing else about MES, remember these.