Complete field reference for JSON-based configuration import and export.
ReferenceSolutionDevOps → Git Integration | JSON Specification

JSON Import/Export Specification (Reference): Detailed field-level documentation for programmatic configuration of all object types via JSON files. Essential for MCP tools, CI/CD pipelines, and external integrations. Format version 1.1.

Overview

This specification documents the JSON format used for:

  • Git export/import operations
  • MCP (Model Context Protocol) tool integration
  • CI/CD pipeline automation
  • External system integration
  • Bulk configuration management

Key Principle: Import and Export use the same JSON format. The only difference is that import ignores metadata sections.



JSON Structure

Standard Format (v1.1)

Every JSON file follows this three-section structure:

json

{
  "ObjectIdentification": {
    "TableType": "UnsTags",
    "SolutionName": "MyProject"
  },
  "ExportMetadata": {
    "ExportDate": "2026-01-16T10:30:00Z",
    "ExportUser": "john.doe",
    "ExportProduct": "FrameworX",
    "ExportProductVersion": "10.1.1.1011",
    "ExportFormat": "1.1"
  },
  "Data": [
    { /* object 1 */ },
    { /* object 2 */ }
  ]
}

Section Details


SectionRequired for ImportDescription
ObjectIdentificationNoTableType and source solution
ExportMetadataNoExport audit information
DataYesArray of configuration objects

Note: The Data section is always an array, even for single-object exports.

Minimal Import Format

For import operations, only the Data array is required:

json

{
  "Data": [
    { "Name": "Tag1", "Type": "Double" }
  ]
}

Import Behavior

Fields Ignored on Import

These fields are auto-generated and ignored during import:

FieldReason
IDAuto-assigned unique identifier
XRefInfoCross-reference data rebuilt
LockStateLock status reset
LockOwnerLock owner reset


Fields Filtered from Export

These fields are excluded from export files to reduce size:

Compiled/Binary Data:

FieldReason
ContentsRunCompiled .NET assembly
WebContentsRunWeb/WASM compiled version
BuildMessagesSerialized build errors
WebBuildMessagesWeb build errors


Build Results:

FieldReason
BuildStatusBuild result
BuildErrorsBuild error count
BuildMessageBuild error text
BuildRequiredBuild flag
BuildNumberBuild identifier


Calculated Fields:

FieldReason
LinesCalculated from Contents
LengthCalculated from Contents
CanBePortableCalculated property
StringsExtracted strings
DriverVersionSystem-assigned


Conditional:

FieldRule
TypeKept only for UnsTags and UserType tables


Import Rules


ScenarioBehavior
Name doesn't existObject created
Name already existsSkipped (no error)
Pre-defined objectSkipped (cannot modify)
Missing required fieldError
Invalid referenceError
Invalid enum valueError

Pre-defined Objects (Cannot Import)

These system objects cannot be created or modified via import:

ModulePre-defined Objects
DevicesAll Protocols, AccessTypes (Read, Write, ReadWrite)
AlarmsGroups (Critical, Warning, AuditTrail)
HistorianStorageLocation (Default), HistorianTable (Table1)
DatasetsDBs (TagHistorian, AlarmHistorian, RuntimeUsers, Retentive)
SecurityUsers (Administrator, Guest), Permissions (24 built-in)


Import Order Dependencies

When importing related objects, order matters:

  1. Independent objects first: Tags, Channels, AlarmGroups, StorageLocations, DatasetDBs
  2. Dependent objects after: Nodes→Channels, Points→Nodes+Tags, AlarmItems→Tags+Groups, HistorianTags→Tags+Tables

Import Modes

FrameworX 10.1.5 introduces three explicit modes that govern how an imported JSON file interacts with rows that already exist in the live solution. Earlier releases supported only a single behavior — an upsert that never deleted — which is preserved as the default Merge mode. The two additional modes give DevOps pipelines and source-of-truth workflows finer control over the live solution's drift relative to the JSON artifact.

