Project source format

FactoryTalk Optix projects are based on text files. You can develop FactoryTalk Optix projects in a collaborative environment with version control inside or outside FactoryTalk Optix.

Tip: You can use standard software development and versioning tools when you edit projects outside of FactoryTalk Optix.

Project structure

Each FactoryTalk Optix project contains these source files and folders:
  • A ProjectName.optix file. Contains general information about the project and references to the FTOptix modules that the project uses.

  • A ProjectName.optix.design file. Contains general information about the project and references to FactoryTalk Optix modules required by elements at design time.

  • A Nodes/ folder. Contains these folders and files:

    • A ProjectName.yaml file. Describes the root node of the project, which contains the related properties and references to the project main nodes.

    • Folders for each main project node (UI, Model, and so on). Each folder contains a .yaml file that describes its related information model (UI.yaml, Model.yaml, and so on).

  • ProjectFiles/ folder. Contains files used in the project (for example, images, fonts, or documents) and these subfolders:

    • NetSolution/. Contains all custom C# NetLogic files.

    • PKI/. Contains private, public, and refused certificates for OPC UA authentication.

Project information model

YAML files represent the information model of a project. Separate YAML files describe each project node and module, enabling application developers to change projects in a granular way by editing maintainable YAML files.

At design time, changes made to projects propagate to the YAML files. The elements described in YAML files are only the elements with a value assigned. If a property of an object is not assigned a value in FactoryTalk Optix, it is not described in the corresponding YAML file.

Example of YAML representation of the UI main project node.

Name: UI
Type: FolderType
Children:
- Name: NativePresentationEngine
  Type: NativePresentationEngine
  ReferenceType: HasOrderedComponent
  Children:
  - Name: StartWindow
    Type: NodePointer
    DataType: NodeId
    Value: {"IdType":2,"Id":"c5b6a0a2e7242da2ad471b89a993b1b9","Namespace":7}
    Children:
    - Name: Kind
      Type: PropertyType
      DataType: NodeId
      Value: {"Id":12,"Namespace":4}
  - Name: StyleSheet
    Type: NodePointer
    DataType: NodeId
    Value: {"IdType":2,"Id":"87ddf487197f945cf28bbdd169681bc9","Namespace":7}
    Children:
    - Name: Kind
      Type: PropertyType
      DataType: NodeId
      Value: {"Id":447,"Namespace":4}
  - Name: EnableVirtualKeyboard
    Type: BaseDataVariableType
    DataType: Boolean
    Value: false
  - Name: StartingUser
    Type: NodePointer
    DataType: NodeId
    Value: {"IdType":2,"Id":"bcd4b69a3d76a1ec8313316b2bbcbba2","Namespace":7}
    Children:
    - Name: Kind
      Type: PropertyType
      DataType: NodeId
      Value: {"Id":14,"Namespace":1}
  - Name: Sessions
    Type: BaseObjectType
- Name: MainWindow
  Id: g=c5b6a0a2e7242da2ad471b89a993b1b9
  Supertype: Window
  Children:
  - Name: Width
    Type: BaseDataVariableType
    DataType: Size
    ModellingRule: Optional
    Value: 400.0
  - Name: Height
    Type: BaseDataVariableType
    DataType: Size
    ModellingRule: Optional
    Value: 400.0
  - Name: Panel1
    Type: Panel
    Children:
    - Name: Width
      Type: BaseVariableType
      DataType: Size
      ModellingRule: Optional
      Value: 300.0
    - Name: Height
      Type: BaseVariableType
      DataType: Size
      ModellingRule: Optional
      Value: 300.0
    - Name: Label1
      Children:
      - Name: Text
        Type: BaseDataVariableType
        DataType: LocalizedText
        ModellingRule: Optional
        Value: {"LocaleId":"it-IT","Text":"Label1"}
    - Name: NetLogicDiRuntime1
      Type: NetLogic