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
Component | Function | Location |
|---|---|---|
| Centralized Database | Single source of truth | .dbsln file |
| Automatic Exports | Version control tracking | Git folder |
| Selective Export | Configuration elements | JSON files |
| Sensitive Data | Protected via placeholders | Database only |
Navigate to Welcome Page
| Setting | Options | Default |
|---|---|---|
| Auto-save JSON files to Git folder | On/Off | On |
| Auto-save | Temporary / Closing Solution | When Closing Documents |
| Target Directory | <SolutionPath>\DesignerData\<SolutionName>-Designer\Git\ | Read-only |
Automatic Export (Auto-save):
Manual Export:
All JSON files are exported to a single flat directory using standardized naming:
| Category | Pattern | Example |
|---|---|---|
| Bulk tables | {TableType}.json | UnsTags.json, AlarmsItems.json |
| Individual objects | {TableType}-{Name}.json | ScriptsTasks-ServerStartup.json |
| UserType members | UserType-{Name}.json | UserType-LabelingMachine.json |
Examples:
Git:
AlarmsGroups.jsonAlarmsItems.jsonDevicesChannels.jsonDevicesNodes.jsonDevicesPoints.jsonScriptsExpressions.jsonScriptsTasks-ServerStartup.jsonScriptsTasks-DataProcessor.jsonUnsTags.json
UnsUserTypes.jsonUserType-LabelingMachine.jsonUserType-Motor.jsonBenefits:
ls *.json returns all filesScriptsTasks-*.json finds all script tasksjson
{
"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 */ }
]
}| Section | Purpose | Import Behavior |
|---|---|---|
ObjectIdentification | TableType and source solution | Ignored - TableType inferred from filename |
ExportMetadata | Audit trail for export | Ignored - metadata only |
Data | Array of configuration objects | Processed - actual data |
Note: The Data section is always an array, even for single-object exports.
The following fields are excluded from export to reduce file size and improve readability:
Auto-Generated Fields:
| Field | Reason |
|---|---|
ID | Auto-assigned unique identifier |
XRefInfo | Cross-reference data rebuilt by system |
LockState | Lock status reset on import |
LockOwner | Lock owner reset on import |
Compiled/Binary Data:
| Field | Reason |
|---|---|
ContentsRun | Compiled binary (.NET assembly) |
WebContentsRun | Web/WASM compiled version |
BuildMessages | Serialized build error data |
WebBuildMessages | Web build errors |
Build Results:
| Field | Reason |
|---|---|
BuildStatus | Build result, not configuration |
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 |
Note: Fields with empty or null values that represent configurable options (such as Description, Trigger, NamespaceDeclarations) are kept in the export for discoverability.
Individual Object Files ({TableType}-{Name}.json):
Bulk Table Files ({TableType}.json):
The import function uses the same JSON format as export.
| Scenario | Behavior |
|---|---|
| New object (Name doesn't exist) | Created with specified properties |
| Existing object (Name matches) | Skipped - no update, no error |
| Pre-defined system object | Skipped - cannot modify |
| Missing required field | Error - import fails for that object |
| Invalid reference | Error - referenced object must exist |
| Import file older than system object | Warning logged, object skipped |
Import uses DateModified to detect potential conflicts:
When importing related objects, order matters:
Valid TableType values:
| TableType | Object | Module |
|---|---|---|
UnsTags | Tag | UNS |
UnsUserTypes | UserType | UNS |
UnsEnumerations | Enumeration | UNS |
UnsTagProviders | TagProvider | UNS |
UnsAssetTree | AssetFolder | UNS |
DevicesChannels | Channel | Devices |
DevicesNodes | Node | Devices |
DevicesPoints | Point | Devices |
AlarmsGroups | AlarmGroup | Alarms |
AlarmsItems | AlarmItem | Alarms |
AlarmsAreas | AlarmArea | Alarms |
HistorianStorageLocations | StorageLocation | Historian |
HistorianTables | HistorianTable | Historian |
HistorianTags | HistorianTag | Historian |
DatasetsDBs | DatasetDB | Datasets |
DatasetsQueries | DatasetQuery | Datasets |
DatasetsTables | DatasetTable | Datasets |
ScriptsTasks | ScriptTask | Scripts |
ScriptsClasses | ScriptClass | Scripts |
ScriptsExpressions | ScriptExpression | Scripts |
SecurityUsers | SecurityUser | Security |
SecurityPermissions | SecurityPermission | Security |
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 | Device.Channel.{name} | "Device.Channel.ModbusPLC1" |
| Node | Device.Node.{name} | "Device.Node.PLC1" |
| AccessType | Device.AccessType.{name} | "Device.AccessType.Read" |
| AlarmGroup | Alarm.Group.{name} | "Alarm.Group.Critical" |
| AlarmArea | Alarm.Area.{name} | "Alarm.Area.Plant1" |
| HistorianTable | Historian.Table.{name} | "Historian.Table.Table1" |
| DatasetDB | DB.{name} | "Dataset.DB.TagHistorian" |
| Data Type | Handling | Storage |
|---|---|---|
| Passwords | Vault references | Secure storage |
| Connection Strings | Environment placeholders | ${DB_CONNECTION} |
| API Keys | Vault references | Secure storage |
| Encrypted Values and Secrets | Not exported | Database only |
json
{
"DatabaseConnection": "${DB_CONNECTION}",
"EmailServer": "${SMTP_SERVER}",
"HistorianPath": "${HISTORIAN_PATH}"
}Variables resolved at runtime for environment-specific deployment.
Initialize Repository
cd /path/to/solution git init git remote add origin https://github.com/company/scada-config.git
Development Branch
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
| Configuration Size | Export Time | File Count | Total Size |
|---|---|---|---|
| Small (<100 objects) | <1 sec | 20-50 | <500 KB |
| Medium (1,000 objects) | 2-4 sec | 50-150 | 2-5 MB |
| Large (10,000 objects) | 10-15 sec | 200-500 | 20-50 MB |
| Enterprise (50,000+) | 30-60 sec | 1,000+ | 100-300 MB |
Note: File counts and sizes reduced compared to previous format due to field filtering and flat structure.
CI/CD Integration
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.
| Issue | Cause | Solution |
|---|---|---|
| Export not triggering | Automatic export disabled | Enable in settings |
| Merge conflicts | Concurrent edits | Use branches |
| Missing exports | Permission issues | Check directory access |
| Import skips object | Object already exists | Expected behavior (check logs) |
| Import error on reference | Referenced object missing | Import dependencies first |
| DateModified warning | System has newer version | Review changes before force import |