The mode is selected per table, not for the import as a whole. A single import operation can run UnsTags in Mirror Sync while leaving DeviceChannels in Merge — useful when only part of the configuration is authoritatively tracked in Git.

Merge (default)

Merge is the historical and default behavior. Rows present in the JSON are inserted when their Name does not yet exist in the live solution, and updated when it does. Rows present in the live solution but absent from the JSON are left in place. Merge never deletes.

Merge is the right choice when the JSON file represents a partial contribution — for example, a new set of tags being added to an existing project, or a third-party module shipping a bundle of Channels and Nodes meant to coexist with the customer's own configuration.

Append

Append inserts rows whose Name does not yet exist and skips rows whose Name already exists. There is no update and no delete. Append guarantees the import will never modify an existing live row.

Append is the right choice when the JSON file is a one-shot seed — for example, importing a vendor-supplied tag library into a project that may have already customized some of those tags — and the operator wants the customer's edits preserved against any newer copy of the seed file.

Mirror Sync (10.1.5)

Mirror Sync makes the imported JSON the authoritative state of the selected table. Rows present in the JSON are inserted or updated exactly as in Merge mode. In addition, rows present in the live solution but absent from the JSON are deleted. After a successful Mirror Sync import, the live table mirrors the JSON exactly, row-for-row.

Mirror Sync targets three classes of workflow:

  • Authoritative Git-tracked configuration: the JSON file in the repository is the single source of truth, and a row removed from the JSON must propagate to every environment on the next deployment.
  • CI/CD deployment pipelines: a stale row left behind in the live solution from a prior build can corrupt the new deployment — for example, an obsolete Device Point that still polls a decommissioned address. Mirror Sync guarantees deployment-time hygiene.
  • Test environment resets: a known-good JSON snapshot can reset a test solution to a clean baseline state without manual cleanup of leftover rows from prior test runs.

Opt-in mechanism. Mirror Sync is never the default. It is selected explicitly per table on two surfaces:

  • The Designer import dialog presents a checkbox column labeled Mirror sync next to each table in the import. The operator ticks the box only for tables that should run in Mirror Sync; unticked tables run in Merge.
  • The JSON import API and MCP-side tooling expose a parameter that accepts the list of TableType values to run in Mirror Sync. Tables not listed run in Merge.

MCP parameter (10.1.5). The ConsoleMCP import_solution_json tool and its DesignerMCP equivalent expose a mirror_sync parameter on the import call. The parameter accepts either a boolean — true to enable Mirror Sync for every table in the payload, false (default) to keep every table in Merge — or a per-table opt-in list of TableType values for finer control. Example invocations: {"mirror_sync": true} applies Mirror Sync to all imported tables; {"mirror_sync": ["UnsTags", "UnsUserTypes"]} runs Mirror Sync only for the two listed tables while every other table in the same import runs in Merge. Tool naming and signatures may evolve across MCP server versions — consult the MCP tool reference for the exact verb name and parameter shape in your installed FrameworX build.

Built-in row protection. Mirror Sync deletion never touches pre-defined system objects or rows marked as built-in. The LockState and LockOwner mechanism that already protects these rows from manual edit and from import overwrite also protects them from Mirror Sync deletion. A Mirror Sync import that omits, for example, the Critical alarm group or the Default storage location will not delete them — they are silently retained. This matches the behavior of the pre-defined objects table in the Import Behavior section above.

Recommended workflow. Mirror Sync is destructive. The recommended pre-flight before a production Mirror Sync import is:

  1. Export the live solution's current state of the target tables to JSON.
  2. Diff the exported JSON against the JSON about to be imported. Every row that appears in the export but not in the import is a row that Mirror Sync will delete.
  3. Review the delete set with whoever owns the configuration. Deletions of operator-facing rows (Tags wired into Displays, Alarms wired into reports, Historian assignments) propagate downstream and may break dependent objects.
  4. Import with Mirror Sync enabled for the reviewed tables.

