SCADA-app voor Siemens PLC'sSCADA app for Siemens PLCs
Een tijdje geleden stonden we voor de uitdaging om een bestaande productielijn beter te monitoren. De Siemens PLC (S7-1500) produceerde massa's data via OPC UA, maar die bleef grotendeels onbenut. Geen realtime inzicht, geen historiek, geen OEE. Typisch probleem in veel fabrieken. Dus bouwden we er een SCADA-applicatie rond.Some time ago, we faced the challenge of better monitoring an existing production line. The Siemens PLC (S7-1500) generated massive amounts of data via OPC UA, but most of it remained unused. No real-time insight, no history, no OEE. A typical problem in many factories. So we built a SCADA application around it.

De backend is een FastAPI-applicatie in Python die via OPC UA rechtstreeks met de Siemens PLC communiceert. Ze leest onder andere baanposities, alarmen, proceswaarden en zone-statussen uit. Die data gaat naar een PostgreSQL-database, opgesplitst in een auth-database en een datadatabase. Omdat we te maken hebben met tijdreeksen — denk aan duizenden meetpunten per uur — hebben we de databankbewerkingen stevig geoptimaliseerd voor performantie.The backend is a FastAPI application in Python that communicates directly with the Siemens PLC via OPC UA. It reads axis positions, alarms, process values, and zone statuses. This data goes into a PostgreSQL database, split into an auth database and a data database. Since we are dealing with time series — think thousands of data points per hour — we have heavily optimized the database operations for performance.
De frontend is gebouwd met Nuxt 4 en Nuxt UI. Ze toont dashboards met OEE-berekeningen, uptime/downtime, alarmoverzichten en historische grafieken. Alles live via Server-Sent Events, geen pagina nodig om de data te verversen. Er zit ook een signage-weergave op, voor schermen in de fabriekshal.The frontend is built with Nuxt 4 and Nuxt UI. It displays dashboards with OEE calculations, uptime/downtime, alarm overviews, and historical charts. Everything is live via Server-Sent Events — no page refresh needed. There is also a signage display mode for screens on the factory floor.

De OEE wordt per zone berekend en opgeslagen in meerdere granulariteiten: per uur, per shift (ochtend/nacht/dag), per dag, week, maand en jaar. Zowel effectief (echte productietijd) als volgens het uurrooster. De formule is klassiek: beschikbaarheid × prestatie × kwaliteit. Alle ruwe data — alarmduurtijden, baanpassages, up/down-signalen — wordt uit de database gehaald en verwerkt door een rekenmodule die bewust framework-onafhankelijk is gehouden.OEE is calculated per zone and stored at multiple granularities: per hour, per shift (morning/night/day), per day, week, month, and year. Both effective (actual production time) and according to schedule. The formula is classic: availability × performance × quality. All raw data — alarm durations, axis passes, up/down signals — is fetched from the database and processed by a calculation module that is deliberately kept framework-independent.

De applicatie kent drie manieren van werken. In PLC-modus leest ze live data van de echte Siemens PLC. In simulatiemodus draait ze een ingebouwde simulator, handig voor testdoeleinden of als er nog geen fysieke PLC aangesloten is. En in de gemengde modus genereert ze zelf data én schrijft ze die terug naar de PLC, zodat je het hele systeem end-to-end kunt testen.The application has three modes of operation. In PLC mode, it reads live data from the actual Siemens PLC. In simulation mode, it runs a built-in simulator, useful for testing or when no physical PLC is connected. And in mixed mode, it generates data and writes it back to the PLC, allowing end-to-end testing of the entire system.
Er is een gebruikerssysteem met rollen (admin, manager, operator).There is a user system with roles (admin, manager, operator).

De productieversie draait op een embedded device dat in de kast naast de PLC past.The production version runs on an embedded device that fits in the cabinet next to the PLC.

Manager BQ Systems