An annotated example plus an interactive template you can use to create, store, and govern canonical manufacturing data-catalog entries (tags, signals, and KPIs). Includes naming guidance, ownership rules, lineage, lifecycle states, expected ranges, and review cadence.
{
"Title": "Manufacturing Data Catalog - Entry Template",
"IntroductionHtml": "
Why this matters
Unclear tag names, inconsistent units, and undocumented mappings create duplicate signals, broken dashboards, and lost trust. Use this interactive template to capture a single authoritative entry for each sensor, PLC signal, historian point, or calculated KPI so analytics, MES, and dashboards are reliable and discoverable.
Annotated example
Example entry: siteA_line3_mixerrpm
- description: Mixer 3 rotational speed (RPM) after reducer
- owner: Controls.Engineer@siteA.example (role & contact)
- source system: PLC (Device: AB-1756-1)
- downstream consumers: OEE dashboard, Quality analytics, MES recipe controller
- units: RPM (integer)
- sample rate: 1s
- expected range: 0 - 3600
- retention: 3 years
- lineage: PLC -> PI Historian -> ETL -> Analytics DB -> Dashboards
- lifecycle: Active (last reviewed 2026-06-01)
Fill in the fields below to create a living catalog entry. The platform will store the submission as structured JSON that can later be exported or integrated into your enterprise catalog.
",
"SubmitLabel": "Save catalog entry",
"SuccessMessage": "Catalog entry saved. Consider scheduling the first review and notifying the owner.",
"DataType": "manufacturing-tag-catalog-entry",
"SchemaVersion": "1.0",
"Fields": [
{ "Key": "tag_name", "FieldType": "text", "Label": "Canonical tag name", "HelpText": "Follow naming convention: site_area_line_equipment_point (lowercase, underscores). Example: siteA_line3_mixerrpm.", "Required": true },
{ "Key": "description", "FieldType": "textarea", "Label": "Short description", "HelpText": "What this signal measures and any important context (what part of the process, where it is measured, and why it exists).", "Required": true },
{ "Key": "owner", "FieldType": "text", "Label": "Owner (role & contact)", "HelpText": "Person or role responsible for the signal (include email or team name). Example: Controls.Engineer@siteA.example", "Required": true },
{ "Key": "owner_group", "FieldType": "text", "Label": "Owning group / department", "HelpText": "Department or team that owns the signal (e.g., Controls, Maintenance, Process Engineering)." },
{ "Key": "source_system", "FieldType": "select", "Label": "Source system", "HelpText": "Where the value originates.", "Required": true, "Options": [ { "Value": "plc", "Label": "PLC" }, { "Value": "historian", "Label": "Historian (PI/other)" }, { "Value": "mes", "Label": "MES" }, { "Value": "opcua", "Label": "OPC-UA/Edge" }, { "Value": "calculated", "Label": "Calculated KPI/Derived" }, { "Value": "other", "Label": "Other" } ] },
{ "Key": "device_identifier", "FieldType": "text", "Label": "Device / PLC point identifier", "HelpText": "Vendor/address/point ID if applicable (e.g., AB-1756-1:N7.0)." },
{ "Key": "physical_location", "FieldType": "text", "Label": "Physical location", "HelpText": "Where the device or sensor is located (e.g., Building A - Line 3 - Mixer Bay)." },
{ "Key": "equipment", "FieldType": "text", "Label": "Associated equipment", "HelpText": "Equipment or asset this signal is related to (use asset registry ID if available)." },
{ "Key": "units", "FieldType": "text", "Label": "Units", "HelpText": "Units of measurement (use canonical units where possible). Example: RPM, °C, kg, m/s.", "Required": true },
{ "Key": "data_type", "FieldType": "select", "Label": "Data type", "HelpText": "Primary data type for storage/validation.", "Options": [ { "Value": "integer", "Label": "Integer" }, { "Value": "float", "Label": "Float" }, { "Value": "boolean", "Label": "Boolean" }, { "Value": "string", "Label": "String" }, { "Value": "timestamp", "Label": "Timestamp" } ], "Required": true },
{ "Key": "sample_rate_seconds", "FieldType": "number", "Label": "Sample rate (seconds)", "HelpText": "Typical sampling interval in seconds. Use 0 for event-driven signals.", "Required": false },
{ "Key": "timestamp_type", "FieldType": "select", "Label": "Timestamp convention", "HelpText": "How timestamps are recorded and interpreted.", "Options": [ { "Value": "utc", "Label": "UTC" }, { "Value": "local", "Label": "Local timezone" }, { "Value": "event", "Label": "Event-based / asynchronous" } ] },
{ "Key": "expected_range_min", "FieldType": "number", "Label": "Expected minimum", "HelpText": "Operational minimum expected value (for automated sanity checks)." },
{ "Key": "expected_range_max", "FieldType": "number", "Label": "Expected maximum", "HelpText": "Operational maximum expected value (for automated sanity checks)." },
{ "Key": "retention_days", "FieldType": "number", "Label": "Retention (days)", "HelpText": "How long raw data should be retained. Align with site data retention policy.", "Required": false },
{ "Key": "pi_foia_classification", "FieldType": "select", "Label": "PI / FOIA / classification", "HelpText": "Classification for access controls and disclosures.", "Options": [ { "Value": "public", "Label": "Public" }, { "Value": "internal", "Label": "Internal" }, { "Value": "confidential", "Label": "Confidential" }, { "Value": "restricted", "Label": "Restricted" } ], "Required": true },
{ "Key": "downstream_consumers", "FieldType": "textarea", "Label": "Downstream consumers", "HelpText": "Dashboards, reports, analytics jobs, MES functions, third-party systems that use this signal. Include owners if known.", "Required": false },
{ "Key": "lineage_snapshot", "FieldType": "textarea", "Label": "Lineage snapshot", "HelpText": "Short description or diagram text showing data flow (example: PLC -> PI -> ETL -> Data Lake -> Analytics DB -> OEE Dashboard)." },
{ "Key": "mapping_template", "FieldType": "textarea", "Label": "Mapping / transformation notes", "HelpText": "If this is a calculated field, include formula, logic, and parameter mappings. If mapped from multiple sources, show mapping table example.", "Required": false },
{ "Key": "lifecycle_state", "FieldType": "select", "Label": "Lifecycle state", "HelpText": "State of the tag to manage discovery and deprecation.", "Options": [ { "Value": "proposed", "Label": "Proposed" }, { "Value": "active", "Label": "Active" }, { "Value": "deprecated", "Label": "Deprecated" }, { "Value": "archived", "Label": "Archived" }, { "Value": "orphaned", "Label": "Orphaned" } ], "Required": true },
{ "Key": "creation_date", "FieldType": "text", "Label": "Creation date", "HelpText": "YYYY-MM-DD (auto-populated if possible)." },
{ "Key": "last_review_date", "FieldType": "text", "Label": "Last review date", "HelpText": "YYYY-MM-DD. Record the latest governance review." },
{ "Key": "review_cadence", "FieldType": "select", "Label": "Review cadence", "HelpText": "How often the owner must review this entry.", "Options": [ { "Value": "monthly", "Label": "Monthly" }, { "Value": "quarterly", "Label": "Quarterly" }, { "Value": "annually", "Label": "Annually" }, { "Value": "ad-hoc", "Label": "Ad-hoc / as-needed" } ] },
{ "Key": "consumer_signoff_required", "FieldType": "yesno", "Label": "Consumer sign-off required?", "HelpText": "Require downstream consumer confirmation before retiring or changing this tag." },
{ "Key": "related_tags", "FieldType": "text", "Label": "Related canonical tags", "HelpText": "Comma-separated canonical tag names that are related, upstream, or aggregated from this signal." },
{ "Key": "tags", "FieldType": "text", "Label": "Free-form tags", "HelpText": "Keywords to help discovery (e.g., oee, throughput, temperature)." },
{ "Key": "notes", "FieldType": "textarea", "Label": "Notes & governance decisions", "HelpText": "Any decisions, exceptions, or migration plans relevant to the tag." }
]
}