Complete field reference for JSON-based configuration import and export.
Reference → Solution → DevOps → Git Integration | JSON Specification
| Info |
|---|
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:
Key Principle: Import and Export use the same JSON format. The only difference is that import ignores metadata sections.
| Table of Contents | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Every JSON file follows this fourthree-section structure:
json
{
"ObjectIdentification": {
"Module": "Uns",
"TableType": "UnsTags",
"TableGroupSolutionName": "ObjectsMyProject"
},
"VersionInfoExportMetadata": {
"TableVersionIDExportDate": 15"2026-01-16T10:30:00Z",
"SolutionVersionIDExportUser": 245"john.doe",
"SolutionNameExportProduct": "MyProjectFrameworX",
},
"ExportMetadataExportProductVersion": {
"ExportDate": "2026-01-16T10:30:00Z",
"ExportUser": "john.doe",
"ExportProduct": "Designer",
"ExportProductVersion": "10"10.1.1.1011",
"ExportFormat": "1.01"
},
"Data": [
{ /* object 1 */ },
{ /* object 2 */ }
]
}| Section | Required for Import | Description | |||
|---|---|---|---|---|---|
ObjectIdentification | No | Module TableType and table identificationsource solution | |||
VersionInfoExportMetadata | No | Version tracking metadata | ExportMetadata | No | Export audit Export audit information |
Data | Yes | Array of configuration objects |
Note: The Data section is always an array, even for single-object exports.
For import operations, only the Data array is required:
json
{
"Data": [
{ "Name": "Tag1", "Type": 153"Double" }
]
}These fields are auto-generated and ignored during import:
| Field | Reason |
|---|---|
ID | Auto-assigned unique identifier |
VersionID | Auto-incremented on change |
DateCreated | Set to import timestamp |
DateModified | Set to import timestamp |
XRefInfo | Cross-reference data rebuilt |
LockState | Lock status reset |
ContentsRunLockOwner | Runtime counter Lock owner reset |
BuildRequired | Build flag reset |
BuildNumber | Build identifier reset |
| Scenario | Behavior |
|---|---|
| Name doesn't exist | Object created |
| Name already exists | Skipped (no error) |
| Pre-defined object | Skipped (cannot modify) |
| Missing required field | Error |
| Invalid reference | Error |
| Invalid enum value | Error |
These system objects cannot be created or modified via import:
| Module | Pre-defined Objects |
|---|---|
| Devices | All Protocols, AccessTypes (Read, Write, ReadWrite) |
| Alarms | Groups (Critical, Warning, AuditTrail) |
| Historian | StorageLocation (Default), HistorianTable (Table1) |
| Datasets | DBs (TagHistorian, AlarmHistorian, RuntimeUsers, Retentive) |
| Security | Users (Administrator, Guest), Permissions (24 built-in) |
When importing related objects, order matters:
| Type Name | Type ID | .NET Type | Range/Notes |
|---|---|---|---|
| Digital | 151 | Int32 | 0 or 1 |
| Integer | 152 | Int32 | ±2,147,483,647 |
| Double | 153 | Double | ±1.79×10³?? |
| Text | 154 | String | Unicode, 2GB max |
| DateTime | 155 | DateTimeOffset | Year 0001-9999 |
| Long | 156 | Int64 | ±9.2×10¹? |
| Decimal | 157 | Decimal | 28-29 significant digits |
| TimeSpan | 158 | TimeSpan | Days to milliseconds |
| Timer | 162 | Int32 | Multiple timer modes |
| Counter | 163 | Int32 | Up/down counting |
| DataTable | 164 | DataTable | In-memory table |
| Image | 165 | Byte[] | Binary content |
| Guid | 166 | Guid | 128-bit unique ID |
| Json | 167 | String | JSON with parsing |
| Reference | 170 | Dynamic | Tag reference |
UserType references use IDs starting at 201:
To reference a UserType in JSON: "Type": 201
These fields are excluded from export files to reduce size:
Compiled/Binary Data:
| Field | Reason |
|---|---|
ContentsRun | Compiled .NET assembly |
WebContentsRun | Web/WASM compiled version |
BuildMessages | Serialized build errors |
WebBuildMessages | Web build errors |
Build Results:
| Field | Reason |
|---|---|
BuildStatus | Build result |
BuildErrors | Build error count |
BuildMessage | Build error text |
BuildRequired | Build flag |
BuildNumber | Build identifier |
Calculated Fields:
| Field | Reason |
|---|---|
Lines | Calculated from Contents |
Length | Calculated from Contents |
CanBePortable | Calculated property |
Strings | Extracted strings |
DriverVersion | System-assigned |
Conditional:
| Field | Rule |
|---|---|
Type | Kept only for UnsTags and UserType tables |
| Scenario | Behavior |
|---|---|
| Name doesn't exist | Object created |
| Name already exists | Skipped (no error) |
| Pre-defined object | Skipped (cannot modify) |
| Missing required field | Error |
| Invalid reference | Error |
| Invalid enum value | Error |
These system objects cannot be created or modified via import:
| Module | Pre-defined Objects |
|---|---|
| Devices | All Protocols, AccessTypes (Read, Write, ReadWrite) |
| Alarms | Groups (Critical, Warning, AuditTrail) |
| Historian | StorageLocation (Default), HistorianTable (Table1) |
| Datasets | DBs (TagHistorian, AlarmHistorian, RuntimeUsers, Retentive) |
| Security | Users (Administrator, Guest), Permissions (24 built-in) |
When importing related objects, order matters:
| Type Name | String Value | Type ID | .NET Type | Range/Notes |
|---|---|---|---|---|
| Digital | "Digital" | 151 | Int32 | 0 or 1 |
| Integer | "Integer" | 152 | Int32 | ±2,147,483,647 |
| Double | "Double" | 153 | Double | ±1.79×10³?? |
| Text | "Text" | 154 | String | Unicode, 2GB max |
| DateTime | "DateTime" | 155 | DateTimeOffset | Year 0001-9999 |
| Long | "Long" | 156 | Int64 | ±9.2×10¹? |
| Decimal | "Decimal" | 157 | Decimal | 28-29 significant digits |
| TimeSpan | "TimeSpan" | 158 | TimeSpan | Days to milliseconds |
| Timer | "Timer" | 162 | Int32 | Multiple timer modes |
| Counter | "Counter" | 163 | Int32 | Up/down counting |
| DataTable | "DataTable" | 164 | DataTable | In-memory table |
| Image | "Image" | 165 | Byte[] | Binary content |
| Guid | "Guid" | 166 | Guid | 128-bit unique ID |
| Json | "Json" | 167 | String | JSON with parsing |
| Reference | "Reference" | 170 | Dynamic | Tag reference |
To reference a UserType in JSON, use the UserType name:
json
"Type": "LabelingMachine"| String Value | Description |
|---|---|
"Server" | Server-side execution |
"Client" | Client-side execution |
| String Value | Description |
|---|---|
"Private" | Not visible externally |
"Protected" | Visible to solution |
"Public" | Fully visible |
| String Value | Description |
|---|---|
"None" | Not retentive |
"ValueOnly" | Value persisted |
"Properties" | Value and properties persisted |
"PropertiesOnly" | Only properties persisted |
| String Value | Description |
|---|---|
"VB.NET" | Visual Basic .NET |
"CSharp" | C# |
"Python" | Python |
Valid TableType valuesValid TableType values for the ObjectIdentification section:
| TableType | Object | Description |
|---|---|---|
UnsTags | Tag | Process variables |
UnsUserTypes | UserType | Data structure templates |
UnsEnumerations | Enumeration | Value-to-text mappings |
UnsTagProviders | TagProvider | External data connections |
UnsAssetTree | AssetFolder | Folder organization |
| TableType | Object | Description |
|---|---|---|
DevicesProtocols | Protocol | Built-in drivers (read-only) |
DevicesChannels | Channel | Protocol instances |
DevicesNodes | Node | Device addresses |
DevicesPoints | Point | Tag-to-address mappings |
DevicesAccessTypes | AccessType | Read/write behavior |
| TableType | Object | Description |
|---|---|---|
AlarmsGroups | AlarmGroup | Alarm behavior settings |
AlarmsItems | AlarmItem | Alarm definitions |
AlarmsAreas | AlarmArea | Hierarchy organization |
| TableType | Object | Description |
|---|---|---|
HistorianStorageLocations | StorageLocation | Database connections |
HistorianTables | HistorianTable | Storage rules |
HistorianTags | HistorianTag | Tag assignments |
| TableType | Object | Description |
|---|---|---|
DatasetsDBs | DatasetDB | Database connections |
DatasetsQueries | DatasetQuery | SQL statements |
DatasetsTables | DatasetTable | Direct table mappings |
DatasetsFiles | DatasetFile | File I/O definitions |
| TableType | Object | Description |
|---|---|---|
ScriptsTasks | ScriptTask | Triggered code blocks |
ScriptsClasses | ScriptClass | Reusable libraries |
ScriptsExpressions | ScriptExpression | One-line calculations |
ScriptsReferences | ScriptReference | External DLL references |
| TableType | Object | Description |
|---|---|---|
ReportsForms | ReportForm | Document templates |
ReportsWebData | WebData | JSON/XML data objects |
| TableType | Object | Description |
|---|---|---|
SecurityUsers | SecurityUser | User accounts |
SecurityPermissions | SecurityPermission | Permission flags |
SecurityPolicies | SecurityPolicy | Login/session rules |
SecuritySecrets | SecuritySecret | Protected credentials |
| TableType | Object | Description |
|---|---|---|
Displays | Display | UI screens |
Layouts | Layout | Frame organization |
Images | Image | Imported graphics |
Symbols | Symbol | Reusable components |
When JSON fields reference other objects, use these formats:
| Reference To | Format | Example |
|---|---|---|
| Tag (root) | Tag.{name} | "Tag.Temperature" |
| Tag (nested) | Tag.{path}.{name} | "Tag.Line1.Tank1.Level" |
| Channel | Channel.{name} | "Channel.ModbusPLC1" |
| Node | Node.{name} | "Node.PLC1" |
| AccessType | AccessType.{name} | "AccessType.Read" |
| AlarmGroup | Alarm.Group.{name} | "Alarm.Group.Critical" |
| AlarmArea | Alarm.Area.{name} | "Alarm.Area.Plant1" |
| HistorianTable | Historian.Table.{name} | "Historian.Table.Table1" |
| StorageLocation | Historian.StorageLocation.{name} | "Historian.StorageLocation.Default" |
| DatasetDB | DB.{name} | "DB.TagHistorian" |
json
{
"Data": [
{
"Name": "Temperature",
"Type": 153"Double",
"Path": "\\Line1\\Tank1",
"Description": "Tank temperature sensor",
"Array": 0,
"StartValue": "25.0",
"Min": "0",
"Max": "100",
"Units": "°C",
"Format": "N1",
"Domain": 0"Server",
"Visibility": "Public",
"Retentive": "None",
"DateCreated": 2"2026-01-16T10:30:00Z",
"DateModified": "Retentive": 0"2026-01-16T10:30:00Z"
}
]
}| Field | Required | Type | Description | ||||
|---|---|---|---|---|---|---|---|
Name | Yes | string | Unique tag name | ||||
Type | Yes | intstring | Type ID name (see Tag Types Reference) | ||||
Path | No | string | Folder path (backslash-separated) | ||||
Description | No | string | Documentation (max 1024 chars) | ||||
Array | No | int | Array size (0=scalar, N=array[0..N]) | ||||
StartValue | No | string | Initial value at startup | ||||
Min | No | string | Minimum allowed value | ||||
Max | No | string | Maximum allowed value | ||||
Units | No | string | Engineering units label | ||||
Format | No | string | Display format (N0, N2, etc.) | ||||
Domain | No | intstring | 0=Server, 1=Client"Server" or "Client" | ||||
Visibility | No | intstring | 0="Private", 1=Protected, 2=Public"Protected", or "Public" | ||||
Retentive | No | string | "None", "ValueOnly", "Properties", "PropertiesOnly" | ||||
DateCreated | No | string | Creation timestamp (ISO 8601) | ||||
DateModified | No | string | Last modification timestamp (ISO 8601) | Retentive | No | int | 0=None, 1=ValueOnly, 2=Properties, 3=PropertiesOnly |
json
{
"Data": [
{
"Name": "Line1",
"Path": "",
"LinkedProvider": "",
"Alias": "",
"Visibility": "Public",
"DateCreated": "Alias": ""2026-01-16T10:30:00Z",
"VisibilityDateModified": 2"2026-01-16T10:30:00Z"
},
{
"Name": "Tank1",
"Path": "\\Line1",
"LinkedProvider": "",
"Alias": "Primary Tank",
"Visibility": "Public",
"DateCreated": "2026-01-16T10:30:00Z",
"Visibility": 2"DateModified": "2026-01-16T10:30:00Z"
}
]
}| Field | Required | Type | Description |
|---|---|---|---|
Name | Yes | string | Folder name |
Path | No | string | Parent path (empty=root) |
LinkedProvider | No | string | TagProvider link |
Alias | No | string | Display name override |
Visibility | No | intstring | 0="Private", 1="Protected", 2=or "Public" |
json
{
"Data": [
{
"Name": "ModbusPLC1",
"Protocol": "Modbus",
"PrimaryStation": "192.168.1.10:502",
"BackupStation": "",
"Timeout": 3000,
"Retries": 3,
"Enabled": true,
"Description": "Main Modbus PLC",
"DateCreated": "Enabled": true"2026-01-16T10:30:00Z",
"DescriptionDateModified": "Main Modbus PLC2026-01-16T10:30:00Z"
}
]
}| Field | Required | Type | Description |
|---|---|---|---|
Name | Yes | string | Channel name |
Protocol | Yes | string | Protocol name (Modbus, OPCUA, etc.) |
PrimaryStation | Yes | string | Connection string |
BackupStation | No | string | Redundant connection |
Timeout | No | int | Timeout in milliseconds |
Retries | No | int | Retry count |
Enabled | No | bool | Active state |
Description | No | string | Documentation |
PrimaryStation Formats by Protocol:
| Protocol | Format | Example |
|---|---|---|
| Modbus TCP | IP:Port | 192.168.1.10:502 |
| Modbus RTU | COM:Baud:Parity:Data:Stop | COM1:9600:N:8:1 |
| OPC UA | opc.tcp://host:port | opc.tcp://server:4840 |
| MQTT | mqtt://host:port | mqtt://broker:1883 |
| Siemens S7 | IP:Rack:Slot | 192.168.1.20:0:1 |
| AB ControlLogix | IP:Slot | 192.168.1.30:0 |
json
{
"Data": [
{
"Name": "PLC1",
"Channel": "Channel.ModbusPLC1",
"PrimaryStation": "1",
"BackupStation": "",
"Enabled": true,
"Description": "Main PLC unit 1 1",
"DateCreated": "2026-01-16T10:30:00Z",
"DateModified": "2026-01-16T10:30:00Z"
}
]
}| Field | Required | Type | Description |
|---|---|---|---|
Name | Yes | string | Node name |
Channel | Yes | string | Parent channel reference |
PrimaryStation | Yes | string | Device address |
BackupStation | No | string | Redundant address |
Enabled | No | bool | Active state |
Description | No | string | Documentation |
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"
}
]
}| Field | Required | Type | Description |
|---|---|---|---|
Node | Yes | string | Parent node reference |
Tag | Yes | string | Tag reference |
Address | Yes | string | Device address |
AccessType | No | string | Default: Read |
Enabled | No | bool | Active state |
Address Formats by Protocol:
| Protocol | Format | Examples |
|---|---|---|
| Modbus | Type+Offset | HR100, IR50, C10, DI200 |
| OPC UA | NodeId | ns=2;s=Tag1, ns=2;i=1001 |
| Siemens S7 | DB.Offset.Type | DB1.DBD0, DB1.DBX0.0 |
| AB ControlLogix | TagName | Program:MainProgram.Tag1 |
json
{
"Data": [
{
"Tag": "Tag.Line1.Tank1.Temperature",
"Group": "Alarm.Group.Critical",
"Area": "Alarm.GroupArea.CriticalPlant1",
"AreaCondition": "Alarm.Area.Plant1GreaterThan",
"ConditionSetpoint": ">9090",
"Message": "Tank temperature high: {0}°C",
"Priority": 800,
"Enabled": true,
"DateCreated": "2026-01-16T10:30:00Z",
"DateModified": "2026-01-16T10:30:00Z"
}
]
}| Field | Required | Type | Description |
|---|---|---|---|
Tag | Yes | string | Monitored tag reference |
Group | Yes | string | Alarm group reference |
Condition | Yes | string | Trigger condition |
Setpoint | Yes | stringTrigger | conditionThreshold value |
Message | Yes | string | Alarm message ({0}=tag value) |
Area | No | string | Alarm area reference |
Priority | No | int | Priority override |
Enabled | No | bool | Active state |
Condition SyntaxValues:
| ConditionString Value | Triggers When | Description |
|---|---|---|
"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 | |
>90 | Value greater than 90 | |
<10 | Value less than 10 | |
>=100 | Value greater or equal to 100 | |
==1 | Value equals 1 | |
!=0 | Value not equal to 0 | |
HI:90 | High limit at 90 | |
LO:10 | Low limit at 10 | |
HIHI:95 | High-high limit at 95 | |
LOLO:5 | Low-low limit at 5 |
json
{
"Data": [
{
"Tag": "Tag.Line1.Tank1.Temperature",
"HistorianTable": "Historian.Table.Table1",
"Deadband": "0.5",
"Enabled": true,
"DeadbandDateCreated": "0.52026-01-16T10:30:00Z",
"EnabledDateModified": true"2026-01-16T10:30:00Z"
}
]
}| Field | Required | Type | Description |
|---|---|---|---|
Tag | Yes | string | Tag to historize |
HistorianTable | Yes | string | Storage table reference |
Deadband | No | string | Logging deadband |
Enabled | No | bool | Active state |
json
{
"Data": [
{
"Name": "ServerStartup",
"Code": "CSharp",
{ "Domain": "Server",
"NameTrigger": "ServerStartup",
"CodeInitialState": 20,
"WhileRunningDescription": false"",
"ExecutionNamespaceDeclarations": 1"",
"Contents": "// C# startup code\n@Info.Trace(\"Server started\"); started\");",
"DateCreated": "2026-01-16T10:30:00Z",
"DateModified": "2026-01-16T10:30:00Z"
}
]
}| Field | Required | Type | Description | ||
|---|---|---|---|---|---|
Name | Yes | string | Task name | ||
Code | Yes | intstring | Language: 0="VB.NET, 2=C#, 4=Python", "CSharp", "Python" | ||
Domain | No | string | "Server" or "Client" | ||
TriggerWhileRunning | No | bool | Run in loop | string | Trigger expression |
InitialStateExecution | No | int | Initial state | ||
Description | No | string | Documentation | ||
NamespaceDeclarations | No | string | Additional namespaces0=Server, 1=Client | ||
Contents | Yes | string | Script code |
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"
}
]
}| Field | Required | Type | Description |
|---|---|---|---|
Name | Yes | string | Expression name |
Expression | Yes | string | Calculation formula |
TargetTag | Yes | string | Result destination tag |
TriggerTag | No | string | Tag that triggers recalculation |
Enabled | No | bool | Active state |
Import order matters - create objects in dependency order:
Step 1: Create Tags
json
{ "Data": [{ "Name": "TankLevel", "Type": 153"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" }] }json
{
"Data": [
{ "Name": "Motor1_Speed", "Type": 153": "Double", "Path": "\\Motors", "Units": "RPM" },
{ "Name": "Motor1_Current", "Type": 153"Double", "Path": "\\Motors", "Units": "A" },
{ "Name": "Motor1_Running", "Type": 151"Digital", "Path": "\\Motors" },
{ "Name": "Motor2_Speed", "Type": 153"Double", "Path": "\\Motors", "Units": "RPM" },
{ "Name": "Motor2_Current", "Type": 153"Double", "Path": "\\Motors", "Units": "A" },
{ "Name": "Motor2_Running", "Type": 151"Digital", "Path": "\\Motors" }
]
}| Object | Required Fields |
|---|---|
| Tag | Name, Type |
| Channel | Name, Protocol, PrimaryStation |
| Node | Name, Channel, PrimaryStation |
| Point | Node, Tag, Address |
| AlarmItem | Tag, Group, Condition, Setpoint, Message |
| HistorianTag | Tag, HistorianTable |
| DatasetQuery | Name, DatasetDB, Contents |
| ScriptTask | Name, Code, Contents |