Mode comparison. The following table summarizes the three modes against the three operations they may perform on each row in the live solution:

ModeInsert newUpdate existingDelete missing
Merge (default)YesYesNo
AppendYesNoNo
Mirror SyncYesYesYes (built-ins protected)



Tag Types Reference

Built-in Types


Type NameString ValueType ID.NET TypeRange/Notes
Digital"Digital"151Int320 or 1
Integer"Integer"152Int32±2,147,483,647
Double"Double"153Double±1.79×10³??
Text"Text"154StringUnicode, 2GB max
DateTime"DateTime"155DateTimeOffsetYear 0001-9999
Long"Long"156Int64±9.2×10¹?
Decimal"Decimal"157Decimal28-29 significant digits
TimeSpan"TimeSpan"158TimeSpanDays to milliseconds
Timer"Timer"162Int32Multiple timer modes
Counter"Counter"163Int32Up/down counting
DataTable"DataTable"164DataTableIn-memory table
Image"Image"165Byte[]Binary content
Guid"Guid"166Guid128-bit unique ID
Json"Json"167StringJSON with parsing
Reference"Reference"170DynamicTag reference

Numeric precision in JSON export. Integer, Long, and Digital tag values export at full precision. Decimal tag values — and Decimal UserType members — are rendered through a 64-bit floating-point (IEEE-754 double) representation on export, so a Decimal initial value (StartValue) that requires more than ~15–17 significant digits is rounded to the nearest representable double in the exported JSON. The value stored in the solution database (.dbsln) and used at runtime is unaffected — only the JSON export rendering is limited. If you need full-precision Decimal values to survive an export/import cycle, treat the solution database as the source of truth rather than the exported JSON.

UserType References

To reference a UserType in JSON, use the UserType name:

json

"Type": "LabelingMachine"

Enumeration Values Reference

Domain


String ValueDescription
"Server"Server-side execution
"Client"Client-side execution

Visibility


String ValueDescription
"Private"Not visible externally
"Protected"Visible to solution
"Public"Fully visible

Retentive


String ValueDescription
"None"Not retentive
"ValueOnly"Value persisted
"Properties"Value and properties persisted
"PropertiesOnly"Only properties persisted

Script Code Language


String ValueDescription
"VB.NET"Visual Basic .NET
"CSharp"C#
"Python"Python

TableType Reference

Valid TableType values:

UNS Module


TableTypeObjectDescription
UnsTagsTagProcess variables
UnsUserTypesUserTypeData structure templates
UnsEnumerationsEnumerationValue-to-text mappings
UnsTagProvidersTagProviderExternal data connections
UnsAssetTreeAssetFolderFolder organization

Devices Module


TableTypeObjectDescription
DevicesProtocolsProtocolBuilt-in drivers (read-only)
DevicesChannelsChannelProtocol instances
DevicesNodesNodeDevice addresses
DevicesPointsPointTag-to-address mappings
DevicesAccessTypesAccessTypeRead/write behavior

Alarms Module


TableTypeObjectDescription
AlarmsGroupsAlarmGroupAlarm behavior settings
AlarmsItemsAlarmItemAlarm definitions
AlarmsAreasAlarmAreaHierarchy organization

Historian Module


TableTypeObjectDescription
HistorianStorageLocationsStorageLocationDatabase connections
HistorianTablesHistorianTableStorage rules
HistorianTagsHistorianTagTag assignments

Datasets Module


TableTypeObjectDescription
DatasetsDBsDatasetDBDatabase connections
DatasetsQueriesDatasetQuerySQL statements
DatasetsTablesDatasetTableDirect table mappings
DatasetsFilesDatasetFileFile I/O definitions

Scripts Module


TableTypeObjectDescription
ScriptsTasksScriptTaskTriggered code blocks
ScriptsClassesScriptClassReusable libraries
ScriptsExpressionsScriptExpressionOne-line calculations
ScriptsReferencesScriptReferenceExternal DLL references

