Integrate solutions with Git repositories.

Reference  Solution  DevOpsTrack Changes | Git 


Git Integration & Export (Reference): Comprehensive Git integration for version control, collaboration, and DevOps workflows while maintaining centralized database architecture security.

Access: Solution → Export (Git Export settings)


Git Export Architecture

Hybrid Configuration Management

Component

Function

Location

Centralized DatabaseSingle source of truth.dbsln file
Automatic ExportsVersion control trackingGit folder
Selective ExportConfiguration elementsJSON files
Sensitive DataProtected via placeholdersDatabase only
Bidirectional SyncDatabase ↔ Git repositoryAutomated

Git-Friendly JSON Format

Feature

Purpose

Benefit

Consistent FormattingClean diffsEasy review
Sorted KeysMinimize conflictsBetter merging
Array-based TablesEfficient storageSmaller files
Metadata PreservationVersion trackingAudit trail
Binary Asset HandlingSeparate files with checksumsIntegrity

Git-Friendly JSON Format

FeaturePurposeBenefit
Flat DirectorySimple file enumerationEasy automation
Consistent FormattingClean diffsEasy review
Sorted KeysMinimize conflictsBetter merging
String EnumerationsHuman-readable valuesSelf-documenting
Filtered FieldsExclude auto-generated dataSmaller files
Array-based DataConsistent structureSimplified parsing

Configuration

Enabling Git Export

Navigate to Solution → Settings → Version Control:

SettingOptionsDefault
Enable Git ExportOn/OffOff
Export ModeAutomatic/ManualManual
Export TriggerOn Version Change-
Export Delay5-60 seconds5
Target DirectoryPathSolution-Data\Git

Export Modes

Automatic Export:

  • Monitors configuration changes
  • Exports on version increment
  • Batches rapid changes
  • Background operation

Manual Export:

  • Export All - Complete solution
  • Export Module - Selected module
  • Export Current - Active object

File Naming Convention

All JSON files are exported to a single flat directory using standardized naming:

CategoryPatternExample
Bulk tables{TableType}.jsonUnsTags.json, AlarmsItems.json
Individual objects{TableType}-{Name}.jsonScriptsTasks-ServerStartup.json
UserType membersUserType-{Name}.jsonUserType-LabelingMachine.json


Examples:

Git/
??? AlarmsGroups.json
??? AlarmsItems.json
??? DevicesChannels.json
??? DevicesNodes.json
??? DevicesPoints.json
??? ScriptsExpressions.json
??? ScriptsTasks-ServerStartup.json
??? ScriptsTasks-DataProcessor.json
??? UnsTags.json
??? UnsUserTypes.json
??? UserType-LabelingMachine.json
??? UserType-Motor.json

Benefits:

  • Simple enumeration: ls *.json returns all files
  • Pattern matching: ScriptsTasks-*.json finds all script tasks
  • Predictable paths for MCP/AI tools
  • Alphabetical grouping by module prefix

JSON File Format

Standard Structure (Format v1.1)

json

{
  "ObjectIdentification": {
    "TableType": "ScriptsTasks",
    "SolutionName": "MyProject"
  },
  "ExportMetadata": {
    "ExportDate": "2025-08-23T10:30:00Z",
    "ExportUser": "john.doe",
    "ExportProduct": "FrameworX",
    "ExportProductVersion": "10.1.1.1011",
    "ExportFormat": "1.1"
  },
  "Data": [
    { /* object properties */ }
  ]
}


SectionPurposeImport Behavior
ObjectIdentificationTableType and source solutionIgnored - TableType inferred from filename
ExportMetadataAudit trail for exportIgnored - metadata only
DataArray of configuration objectsProcessed - actual data

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


Fields Filtered from Export

The following fields are excluded from export to reduce file size and improve readability:

Auto-Generated Fields:

FieldReason
IDAuto-assigned unique identifier
XRefInfoCross-reference data rebuilt by system
LockStateLock status reset on import
LockOwnerLock owner reset on import


Compiled/Binary Data:

FieldReason
ContentsRunCompiled binary (.NET assembly)
WebContentsRunWeb/WASM compiled version
BuildMessagesSerialized build error data
WebBuildMessagesWeb build errors


Build Results:

FieldReason
BuildStatusBuild result, not configuration
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 Filtering:

FieldRule
TypeKept only for UnsTags and UserType tables


Note: Fields with empty or null values that represent configurable options (such as Description, Trigger, NamespaceDeclarations) are kept in the export for discoverability.


Export Categories

Individual Object Files ({TableType}-{Name}.json):

  • Script Tasks and Classes
  • Display Layouts
  • Dataset Queries
  • Report Definitions
  • Symbol Definitions

Bulk Table Files ({TableType}.json):

  • Tags (UnsTags)
  • Alarm Items (AlarmsItems)
  • Device Points (DevicesPoints)
  • Expressions (ScriptsExpressions)
  • UserType Definitions (UnsUserTypes)

JSON Import Behavior

The import function uses the same JSON format as export.

Import Behavior Rules


