JSON Structure
Standard Format (v1.1)
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 Details
| Section | Required for Import | Description |
|---|
ObjectIdentification | No |
Module table identificationVersionInfoExportMetadata | No | Export audit Version tracking metadata | | Export audit information |
Data | Yes | Array 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": 153"Double" }
]
}
Import Behavior
Fields Ignored on Import
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 |
DateModifiedSet to import timestamp | XRefInfo | Cross-reference data rebuilt |
LockState | Lock status reset |
ContentsRunRuntime counter BuildRequired | Build flag reset |
BuildNumber | Build identifier reset |
Import Rules
| 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 |
Pre-defined Objects (Cannot Import)
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) |
Import Order Dependencies
When importing related objects, order matters:
- Independent objects first: Tags, Channels, AlarmGroups, StorageLocations, DatasetDBs
- Dependent objects after: Nodes→Channels, Points→Nodes+Tags, AlarmItems→Tags+Groups, HistorianTags→Tags+Tables
Tag Types Reference
Built-in Type IDs
| 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 IDs
UserType references use IDs starting at 201:
- First UserType created: ID 201
- Second UserType: ID 202
- And so on...
To reference a UserType in JSON: "Type": 201
TableType Reference
Valid TableType values for the ObjectIdentification section:
UNS Module
| 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 |
Devices Module
| 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 |
Alarms Module
| TableType | Object | Description |
|---|
AlarmsGroups | AlarmGroup | Alarm behavior settings |
AlarmsItems | AlarmItem | Alarm definitions |
AlarmsAreas | AlarmArea | Hierarchy organization |
Historian Module
| TableType | Object | Description |
|---|
HistorianStorageLocations | StorageLocation | Database connections |
HistorianTables | HistorianTable | Storage rules |
HistorianTags | HistorianTag | Tag assignments |
Datasets Module
| TableType | Object | Description |
|---|
DatasetsDBs | DatasetDB | Database connections |
DatasetsQueries | DatasetQuery | SQL statements |
DatasetsTables | DatasetTable | Direct table mappings |
DatasetsFiles | DatasetFile | File I/O definitions |
Scripts Module
| TableType | Object | Description |
|---|
ScriptsTasks | ScriptTask | Triggered code blocks |
ScriptsClasses | ScriptClass | Reusable libraries |
ScriptsExpressions | ScriptExpression | One-line calculations |
ScriptsReferences | ScriptReference | External DLL references |
Reports Module
| TableType | Object | Description |
|---|
ReportsForms | ReportForm | Document templates |
ReportsWebData | WebData | JSON/XML data objects |
Security Module
| TableType | Object | Description |
|---|
SecurityUsers | SecurityUser | User accounts |
SecurityPermissions | SecurityPermission | Permission flags |
SecurityPolicies | SecurityPolicy | Login/session rules |
SecuritySecrets | SecuritySecret | Protected credentials |
Displays Module
| 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" |
UNS Objects
Tag (UnsTags)
json
Fields Filtered from Export
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 |
Import Rules
| 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 |
Pre-defined Objects (Cannot Import)
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) |
Import Order Dependencies
When importing related objects, order matters:
- Independent objects first: Tags, Channels, AlarmGroups, StorageLocations, DatasetDBs
- Dependent objects after: Nodes→Channels, Points→Nodes+Tags, AlarmItems→Tags+Groups, HistorianTags→Tags+Tables
Tag Types Reference
Built-in Types
| 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 |
UserType References
To reference a UserType in JSON, use the UserType name:
json
"Type": "LabelingMachine"
Enumeration Values Reference
Domain
| String Value | Description |
|---|
"Server" | Server-side execution |
"Client" | Client-side execution |
Visibility
| String Value | Description |
|---|
"Private" | Not visible externally |
"Protected" | Visible to solution |
"Public" | Fully visible |
Retentive
| String Value | Description |
|---|
"None" | Not retentive |
"ValueOnly" | Value persisted |
"Properties" | Value and properties persisted |
"PropertiesOnly" | Only properties persisted |
Script Code Language
| String Value | Description |
|---|
"VB.NET" | Visual Basic .NET |
"CSharp" | C# |
"Python" | Python |
TableType Reference
Valid TableType values:
UNS Module
| 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 |
Devices Module
| 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 |
Alarms Module
| TableType | Object | Description |
|---|
AlarmsGroups | AlarmGroup | Alarm behavior settings |
AlarmsItems | AlarmItem | Alarm definitions |
AlarmsAreas | AlarmArea | Hierarchy organization |
Historian Module
| TableType | Object | Description |
|---|
HistorianStorageLocations | StorageLocation | Database connections |
HistorianTables | HistorianTable | Storage rules |
HistorianTags | HistorianTag | Tag assignments |
Datasets Module
| TableType | Object | Description |
|---|
DatasetsDBs | DatasetDB | Database connections |
DatasetsQueries | DatasetQuery | SQL statements |
DatasetsTables | DatasetTable | Direct table mappings |
DatasetsFiles | DatasetFile | File I/O definitions |
Scripts Module
| TableType | Object | Description |
|---|
ScriptsTasks | ScriptTask | Triggered code blocks |
ScriptsClasses | ScriptClass | Reusable libraries |
ScriptsExpressions | ScriptExpression | One-line calculations |
ScriptsReferences | ScriptReference | External DLL references |
Reports Module
| TableType | Object | Description |
|---|
ReportsForms | ReportForm | Document templates |
ReportsWebData | WebData | JSON/XML data objects |
Security Module
| TableType | Object | Description |
|---|
SecurityUsers | SecurityUser | User accounts |
SecurityPermissions | SecurityPermission | Permission flags |
SecurityPolicies | SecurityPolicy | Login/session rules |
SecuritySecrets | SecuritySecret | Protected credentials |
Displays Module
| 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" |
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"
}
]
}
| Field | Required | Type | Description |
|---|
Name | Yes | string | Unique tag name |
Type | Yes | string | Type 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 | string | "Server" or "Client" |
Visibility | No | string | "Private", "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) |
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"
}
]
}
| 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 | string | "Private", "Protected", or "Public" |
Devices Objects
Channel (DevicesChannels)
json
{
"Data": [
{
"Name": "ModbusPLC1{
"Data": [
{
"Name": "Temperature",
"Type": 153,
"Path": "\\Line1\\Tank1",
"Description": "Tank temperature sensor",
"ArrayProtocol": 0"Modbus",
"StartValuePrimaryStation": "25.0192.168.1.10:502",
"MinBackupStation": "0",
"MaxTimeout": "100"3000,
"UnitsRetries": "°C"3,
"FormatEnabled": "N1"true,
"DomainDescription": 0 "Main Modbus PLC",
"Visibility": 2 "DateCreated": "2026-01-16T10:30:00Z",
"RetentiveDateModified": 0"2026-01-16T10:30:00Z"
}
]
}
| Field | Required | Type | Description |
|---|
Name | Yes | string |
Unique tag TypeintType ID (see Tag Types Reference) | Path| Protocol name (Modbus, OPCUA, etc.) |
PrimaryStation | Yes | string | Connection string |
BackupStation | No | string |
Folder path (backslash-separated) | | Redundant connection |
Timeout | No | int | Timeout in milliseconds |
Retries |
Descriptionstring | Documentation (max 1024 chars) | Arrayint | Array size (0=scalar, N=array[0..N]) | | bool | Active state |
Description |
StartValueInitial 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 | int | 0=Server, 1=Client |
Visibility | No | int | 0=Private, 1=Protected, 2=Public |
Retentive | No | int | 0=None, 1=ValueOnly, 2=Properties, 3=PropertiesOnly |
AssetFolder (UnsAssetTreePrimaryStation Formats by Protocol:
Node (DevicesNodes)
json
{
"Data": [
{
"Name": "Line1PLC1",
"PathChannel": "Channel.ModbusPLC1",
"LinkedProviderPrimaryStation": "1",
"AliasBackupStation": "",
"Visibility": 2
},
{
"Name": "Tank1",
"Path": "\\Line1"Enabled": true,
"LinkedProviderDescription": "Main PLC unit 1",
"AliasDateCreated": "Primary Tank2026-01-16T10:30:00Z",
"VisibilityDateModified": 2"2026-01-16T10:30:00Z"
}
]
}
| Field | Required | Type | Description |
|---|
Name | Yes | string |
Folder PathNo path (empty=root)| channel reference |
PrimaryStation | Yes | string | Device address |
BackupStation |
LinkedProviderTagProvider linkAliasstring | Display name override | Visibility| bool | Active state |
Description | No |
int | 0=Private, 1=Protected, 2=Public | Devices Objects
Channel (DevicesChannelsPoint (DevicesPoints)
json
{
"Data": [
{
"NameNode": "ModbusPLC1Node.PLC1",
"ProtocolTag": "ModbusTag.Line1.Tank1.Temperature",
"PrimaryStationAddress": "192.168.1.10:502HR100",
"BackupStationAccessType": "",
"Timeout": 3000AccessType.Read",
"RetriesEnabled": 3true,
"EnabledDateCreated": true"2026-01-16T10:30:00Z",
"DescriptionDateModified": "Main Modbus PLC2026-01-16T10:30:00Z"
}
]
}
| Field | Required | Type | Description |
|---|
NameChannel 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| Parent node reference |
Tag | Yes | string | Tag reference |
Address | Yes | string | Device address |
AccessType | No | string | Default: Read |
Enabled | No | bool | Active state |
Description | No | string | Documentation |
PrimaryStation Address Formats by Protocol:
Node (DevicesNodes)
json
| 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 |
Alarms Objects
AlarmItem (AlarmsItems)
json
{
"Data": [
{
"Tag": "Tag.Line1.Tank1.Temperature",
"Group": "Alarm.Group.Critical",
"Area": "Alarm.Area.Plant1",{
"Data": [
{
"NameCondition": "PLC1GreaterThan",
"ChannelSetpoint": "Channel.ModbusPLC190",
"PrimaryStationMessage": "1Tank temperature high: {0}°C",
"BackupStationPriority": 800,
"" "Enabled": true,
"EnabledDateCreated": true"2026-01-16T10:30:00Z",
"DescriptionDateModified": "Main PLC unit 12026-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 |
Point (DevicesPoints
]
}
| Field | Required | Type | Description |
|---|
Tag | Yes | string | Monitored tag reference |
Group | Yes | string | Alarm group reference |
Condition | Yes | string | Trigger condition |
Setpoint | Yes | string | Threshold 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 Values:
| String Value | 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 |
Historian Objects
HistorianTag (HistorianTags)
json
{
"Data": [
{
"NodeTag": "Node.PLC1Tag.Line1.Tank1.Temperature",
"TagHistorianTable": "TagHistorian.Line1Table.Tank1.TemperatureTable1",
"AddressDeadband": "0.5",
"HR100Enabled": true,
"AccessType": "AccessType.Read"DateCreated": "2026-01-16T10:30:00Z",
"EnabledDateModified": true"2026-01-16T10:30:00Z"
}
]
}
| 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 |
Alarms Objects
AlarmItem (AlarmsItems | Type | Description |
|---|
Tag | Yes | string | Tag to historize |
HistorianTable | Yes | string | Storage table reference |
Deadband | No | string | Logging deadband |
Enabled | No | bool | Active state |
Scripts Objects
ScriptTask (ScriptsTasks)
json
{
"Data": [
{
"Name": "ServerStartup",
"Code": "CSharp",
{"Domain": "Server",
"TagTrigger": "Tag.Line1.Tank1.Temperature",
"GroupInitialState": "Alarm.Group.Critical"0,
"AreaDescription": "Alarm.Area.Plant1",
"ConditionNamespaceDeclarations": ">90",
"MessageContents": "Tank temperature high: {0}°C// C# startup code\n@Info.Trace(\"Server started\");",
"DateCreated": "Priority": 8002026-01-16T10:30:00Z",
"EnabledDateModified": true"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 |
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 Syntax:
| Condition | Triggers When |
|---|
>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 |
Historian Objects
HistorianTag (HistorianTags)
json
| Field | Required | Type | Description |
|---|
Name | Yes | string | Task name |
Code | Yes | string | Language: "VB.NET", "CSharp", "Python" |
Domain | No | string | "Server" or "Client" |
Trigger | No | string | Trigger expression |
InitialState | No | int | Initial state |
Description | No | string | Documentation |
NamespaceDeclarations | No | string | Additional namespaces |
Contents | Yes | string | Script code |
ScriptExpression (ScriptsExpressions)
json
{
"Data": [
{
"Name": "TotalFlow",
"Expression": "Tag.Flow1 + Tag.Flow2 + Tag.Flow3",
"TargetTag": "Tag.TotalFlow",{
"Data": [
{
"TagTriggerTag": "Tag.Line1.Tank1.TemperatureFlow1",
"HistorianTableEnabled": "Historian.Table.Table1"true,
"DeadbandDateCreated": "0.52026-01-16T10:30:00Z",
"EnabledDateModified": true"2026-01-16T10:30:00Z"
}
]
}
| Field | Required | Type | Description |
|---|
|
|---|
Name | Yes | string | Expression name |
Expression |
TagTag to historize | HistorianTable| Calculation formula |
TargetTag | Yes | string |
Storage table reference | Deadband| Result destination tag |
TriggerTag | No | string |
Logging deadband| Tag that triggers recalculation |
Enabled | No | bool | Active state |
Scripts Objects
ScriptTask (ScriptsTasks)
json
{
"Data": [
{
"Name": "ServerStartup",
"Code": 2,
"WhileRunning": false,
"Execution": 1,
"Contents": "// C# startup code\n@Info.Trace(\"Server started\");"
}
]
}
| Field | Required | Type | Description |
|---|
Name | Yes | string | Task name |
Code | Yes | int | Language: 0=VB.NET, 2=C#, 4=Python |
WhileRunning | No | bool | Run in loop |
Execution | No | int | 0=Server, 1=Client |
Contents | Yes | string | Script code |
ScriptExpression (ScriptsExpressions)
json
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": "TotalFlowPLC1",
"ExpressionChannel": "Tag.Flow1 + Tag.Flow2 + Tag.Flow3Channel.ModbusCh1",
"TargetTagPrimaryStation": "Tag.TotalFlow",
1" }] }
Step 4: Create Point
json
{ "Data": [{ "Name "TriggerTag": "Tag.Flow1Point1",
"Enabled": true
}
]
}
| 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 |
Common Patterns
Creating a Complete Device Communication Setup
Import order matters - create objects in dependency order:
Step 1: Create Tags
json
Node": "Node.PLC1", "Tag": "Tag.Process.TankLevel", "Address": "HR100" }] }
Bulk Tag Creation
json
{
{ "Data": [
{ "Name": "TankLevelMotor1_Speed", "Type": 153"Double", "Path": "\\ProcessMotors", "Units": "RPM" }] }
Step 2: Create Channel
json
,
{ "DataName": [{"Motor1_Current", "NameType": "ModbusCh1Double", "ProtocolPath": "Modbus\\Motors", "PrimaryStationUnits": "192.168.1.10:502A" }] }
Step 3: Create Node
json
{ "Data": [,
{ "Name": "PLC1Motor1_Running", "ChannelType": "Channel.ModbusCh1Digital", "PrimaryStationPath": "1\\Motors" }] }
Step 4: Create Point
json
{ "Data": [,
{ "NodeName": "Node.PLC1Motor2_Speed", "TagType": "Tag.Process.TankLevelDouble", "AddressPath": "HR100\\Motors" }] }
Bulk Tag Creation
json
{
"Data": [, "Units": "RPM" },
{ "Name": "Motor1Motor2_SpeedCurrent", "Type": 153"Double", "Path": "\\Motors", "Units": "RPMA" },
{ "Name": "Motor1Motor2_CurrentRunning", "Type": 153"Digital", "Path": "\\Motors", "Units": "A" },
{ "Name": "Motor1_Running", "Type": 151, "Path": "\\Motors" },
{ "Name": "Motor2_Speed", "Type": 153, "Path": "\\Motors", "Units": "RPM" },
{ "Name": "Motor2_Current", "Type": 153, "Path": "\\Motors", "Units": "A" },
{ "Name": "Motor2_Running", "Type": 151, "Path": "\\Motors" }
]
}
Validation Rules
Name Validation
- Must be unique within object type
- Alphanumeric plus underscore
- Cannot start with number
- Max length: 256 characters
- Case-sensitive
Required Fields by Object
| Object | Required Fields |
|---|
| Tag | Name, Type |
| Channel | Name, Protocol, PrimaryStation |
| Node | Name, Channel, PrimaryStation |
| Point | Node, Tag, Address |
| AlarmItem | Tag, Group, Condition, Message |
| HistorianTag | Tag, HistorianTable |
| DatasetQuery | Name, DatasetDB, Contents |
| ScriptTask | Name, Code, Contents |
See Also
→ Git Integration and Export Reference — Export configuration→ Object Model Quick Reference — Object overview→ UNS Tags Reference — Tag details]
}
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
| 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 |
| Aspect | v1.0 | v1.1 |
|---|
| Sections | 4 (ObjectIdentification, VersionInfo, ExportMetadata, Data) | 3 (ObjectIdentification, ExportMetadata, Data) |
| ObjectIdentification | Module, TableType, TableGroup | TableType, SolutionName |
| VersionInfo | TableVersionID, SolutionVersionID, SolutionName | Removed |
| Folder structure | Hierarchical by module | Flat, single folder |
| File naming | Path-based | {TableType}.json or {TableType}-{Name}.json |
| Enum fields | Numeric IDs | String values |
| Data format | Array or single object | Always array |
| Type field | All objects | Only UnsTags and UserType tables |
| Filtered fields | None | ID, XRefInfo, LockState, ContentsRun, BuildMessages, etc. |
| DateCreated/DateModified | In Data objects | Kept in Data objects |
→ Devices Module Reference — Device communication