Reports Module


TableTypeObjectDescription
ReportsFormsReportFormDocument templates
ReportsWebDataWebDataJSON/XML data objects

Security Module


TableTypeObjectDescription
SecurityUsersSecurityUserUser accounts
SecurityPermissionsSecurityPermissionPermission flags
SecurityPoliciesSecurityPolicyLogin/session rules
SecuritySecretsSecuritySecretProtected credentials

Displays Module


TableTypeObjectDescription
DisplaysDisplayUI screens
LayoutsLayoutFrame organization
ImagesImageImported graphics
SymbolsSymbolReusable components

Object Reference Formats

When JSON fields reference other objects, use these formats:

Reference ToFormatExample
Tag (root)Tag.{name}"Tag.Temperature"
Tag (nested)Tag.{path}.{name}"Tag.Line1.Tank1.Level"
ChannelChannel.{name}"Channel.ModbusPLC1"
NodeNode.{name}"Node.PLC1"
AccessTypeAccessType.{name}"AccessType.Read"
AlarmGroupAlarm.Group.{name}"Alarm.Group.Critical"
AlarmAreaAlarm.Area.{name}"Alarm.Area.Plant1"
HistorianTableHistorian.Table.{name}"Historian.Table.Table1"
StorageLocationHistorian.StorageLocation.{name}"Historian.StorageLocation.Default"
DatasetDBDB.{name}"DB.TagHistorian"



UNS Objects

Tag (UnsTags)

json