ScenarioBehavior
New object (Name doesn't exist)Created with specified properties
Existing object (Name matches)Skipped - no update, no error
Pre-defined system objectSkipped - cannot modify
Missing required fieldError - import fails for that object
Invalid referenceError - referenced object must exist
Import file older than system objectWarning logged, object skipped

Conflict Detection

Import uses DateModified to detect potential conflicts:

  • If system object is newer than import file → Warn and skip
  • If import file is newer than system object → Safe to update (future feature)
  • If dates are equal → Skip (no changes)

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

TableType Reference

Valid TableType values:

TableTypeObjectModule
UnsTagsTagUNS
UnsUserTypesUserTypeUNS
UnsEnumerationsEnumerationUNS
UnsTagProvidersTagProviderUNS
UnsAssetTreeAssetFolderUNS
DevicesChannelsChannelDevices
DevicesNodesNodeDevices
DevicesPointsPointDevices
AlarmsGroupsAlarmGroupAlarms
AlarmsItemsAlarmItemAlarms
AlarmsAreasAlarmAreaAlarms
HistorianStorageLocationsStorageLocationHistorian
HistorianTablesHistorianTableHistorian
HistorianTagsHistorianTagHistorian
DatasetsDBsDatasetDBDatasets
DatasetsQueriesDatasetQueryDatasets
DatasetsTablesDatasetTableDatasets
ScriptsTasksScriptTaskScripts
ScriptsClassesScriptClassScripts
ScriptsExpressionsScriptExpressionScripts
SecurityUsersSecurityUserSecurity
SecurityPermissionsSecurityPermissionSecurity

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"
ChannelDevice.Channel.{name}"Device.Channel.ModbusPLC1"
NodeDevice.Node.{name}"Device.Node.PLC1"
AccessTypeDevice.AccessType.{name}"Device.AccessType.Read"
AlarmGroupAlarm.Group.{name}"Alarm.Group.Critical"
AlarmAreaAlarm.Area.{name}"Alarm.Area.Plant1"
HistorianTableHistorian.Table.{name}"Historian.Table.Table1"
DatasetDBDB.{name}"Dataset.DB.TagHistorian"

Security & Sensitive Data

Data Protection

Data TypeHandlingStorage
PasswordsVault referencesSecure storage
Connection StringsEnvironment placeholders${DB_CONNECTION}
API KeysVault referencesSecure storage
Encrypted Values and SecretsNot exportedDatabase only

Environment Variables

json

{
  "DatabaseConnection": "${DB_CONNECTION}",
  "EmailServer": "${SMTP_SERVER}",
  "HistorianPath": "${HISTORIAN_PATH}"
}

Variables resolved at runtime for environment-specific deployment.


Git Workflow

Recommended Process

  1. Initialize Repository

bash

cd /path/to/solution
git init
git remote add origin https://github.com/company/scada-config.git
  1. Development Branch

bash

git checkout -b feature/new-alarm-logic
# Make changes in FrameworX
git add .
git commit -m "Add temperature monitoring for Reactor-3"
git push origin feature/new-alarm-logic
  1. Code Review
    • Create pull request
    • Team reviews changes
    • Merge to main branch

Branching Strategy

Main Branches:

  • main - Production-ready code
  • develop - Integration branch for features

Feature Branches:

  • feature/new-screens - New display development
  • feature/alarm-updates - Alarm system modifications
  • feature/script-optimization - Script performance improvements

Maintenance Branches:

  • hotfix/critical-alarm-fix - Emergency production fixes
  • release/v2.1 - Release preparation and stabilization

Branch Hierarchy:

  • Main branch serves as production baseline
  • Develop branch integrates all feature work
  • Feature branches created from develop
  • Hotfix branches created from main for urgent fixes
  • Release branches created from develop for version preparation

Best Practices Checklist 

What to Export

  • Export to Git:
    • Application configuration
    • Display definitions
    • Script code
    • Alarm rules
    • Report templates
    • Static settings
  • Keep in Database Only:
    • Runtime tag values
    • Historical data
    • User passwords
    • Session information
    • Temporary data
    • High-frequency updates

Commit Guidelines

GoodBad
"Add temperature monitoring for Reactor-3""Updated stuff"
"Fix alarm delay calculation in Tank-Level""Changes"
"Implement new batch report template""Friday work"

Performance

Export Performance


Configuration SizeExport TimeFile CountTotal Size
Small (<100 objects)<1 sec20-50<500 KB
Medium (1,000 objects)2-4 sec50-1502-5 MB
Large (10,000 objects)10-15 sec200-50020-50 MB
Enterprise (50,000+)30-60 sec1,000+100-300 MB

Note: File counts and sizes reduced compared to previous format due to field filtering and flat structure.

Optimization Tips

(No change)


CI/CD Integration

Example GitHub Actions

yaml

name: Validate FrameworX Configuration

on:
  pull_request:
    branches: [ main, develop ]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Validate JSON Schema
      run: |
        for file in $(find . -name "*.json"); do
          python validate_schema.py $file
        done
    
    - name: Check Tag Naming Convention
      run: python check_naming.py ./UnsTags.json
    
    - name: Verify No Credentials
      run: |
        ! grep -r "password\|credential\|secret" --include="*.json"

Note: CI/CD scripts simplified due to flat directory structure - no need to traverse nested folders.


Troubleshooting


IssueCauseSolution
Export not triggeringAutomatic export disabledEnable in settings
Large file sizesMany objectsUse selective export
Merge conflictsConcurrent editsUse branches
Missing exportsPermission issuesCheck directory access
Sensitive data exposedWrong configurationReview export filters
Import skips objectObject already existsExpected behavior (check logs)
Import error on referenceReferenced object missingImport dependencies first
DateModified warningSystem has newer versionReview changes before force import

See Also


In this section...