Server Edition — Accounts, Projects & Sharing
This build runs as a multi-user server application. Instead of each person keeping data in their own browser, everyone connects to one shared server where projects, PLC data, patterns and the audit trail all live in a central SQL database. What you save is visible to your colleagues, and it survives closing the browser.
Signing in
- Open the server address in your browser (for example
https://your-server:7443) and sign in with the account your administrator created for you.
- On first sign-in you may be asked to change your password. Access to each tool depends on your role (Administrator, Engineer, Technician, or Operator).
Projects and versions
- Work is organised into Projects, each holding one or more imported versions. The Project and Version pickers sit at the top-left of every page.
- The hub's Process and Save creates a fresh project for each batch of files loaded (named from the loaded controllers — you can rename it in the prompt). Use this when you're onboarding a new site or want a clean snapshot.
- Per-version file editing — on the Projects admin page, the current version's file list gains per-file Remove buttons, checkboxes with Remove selected (multi-file remove creates one new version), and a + Add file control. Removing file(s) auto-forks the version: the original stays as an immutable historical record, and a new current version is created with those file(s) omitted. Adding accepts one or more
.L5X/.XBD/.XHW/.ZEF/.XEF files in one picker (each is appended to the current version in place — no fork), parses metadata, and refuses duplicate filenames. This lets you swap or drop controller exports in a large project without re-uploading the whole batch. Every add and remove is recorded in the audit log.
- The Projects page (admin) lists every project, its versions, when they were loaded and by whom, and how much is stored. Deleting a project removes all its versions and data permanently. Administrators can also use Delete all projects… to wipe every project, version, source file and dataset on the server in one step (irreversible; audited). Use it only when retiring a test site or clearing the server before a fresh load.
- Auto-heal: after any Add/Remove File, the hub rebuilds the derived caches (
pcsData, Loaded PLC Files manifest, I/O index, CPU report) automatically on next visit from stored .L5X, .XHW and .ZEF/.XEF — you'll see a "Rebuilding processed data…" banner briefly, then everything is ready.
Users & Audit (administrators)
- Users — create, disable, reset and group accounts. Four groups map to roles with increasing access: Operators (read), Technicians (read + reports), Engineers (+ write & reference data), Administrators (everything).
- Audit — a searchable log of who did what: sign-ins, saves, deletes, report generation and exports, plus any access that was denied. Exportable to CSV.
Where your data lives
Unlike the offline edition, data does leave your browser — it is stored on your organisation's server. Individual tool pages still read and write through the same interface, but behind the scenes they save to the server, with a local cache so pages load quickly and only re-download when something has actually changed. If you ever see a red “Not saved to server” banner, your work was kept in the browser only and has not reached the database — re-process, and check the Projects page shows a stored size before closing.
SLC 500 / MicroLogix Support (RSLogix 500)
Alongside Studio 5000 .L5X files, the suite reads RSLogix 500 exports from SLC 500 and MicroLogix processors. These are a different, text-based format (.SLC), but they flow through the same tools — ladder viewer, FD generator, tag search, BOM — because they're translated into the same shape internally on import.
What to upload
- .SLC — the ladder/program export. Drop it in the PLC Files box with your L5X files; it's detected automatically.
- .SY5 / .SY6 — the symbol & comment table. These carry the descriptions the bare
.SLC lacks. Upload them alongside the matching .SLC (same base name) and the addresses in your logic pick up their names — e.g. O:2.0/1 shows as SV15. Where both are present, .SY6 is preferred (it's the fuller, newer format).
- .FIX / .FX2 — binary fixup files. These are ignored; they carry no documentation the tools can use.
Honest limitation: if you upload a .SLC without its .SY5/.SY6, the logic and structure are still exact, but operands appear as raw addresses (B3:0/15) rather than names — because the names simply aren't in the .SLC file.
Getting Started: The Home Page
The Home Page is the central hub for the tool suite. All data is loaded here and — in the Server Edition — saved to the shared server (or, in the offline edition, your browser's local database), making it available to all the other tool pages without needing to re-upload.
1. Loading Your Data
- On the Home Page, use the drag-and-drop zones or click to browse for your files: Asset Report (.csv), PCS Data (.l5x, .xhw, .slc, .xbd, .zef, .xef), FD Patterns (patterns.xml / schneider_patterns.xml), Schneider Tags (.txt), and Lifecycle Data (.csv).
- You can add multiple PCS data files at once. Rockwell and Schneider files land in the same PLC Files box — they're sorted by extension automatically.
- After selecting your files, click the Process and Save Data button. New customers can drop the compact samples
samples/ACE_Systems_Demo.L5X and samples/ACE_Peer_PLC.L5X here — unlicensed ACE Suite and CSAM allow those demo files (controllers ACE_Systems_Demo and ACE_Peer_PLC) with full tools; other plant files still need a licence. Load both to see resolved produced/consumed links in PCS Messaging.
- An inline progress bar shows which file is being read and how many remain (large L5X files are read serially so you can see progress).
- A status message will confirm when data is loaded. This data will persist even if you close the browser tab.
- Each upload box shows a loaded-status indicator — a green "✅ … loaded" line (with a count) when data of that type is present, or a red "⚠️ No … loaded" line when it isn't — so you can see at a glance what's in the database, including for FD Patterns and Schneider Tags.
- If you process new PLC files while a project is already loaded, you'll be asked how to apply them: Add to existing merges the new controllers in (a controller/file with the same name is refreshed rather than duplicated), or Clear PLC data & replace removes only the PLC-file data and starts fresh. Your Asset Report, Lifecycle, FD Patterns and Schneider tags are never touched by this choice.
2. Loaded PLC Files panel
Below the upload boxes, the Loaded PLC Files panel sits on the same row as the Schneider tags area and widens into the open space to the right. It lists every controller detected in your uploads with:
- Name — the controller name from the L5X.
- File Name — the source filename that was uploaded (useful when several exports share the same controller name, e.g.
…IrrigationOld.L5X vs …Aug28.L5X).
- Platform — Rockwell (L5X) or Schneider (XBD).
- Type / Detail — the processor type (e.g.
1756-L83E) or, for Schneider, the number of FBD networks.
- FW — firmware major/minor revision.
- PLC Standard — the site "code standard" version, auto-detected from a shortlist of common controller tags (
Standard_Code, sCodeVersionDeveloped, Site_Standard, S88_Version, CodeVersion), falling back to a combined RevisionMajor/RevisionMinor read.
- Source — encryption status badge:
- 🔓 Clean — all program routines have visible source.
- 🔒 N/M enc. — partial encryption; N of M programs are source-protected.
- 🔒 Fully encrypted (N/N) — every program's routines are stored as
<EncodedData>. IO detection, tag search, and utilization figures will be significantly reduced for this PLC because scanners cannot parse the encrypted logic.
Note on encrypted controllers: if a plant's L5X was exported with source protection on, no scanner (this suite or Rockwell's own tools) can pull tag↔IO mappings, ladder logic, or usage counts from those routines. The encryption badge makes this visible so a suspiciously-low utilization or empty search result is easy to explain. Source protection is Rockwell EncodedData / encryption on the routines themselves — not the same as FactoryTalk Security permissions on the export.
3. Navigating the Tools
Once your data is loaded, use the navigation bar at the top or the tiles on the Home page to access the different tools. Hardware tools that work for both Rockwell and Schneider (Report Packager, PCS Asset Map, BOM Viewer, I/O Card Utilization) sit in their own Common / both platforms group. Rockwell-only tools include the Ladder Viewer, Tag Search, Messaging, UDT/AOI Report, and PCS Version Compare. Schneider-only tools stay in their own section. Additional actions in the toolbar row:
- Identify UR20 Modules — quick scan for Weidmuller UR20 IO modules across all loaded L5X.
- Refresh Page — reloads the hub view (useful after you Process new files).
- DB Export / DB Import — save the entire loaded data set to a single
.json file (backup or move between machines).
- Delete Database — clears every stored file and cache from the browser.
ClarOTy Asset Map & Inventory
This is the main dashboard for visualizing the structure of your assets based on the ClarOTy Asset Report.
Building Your View
- Add/Remove Assets: Click assets in the Major Asset list on the left to add or remove their diagrams from the canvas.
- Filtering the List: The asset list only shows items identified as racks/chassis (excluding detailed card/address entries).
- Pan and Zoom: Click and drag the background to pan. Use your mouse wheel to zoom.
- Search: Use the search boxes to filter the asset list by name or highlight specific card models on the canvas.
Canvas Actions
- Join Selected Nodes: Select two assets (using Ctrl/Cmd + Click), then click this to draw a dashed line connecting them.
- Unjoin Selected: Select a dashed line and click this to remove it.
- Ghost/Un-ghost Selected: Select an asset to turn it and its children grey. This visually hides them and removes them from the "BOM Summary - ALL" list.
- Clear Canvas & Selections: Removes all assets from the canvas and clears selections.
Inventory / Bill of Materials (BOM)
- Toggle Inventory: Shows/hides the BOM panel on the right.
- The panel displays a combined inventory of all non-ghosted assets currently on the canvas, grouped by model.
- It also provides summaries for each individual major asset.
- Clicking a model row in the summary highlights the corresponding nodes on the canvas.
Exporting
- Export Selected as PDF/ZIP: Generates a PDF file for each major asset currently displayed on the canvas. If multiple assets are selected, they will be combined into a single ZIP file. Each PDF includes the visual diagram and its corresponding BOM.
Your work on this page—including asset selection, joins, and ghosted states—is automatically saved for your browser session.
Architecture Comparison
This tool allows for a side-by-side comparison of the same control system asset as represented in the ClarOTy data and the PCS project data.
How to Use
- Select ClarOTy Asset: Use the list on the left panel to choose the main ClarOTy asset (PLC/Chassis) you want to visualize. The list is pre-filtered to show relevant assets (excluding detailed card/address entries).
- Select PCS Controller: Use the list on the right panel to choose the corresponding controller from your uploaded PCS project files.
- Draw Comparison: Click the Draw Comparison button in the top bar.
Understanding the View
- Left Panel (ClarOTy): Shows the architecture based on the selected ClarOTy asset report data.
- Right Panel (PCS): Shows the architecture based on the selected PCS project file data. Racks marked as hidden in the "PCS Data Viewer" tool will be excluded from this visualization.
- Lifecycle Colors: Border colors on nodes in both diagrams indicate lifecycle status (Green=Active, Orange=End of Life, Red=Discontinued, Grey=Unknown).
- Module Count Comparison: The status bar at the top right (next to the "Done." message) shows the number of modules counted in each view and calculates a percentage representing (ClarOTy Count / PCS Count). This gives a basic quantitative comparison.
PCS Asset Map
This tool provides a visual network diagram of your PLC's hardware configuration based *only* on the PCS project files (`.l5x`, `.xhw`, `.zef`/`.xef`), showing how local and remote racks are connected. Racks marked as hidden in the "PCS Data Viewer" are excluded — and you can Hide / Show the same racks from the drawing itself.
Understanding the Diagram
- Nodes: The diagram shows the **Local Chassis**, its **Local Modules**, and any connected **Remote Racks** with their respective modules.
- Lifecycle Colors: The border color of every component (chassis, racks, and modules) indicates its lifecycle status, matching the legend below.
- Connections: Solid lines show modules on the local backplane. Dashed lines represent network connections from a local communication module to a remote rack (these may need to be added manually). Red lines indicate special connections (e.g., Schneider secondary racks or direct CPU-Rack links).
Hide / Show racks from the drawing
- Hide: Right-click a rack or local chassis node (not an empty slot) and choose Hide. This uses the same Hidden list as PCS Data Quick Navigation, so the rack disappears here and is Hidden there (and vice versa).
- Unhide: Click Hidden (N) — show above the map, then Show on a rack, or Show all on this PLC.
- Hide Empty Slots / Show Empty Slots: Toolbar toggle that hides empty slot placeholders (-- Empty --) on the Asset Map while keeping the rack/chassis visible. This is a view filter only — it does not change the Hidden list or Remove from BOM. Default is Show Empty Slots.
- Remove from BOM: Also on the right-click menu, matching the amber PCS Data toggle. The rack stays on the map; it is only excluded from Total BOM totals. Excluded racks are marked on the drawing with an amber dashed border, a cream background, and an Excl. BOM label suffix, and the tooltip / context menu call out the exclusion so it is obvious without opening the Data Viewer.
Lifecycle Status
- Green: Active
- Orange: End of Life / Limited
- Red: Discontinued / Obsolete
- Grey: Unknown
Creating Manual Links
This feature is essential when the project file does not define the link from a local communication card to a remote rack. It allows you to complete the diagram visually.
- Hold down the Ctrl key (or Cmd on a Mac).
- Click on a single communication module in the local chassis (e.g., a 1756-ENBT).
- While still holding Ctrl/Cmd, click on one or more remote racks.
- Click the Join Selected button. An orange dashed line will appear, linking the items. This connection is saved locally in your browser.
- To remove a manual link, simply select the orange dashed line and click the Unjoin Selected button.
Exporting
- Export Current to PDF: Generates a high-resolution, A3-sized PDF of the currently displayed map.
- Export All to PDF: Generates a single PDF containing separate pages for the maps of *all* controllers found in your uploaded PCS files.
PCS Data Viewer
This tool provides a detailed, table-based view of the hardware from your uploaded PCS project files (`.l5x`, `.xhw`). It's ideal for inventory management and detailed analysis.
Key Features
- Controller Selection: Use the dropdown to switch between the PLC projects you've uploaded. Your selection is remembered and carried across to the PCS Asset Map and Ladder Viewer (and back), so you don't have to re-pick a controller each time you move between them.
- Hide / Show racks: The Hide ⚫ buttons in "Quick Navigation" or next to each rack — or right-click a rack on the PCS Asset Map — remove a rack from view and from the Bill of Materials. Because the state is shared, a rack hidden here also drops out of the PCS Asset Map and Architecture Comparison, and hiding from the map updates this page.
- Remove from BOM (keep visible): The amber Remove from BOM ⚫ button excludes a rack from the Total Bill of Materials only — the rack stays fully visible in the tables and on the maps, and is tagged with an "Excluded from BOM" badge. On the PCS Asset Map the same racks also show an amber dashed border and an Excl. BOM label. Use it for spares or comms racks you don't want counted in the materials total. A note under the Total BOM shows how many visible racks are excluded, and the exclusion also applies to the PDF / "Export All" totals.
- Highlight a module across racks: Click any catalogue number — in the Total BOM, a per-rack BOM, or a rack slot row — to highlight every matching module throughout the racks (click again to clear). Clicking from a BOM jumps to the first occurrence in the racks. Ideal for answering "where are all my Discontinued 1756-CNB/E cards?"
- Accurate chassis counting: Each rack is a distinct BOM line (chassis catalog from the L5X Module tree when known, otherwise the rack name — e.g. Peer_Peer remote chassis). Slot modules are listed separately, including remote Slot 0 adapters (CNB, ENBT, AENTR, …) — each remote rack's adapter is a physical card and is counted in addition to any matching local scanner.
- Lifecycle Status Dots: Each component shows a coloured dot for its lifecycle status (see the legend in the PCS Asset Map section).
- Exporting: Export the hardware data for the current PLC:
- Export Report as CSV: a full component listing for every visible rack (a BOM-excluded rack's modules are still listed — only the aggregated total omits them).
- Export Report as PDF: a professional PDF with a summary Bill of Materials plus a detailed table per visible rack.
- Export All Reports: the PDF report for every controller, combined.
PCS CPU Report
A fleet-wide controller resource table built from your uploaded .L5X files. Each row blends the static profile (processor, firmware, nominal memory, tasks, program/routine and code size) with the Online Snapshot — real CPU utilisation, memory usage and connection counts — from the last time the project was online, decoded from Rockwell's L_CPU_20 / L_CPU_10 AOIs. Controllers without the AOI (or exported without decorated data) show their static profile only; nothing is fabricated.
What each row shows
- Processor & firmware, nominal memory, and task count.
- CPU Act%, D/L and I/O memory used, and connections (current / allowed) — colour-coded green / amber / red as they approach their limits.
- Tags, Standard (S88 / v4 chip), Source protection, and whether an Online Snapshot was found.
Detail drill-down
Click any controller row to expand a full breakdown — static profile, task configuration, a CPU-consumer breakdown, memory pools, connection detail, and the snapshot identity (reported processor, serial, time slice, minor fault count). Use Search Controller and the Snapshot filter to narrow the fleet, then Export CSV, Export PDF (page 1 is the KPI overview; following pages are the same per-controller detail as a row click), or Rebuild to regenerate the dataset.
PCS Fleet Health
A single consolidated view across every loaded controller, derived from the same fleet dataset the PCS CPU Report builds (open the CPU Report once, or this page will build it from your .L5X files automatically). Everything is grounded in parsed data or the uploaded Lifecycle CSV — where a figure is absent it shows "-" rather than guessing.
Risk register
Flags controllers that need attention: source-protected (encrypted) programs, controllers with no online snapshot, and any nearing their connection / CPU / memory limits (warning at 80%, critical at 90% — tunable in the code). Inhibited tasks and non-S88/v4 standards are flagged for review.
Obsolescence
Each controller's processor is matched against your uploaded Lifecycle CSV: "End of Life" / "Discontinued" show as critical, mature / NRND as a warning, Active as OK. Firmware is shown for planning. Processors not in the Lifecycle list are shown honestly as "Unknown" — upload the Lifecycle list on the Home hub to populate this.
Spare capacity
Headroom from the online snapshot per controller: spare connections, free CPU, memory used (D/L and I/O), and module count. For per-card used-vs-spare channels, use the I/O Card Utilization tool.
Filters & export
- Search by controller or processor, or filter to just risk / obsolete / no-snapshot controllers.
- Summary tiles at the top give an at-a-glance count of controllers, critical risks, obsolete units and encrypted controllers.
- Export CSV writes the full per-controller health summary for reporting.
Ladder Logic Viewer
A code reader that renders Relay Ladder Logic as proper ladder diagrams, drawn directly from the L5X. It shows contacts (XIC/XIO), coils (OTE/OTL/OTU), branches, and instruction boxes (timers, counters, math, MOV, AOIs, etc.), annotated with each operand's tag description.
Loading logic
- From your uploaded project: the "Load from uploaded project" dropdown lists the controllers already loaded on the Home hub. It follows the shared controller selection, so it opens on whichever controller you last chose in PCS Data / the Asset Map — no re-uploading.
- Ad-hoc file: drag-and-drop (or click to browse) any
.L5X / .xml file that isn't part of the loaded project.
Reading the ladder
- Logic is grouped by Program → Routine → Rung; click a program or routine header to expand / collapse it, or use Expand All / Collapse All.
- Toggle Show descriptions and Full tag names, search rung text, and filter by program / routine.
- 🖨️ Print produces a clean, diagram-only printout.
Controller Tag List
The 🏷️ Tag List button opens a slide-over tag browser, like the RSLogix Controller Tags window:
- Lists every tag with its Scope (Controller first, then per-program), Name, Data Type, Description, Initial Value (from the last L5X save — Decorated / L5K data; hover for a fuller detail string), and a Used count of references in the ladder.
- Expand a base tag (▸) to see its members — UDT members are resolved from the L5X data types (nested and hidden-packing members handled), and TIMER / COUNTER / CONTROL / MESSAGE members are built in. Each member has its own usage count; expanded UDT members can show their initial values when present.
- The filter searches members too: typing
DN or Speed surfaces the parent tag with the matching sub-member auto-expanded.
Where Used & jump-to-rung
- Right-click (or click) any tag or sub-member and choose 🔎 Where Used to list every rung that references it, as Program / Routine — Rung N with the rung text.
- Click a result to jump straight to that rung: its program and routine expand, it scrolls into view, and it stays highlighted in red so you can see exactly where you landed.
- If it's the wrong rung, use the floating ◀ Results button (bottom-left) to reopen the Where-Used list — the rung you're on is marked "◀ here" — and pick another. Press Esc to close the panel or menu.
Bingo / Matrix arrays
Step-matrix arrays (Rockwell S88 phase logic: *MatrixA, *FaultMatrix, *FaultMons) render as bit-array tables the same way as the FD tool's Bingo section — one row per step, one column per bit, with the raw decimal value and step time on the right. DINT (32-bit), INT (16-bit) and SINT (8-bit) matrices are all recognised.
- 🎯 Bingo in the top toolbar opens a slide-out panel with every matrix in the current controller. The Search tags… box highlights matching column labels; unrelated tables dim. When the term also appears in the ladder, a Find in code ↓ (N) button surfaces — click it to filter the ladder down to those rungs.
- Each routine header that references at least one matrix gets a smaller 🎯 Bingo pill (with a count if more than one). Click it to open the drawer scrolled to just that routine's matrices — unrelated matrices dim automatically via the routine's common tag prefix (e.g.
C1005).
- Bit labels above each matrix are auto-derived from the code: the tool finds the
MOV(…Matrix[i], DecodeWord) rungs, then scans every DecodeWord.N reference to guess a name for bit N. Blank columns aren't referenced anywhere in logic. Click any label to search that tag.
- Step Time column pulls from the matching
*StepTimes array if present — the timer preset is that value × 1000 ms.
- The ✕ close button and clicking outside the panel both dismiss it. Press Esc as usual.
PCS Tag Search
A tile-based search of every tag in every loaded PLC. Enter a partial tag name, description, or type in the search box — results narrow live as you type. Each tile expands to show the tag's UDT/AOI structure with per-instance comment overrides.
What each tile shows
- Tag name, DataType, and Description from the L5X, plus the PLC and scope (Controller / program-name).
- EU Range — automatically detected from named
LowEngineer/HighEngineer UDT members, with the field names it read.
- Sub-tags — expandable list of UDT/AOI members with their DataType, per-instance description (if overridden via
<Comment Operand>), and decoded value.
- I/O address rows — Rack, Slot, Channel, and module catalog. Each row is badged with the detection source (see below).
How I/O is detected
Not every I/O tag is a direct alias. The Tag Search scans four kinds of reference:
- ALIAS — the tag's
AliasFor is a direct module path (Rack:Slot:I.Data.Ch).
- MOV — a
MOV, COP, or CPS instruction pairs the tag with a module path.
- BIT MAP — an
XIC/XIO to OTE/OTU/OTL/OTM rung wires the tag through to (or from) a channel bit.
- AOI:name — a custom Add-On Instruction passes the tag alongside a module reference.
- ST — a Structured Text
:= assignment couples the tag with a module path.
Direction-aware I/O display
By default the tile only shows I/O rows whose type matches the tag's inherent direction:
- A
Solenoid_Output tag shows only the :O rows — not the same-slot :I feedback surface that every Rockwell output card exposes.
- An
AnalogIn_CardScaled shows only the :I channel — not the :C config row that ladder COP distributes on startup.
- Within a matched direction, channel-specific rows are preferred over channel-less "just rack/slot" phantom references.
When rows are hidden, a small "N other references hidden" note appears under the tile so nothing is silently swallowed. Tick the Verbose I/O checkbox in the filter row to see every raw reference (Config + wrong-side + channel-less).
Filters & export
- PLC and Type (UDT / AOI / atomic) dropdowns.
- Has EU Scaling and Has I/O Address checkboxes for quick narrowing.
- Verbose I/O — disables the direction filter for the current view.
- Rebuild Index — re-parses all L5X (only needed after new files are loaded on the hub).
- Export Results (CSV) — exports the currently filtered set, with one row per tag including its primary I/O reference and all reference details.
The first index build parses every L5X sequentially with a progress bar — on a fully loaded plant this takes a handful of seconds. Subsequent visits reuse a LocalForage cache keyed to the loaded file set, so page loads are instant unless files changed.
PCS I/O Card Utilization
Replaces the older comment-per-channel view. For each I/O module in each controller, the page shows a real utilisation figure: how many channels have at least one tag mapped to them out of the card's total channel count. Only physical I/O modules (and module Connection comments) appear here. Produced/Consumed bit aliases and MSG send/receive buffers are shown on PCS Messaging, not as fake “Tag Aliases” cards.
What counts as "used"
- A channel counts as wired only when a real controller/program-scoped tag is mapped to a specific channel — via alias, MOV, XIC/OTE bit-map, AOI parameter pass, or Structured Text assignment.
- Only the tag's own direction is credited: an
AnalogIn tile does not inflate an output card's utilization from its incidental fault-bit reference on the same slot's :I side.
- CONFIG references (
:C paths) never credit utilization — they're startup defaults, not wiring.
- Unknown module catalogs report "used channels" only, without inventing a total. The scanner will not fabricate a denominator it can't verify.
Reading a card row
- Left stripe colour: green = Input card, red = Output card.
- Utilization %: red means no spare channels (100% committed — concerning); yellow is 40–79% (getting tight); green is under 40% (plenty of spare). The colour scheme is deliberately opposite to a test-coverage scale — utilisation isn't a score to maximise, it's a capacity-remaining indicator.
- Channel map: coloured grid, one square per channel. Green = wired (hover for the tag name + description), grey = unused, red = multi-tag on one channel, grey
? = unknown catalog with wired channels detected.
- Show tags: click to expand a table of channel → tag(s) → description for the card.
Filters
- Controller, Catalog, and Direction (Input / Output / both).
- Min / Max Utilization % — update live as you type. Set
80–100 to surface fully-committed cards, or 0–20 to surface spare-heavy cards.
- Search Tag / Description — find the card containing a specific tag (e.g. type
FCV3130 to jump to the card that has it wired).
- Has spare channels and Fully utilised (100%) checkboxes.
- Include unknown catalogs — catalogs not in the built-in lookup (see below) are hidden by default; tick to include them (they'll show used-channel counts only).
Supported module catalogs
Channel counts are known for 55 validated Rockwell catalogs across ControlLogix (1756), FLEX (1794), and POINT (1734):
- 1756 Digital Input: IA16, IB16, IB16D, IB16I, IB32, IH16I, IH16ISOE, IM16, IN16, IV16, IV32.
- 1756 Digital Output: OA8, OA16, OB8, OB16, OB16D, OB16E, OB16I, OB32, OH8I, OW16I, ON8.
- 1756 Analog Input: IF6I, IF8, IF8H, IF16, IF16H, IR6I, IR12, IT6I, IT6I2, IT16.
- 1756 Analog Output: OF4, OF6CI, OF6VI, OF8, OF8I, OF8H.
- 1794 FLEX: IB16, IB32, OB16, OB16P, OB32P, OW8, IE8, IE12, IF4I, IF8IH, IRT8, OE4, OE8, OF4I.
- 1734 POINT: IB4, IB8, OB4, OB8, IE4C, IE8C, OE2C, OE4C.
Any other catalog will show up in the "unknown" bucket — used channels are still counted honestly, but no total or percentage is reported.
Summary tiles & export
The tiles above the card list show, for the currently filtered view: total cards, total channels on known-catalog cards, wired channels, and overall utilisation. Set a filter to see per-plant or per-catalog totals live.
Export CSV saves the current filtered set as one row per card — PLC, rack, slot, direction, catalog, module name, total & wired channels, utilisation %, wired-channel list, and sample tags.
PCS UDT/AOI Report
Consolidates two features that used to be separate hub buttons: the UDT/AOI Summary Report and the S88 Version Compare. Same underlying extraction as the old exports, same Excel workbook output — now viewable on-page with the same column layout and cell colouring.
Summary Report tab
For each controller you select, an Excel-look table lists every UDT and Add-On Instruction with:
- Type — UDT (green badge) or AOI (cyan badge).
- Name and Description.
- Usage Count — how many tags in the controller use this type.
- Revision and Last Edited (AOIs only; UDTs don't carry revision metadata).
The Search box narrows by name or description as you type; the Type dropdown filters to UDT-only or AOI-only. Click any column header to sort ascending; click again for descending. Export to Excel produces one workbook with one sheet per selected file, using the same column widths as the previous hub export.
Encoded AOIs (source-protected) are captured the same as visible AOIs — the definition metadata is still in the L5X even when the ladder is encrypted.
S88 Version Compare tab
Pick one L5X as the Master template (a shortlist auto-selects files whose name matches template, s88, master, or standard), then tick the site controllers to compare against it. The comparison runs live — no separate "Run" button.
Match Summary tiles at the top show, per site: matched %, matched / mismatch / not-in-master / not-in-site counts. This mirrors the REPORT_SHEET tab of the old workbook.
Full Comparison table shows every unique UDT/AOI name across master + all sites, with side-by-side Usage, Revision, Last Edited, and a Status cell per site:
- OK — type exists in both master and site, revisions match.
- MISMATCH — exists in both, revisions differ (mismatched revision cell is also highlighted).
- NOT IN MASTER — site has it, master doesn't (site-specific extra).
- NOT IN SITE — master has it, site doesn't (missing coverage).
The Row filter dropdown narrows to a single status class (typically Only mismatches) so you can focus on drift.
Export to Excel produces the identical workbook the old hub button did: S88_Compare + S88_MISMATCH + REPORT_SHEET sheets, same column widths, same percentage formatting.
PCS Messaging & Produced/Consumed
This page reads the same data you load on the Home page (no re-upload needed) and shows how your controllers exchange data. Everything is built from the Produced/Consumed tags and MESSAGE instructions inside the uploaded .l5x files.
Overview & Status
The summary cards show how many controllers are loaded, how many Produced/Consumed links exist, how many resolve within the loaded set, and how many MSG blocks were found. Each link is one consumed tag — the consuming controller pulls a Remote Tag from a Producer. Links are flagged:
- resolved — the producer and the produced tag were both found in the loaded files.
- missing — the producer is loaded, but it does not actually publish that tag (a likely misconfiguration worth checking).
- external — the producer controller is not among the loaded files (load that PLC to resolve it).
Tip: Load all of your controllers on the Home page so cross-controller links resolve. Anything still showing external just means that producer's L5X hasn't been loaded.
Network Diagram
- Nodes are controllers (solid = loaded, amber dashed = referenced but not loaded). Arrows point from producer to consumer; edge thickness is the number of tags; colour shows status (green resolved, red missing, orange-dashed external).
- Click a controller to highlight only its connections and fade the rest. The same selection also filters the Produced/Consumed tables below. Click empty space or Reset view to clear. Drag nodes to rearrange and scroll to zoom.
- Publish to PDF: Export full diagram (PDF) saves the whole network (A3 landscape). To document a single controller, click its node first, then Export node report (PDF) — this builds a full multi-page report for that controller (see below).
Per-controller PDF report
Select a controller in the diagram and click Export node report (PDF) to generate a multi-page A3 report for just that controller, containing:
- A focused diagram of the controller and the controllers it talks to.
- Consumed by <controller> (incoming) — every block it pulls in, with producer, tags, type, RPI, status and description.
- Individual tag data — for each incoming block, the full bit/word/real cross-reference (Element, Type, Alias Tag, Description, and the routine(s) each element is used in), plus the "whole block referenced in…" line.
- Produced by <controller> (outgoing) — every block it publishes and which controllers consume it.
- MSG blocks defined in that controller.
For a large controller this can take a few seconds to build (it indexes that controller's routines) and can run to several pages. The button shows "Generating…" while it works.
PLC-to-PLC Matrix
A grid where rows are producers and columns are consumers; each cell shows the number of tags flowing that direction — a quick view of who feeds whom.
Produced / Consumed Links
- Filter by Source, Destination, Status, or by text in the tag/description.
- Sort any column by clicking its header (a faint ⇅ marks sortable columns; click toggles ascending ▲ / descending ▼). RPI sorts numerically and tag names sort naturally.
- Bit/Word/Real Xrefs column shows how many elements are documented for each link (used by the ▶ expansion).
- Export links — CSV downloads the current link list; Excel exports an Overview sheet plus a Bit Level sheet.
- Live counts show immediately on page load.
Bit / Word / Real Cross-Reference
Click the ▶ on any link row to expand it and see how that comms block's data is used inside the consuming controller. For each documented element it lists:
- Element (e.g.
...Txi[0].21 for a bit, ...Txr[1] for a word/real) and its Type (Bit, Word, or Real).
- Alias Tag — the friendly tag mapped onto that bit/word, if one exists.
- Description — from the block's per-element comments.
- Used in Routine(s) — the Program/Routine path and the ladder rung numbers that reference that element (via its alias or directly), plus a "whole block referenced in…" line for the COP/copy that distributes it.
The first time you expand a block on a large controller, it parses and indexes that controller's routines, which can take a second or two; after that it is instant. If a controller's logic is FBD/ST (not ladder), elements may show "not used in ladder".
MSG Message Blocks
Lists every MESSAGE (MSG) instruction config: controller, MSG tag, message type, Local Element (the local data buffer — e.g. MK_TR1_D_Send[0]), buffer type (e.g. INT[20]), Remote Element, requested length, connection path, and service code. Click a row to expand the same bit/word/alias cross-reference used for Produced/Consumed blocks. CIP Data Table Read/Write on a peer that has no MSG of its own still appears here on the sending PLC (path + remote element). Sortable headers and an Export MSG to CSV button are provided. Ladder Viewer MSG boxes also show these MessageParameters under the control tag. PID/PIDE boxes similarly show SP, KP/KI/KD, limits and mode bits from the control structure.
Offline note
The diagram uses js/vis-network.min.js and the PDF export uses js/jspdf.umd.min.js. Both ship locally, so the page works fully offline once those files are in your js/ folder.
PCS Version Compare
Compare an older Version A against a newer Version B from the files already loaded on Home (they stay side by side in storage). Unity (.zef/.xef/.xbd) comparison is a later iteration — this build compares L5X.
How to use
- Load both exports on Home (use Add to existing if a project is already open). Prefer distinct filenames when controller names match.
- Open PCS Version Compare, pick Version A (older) and Version B (newer), then review the summary chips.
- Use the Show checkboxes to focus on I/O, Hardware, Code, Initial values, and/or Asset map.
What is compared
- Hardware — modules added, removed, or changed (catalog / parent / slot).
- I/O channels (by tag) — wired tag↔channel moves, renames by description, adds and removes.
- Code — routines added/removed, and modified routines as side-by-side ladder (or text) with optional descriptions and fit-width.
- Initial values — controller- and program-scoped tags whose Decorated/L5K initial data (from the last L5X save) differs. Aliases are skipped. Same value source as the Ladder Viewer Initial Value column.
- Asset map — two independent PCS network drawings (A | B), same engine as the Asset Map page. Pan and zoom each; lifecycle border colours apply. Compare maps show every rack in each file (they do not apply BOM Viewer “hidden” curation).
Initial value changes
- Tags are listed as expandable rows: Name — description (TYPE) [scope], with Changed / Added / Removed badges.
- Expand a tag for an element list like Controller Information / All Tags — e.g.
[0] (REAL): 16 // Steam Header Pressure High Alarm Setpoint. Changed members show A → B; unchanged members stay a single value. Element comments and tag descriptions appear when present in the L5X.
- Filter tags — live substring filter (e.g. type
Vars) with a showing count and Clear.
- Export CSV — one row per element/member with Change, Scope, Tag, Tag Description, Tag Data Type, Element, Element Data Type, Value A, Value B, and Element Description. Exports the full Initial Value diff (not only the filtered view).
If pane B looks missing on a narrow window, widen the browser — A and B share equal columns. Hard-refresh after an update if an older cached page is still open.
Lifecycle Data Management
This page displays the contents of the Lifecycle CSV file you uploaded on the Home page. This data is used to determine the status colors shown in the PCS Data Viewer and Asset Maps.
- View Data: See the raw mapping between Model/Part Number and Lifecycle Status.
- Search: Filter the table to find specific entries.
- Clear Data: Click Clear Lifecycle Data to remove the current lifecycle information from the browser's storage. You will need to re-upload a CSV on the Home page to add new data.
Parser & FD Generator Tools
Help for the L5X Tag Parser, Functional Description (FD) Generator, and Pattern Validator.
Report Packager
The Report Packager assembles a client-ready handover pack in one place. Pick one or more controllers (Rockwell and Schneider), tick the reports you want, and it builds a single merged PDF per processor — or bundles multiple controllers into a ZIP. Hardware BOM, Asset Map and I/O utilisation use the same chassis data for both platforms. CPU, Messaging, and the AOI/UDT Excel inventory stay L5X-only.
PDF section order (when selected): controller summary (Loaded PLC Files row), then CPU / Resource Snapshot, Asset Map (architecture), Hardware BOM, I/O Card Utilization, Messaging. Excel reports (BOM, I/O tags, AOI/UDT) are bundled alongside the PDF in the ZIP.
How to Use
- An availability check runs when the page opens (and again via Check available reports). The table is a matrix: rows are processors, columns are report types (CPU, Asset Map, Hardware BOM, I/O, Messaging, AOI/UDT). Each cell is Available, Reduced, or Unavailable. Hover or click a cell for why and a recommendation. Reduced reports can still be packed — for example an I/O card list or AOI/UDT inventory from a source-protected L5X.
- Select the controller(s) to include.
- Tick the reports to add (including AOI / UDT Report (Excel)). Unavailable reports are skipped per processor; packaging is not blocked.
- Build. Each processor becomes one merged PDF plus any ticked Excel files; multiple processors are delivered as a ZIP.
The packager honours the curation you've already done in each source tool (for example racks you've excluded from a BOM), so the pack matches what you see on the individual pages. The AOI/UDT workbook columns are Controller, Name, Type, Count Used, Description, Date, and Version. Count Used is tags whose DataType matches the definition (same as the PCS UDT/AOI Report page). Schneider/Unity controllers mark AOI/UDT Unavailable (DFBs are not AOIs).
While a pack is building: if you try to leave the page (nav link, browser back, or close/refresh) you will be asked to confirm — Are you sure? Handover Packs are still processing and have not been exported. Wait for the build to finish and download, then navigate away.
Unity ZEF Reader (Schneider)
Reads Schneider Control Expert / Unity projects from a .zef archive (or a .xef / .xml export). It exposes program sections, variables, I/O, and FBD logic with wire routing and documentation tooltips.
How to Use
- Drop a
.zef, .xef, or .xml file onto the page to explore it.
- Browse sections and variables; hover FBD blocks and wires for documentation and routing detail.
This is a read/explore tool. To turn Schneider logic into written Functional Descriptions, use the Schneider FD Generator instead.
Pattern Development Suite
The FD Generator turns ladder logic into readable Functional Descriptions by matching each instruction against a set of regex patterns. In the server edition these patterns are shared reference data stored in the database, so a change applies to everyone. The Pattern Development Suite (test_patterns.html) is where you view, test and manage them.
Load, edit, save
- Load current patterns from server pulls the live Rockwell and Schneider sets into the page so you're editing what's actually in use.
- The testing tools below let you trial a single pattern against sample logic, regenerate a pattern for logic that isn't matching, and validate a whole file for regex errors before you commit it.
- Save Rockwell / Save Schneider to server writes the set back. Saving replaces the whole set for that vendor, so it's validated first — a broken pattern can't be saved.
Pattern Gap Scanner
Rather than discovering un-patterned instructions one Functional Description at a time, the Scanner (pattern_scanner.html) runs the current patterns against every rung of every loaded PLC and lists exactly the instructions nothing matches. Download unidentified code exports the actual instruction call and full rung text (CSV or XML) so you can paste it into AI to generate new patterns. Suggested-pattern XML stubs remain available, but they are guesses and should not be the file you send to AI.
CSV columns: Controller, Program, Routine, Rung, UnmatchedInstruction, FullRungText. The FD Generator’s Export unidentified code button writes the same columns from unmatched rungs after you generate FDs.
Ordering matters (first-match-wins)
Patterns are tried top-to-bottom and the first that matches wins. So a general pattern (e.g. one that accepts any XIC operand) must sit after the specific ones, or it shadows them. The Scanner places its suggestions after existing patterns for the same instruction for exactly this reason.
Backup & restore (the stale-seed problem)
Patterns and lifecycle data are seeded from the bundled files only when the database is empty. Once you edit them in the app, those bundled files are out of date — so a fresh install would otherwise start from stale data. Use Backup ALL reference data to export the live patterns, lifecycle and tags to one file, and Restore from backup to load it onto a new or rebuilt server. Dropping that file in as reference-backup.json before first run makes a new install inherit your current data instead of the original seed.
ClarOTy CSV Viewer
Shows the raw, filterable rows from the ClarOTy Asset Report you uploaded on the Home page. Items you highlight on the ClarOTy Asset Map also surface here, making it easy to cross-check a device against its source row.
Read-only view of already-loaded data. Load or replace the underlying CSV from the Home page.
Raw Data Viewers (Diagnostics)
Two low-level viewers expose exactly what is held in browser storage (IndexedDB), for troubleshooting and verification:
- ClarOTy Raw Data Viewer (
claroty-data-viewer.html) — the stored ClarOTy asset data in text form.
- PCS Raw Data Viewer (
pcs-data-viewer.html) — the raw stored PCS / L5X-derived data.
Use these when a tool shows unexpected or empty results and you want to confirm what was actually stored. They display data only — they don't modify it.
What's New
Aug 25, 2026
- Report Packager — PDF section order — merged handover PDFs now put a controller summary first (Name, File Name, Platform, Type / Detail, FW, PLC Standard, Source, Routines from Loaded PLC Files), then CPU / Resource Snapshot, then Asset Map (architecture), then BOM, I/O, and Messaging.
- Report Packager — ZIP download — leave-page warning no longer intercepts the ZIP/PDF download click at the end of a build.
- Hardware BOM (Excel) — Rack Detail sheet adds Processor Name, Family, and Count columns.
- BOM — remote Slot 0 adapters — CNB / ENBT cards in Slot 0 of ControlLogix remotes are counted. Compact 5000 5069-AENTR (adapter = Slot 0) counts once. Flex I/O 1794-AENT (adapter on Chassis only; Slot 0 is I/O) is counted from the Chassis line.
Aug 24, 2026
- PCS Version Compare — Initial Values — new compare category for tag initial data from the L5X save. Expandable element lists (Controller Information style), tag filter, descriptions and
// element comments on screen, and Export CSV (tag + element descriptions included). See PCS Version Compare.
- PCS Version Compare — layout & Asset Map — Value B / map pane B stay visible (equal columns); compare maps draw full remotes per file and ignore BOM “hidden” curation so they match each L5X.
- Home — Loaded PLC Files — dedicated File Name column; panel widens beside Schneider tags on wide layouts.
- PCS Asset Map — Exclude from BOM — excluded racks show amber dashed borders, cream fill, and an Excl. BOM label on the drawing (not only a tooltip).
- Report Packager — confirms before you leave while a handover pack is still building / not yet exported.
- CSAM / file:// — tool pages use relative
js/ script paths so opening CSAM from disk no longer blanks pages that need shared helpers.
- Server Edition — Administrators can Delete all projects… on the Projects page (irreversible bulk wipe; audited).
Aug 23, 2026 — Build v2026.08
- 1756 chassis BOM — chassis slots from Bus Size (1756-A4…A17); PA72/PA75 power supply support.
- BOM rack filtering — non-catalog rack names (e.g. BFEN*) are excluded from the BOM.
- Asset Map — empty slots hidden; rack size shown as an annotation.
- Asset Map — fixed duplicate peer modules (Ethernet / ControlNet).
- Module catalog overrides — editable on BOM and Asset Map.
- Report Packager — availability matrix and AOI/UDT report.
- Help: diagnostics — System health page (server admin) and Browser storage panel.
- CSAM Help — Client health summary and Browser storage panel.
- Lifecycle matching — exact-match fix for chassis codes (e.g. 1756-A7).
- Schneider I/O, Schneider home auto-heal, and PCS Messaging improvements.
Aug 19, 2026 — FD Generator processor picker: the one-button-per-PLC tab row is now a sorted dropdown (Rockwell and Schneider). Process/Generate still runs every loaded PLC; the dropdown only filters what you see. All processors remains an option so you can still export everything without changing the process model.
Aug 18, 2026 — updates in this chat: Schneider FD improvements, PCS Messaging exports/UX, and FD/PCS export consistency. The current build is shown as a version badge in the top-right of the Home page.
- FD Generator processor picker — Rockwell and Schneider FD Generators now use a sorted Processor dropdown instead of a button per PLC. Defaults to one controller; choose All processors to show every generated FD. Process/Generate still parses every loaded file so Excel/PDF export can still include any PLC.
- Schneider FD: AND/OR wire linking duplication fix (v12/v13) — corrected connective/link duplication across parallel leg wiring.
- Schneider FD: Go to FBD + richer FD cards — added “Go to FBD” per-block; FBD tag tooltips show tag descriptions; FD card headers now show the “Then” tag + description; when an out tag exists, redundant
AND/.n and SR labels are dropped.
- Schneider FD: Raw vs Formatted Excel/PDF exports — Excel (.xlsx) exports now include Raw vs Formatted output (ExcelJS), with two-sheet formatted output where applicable; PDF exports are styled like the formatter.
- Schneider FD export modes match PCS — Excel supports single workbook, one workbook per file, or one workbook per section name; PDF supports single vs separate-per-section outputs.
- PCS Messaging: node filtering, exports, and counts — clicking a node filters the tables below; exports now support CSV and Excel links (Excel includes Overview + Bit Level sheets); the links table includes a Bit/Word/Real Xrefs column; counts show immediately on load.
- Dev runner —
build/dev-run.ps1 now performs port-based cleanup before starting.
- Bingo / Matrix Arrays in the Ladder Viewer — the Ladder Viewer gained a Bingo panel matching the FD tool's: a slide-out drawer listing every step-matrix DINT/INT/SINT tag in the controller with its bit values, auto-derived per-bit tag names, and per-step timing. A global 🎯 Bingo button in the toolbar opens all matrices; each routine that references a matrix also gets its own 🎯 Bingo pill that opens the drawer scrolled to that routine's matrices. The panel's Search tags… box filters the tables and shows Find in code ↓ counts — clicking that filters the ladder to just the rungs containing the term. See Ladder Logic Viewer → Bingo / Matrix arrays.
- FaultMatrix (INT) and narrow (SINT) matrices now render — Bingo detection was previously DINT-only, so
*FaultMatrix arrays (INT/16-bit) and small SINT arrays were silently skipped. All three types are now recognised in both the FD Generator's per-routine Bingo section and the Ladder Viewer's Bingo panel, with the correct column count per type. The header cell shows the actual DataType ([DINT], [INT], [SINT]).
- FD Export PDF now includes each routine's Bingo tables — previously only the on-screen and Excel exports carried the matrix tables; the PDF FD export skipped them. Each routine's PDF section now starts with a Bingo / Matrix Arrays block (one table per matrix, with the bit-label legend, values and step times) directly above the Functional Description table, matching the on-screen reading order.
- Shift+click range selection in the FD Export dialog — the Select Items to Export checkbox tree now supports Windows-style range selection. Click a routine (or program), then shift+click another at the same level, and everything in between fills to match. Works forwards and backwards, and range-unchecks when you start on a checked one. Programs and files update to indeterminate or checked as appropriate.
- Server Edition — per-version file editing — the Projects admin page gained per-file Remove, multi-select Remove selected (one fork for many files), and + Add file controls on the current version. Removing file(s) auto-forks the version (the original is kept as history, a new current version is created with those file(s) omitted). Adding accepts one or more
.L5X/.XBD/.ZEF/.XEF files in one picker (appended in place to the current version), parses metadata with the same extractor as the initial upload, and refuses duplicate filenames. Enables in-place project maintenance (e.g. swap one controller's L5X for a newer export, or drop several PLCs at once) without re-creating the whole project. See Server Edition — Accounts, Projects & Sharing.
- Server Edition — auto-heal on hub load — when derived caches (
pcsData, the Loaded PLC Files manifest, I/O index, CPU report) are missing but source files exist — typically after an Add/Remove File edit — the hub detects the inconsistency on load and rebuilds them automatically. A progress banner appears while the rebuild runs.
- Tag List — no auto-expand on search — searching the Ladder Viewer's 🏷️ Tag List used to auto-open the tree of any UDT whose members happened to match the query, which buried other matches when a UDT had many members. Search results now stay collapsed; use the ▸ arrow to open a tag's tree yourself.
- Server Edition — the suite now runs as a multi-user server application backed by SQL, with sign-in, roles, shared Projects & versions, a Users admin page and an Audit trail. Data is stored centrally rather than per-browser. See Server Edition — Accounts, Projects & Sharing above.
- SLC 500 / MicroLogix support — RSLogix 500
.SLC exports now work across the ladder, FD and tag tools. Upload the matching .SY5/.SY6 symbol files alongside to get tag names and descriptions (e.g. O:2.0/1 → SV15). See SLC 500 / MicroLogix Support above.
- Pattern Gap Scanner — scans every loaded PLC for instructions no pattern matches and suggests patterns for them in one pass, replacing the hand-collection of unmatched instructions.
- Server-based pattern management — the Pattern Development Suite now loads and saves the live shared pattern sets directly, with validation-gated saves and a one-file backup/restore of all reference data (patterns, lifecycle, tags).
- FD descriptions on multi-operand instructions — comparison and math instructions (e.g.
N27:0 < N12:2) now show the description of each address they reference, not just the first.
- FD And/Or fixes — corrected the connective on the first element of a parallel leg and on the element following a nested branch group, so series (And) and parallel (Or) relationships render correctly.
- AOI & array-operand patterns — patterns now handle un-prefixed AOI names and operands containing bracketed array subscripts with internal commas (e.g.
SiloVols[(i+1)/2,IngdSilo]) without splitting on the wrong comma.
- Performance — project data is cached client-side and re-downloaded only when it changes (ETag revalidation), and parsed with streaming to roughly halve peak memory on large controllers.
- Build v2026.07 — a version badge now appears in the Home header (links here). Home page gained an export reminder: because the database is cleared when the browser is fully closed, a banner and a close-page prompt now warn you to DB Export unsaved work first. The Comparison & Lifecycle Reports tile now opens an honest "Coming Soon" placeholder, and the retired ClarOTy Asset Merge Sandpit tile has been removed. Help now covers the Report Packager, Unity ZEF Reader, Pattern Validator, CSV Viewer, and the raw data viewers.
- PCS Tag Search — new page. Tile-based search of every tag in every loaded PLC with UDT/AOI sub-tag unpacking, EU scaling detection, and direction-aware I/O address resolution.
- PCS I/O Card Utilization — rewritten. Real per-card wiring map (used vs spare channels) using the same tag↔I/O detection as the Tag Search. Utilisation colours are red-for-full / green-for-spare (opposite of a coverage %) so no-room cards jump out.
- PCS UDT/AOI Report — new page consolidating the old "Export AOI/UDT Summary Report" and "S88 Version Compare" hub buttons into one tabbed interface. Both exports produce the same styled workbooks as before.
- Home page Loaded PLC Files panel — now shows PLC Standard (auto-detected from common controller tags) and an encryption Source badge per file so fully-encrypted controllers (Ethanol, Recep_Seps) are visible at a glance.
- Home page & FD Generator progress bars — multi-file processing now shows "Reading X (N of M)…" with a live fill bar instead of a spinner. Serial reads so you can see which file is blocking.
- FD Generator branch-parsing fix — a rung whose last branch came after a JSR (or any AOI with a greedy
.*) in its pattern) previously dropped that final branch. The parser now confines each pattern match to the current instruction's balanced-paren extent, so downstream branches are preserved.
- Home page widened — max width bumped from 1280 to 1600 px for better use of wide monitors; tool grid still degrades gracefully to 3/2/1 columns as needed.
- Encryption detection — every L5X is scanned for source-protected routines (
<Routines><EncodedData>) and flagged on the hub, so a suspiciously-empty Tag Search or 0.2% utilisation is explained by the badge rather than looking like a tool bug.
Overview
You load files on Home (index.html) and the tools read that data on the other pages. In the Server Edition, saved data is stored centrally on your organisation's server and shared with your colleagues (see the Server Edition section above). In the standalone offline edition, data instead stays in your browser's local database and never leaves your machine. The tool pages work the same way in both.
- Asset Tools Hub (index.html): Drag/drop files, process, manage storage, and see all loaded PLCs with filename, code standard and encryption status.
- PCS Version Compare (pcs_compare.html): Diff two L5X exports (hardware, I/O, code, initial values with CSV export, side-by-side Asset Maps).
- PCS Tag Search (pcs_tag_search.html): Cross-PLC tag search with UDT/AOI sub-tags, EU scaling, and direction-aware I/O address resolution.
- PCS I/O Card Utilization (pcs-io-data-viewer.html): Per-card wiring map (used vs spare channels) across every DI/DO/AI/AO module in every loaded PLC.
- PCS UDT/AOI Report (pcs_udt_aoi_report.html): Per-controller UDT/AOI inventory plus S88 Version Compare (master vs sites).
- L5X Tag Parser (parser.html): Single-file explorer for Tags, UDTs, AOIs; filter and export CSV/Excel.
- FD Generator (fd_generator_logix.html): Convert Rockwell ladder logic into readable Functional Descriptions.
- Schneider FD Generator (fd_generator_schneider.html): Same for Schneider Control Expert FBD networks.
- Pattern Validator (test_patterns.html): Trial regex patterns for the FD Generator.
Persistence: Data persists across browser closes and restarts unless you clear it (or use InPrivate). See "Storage & Persistence" below.
Getting Started (Home)
- Drop Patterns (Optional): Add
patterns.xml if you plan to use the FD Generator.
- Drop .L5X (Required): Drag one or more
.L5X files into the second box.
- Process: Click the buttons to parse and store each file type. Status turns green when saved.
- Open Tools: Once data is saved, the app tiles become active; open them in new tabs.
L5X Tag Parser (parser.html)
Explore tags, UDTs, and AOIs for a single file. Usage is shown inline and export options are available.
Inline Usage Counts
- In the UDT and AOI sections, the header shows
(n uses) beside each name.
- Expand a type to see its structure and a linked list of tags that use it.
Detailed UDT/AOI Usage Report (Excel)
- Click Export UDT/AOI Report in the parser and choose types to include.
- The Summary sheet has:
Type, Name, Description, Usage Count, Revision, Last Edited.
- Name cells are hyperlinks to detail sheets for that UDT/AOI, which list all tags (with Scope/Description).
Filtering & CSV Export
- Data Type filter (e.g., DINT, TIMER, or a specific UDT/AOI).
- Scope (Controller or Program), Tag Name, and Description partial matches.
- Suffix filter supports multiple suffixes separated by
; (example: .DN;.EN).
- Click Export Filtered Data to CSV to download the current results.
Viewing Bit Arrays
For arrays of SINT/INT/DINT, use View Bit Array to toggle a per-bit table view that highlights 1 bits for fast scanning.
Storage & Persistence
- Data is stored locally (IndexedDB). Closing the browser or rebooting does not clear it.
- It will clear if you:
- Use InPrivate, or have Edge set to “clear on close”.
- Manually clear browsing data for this origin.
- Change the origin (for
file:// pages this includes moving/renaming the folder).
Tip: Keep files in the same folder path or serve locally (e.g., http://localhost:8080) for a stable origin. You can also request persistent storage:
<script>
(async () => {
if ('storage' in navigator && navigator.storage?.persist) {
if (!(await navigator.storage.persisted())) {
console.log('Persistent storage granted?', await navigator.storage.persist());
}
}
})();
</script>
FD Generator (fd_generator_logix.html)
The FD Generator parses ladder logic into human-readable Functional Descriptions. It uses your patterns.xml to recognise instructions and format branches clearly.
Multi-file processing with progress
When you drop multiple .L5X files (or open the tool with files already saved from the Home hub), the FD build now runs serially with a progress bar at the top of the output area: Processing <filename> (N of M)… with a live fill bar. Each file yields to the browser between parses so you can see which one is currently blocking on a large export. On completion the bar flips to a green "Processed N files." confirmation (or red with a link to the error summary if any file failed).
Processor picker
After processing, a sorted Processor dropdown lists each controller (Studio 5000 name, falling back to the filename). It defaults to one PLC so you can read that FD without hunting through a row of buttons. Choose All processors to show every generated FD on one page. Changing the dropdown only filters the display — Process still parses every loaded file, and Export still offers the full file/program/routine tree.
Bingo / Matrix arrays per routine
Where a routine references step-matrix tags (*MatrixA, *FaultMatrix, *FaultMons), the FD output prefaces that routine's description with a Bingo / Matrix Arrays section — one bit-array table per matrix, with auto-derived per-bit labels, decimal values, and a Step Time column from the matching *StepTimes array. All three integer widths are supported: DINT (32 columns), INT (16 columns, typical of *FaultMatrix), and SINT (8 columns). The header cell shows the actual DataType so you can tell them apart at a glance.
Exporting selected routines
Click Export → Excel / PDF to open the Select Items to Export tree. Three configuration options control how the workbook / PDF is organised:
- 1) All selected routines in a single workbook — one sheet per routine plus a Tags sheet.
- 2) One workbook per Program — sheets for each routine in that program, its Bingo tables, and Tags.
- 3) One workbook per Routine name — each occurrence of the same routine name across files ends up in one workbook (useful for site-wide comparisons of e.g. every plant's
_sbrCIP).
The checkbox tree supports shift+click range selection: click one routine (or program), then shift+click another at the same level, and everything in between fills to match. Programs and files become indeterminate or checked automatically as their children change. Select All / Deselect All at the top still work for whole-tree toggles.
PDF exports render each routine as: routine header, Bingo / Matrix tables (if any), then the Functional Description table — matching the on-screen reading order.
Branch parsing — balanced-paren fix
A subtle bug in earlier builds caused the last branch of a rung to be silently swallowed if the rung contained a JSR (or any AOI/instruction) whose patterns.xml entry used a greedy .*) in its argument capture. Example rung:
[XIC(MB1_RUN) OTE(FF5.Run) ,OTE(FF5.Isolator) ,JSR(_sbrDriveVFD_Digital,1,FF5,FF5) ,XIC(FF5.Out) OTE(MB1_Out) ];
The greedy .*) in the JSR pattern would match all the way to the closing ) of the final OTE(MB1_Out), consuming the XIC(FF5.Out) OTE(MB1_Out) branch as if it were part of the JSR arg. The current build confines every pattern match to the current instruction's own balanced-paren extent, so the JSR sees only JSR(_sbrDriveVFD_Digital,1,FF5,FF5) and the trailing branch is picked up correctly. If your existing patterns.xml uses greedy captures for good reason, they still work — they just can't over-run their own closing paren any more.
Understanding patterns.xml
The file contains regex "patterns" the generator uses to match instructions and format output. Each pattern defines a match, a return format, and a type (Input / Output / Format).
Pattern Block Format
<Pattern>
<RegexString>...</RegexString>
<ReturnPattern>...</ReturnPattern>
<Type>...</Type>
<ExtendedInfo>...</ExtendedInfo>
</Pattern>
Visualising Ladder Logic Branches
Parallel branches are rendered as coloured, indented sections so the logic reads clearly.
***NZ033_StatusID:90 NZ033P03L01E01 - HCT 1***
| --- Branch A Start --- |
| --- Branch B Start --- |
| If: | | | ButMkr1C01.Active | Butter Maker CIP Selection |
| | Or | | | |
| | And | | S:FS | System First Scan |
| --- Branch B End --- |
| Then: | | Latch | NZ033P03L01E01 | |
| | Or | | | |
| If: | | | ButMkr1P01.Selected | Butter Maker 1 Production |
| And | | NZ033P03L01U01OrderContextAvailable | Order Context Available (HCT 1) |
| Then: | | UnLatch | NZ033P03L01E01 | |
| --- Branch A End --- |
Schneider FD Generator (fd_generator_schneider.html)
The Schneider FD Generator produces Functional Descriptions for Schneider Control Expert logic, the counterpart to the Rockwell FD Generator. Instead of L5X ladder it reads Control Expert .XBD exports (FBD networks), an optional tag .TXT list for comments (not type/initial-value blobs), and a schneider_patterns.xml that maps each block type (AND, OR, SR/RS latches, timers, etc.) to its FD wording. Device initial values (scaling, valve times, MessageNo) are shown on the Schneider Device Register and I/O Card Utilization; they are read from .XEF/.ZEF first, with the tags .TXT filling gaps when it is loaded.
Loading data
Uploads are consolidated on the Home page. Put your Schneider .XBD file(s) in the PLC Files box (the same box takes Rockwell .L5X/.SLC — they're sorted by type automatically). Drop schneider_patterns.xml into the FD Patterns box (which also accepts the Rockwell patterns.xml; each is detected and routed automatically). Add your tag .TXT in the Schneider Tags box. Then click Process and Save Data. Schneider data is stored separately from Rockwell, so both platforms can be loaded at once. Open the Schneider FD Generator tile and click Generate FDs from Saved XBD.
When several projects are loaded, a sorted Processor dropdown filters the on-screen FD to one file (or All processors). Generate still processes every loaded XBD/XEF/ZEF so export can still include any section. Section quick-links, search, and Go to FBD stay on the visible file(s).
What it does
- Parses each
.XBD FBD network, follows the links between blocks, and resolves each block's inputs back to source tags/expressions.
- Formats each block into If / And / Or / Then lines (with Set when… / ReSet when… (UnLatched) for SR/RS latches), pulling descriptions from the tag
.TXT.
- AND/OR wire linking fix (v12/v13) — prevents duplication in parallel leg connective/link rendering.
- Go to FBD per-block — “Go to FBD” jumps you to the exact block, and FBD tag tooltips show tag descriptions.
- Cleaner FD cards — card headers show the “Then” tag + description; redundant
AND/.n and SR labels are dropped when an out tag exists.
- Exports — Excel (.xlsx) exports include Raw vs Formatted output (ExcelJS) and formatted exports use a two-sheet workbook where applicable; PDF exports use the same formatter styling.
- Export modes match PCS — Excel can be a single workbook, one per file, or one per section name; PDF can be a single PDF or separate PDFs per section.
The Schneider tool runs fully offline using the same vendored libraries as the rest of the suite (js/xlsx.full.min.js, js/html2pdf.bundle.min.js, js/localforage.min.js). It also needs fd_style.css and schneider_fd_style.css in the folder.
Browser storage
IndexedDB data for this browser only. Server Edition also syncs project data to SQL when a version is selected; this panel shows what is cached locally.
Troubleshooting
- Open DevTools → Console and check for red errors (usually a missing function or an ordering issue).
- If you moved the project folder, the
file:// origin changed; re-process the files on index.html.
- To force a clean slate: use Browser storage above, or DevTools → Application → clear IndexedDB/localForage keys like
l5xDataStore and patternsXML; then re-process.
- If a Tag Search / I/O Utilization page shows suspiciously little data for one controller, check the Source badge for that PLC on the Home hub — a "Fully encrypted" flag explains empty results.
- If the FD Generator drops a rung's last branch, verify the JSR / AOI patterns aren't using an unbounded greedy capture — the current build confines each pattern to its instruction's paren extent, but a very old cached
fd_app.js may still exhibit the bug (hard-refresh to pick up the fix).
- If tool tiles look pale on the hub, your browser may be caching an old
index.html stylesheet; hard-refresh (Ctrl+F5) after replacing files.
- If your local dev ports conflict, re-run
build/dev-run.ps1 — it now cleans up by port before starting.