{
  "Data": [
    {
      "Name": "Temperature",
      "Type": "Double",
      "Path": "\\Line1\\Tank1",
      "Description": "Tank temperature sensor",
      "Array": 0,
      "StartValue": "25.0",
      "Min": "0",
      "Max": "100",
      "Units": "°C",
      "Format": "N1",
      "Domain": "Server",
      "Visibility": "Public",
      "Retentive": "None",
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
NameYesstringUnique tag name
TypeYesstringType name (see Tag Types Reference)
PathNostringFolder path (backslash-separated)
DescriptionNostringDocumentation (max 1024 chars)
ArrayNointArray size (0=scalar, N=array[0..N])
StartValueNostringInitial value at startup
MinNostringMinimum allowed value
MaxNostringMaximum allowed value
UnitsNostringEngineering units label
FormatNostringDisplay format (N0, N2, etc.)
DomainNostring"Server" or "Client"
VisibilityNostring"Private", "Protected", or "Public"
RetentiveNostring"None", "ValueOnly", "Properties", "PropertiesOnly"
DateCreatedNostringCreation timestamp (ISO 8601)
DateModifiedNostringLast modification timestamp (ISO 8601)

AssetFolder (UnsAssetTree)

json

{
  "Data": [
    {
      "Name": "Line1",
      "Path": "",
      "LinkedProvider": "",
      "Alias": "",
      "Visibility": "Public",
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    },
    {
      "Name": "Tank1",
      "Path": "\\Line1",
      "LinkedProvider": "",
      "Alias": "Primary Tank",
      "Visibility": "Public",
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
NameYesstringFolder name
PathNostringParent path (empty=root)
LinkedProviderNostringTagProvider link
AliasNostringDisplay name override
VisibilityNostring"Private", "Protected", or "Public"

Devices Objects

Channel (DevicesChannels)

json

{
  "Data": [
    {
      "Name": "ModbusPLC1",
      "Protocol": "Modbus",
      "PrimaryStation": "192.168.1.10:502",
      "BackupStation": "",
      "Timeout": 3000,
      "Retries": 3,
      "Enabled": true,
      "Description": "Main Modbus PLC",
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
NameYesstringChannel name
ProtocolYesstringProtocol name (Modbus, OPCUA, etc.)
PrimaryStationYesstringConnection string
BackupStationNostringRedundant connection
TimeoutNointTimeout in milliseconds
RetriesNointRetry count
EnabledNoboolActive state
DescriptionNostringDocumentation

PrimaryStation Formats by Protocol:

ProtocolFormatExample
Modbus TCPIP:Port192.168.1.10:502
Modbus RTUCOM:Baud:Parity:Data:StopCOM1:9600:N:8:1
OPC UAopc.tcp://host:portopc.tcp://server:4840
MQTTmqtt://host:portmqtt://broker:1883
Siemens S7IP:Rack:Slot192.168.1.20:0:1
AB ControlLogixIP:Slot192.168.1.30:0


Node (DevicesNodes)

json

{
  "Data": [
    {
      "Name": "PLC1",
      "Channel": "Channel.ModbusPLC1",
      "PrimaryStation": "1",
      "BackupStation": "",
      "Enabled": true,
      "Description": "Main PLC unit 1",
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
NameYesstringNode name
ChannelYesstringParent channel reference
PrimaryStationYesstringDevice address
BackupStationNostringRedundant address
EnabledNoboolActive state
DescriptionNostringDocumentation

Point (DevicesPoints)

json

{
  "Data": [
    {
      "Node": "Node.PLC1",
      "Tag": "Tag.Line1.Tank1.Temperature",
      "Address": "HR100",
      "AccessType": "AccessType.Read",
      "Enabled": true,
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
NodeYesstringParent node reference
TagYesstringTag reference
AddressYesstringDevice address
AccessTypeNostringDefault: Read
EnabledNoboolActive state

Address Formats by Protocol:

ProtocolFormatExamples
ModbusType+OffsetHR100, IR50, C10, DI200
OPC UANodeIdns=2;s=Tag1, ns=2;i=1001
Siemens S7DB.Offset.TypeDB1.DBD0, DB1.DBX0.0
AB ControlLogixTagNameProgram:MainProgram.Tag1



Alarms Objects

AlarmItem (AlarmsItems)

json

{
  "Data": [
    {
      "Tag": "Tag.Line1.Tank1.Temperature",
      "Group": "Alarm.Group.Critical",
      "Area": "Alarm.Area.Plant1",
      "Condition": "GreaterThan",
      "Setpoint": "90",
      "Message": "Tank temperature high: {0}°C",
      "Priority": 800,
      "Enabled": true,
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
TagYesstringMonitored tag reference
GroupYesstringAlarm group reference
ConditionYesstringTrigger condition
SetpointYesstringThreshold value
MessageYesstringAlarm message ({0}=tag value)
AreaNostringAlarm area reference
PriorityNointPriority override
EnabledNoboolActive state

Condition Values:

String ValueDescription
"GreaterThan"Value > Setpoint
"LessThan"Value < Setpoint
"GreaterOrEqual"Value >= Setpoint
"LessOrEqual"Value <= Setpoint
"Equal"Value == Setpoint
"NotEqual"Value != Setpoint
"HiHi"High-high limit
"Hi"High limit
"Lo"Low limit
"LoLo"Low-low limit



Historian Objects

HistorianTag (HistorianTags)

json

{
  "Data": [
    {
      "Tag": "Tag.Line1.Tank1.Temperature",
      "HistorianTable": "Historian.Table.Table1",
      "Deadband": "0.5",
      "Enabled": true,
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
TagYesstringTag to historize
HistorianTableYesstringStorage table reference
DeadbandNostringLogging deadband
EnabledNoboolActive state

Scripts Objects

ScriptTask (ScriptsTasks)

json

{
  "Data": [
    {
      "Name": "ServerStartup",
      "Code": "CSharp",
      "Domain": "Server",
      "Trigger": "",
      "InitialState": 0,
      "Description": "",
      "NamespaceDeclarations": "",
      "Contents": "// C# startup code\n@Info.Trace(\"Server started\");",
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
NameYesstringTask name
CodeYesstringLanguage: "VB.NET", "CSharp", "Python"
DomainNostring"Server" or "Client"
TriggerNostringTrigger expression
InitialStateNointInitial state
DescriptionNostringDocumentation
NamespaceDeclarationsNostringAdditional namespaces
ContentsYesstringScript code

ScriptExpression (ScriptsExpressions)

json

{
  "Data": [
    {
      "Name": "TotalFlow",
      "Expression": "Tag.Flow1 + Tag.Flow2 + Tag.Flow3",
      "TargetTag": "Tag.TotalFlow",
      "TriggerTag": "Tag.Flow1",
      "Enabled": true,
      "DateCreated": "2026-01-16T10:30:00Z",
      "DateModified": "2026-01-16T10:30:00Z"
    }
  ]
}


FieldRequiredTypeDescription
NameYesstringExpression name
ExpressionYesstringCalculation formula
TargetTagYesstringResult destination tag
TriggerTagNostringTag that triggers recalculation
EnabledNoboolActive state

Common Patterns

Creating a Complete Device Communication Setup

Import order matters - create objects in dependency order:

Step 1: Create Tags

json

{ "Data": [{ "Name": "TankLevel", "Type": "Double", "Path": "\\Process" }] }

Step 2: Create Channel

json

{ "Data": [{ "Name": "ModbusCh1", "Protocol": "Modbus", "PrimaryStation": "192.168.1.10:502" }] }

Step 3: Create Node

json

{ "Data": [{ "Name": "PLC1", "Channel": "Channel.ModbusCh1", "PrimaryStation": "1" }] }

Step 4: Create Point

json

{ "Data": [{ "Name": "Point1", "Node": "Node.PLC1", "Tag": "Tag.Process.TankLevel", "Address": "HR100" }] }

Bulk Tag Creation

json

{
  "Data": [
    { "Name": "Motor1_Speed", "Type": "Double", "Path": "\\Motors", "Units": "RPM" },
    { "Name": "Motor1_Current", "Type": "Double", "Path": "\\Motors", "Units": "A" },
    { "Name": "Motor1_Running", "Type": "Digital", "Path": "\\Motors" },
    { "Name": "Motor2_Speed", "Type": "Double", "Path": "\\Motors", "Units": "RPM" },
    { "Name": "Motor2_Current", "Type": "Double", "Path": "\\Motors", "Units": "A" },
    { "Name": "Motor2_Running", "Type": "Digital", "Path": "\\Motors" }
  ]
}

Validation Rules

Name Validation

  • Must be unique within object type
  • Alphanumeric plus underscore
  • Cannot contain dashes (reserved for expressions)
  • Cannot start with number
  • Max length: 256 characters
  • Case-sensitive

Required Fields by Object

ObjectRequired Fields
TagName, Type
ChannelName, Protocol, PrimaryStation
NodeName, Channel, PrimaryStation
PointNode, Tag, Address
AlarmItemTag, Group, Condition, Setpoint, Message
HistorianTagTag, HistorianTable
DatasetQueryName, DatasetDB, Contents
ScriptTaskName, Code, Contents

Summary of v1.1 Format Changes


Aspectv1.0v1.1
Sections4 (ObjectIdentification, VersionInfo, ExportMetadata, Data)3 (ObjectIdentification, ExportMetadata, Data)
ObjectIdentificationModule, TableType, TableGroupTableType, SolutionName
VersionInfoTableVersionID, SolutionVersionID, SolutionNameRemoved
Folder structureHierarchical by moduleFlat, single folder
File namingPath-based{TableType}.json or {TableType}-{Name}.json
Enum fieldsNumeric IDsString values
Data formatArray or single objectAlways array
Type fieldAll objectsOnly UnsTags and UserType tables
Filtered fieldsNoneID, XRefInfo, LockState, ContentsRun, BuildMessages, etc.
DateCreated/DateModifiedIn Data objectsKept in Data objects