Direct object model exposing all platform modules as .NET namespaces without API layers

Platform → TechnologySupporting → Built-in Namespaces | Concept | Reference


The Platform Kernel

Built-in namespaces represent the kernel of FrameworX - the convergence of real-time database technology, .NET framework, and Unified Namespace architecture. This creates a framework on top of frameworks, where every platform module becomes a directly accessible .NET namespace. No APIs, no temporary variables, no middleware - just direct object access.


Architectural Foundation

The built-in namespaces embody a unique architectural pattern: a one-to-three mirror system where the same object model reflects across:

  • Designer UI - Module organization in configuration interface
  • SQL Database - Table structure for configuration storage
  • Git/DevOps - JSON export structure for version control

This triple mirror means learning one structure teaches you three - the UI navigation, the database schema, and the version control organization all follow the same namespace hierarchy.


Namespace Hierarchy

The platform organizes namespaces following the Four Pillars architecture:

CategoryNamespaceTypeDescription
P1: UNS FoundationTagRootSolution Tags at root location
AssetFolderAsset("/path")Asset tree organization
P2: Process ModulesDeviceDevice.*Field device connections
AlarmAlarm.*Alarm management system
HistorianHistorian.*Time-series data logging
OPCServerOPCServer.*Built-in OPC server
P3: Application ModulesDatasetDataset.*Database connections
ReportReport.*Document generation
ScriptScript.*Business logic execution
P4: User InterfaceDisplayDisplay.*HMI/SCADA screens
LayoutLayout.*Display frameworks
SecuritySecurity.*User management
SystemInfoInfo.*Solution metadata
ServerServer.*Server runtime state
ClientClient.*Client-specific state

Direct Object Model

Unlike traditional systems requiring APIs or temporary variables, every object created in your solution immediately becomes a .NET object with full inheritance:

Automatic Property Access

// Create an alarm group "ProductionAlerts" in Designer
// Immediately accessible at runtime:
Alarm.Group.ProductionAlerts.TotalCount      // Active alarm count
Alarm.Group.ProductionAlerts.UnackedCount    // Unacknowledged count
Alarm.Group.ProductionAlerts.Disable()       // Method to disable group

.NET Class Inheritance

// Tags are full .NET objects - use any .NET method:
Tag.StartDateTime.Value.DayOfYear           // .NET DateTime property
Tag.ProductName.Value.ToUpper()             // .NET String method
Tag.Temperature.Value.ToString("F2")        // .NET formatting

// Not programmed by FrameworX - inherited from .NET


IntelliSense Navigation

The namespace structure enables full IntelliSense throughout the platform:

  • Auto-completion in all configuration fields
  • Type-safe property access
  • Method signature hints
  • Real-time validation

Context-Aware Syntax

ContextSyntaxExample
Scripts/CodeBehind@ prefix required@Tag.Temperature.Value
Expressions/GridsDirect accessTag.Temperature.Value
Display BindingFiltered by typeTemperature (tags only)

Server-Client Domain Separation

Namespaces automatically handle distributed architecture:

Server Domain

  • @Server.* - Global server properties
  • Tag.* - Process values (synchronized)
  • Alarm.* - System-wide alarms
  • Device.* - Communication status

Client Domain

  • @Client.* - Local client properties
  • @Client.Username - Current user
  • @Client.DisplayName - Active display
  • @Client.MousePosition - Local UI state

Even on a single computer, separate processes maintain this separation for security and performance.


Practical Examples

Device Communication Status

// No temporary tags needed - direct access:
if (@Device.Channel.PLCChannel.IsActive)
{
    @Display.StatusPanel.PLCStatus = "Connected";
    @Display.StatusPanel.NodeCount = @Device.Node.Count;
}

Alarm Statistics

// Built-in aggregation properties:
@Display.Header.CriticalCount = @Alarm.Group.Critical.ActiveCount;
@Display.Header.WarningCount = @Alarm.Group.Warning.ActiveCount;
@Display.Header.TotalAlarms = @Alarm.TotalCount;

Dynamic Script Monitoring

// Access script execution metrics:
var cpuTime = @Script.Task.DataProcessor.LastCPUTime;
var execCount = @Script.Task.DataProcessor.ExecutionCount;
if (cpuTime > 100) // milliseconds
{
    @Alarm.Group.System.HighCPU = true;
}

One-to-One Correspondence Benefits

Understanding namespace organization provides mastery across the platform:

Learn OnceApply Everywhere
Device.Channel.Node structureDesigner UI navigation
SQL table relationships
Git folder structure
Alarm.Group.Item hierarchyConfiguration interface
Database schema
Runtime object access
Display.Layout.Page organizationUI module structure
Export file format
Client navigation

Performance Implications

Direct object access eliminates traditional overhead:

  • No API serialization/deserialization
  • No intermediate data structures
  • Native .NET performance
  • Compile-time optimization
  • Type-safe execution


In this section...