Architecture Concepts
The Triple Mirror Pattern
The FrameworX object model follows a one-to-three mirror system where the same structure reflects across:
| Layer | Description |
|---|
| Designer UI | Module organization and navigation tree |
| SQLite Database | Table structure in .dbSLN solution files |
| Git/DevOps | JSON export structure for version control |
Learning one structure teaches you all three.
Three-Level Hierarchy
All configurable objects follow a consistent hierarchy:
- Module Container (or RunDBRoot)
- Collection Table (plural naming, e.g., AlarmsGroups)
- Object Instance (singular naming, e.g., AlarmGroup)
Naming Conventions
| Context | Format | Example |
|---|
| Single object | Singular | DatasetDB, DatasetQuery |
| Table (collection) | Plural | DatasetsDBs, DatasetsQueries |
| Runtime path | Singular | Dataset.Query.Query1 |
Designer ↔ Object ↔ Database: One-to-one mapping across Designer UI pages, object model classes, and SQLite tables in the solution file (.dbSLN).
Named Objects vs Configuration Rows
Named Objects have unique names within their namespace and appear in the Designer navigation tree where users can create new instances. Internally, named objects are stored as tokens for efficient referencing — the Designer UI displays friendly names, but solution files store tokenized references.
Configuration Rows are objects without unique name identifiers, configured in grid/table editors:
| Object Type | Parent | Description |
|---|
DevicePoint | DevicesPoints | Individual point mappings within a Node |
AlarmItem | AlarmsItems | Individual alarm configurations within a Group |
HistorianTag | HistorianHistorianTags | Tag assignments within a Historian Table |
ScriptExpression | ScriptsExpressions | Expression-based calculations |
Quick Navigation
| Module | 4 Pillars Group | Objects |
|---|
| UNS | Data Foundation | AssetFolder, Tag, UserType, Enumeration, TagProvider |
Service |
| Devices | Industrial Operations | Protocol, Channel, Node, Point, AccessType |
| Alarms | Industrial Operations | AlarmsGroup, AlarmsItem, AlarmsArea |
| Historian | Industrial Operations | StorageLocation, HistorianTable, HistorianTag |
| Datasets | Business | DatasetDB, DatasetQuery, DatasetTable, DatasetFile |
| Reports | Business | ReportForm, WebData |
| Scripts | Business | ScriptTask, ScriptClass, ScriptExpression, ScriptReference |
| Security | UI | SecurityUser, SecurityPermission, SecurityPolicy, SecuritySecret |
| Displays | UI | Display, Layout, Image, Symbol |
UNS (Data Foundation)
The Unified Namespace holds all process variables and provides the central data layer for all modules.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| Tag | UnsTags | Tag.{name} | Process variable |
| UserType | UserTypes | — | Data structure template |
| Enumeration |
Enumerations| UserTypes | — | Number↔String mapping |
| TagProvider Service |
TagProviderServices| UnsTagProviders | — | External data source connection |
Pre-defined Objects
None — user creates all objects.
Tag — Minimum Configuration
| Property | Required | Default | Notes |
|---|
| Name | No | {Type}{N} | Recommended to define meaningful name |
| Type | Yes | — | Basic type (Integer, Double, Text, etc.) or UserType |
| Path | No | Root (empty) | Folder location in hierarchy |
| Description | No | — | Recommended for real projects |
Tag Path and Access
| Path Column Value | Full Access Syntax |
|---|
| (empty) | Tag.TagName |
\Line1\Machine1 | Tag.Line1.Machine1.TagName |
UserType vs Tag
UserTypes and Tags have nearly identical structure:
- Tag has PATH column (instance in hierarchy)
- UserType has no PATH (template for creating Tags)
When a Tag uses a UserType, members are accessed as: Tag.Motor1.Speed, Tag.Motor1.Status
TagProvider Services
Enable dynamic external data without pre-defining tags:
- Create TagProvider Service with connection credentials
- Attach to a node in the Asset Tree
- Children are queried directly from external source
- Access via
Asset("path") syntax only
→ Unified Namespace Reference
Devices (Industrial Operations)
Connects to field devices and maps device data to Tags.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| Protocol | DevicesProtocols | — (internal) | Built-in communication driver |
| Channel | DevicesChannels | Device.Channel.{name} | Protocol instance + settings |
| Node | DevicesNodes | Device.Node.{name} | Device address |
| Point | DevicesPoints | — (internal) | Tag ↔ device address mapping |
| AccessType | DevicesAccessTypes | Device.AccessType.{name} | Read/write behavior |
*Protocol is built-in, query only
Pre-defined Objects
| Object | Pre-defined Values |
|---|
| Protocol | All built-in (Modbus, ControlLogix, MQTT, OPC UA, etc.) |
| AccessType | Read, Write, ReadWrite |
Hierarchy
Protocol (built-in, select only)
??? Channel
??? Node
??? Point (tag + Dependencies
| To Create | Requires |
|---|
| Channel | Protocol selection |
| Node | Existing Channel |
| Point | Existing Node + Tag (auto-creates if omitted) + Address |
| AccessType | Nothing (standalone) |
Point — Minimum Configuration
| Property | Required | Notes |
|---|
| Node | Yes | Parent node |
| Tag | Yes | Auto-created if not specified |
| Address | Yes | Protocol-specific syntax |
| AccessType | No | Defaults to Read |
→ Devices Module Reference
Alarms (Industrial Operations)
Monitors Tags for alarm conditions and manages alarm events.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| AlarmsGroup | AlarmsGroups | Alarm.Group.{name} | Behavior settings |
| AlarmsItem | AlarmsItems | Alarm.Item.{name} | Alarm definition |
| AlarmsArea | AlarmsAreas | Alarm.Area.{name} | Hierarchy organization |
Pre-defined Objects
| Object | Pre-defined Values |
|---|
| AlarmsGroup | Critical, Warning, AuditTrail |
Dependencies
| To Create | Requires |
|---|
| AlarmsGroup | Nothing (standalone) |
| AlarmsItem | Existing Tag + Existing Group |
| AlarmsArea | Nothing (standalone tree) |
AlarmsItem — Minimum Configuration
| Property | Required | Notes |
|---|
| Tag | Yes | Tag to monitor |
| Condition | Yes | Trigger expression |
| Message | Yes | Alarm message text |
| Group | Yes | Can use pre-defined (Critical, Warning, AuditTrail) |
| Area | No | Optional hierarchy placement |
→ Alarms Module Reference
Historian (Industrial Operations)
Records Tag values over time for historical analysis.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| StorageLocation | HistorianStorageLocations | Historian.StorageLocation.{name} | Where data is saved |
| HistorianTable |
HistorianTables| HistorianHistorianTables | Historian.Table.{name} | Storage conditions |
| HistorianTag |
HistorianTags| HistorianHistorianTags | Historian.Tag.{name} | Tag to historize |
Pre-defined Objects
| Object | Pre-defined Values |
|---|
| StorageLocation | Dataset.DB.TagHistorian (default to SQLite database |
(default| ) |
| HistorianTable | Table1 (basic settings) |
Hierarchy
Hierarchy
??? HistorianTable
??? HistorianTag Dependencies
| To Create | Requires |
|---|
| StorageLocation | Nothing (standalone) |
| HistorianTable | Existing StorageLocation |
| HistorianTag | Existing Tag + Existing HistorianTable |
HistorianTag — Minimum Configuration
| Property | Required | Notes |
|---|
| Tag | Yes | Tag to historize |
| HistorianTable | Yes | Can use pre-defined Table1 |
→ Historian Module Reference
Datasets (Business)
Connects to SQL databases for queries, table operations, and file I/O.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| DatasetDB | DatasetsDBs | Dataset.DB.{name} | Database connection |
| DatasetQuery | DatasetsQueries | Dataset.Query.{name} | SQL statement |
| DatasetTable | DatasetsTables | Dataset.Table.{name} | Direct table mapping |
| DatasetFile | DatasetsFiles | Dataset.File.{name} | File I/O |
Pre-defined Objects
| Object | Pre-defined Values |
|---|
| DatasetDB | TagHistorian, AlarmHistorian, RuntimeUsers, Retentive (all SQLite by default) |
Dependencies
| To Create | Requires |
|---|
| DatasetDB | Nothing (standalone) |
| DatasetQuery | Existing DatasetDB |
| DatasetTable | Existing DatasetDB |
| DatasetFile | Nothing (standalone, unrelated to DBs) |
DatasetQuery — Minimum Configuration
| Property | Required | Notes |
|---|
| DatasetDB | Yes | Can use pre-defined |
| Query | Yes | SQL statement, supports {TagName} for runtime substitution |
→ Datasets Module Reference
Reports (Business)
Generates documents and handles web data interchange.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| ReportForm | ReportsForms | Report.Form.{name} | Document template |
| WebData | ReportsWebData | Report.WebData.{name} | JSON/XML/Text data object |
Pre-defined Objects
None.
Dependencies
| To Create | Requires |
|---|
| ReportForm | Nothing (references Tags in template) |
| WebData | Nothing (standalone) |
→ Reports Module Reference
Scripts (Business)
Custom code execution in C#, VB.NET, or Python.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| ScriptTask | ScriptsTasks | Script.Task.{name} | Event/time triggered code |
| ScriptClass | ScriptsClasses | Script.Class.{name} | Reusable function library |
| ScriptExpression | ScriptsExpressions | Script.Expression.{name} | One-line auto-executing expression |
| ScriptReference | ScriptsReferences | Script.Reference.{name} | External DLL reference |
Pre-defined Objects
None.
Dependencies
| To Create | Requires |
|---|
| ScriptTask | Nothing (can use Classes and References) |
| ScriptClass | Nothing (can use References) |
| ScriptExpression | Nothing (references Tags in expression) |
| ScriptReference | Nothing (standalone) |
ScriptExpression Note
ScriptExpressions can auto-trigger when referenced Tags change value.
→ Scripts Module Reference
Security (UI)
Users, permissions, and access control.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| SecurityUser | SecurityUsers | Security.User.{name} | User account |
| SecurityPermission | SecurityPermissions | Security.Permission.{name} | Permission flags |
| SecurityPolicy | SecurityPolicies | Security.Policy.{name} | Login/session rules |
| SecuritySecret | SecuritySecrets | Security.Secret.{name} | Protected credentials |
Pre-defined Objects
| Object | Pre-defined Values |
|---|
| SecurityUser | Administrator, Guest, User |
| SecurityPermission | Administrator, Guest, Maintenance, Engineering, Supervisor, Operator, User, Group8–Group24 |
| SecurityPolicy | Default policy |
Dependencies
| To Create | Requires |
|---|
| SecurityUser | Existing Permission(s) + Existing Policy |
| SecurityPermission | Nothing (standalone) |
| SecurityPolicy | Nothing (standalone) |
| SecuritySecret | Nothing (standalone) |
SecuritySecret
Encrypted storage for passwords used in Datasets (DB connections) and Devices (device connections).
→ Security Module Reference
Displays (UI)
Operator interface screens and layouts.
Objects
| Object | Table | Runtime Path | Purpose |
|---|
| Display | Displays | Display.{name} | UI screen |
| Layout | Layouts | Layout.{name} | Frame organization |
| Image | Images | Image.{name} | Imported graphic |
| Symbol | Symbols | Symbol.{name} | Reusable component |
Pre-defined Objects
| Object | Pre-defined Values |
|---|
| Symbol | ~2000 in Product Library |
Dependencies
| To Create | Requires |
|---|
| Display | Nothing (standalone) |
| Layout | Existing Displays to place in frames |
| Image | External file to import |
| Symbol | Nothing (standalone) |
Display Types
| Type | Purpose | Elements Allowed |
|---|
| Canvas | Process synoptics, fixed positioning | All elements + graphic primitives |
| Dashboard | Responsive grid layout | All elements (no primitives) |
→ Displays Module Reference
→ Display Controls Reference
Configuration Dialogs
These are built-in settings dialogs to the solution or specific modules, not creatable objects :to be created.
| Dialog | Location | Purpose |
|---|
| Solution Settings | Solution | Global solution configuration |
| Alarm Global Settings | Alarms | Alarm module defaults |
| Display Client Settings | Displays | Client behavior defaults |
Solution Categories
Solution categories are metadata information labels, created by the user, that be can applied to any object in the system.
All Objects Summary
| Module | Objects |
|---|
| UNS | Tag, UserType, Enumeration, TagProvider Service |
| Devices | Protocol*, Channel, Node, Point, AccessType |
| Alarms | AlarmsGroup, AlarmsItem, AlarmsArea |
| Historian | StorageLocation, HistorianTable, HistorianTag |
| Datasets | DatasetDB, DatasetQuery, DatasetTable, DatasetFile |
| Reports | ReportForm, WebData |
| Scripts | ScriptTask, ScriptClass, ScriptExpression, ScriptReference |
| Security | SecurityUser, SecurityPermission, SecurityPolicy, SecuritySecret |
| Displays | Display, Layout, Image, Symbol |
Runtime Namespace Reference
Syntax by Context
| Context | Syntax | Example |
|---|
| Scripts / CodeBehind | @ prefix required | @Tag.Temperature.Value |
| Expressions / Grids | Direct access | Tag.Temperature.Value |
| Display Binding | Filtered by type | Temperature (tags only) |
Domain Separation
| Domain | Scope | Examples |
|---|
| Server | Global, synchronized across all clients | @Server.Date, Tag.*, Alarm.*, Device.* |
| Client | Local to each client process | @Client.Username, @Client.DisplayName |
Even on a single computer, separate processes maintain this separation for security and performance.
→ Built-in Namespaces
→ Built-in Namespaces Reference
Objects with Custom Editors
The following objects have dedicated visual editors. Content is stored in hidden *Contents tables managed internally by the system:
| Object | Editor Type |
|---|
| Display | Canvas Editor (XAML) |
| Symbol | Canvas Editor (XAML) |
| ScriptTask | Code Editor |
| ScriptClass | Code Editor |
| ReportForm | Report Designer |
| WebData | WebData Editor |
| DatasetQuery | SQL Query Editor |
Tag Types Reference
Built-in Types
| 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 built-in parsing |
| Reference | 170 | Dynamic | Tag reference |
UserType References
UserTypes are assigned IDs starting at 201:
- First UserType created: ID 201
- Second UserType: ID 202
- And so on...
In JSON, reference a UserType with: "Type": 201
See Also