English · 한국어
VEXPLOR AAS Studio
Author, validate, serve and collect live values for AAS (Asset Administration Shell) — in one web app.
Upload one machine's AASX, see exactly which rules it breaks, and fix what can be fixed in one step.
This used to take three tools. VEXPLOR AAS Studio brings the work together and is built so that
people new to AAS can follow along.
| Task | Usual tool | Here |
|---|
| Open · edit · export AASX | AASX Package Explorer (desktop) | In the browser, with findings and auto-fix |
| Serve AAS to other systems (Part 2 REST · registry) | Eclipse BaSyx server | The same server does it |
| Collect machine values · publish them by subscription | Separate OPC UA client/server | Collects per the AID in the AAS and publishes via an OPC UA server |
Not affiliated with, and not derived from, the tools above — it combines the same jobs in one place.
New here? Click "Start with a sample" on the start screen to open a fully filled equipment file and a process structure.
Website: wace.me/en-platform-aas-studio
Docs: Usage · Install · Deployment & hosting · The 52 rules · Using it with Logic Studio
— every document is also available in Korean.
Why
AAS is in place as a standard. Putting it into a factory is still work left outside the specification.
A review of ten years of AAS research (IEEE Access, 2025) names integration with existing machines and
systems as a key challenge holding back adoption. Several studies point to the effort of building an AAS by
hand, and the open tools are split into editors, servers and libraries, so collecting field values means
mapping it yourself in configuration files. VEXPLOR AAS Studio lets software take on that work, so an AAS
does not end as a document but becomes operating data with live values from the machines on the floor.
| What people hit on the floor | In VEXPLOR AAS Studio |
|---|
| Attaching to machines and PLCs that already run | Collects from OPC UA, Modbus TCP and MQTT per the AID in the AAS, and reads S7, MELSEC (MC protocol) and LS ELECTRIC XGT PLCs directly — read only, a VEXPLOR extension binding. The remote collector sends outward only; PLC programs are not changed |
| Building an AAS by hand | Start from a filled sample, fill values at once from tables or CSV; 52 rules point out problems and 19 fix them automatically |
| One tool per job | Open, edit, check, Part 2 REST, field value collection and OPC UA publishing in one screen |
| Passing the standard, failing the receiver | Checks the Korean receiving validator's (KOSMO Validator) business rules — semantic ID allow-list, mandatory submodels, package structure — before submission, and shows conflicts with the standard as a policy the user decides |
There are real line deployments (Bosch Rexroth and others). They adopted AAS to end months of integration work
whenever machines change — and they too report that creating the AAS itself is the first hurdle for many users. Evidence and sources: docs/background.md.
The receiving validator remains the only authority on acceptance. This tool is a pre-check.
What it does
| |
|---|
| Open & edit | Load AASX (JSON or XML), browse it as a tree, edit values, elements, submodels and concept descriptions. Fill many values at once from a submodel value table or from a CSV equipment list |
| Lint | 52 rules in three layers — package structure (L1), metamodel constraints (L2), submission business rules (L3) |
| Auto-fix | Preview the fixable findings (19 rules), choose, apply at once. Every relocation is recorded |
| Report | A printable HTML validation report |
| What to fill | With the IDTA templates installed, every value row shows required · collected · optional, and "Show only what to fill" hides the rest |
| Undo & history | One-step undo, and restore a submodel to an earlier point |
| Types and units | Split a type file into units; when the type changes, review the differences line by line and pull only the lines you choose — values edited on site are never overwritten |
| Process bundles | Company → line → process → equipment → part. Group machines into a process and export a submission bundle |
| Data collection | Read live values from OPC UA · Modbus TCP · MQTT devices, and directly from S7, MELSEC (MC protocol) and LS ELECTRIC XGT PLCs — read only, a VEXPLOR extension binding not yet checked on real PLCs — addressed by the AID submodel inside the AAS. Each value shows whether it is live, stale or missing, and each machine gets a daily status bar (running · stopped · alarm). Add dozens of tags from one pattern |
| Standard API | IDTA Part 2 REST API, so other systems can read the AAS held here |
| MES · ERP · CMMS integration | A pull feed of every change and runtime event (CloudEvents), signed webhooks and MQTT, equipment / BOM / hierarchy / maintenance / document exports in JSON or CSV, ERP numbers kept next to the AASX, and server-side state, alarm, counter and threshold rules. A secure OPC UA server (accounts + encryption). See docs/integration.md |
|
What's new in 2.3 – 2.12
| Feature | Release | Detail |
|---|
| Node.js security releases | 2.12.2 | The Docker image now pins Node.js 24.22.1 (it followed the floating node:24 tag before), and engines asks for Node.js 22.23.4 or later — the October 2026 Node.js security releases. undici goes to 8.12.3. The site bundle for Linux now carries VEXPLOR Edge 1.3.1 (it still named 1.1.0). No feature or storage change; rebuild a running image to take it |
| Empty list elements in XML read as empty lists | 2.12.1 | A list closed with no items (<qualifiers />, <description />, a collection's <value /> …) was read as the empty string. In KOSMO's 179 public reference models the check then stopped part way in 45 files and a saved copy could not be opened again for 27; both are now 0. The empty list is kept as it was and reported by PKG-EMPTY-ARRAY (auto-fix). scripts/lint.mjs now checks each file by its own metamodel version and looks into subfolders. New guide: using KOSMO reference models with a file-by-file table |
| Range limits in tag hints | 2.12.0 | A Range element with the same semanticId as a tag's value now gives limits too — its min as lsl, its max as usl — so a receiver such as Logic Studio gets lower specification limits from the file. Limits from the KOSMO property pairs come first, ranges after; a tag may carry several of the same bound, each with its source, for a person to choose. No schema change. The KOSMO model files in use today hold no Range, so their hints are unchanged; for a lower limit, add a Range with the value's semanticId and an idShort different from the value's (integration) |
| LS ELECTRIC XGT, read directly | 2.11.0 | XGK · XGI · XGR · XGB PLCs with an FEnet module are read over the XGT dedicated protocol (TCP 2004) without a gateway — read only. Addresses are written as XG5000 shows them (D100, D100.3, P0001A, %MW100, %IX0.0.3). AID 1.1 has no XGT binding, so this is a VEXPLOR extension binding marked by our binding IRI. Built from LS ELECTRIC's published FEnet manual and tested against a test server built from it — not yet checked on a real PLC; please send a . The server reads it with , the remote collector from VEXPLOR Edge 1.3.0 — |
Full notes: Releases.
Works with VEXPLOR Logic Studio
AASX files authored and checked here import straight into
VEXPLOR Logic Studio (WACE's factory platform — MES · PLM · ERP · QMS) — nothing to install in the factory,
no conversion step.
- Author the equipment AASX here and pass the 52-rule check.
- Drop the file on the equipment screen of Logic Studio Cloud.
- Check types, equipment, plant and line in the preview, then import — each machine enters the equipment register
linked to its type.
- Type files and Instance files are imported separately.
- Dropping the same file again ends with "Nothing changes" — no duplicate equipment.
- Step-by-step guide: docs/logic-studio.md. The in-app help (? Help) has the same steps.
- Live values are in preparation: the same remote collector is being prepared to send machine values to
Logic Studio Cloud as well. The two endpoints any receiver implements are in docs/edge-contract.md.
Not offered yet.
Quick start
Docker
git clone <this repository> && cd <folder>
cp .env.example .env # only POSTGRES_PASSWORD is required
docker compose up -d --build
Open http://localhost:8080. Details: install.md. A factory server with no internet: the site
install bundle, site-install.md.
The database image timescale/timescaledb is TimescaleDB Community Edition by Tiger Data, under the Timescale
License (https://www.tigerdata.com/legal/licenses) — not under this repository's licence; Docker pulls it from Docker Hub
on your machine. -oss images are TimescaleDB Apache-2 Edition (no compression or continuous aggregates).
From source — Node.js 24 LTS (22 or later works; at least 24.22.1 / 22.23.4)
npm install
npx tsc -b
npm run build --workspace apps/web
node apps/api/dist/server.js # http://localhost:8080
With no configuration the server binds to 127.0.0.1 only. To share it, configure accounts or
an API key first — see Usage §12.
Create the first administrator right after starting (Settings → Create the first administrator). Once any
account exists, both the UI and the API require a login (or an API key). Until then the server is open.
For development, run the UI separately:
npm run dev:api # API on 8080
npm run dev:web # UI on 5173 (in another terminal)
Layout
A TypeScript monorepo — one language for the front end and the server.
| Package | Role |
|---|
packages/aas-core | AAS metamodel types (V3.0 · V3.1 · V3.2) and version conversion · server-side text in English and Korean |
packages/aasx | AASX (OPC package) reader/writer with lossless round-trip |
packages/linter | Rules, auto-fixes, reports |
packages/store | Storage — in-memory, folder and PostgreSQL pass the same conformance suite |
packages/collector | Resolves AID and collects field values |
packages/opcua | OPC UA client and server (node-opcua) |
packages/fieldbus | Modbus TCP · MQTT · S7 · MC · XGT protocol collection adapters, read only (no external dependencies — node:net) · test device and broker |
apps/api | REST API server |
apps/web | React front end |
Using the libraries in another product
@aas/core, @aas/aasx, @aas/linter, @aas/bundle (the integration bundle built from AASX files without a
server — buildBundle) and @aas/collector, @aas/fieldbus, @aas/opcua (equipment readers — the remote collector
uses them) are attached to each GitHub release as npm tarballs (node scripts/pack-libraries.mjs,
checksums in SHA256SUMS). Install them by release URL:
"@aas/aasx": "https://github.com/waceinc/vexplor-aas/releases/download/v2.12.2/aas-aasx-2.12.2.tgz"
Never by version number — the @aas scope on the public npm registry is not ours, so "@aas/core": "^2.0.0" would
install whatever someone else publishes there. The tarballs point at each other by release URL, so one pinned URL is
enough.
Remote collector
When the server is outside the factory (cloud, head office), put VEXPLOR Edge on one factory PC — its own open
source, waceinc/vexplor-edge. It reads only the PLCs of an approved list and
sends signed batches out over HTTPS — outbound only, no remote stop. Connecting is one button and one pasted line under
Settings → Remote collectors → "+ Connect a collector" (Linux x64 · arm64; Windows x64 from VEXPLOR Edge 1.2.0). This server's
side: docs/edge-install.md; the contract copy: docs/edge-contract.md.
Standards
| Standard | Status |
|---|
| AAS metamodel V3.0 · V3.1 · V3.2 (IDTA-01001-3-0 · 3-1 · 3-2) | Reads all three. A file is downloaded as the version it came in as (an XML namespace says it; a JSON file carries no version, so the lowest version that holds its content). New models — new equipment, samples, the passport templates — are V3.1, the version KOSMO asks for. Another version can be picked when downloading: writing a lower one lists the fields it leaves out and refuses values it cannot express |
| Checking a written file | V3.0: the official validator aas-test-engines 1.0.3, which checks V3.0 only. V3.1 · V3.2: the official JSON schemas of admin-shell-io/aas-specs-metamodel (v3.1.2 · v3.2.0) in this repository's tests — aas-test-engines does not check those versions yet |
| AASX package (IDTA-01005) | Reads JSON and XML, writes JSON. For V3.1 · V3.2, attachment names with spaces or non-ASCII letters are percent-encoded (RFC 3986, UTF-8) together with their parts and relationships — those versions accept only URIs |
| Part 2 REST API (IDTA-01002-3-0) | AasxFileServer 6/6 · ConceptDescription 7/7 · AAS Repository 47/54 · Submodel Repository 38/45 · partial Registry and Discovery. Served under /api/v3.0 and, for V3.1 · V3.2 clients, /api/v3 (same routes). Endpoints new in V3.2 ($recent-changes, $history, $signed, asynchronous package operations) are not implemented and answer 404 |
| AID 1.1 (IDTA-02017) | OPC UA · Modbus TCP · MQTT address resolution (Modbus · MQTT use the W3C WoT binding notation). S7, MC and XGT are not AID bindings — a VEXPLOR extension in the standard base / href places, marked by our binding IRI (docs/usage.md §8) |
node scripts/part2-coverage.mjs compares the implementation against the specification's OpenAPI
files and prints the exact coverage.
Protocols
| Protocol | Equipment | Server (COLLECT=on) | Remote collector (VEXPLOR Edge) | Basis |
|---|
| OPC UA | Any OPC UA server | Yes | Yes | AID 1.1 |
| Modbus TCP | Modbus TCP devices | Yes | Yes | AID 1.1 (W3C WoT binding notation) |
| MQTT | MQTT brokers | Yes | Yes | AID 1.1 (W3C WoT binding notation) |
| S7 (ISO-on-TCP, S7comm) | Siemens S7-300 · 400 · 1200 · 1500 | Yes (2.10.0) | Edge 1.2.0 or later | VEXPLOR extension binding — tested against test servers only. Real PLC: waiting for user reports (field report) |
| MC protocol (3E binary) | MELSEC Q · L · iQ-R · iQ-F | Yes (2.10.0) | Edge 1.2.0 or later | VEXPLOR extension binding — tested against test servers only. Real PLC: waiting for user reports (field report) |
| XGT dedicated protocol (FEnet, TCP 2004) | LS ELECTRIC XGK · XGI · XGR · XGB | Yes (2.11.0) | Edge 1.3.0 or later | VEXPLOR extension binding, built from LS ELECTRIC's published FEnet manual — tested against test servers only. Real PLC: waiting for user reports (field report) |
Checked on a real PLC? Not yet for S7, MC and XGT. They are built from the published specifications and tested against
test servers that follow them — no real PLC was available. If you read one of these PLCs, please tell us what you saw with
the PLC field report: maker, series, CPU, firmware, address, the value you expected and the value read (or the
reason it could not be read). Each report goes into this table.
XGT: check the word order first. LS ELECTRIC's manuals do not say in which order the words of a value over several
words (DINT, REAL, LREAL …) are placed; this tool reads the low word first. If INT and BOOL read right but REAL or
DINT read wrong, that is the reason — a field report with both values settles it. The other open points from the
manuals are listed in usage §8 (XGT, "What the published manuals do not settle").
All of them are read only. HTTP and BACnet interfaces in an AID are recognised but not collected.
Using KOSMO reference models
KOSMO publishes AAS reference models per equipment type from the Korean manufacturing-data standardization programme
at github.com/kosmo-AAS — the files are in
kosmo-AAS/kasmo-AAS_Pubilc (the repository's own spelling). KOSMO
submissions ask for metamodel V3.1; the published files themselves declare V3.0.
- Download the reference model for your machine from that repository.
- Open it in AAS Studio — the XML body is converted to JSON on import.
- Check against the KOSMO submission rules: filter the findings by L3, apply auto-fix where offered (usage §4-8).
- Fill in the machine's values — most findings are empty Property values the model leaves for you (usage §4-3).
- Download as V3.1 (usage §4-10). One-letter idShorts (
Q, T, X …) are valid in V3.0 but not in
V3.1, so the download window refuses them — rename them first.
Measured 2026-10-20 against commit 6f6ac69 of that repository with AAS Studio 2.12.1:
| Item | Result |
|---|
| Files | 179 AASX — all open, all declare metamodel V3.0 |
| Check | ran to the end on all 179 (2.12.0 stopped on 45 files with empty list elements such as <qualifiers /> — fixed in 2.12.1) |
| Findings (179 files) | L1 errors 12,182 · L2 errors 48,117 · L3 errors 152,445. Of all errors, 64,357 are empty Property values (KOSMO-SME-4) and 146,106 are auto-fixable. Most frequent: KOSMO-SME-4 · AASd-121~128 · KOSMO-CD-2 · KOSMO-CD-4 · KOSMO-SME-5 |
| Round trip | 179 the same — every saved copy opens again |
| Export as V3.1 | 156 written with 0 dropped values; 23 refused (one-letter idShorts). 33 of the 156 pass the official V3.1 schema — the rest fail on values in the source: empty lists (minItems 1), empty text, units or idShorts |
Every file, rule by rule: docs/kosmo-compat.md.
License: that repository shows no license, so this repository does not include its files — it only links to them.
Check the provider's terms before redistributing them.
Things to know
- Authentication is opt-in. With neither accounts nor an API key the server only listens on
the local machine.
- The OPC UA server (port 4840) requires an account and encryption (Sign / SignAndEncrypt). It is off by default;
OPCUA_ALLOW_INSECURE=on restores the old unauthenticated port for isolated test networks only.
- Once people sign in, put HTTPS in front — see
Caddyfile.example.
- In English, what stays as it was written is what comes from your own files (names, values) and the
folder names of the submission bundle, which the submission format fixes.
- Server startup logs are Korean by default; set
AAS_LANG=en for English.
- Report security problems through the channel in SECURITY.md, not a public issue.
Contributing
bash scripts/ci.sh # build → typecheck → tests → spec coverage → generated docs → licenses → i18n
CI runs on Node.js 22 and 24. See CONTRIBUTING.md.
License
Apache License 2.0. You may modify it and ship it in commercial products.
Copyright 2026 WACE. The names and logos "VEXPLOR" and "WACE" are trademarks of WACE and are not licensed for use — see
NOTICE. Dependencies are listed in THIRD-PARTY-NOTICES.md.
docs/spec/part2/ contains the specification published by the IDTA under CC BY 4.0.