Help
  • Explore Community
  • Get Started
  • Ask the Community
  • How-To & Best Practices
  • Contact Support
Notifications
Login / Register
Schneider Electric
Community
Community
Notifications
close
  • Categories
  • Forums
  • Knowledge Center
  • Blogs
  • Ideas
  • Events & Webinars
Help
Help
  • Explore Community
  • Get Started
  • Ask the Community
  • How-To & Best Practices
  • Contact Support
Login / Register

Contact Support

Close

Ask our Experts

Have a question related to our products, solutions or services? Get quick support on community Forums

Email Us

For Community platform-related support, please email us

New Community Ranking System
Our Community ranking system has recently been updated. You may notice changes in user rankings and receive system messages or notifications. If you have questions about how the new ranking works, please refer to the announcement post for more details (click here).

Digital Twin

This knowledge base is addressing usage of software Experior, Machine Expert Twin and future Automation Expert Twin. These softwares are used to create smaller instances of digital twins for use in industrial automation, warehouse management, design & engineering with more..

Search in

Improve your search experience:

  • Exact phrase → Use quotes " " (e.g., "error 404")
  • Wildcard → Use * for partial words (e.g., build*, *tion)
  • AND / OR → Combine keywords (e.g., login AND error, login OR sign‑in)
  • Keep it short → Use 2–3 relevant words , not full sentences
  • Filters → Narrow results by section (Knowledge Base, Users, Products)
cancel
Turn on suggestions
Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Select a Country

Please select a country to continue with beta search.

  • Home
  • Schneider Electric Community
  • Knowledge Center
  • Digital Twin
Options
  • Knowledge Base Article Dashboard
  • Subscribe
  • Bookmark
  • Invite a Friend
Invite a Co-worker
Send a co-worker an invite to the portal.Just enter their email address and we'll connect them to register. After joining, they will belong to the same company.
You have entered an invalid email address. Please re-enter the email address.
This co-worker has already been invited to the Exchange portal. Please invite another co-worker.
Please enter email address
Send Invite Cancel
Invitation Sent
Your invitation was sent.Thanks for sharing Exchange with your co-worker.
Send New Invite Close
Labels
Top Labels
  • Alphabetical
  • Experior 6 85
  • Experior 7 57
  • Exp-6 Developer Guide 35
  • Exp-7 Developer 16
  • Exp-6 User Guides 16
  • Exp-7 Communication Protocols 11
  • Exp-6 Experior 11
  • Exp-6 Communication Protocols 11
  • Exp-7 Getting Started 10
  • Exp-6 Dev Environment 9
  • Exp-7 User Interface 9
  • Exp-6 Dev Assembly 7
  • Exp-7 Building Models 6
  • Exp-7 Working With Models 5
  • Exp-6 PLC 4
  • Exp-6 Getting Started 3
  • Exp-7 Importing Graphics 3
  • Exp-6 3rd Party Programs 2
  • Exp-6 Tips and Tricks 2
  • Remote Viewer 2
  • Exp-6 Model Modifications Examples 1
  • Previous
  • 1 of 3
  • Next
Top Contributors
  • Kasper.Vestrup
    Kasper.Vestrup
See More Contributors

Related Forums

  • Intelligent Devices Forum

Previous Next

Invite a Colleague

Found this content useful? Share it with a Colleague!

Invite a Colleague Invite

Digital Twin

Sort by:
Date
  • Date
  • Views
  • Likes
Options
  • Knowledge Base Article Dashboard
  • Subscribe
  • Bookmark
  • Invite a Friend
  • « Previous
    • 1
    • 2
    • 3
    • …
    • 8
  • Next »

Property filter

Property Filters are described here as seen from the users point of view.   The configuration files are created the first time the catalog is loaded into Experior.   It is possible to set some predefined filters by using the attribute called Experior.Core.Properties.DefaultFilter.   The code below shows the “Blocked” property for the PhotoEye:
View full article
Kasper.Vestrup Explorer
‎2026-01-14 06:23 AM

Labels:
  • Exp-6 Dev Assembly
  • Exp-6 Developer Guide
  • Experior 6
176 Views

AssemblyInfo class

The AssemblyInfo class is the base class (deriving from EntityInfo) used to manage all data of an Assembly object that needs to be saved. Each constructor of an Assembly class contains an AssemblyInfo object as argument. If the AssemblyInfo class doesn’t contain all necessary fields to restore an assembly then a new class is used that derives from AssemblyInfo. The developer just has to add new public fields to that info class so that this data can be retrieved by the matching assembly constructor.   When saving the model Experior will serialize all AssemblyInfo objects into an Assemblies.XML file and compress it into the Experior model file.   When loading the model the process is reversed: Experior unzips the model file and de-serializes the Assemblies.XML file. Each newly created AssemblyInfo object is passed into the constructor of the matching Assembly class (which is derived from the fullname field).   Due to the nature and purpose of the AssemblyInfo objects they have an empty constructor and most fields are public.   When selecting an icon of the assembly in the catalog window then some class-properties are shown. They contain default values that will be used to create the new Assembly when you drag it onto the working area. By changing those default property values subsequent assemblies will be created with those new values.   Below is described some common fields of each AssemblyInfo object and explain mechanism of storing default properties and illustrate it with an example.   Main fields: public string name: The saved name of the corresponding assembly public string fullname: The saved fully qualifying  class name of the corresponding assembly public string section: The saved section name of the corresponding assembly public Vector3 position: The saved global position of the corresponding assembly public Matrix orientation: The saved orientation matrix of the corresponding assembly public Vector3 localposition: The saved local position of the corresponding assembly related to its parent assembly public Matrix localorientation: The saved local orientation matrix of the corresponding assembly related to its parent assembly public object userdata: The saved custom user data of the corresponding assembly public bool visible: The saved visibility state of the corresponding assembly public bool locked: The saved locked state of the corresponding assembly public float length: The saved length of the corresponding assembly public float width: The saved width of the corresponding assembly public float height:  The saved height of the corresponding assembly   Storing default property values:  As mentioned above Experior supports a mechanism to modify the default properties that a used to create new assemblies. These default values are saved by Experior so that they can be retrieved even after Experior is closed and started again.   To allow a user to change the default value the AssemblyInfo class contains a GetProperty and SetProperty methods: public string GetProperty(string tag): This method allows to retrieve the saved value of the property with as name the given tag. The value is returned as string.   public void SetProperty(string tag, object value): This method allows to save the value of the property with as name the given tag. Note that the value will be saved as a string.   Below is an example of its usage.   Suppose the assembly that we are creating has a property MinHeight. We want to store this for each assembly and therefore add a public field float MinHeight to the corresponding AssemblyInfo class. public class MyAssemblyInfo : AssemblyInfo { private static MyAssemblyInfo properties = new MyAssemblyInfo(); public float minHeight=0.2f; public static object Properties // used for showing default properties in property window when selecting icon of assembly in catalog window { get { properties.color = Experior.Core.Environment.Scene.DefaultColor; return properties; } } }   So by default the MinHeight value is 200 mm.   When we want to allow a user to change this default value and add this as a class property the following code can be added to the corresponding AssemblyInfo class: [XmlIgnore]// to make sure that the MinHeight property is not serialised for each assembly [CategoryAttribute("Size")] [Description("Minimum Height in mm")] [TypeConverter(typeof(FloatConverter))] [PropertyOrder(0)] public virtual float MinHeight { get { string value = GetProperty("MinHeight"); //retrieve the MinHeight property if (value == string.Empty) // property has not been stored yet minHeight = 0.3f; else minHeight = float.Parse(value); // assign the new value to the minHeight field return minHeight; } set { minHeight = value; SetProperty("MinHeight", value); // store the property } }   When a user selects the icon of the assembly in the catalog window then the selected method of the catalog is called. public override object Selected(string title, string subtitle) { if (title == "MyAssemblyClass") return MyAssemblyInfo.Properties; else ... }   As shown above this typically returns a static info object of the corresponding class which is used to display the default properties in the property window:   When changing the MinHeight value in the property window the setter of the MinHeight code shown above is executed and this causes to save the new value with the SetProperty method but also to modify the MinHeight field of the current info object. This info object is passed to the constructor of the matching Assembly class and hence the new value will be taken into account.  
View full article
Kasper.Vestrup Explorer
‎2026-01-14 06:20 AM

Labels:
  • Exp-6 Dev Assembly
  • Exp-6 Developer Guide
  • Experior 6
89 Views

Assembly

Before starting to build your first Assembly please read Assembly Configuration   Please have a look at the attached presentation that shows how easy it is to create an assembly.   You can download the attached zip file that includes a Visual Studio Project with the assembly created in the presentation
View full article
Kasper.Vestrup Explorer
‎2026-01-14 06:15 AM

Labels:
  • Exp-6 Dev Assembly
  • Exp-6 Developer Guide
  • Experior 6
196 Views

Assembly Configuration

  Overview   When you build an assembly the Assembly Configuration object can automatically handle: Rendering of parts, measures and other assemblies (sub-assemblies) Disposing of parts and sub-assemblies Picking User movement and rotation with the mouse Locking and unlocking Selecting and deselecting   If you want to manually handle some of these methods you must override the according method (or property) in the Assembly class:   public virtual void Move(Vector3 delta) public virtual float Yaw public virtual Vector3 Position public virtual void Lock() public virtual void UnLock() public virtual PickResult Pick(Vector3 rayStart, Vector3 rayDirection) public virtual void Render() public virtual void Select() public virtual void DeSelect() public virtual void Dispose()   This part of the wiki will explain how to: Add a part, a measure or another assembly to the assembly Position, rotate and move parts using local coordinates Use movement and angular movements of parts Use the coordinate systems   All examples in this document refer to the assemblies in the DeveloperSamples catalog. Naming the coordinates   When referring to an assembly’s local coordinates the coordinate system on the blue conveyor in Figure 1 is being referred to. These coordinates will always follow the assembly.   The Global coordinates always refer to the coordinate system of the 3D environment with axis names: X, Y, Z, also illustrated in Figure 1. This coordinate system is never moved.   The third coordinate system, placed in the blue cube in Figure 1, is the parts own coordinate system. This coordinate system is not as important as the two others and is mainly used when using a LocalRotationPoint.   Figure 1   Classes, methods and properties   The Assembly Configuration object is not accessed directly. But it is used indirectly when using the following methods and properties in the RigidPart, Assembly and Measure classes.   For the RigidPart class the involved methods and properties are: public Vector3 LocalPosition public float LocalYaw public float LocalPitch public float LocalRoll public Vector3 LocalRotationPoint public void LocalMovement(Vector3 localVelocity, float lengthToMove) public void LocalMovement(Vector3 localVelocity, float lengthToMove, float rampUpLength, float rampDownLength) public void LocalAngularMovement(Vector3 angularVelocity, Vector3 radiansToRotate) public event FinishedMoving LocalMovingFinished; public event FinishedRotating LocalRotationFinished; public CoordinateSystem LocalCoordinateSystem   For the Assembly class the involved methods are: protected RigidPart Add(RigidPart part) protected RigidPart Add(RigidPart part, Vector3 localPosition) protected RigidPart Add(string name, RigidPart part) protected RigidPart Add(string name, RigidPart part, Vector3 localPosition) protected Assembly Add(Assembly assembly, Vector3 localPosition) protected Assembly Add(Assembly assembly, Vector3 localPosition, bool visible) protected Core.Dialog.Measure Add(Core.Dialog.Measure Measure) protected CoordinateSystem Add(CoordinateSystem c) protected bool Remove(RigidPart part) protected bool Remove(Core.Dialog.Measure measure) protected bool Remove(Assembly assembly) public Vector3 LocalPosition public float LocalYaw public float LocalPitch public float LocalRoll   For the Measure class the involved methods are: public Vector3 LocalStartPosition public Vector3 LocalEndPosition   Note that all methods and properties begins with Add, Remove or Local. Add parts, measures and assemblies Adding parts   Adding a part to an assembly is done by the method Add(RigidPart part).   Example: (See Sample0.cs for full source code) Add(new Cube(Color.Wheat, 0.5f, 0.5f, 0.5f));   Figure 2 Without further code the cube can now be selected, deselected, locked, unlocked, picked, moved and rotated.   To remove the part from the assembly: protected bool Remove(RigidPart part) Note: this does not dispose the part.   Positioning of parts using LocalPosition In Sample1.cs it is shown how to add 100 cubes and position them using the LocalPosition property. Example: (See Sample1.cs for full source code) for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { Add(new Cube(Color.Wheat, 0.5f, 0.5f, 0.5f), new Vector3(0, i, j)); } } Figure 3   When a part is added to an assembly it is recommended that the part is positioned using the LocalPosition property.    The property called Position always refers to a part’s global position.   Rotating parts using LocalYaw, LocalPitch and LocalRoll   In Sample2.cs two cubes are added. The LocalPitch value of the blue cube has been set to 0.56f.   Default values for LocalYaw, LocalPitch and LocalRoll are 0 and the units are radians.   Figure 4 Note: If a part is not added to an assembly, the properties Yaw, Pitch and Roll will refer to the global orientation.   When a part is added to an assembly these values refer to the rotation in the parts own coordinate system. See also the section about LocalRotationPoint.   Adding another assembly and a measure   It can be useful to add another assembly and treat it as a part (or as a sub-assembly). This can be done with the method:  protected Assembly Add(Assembly assembly, Vector3 localPosition)   When the assembly has been added it can be positioned and rotated with the following methods: public Vector3 LocalPosition public float LocalYaw public float LocalPitch public float LocalRoll LocalPosition, LocalYaw, LocalPitch and LocalRoll all use the coordinate values of the assembly that the sub-assembly has been added to.   To add a measure use the following method: protected Core.Dialog.Measure Add(Core.Dialog.Measure Measure)   When constructing the measure a start position and an end position must be provided. Local coordinates must be used for these values as they are used when adding the measure to the assembly as the LocalStartPosition and LocalEndPosition.   If later on these values need changing use the following measure methods: public Vector3 LocalStartPosition public Vector3 LocalEndPosition Figure 5   The file Sample3.cs contains an example on how to add an existing conveyor and a measure as illustrated in Figure 5.   To remove the assembly or the measures use the following methods: protected bool Remove(Assembly assembly) protected bool Remove(Core.Dialog.Measure measure) Note: this does not dispose of the assembly.   Linear and angular movement (Physics mode) LocalMovement and LocalAngularMovement   To create a movement of a part it is always possible to override the void Step(float deltatime) method in the Assembly and use this time-step to move the parts.   The Assembly Configuration gives you two methods to create movements without overriding the Step method.   One for a straight movement: public void LocalMovement(Vector3 localVelocity, float lengthToMove)   One for an angular movement: public void LocalAngularMovement(Vector3 angularVelocity, Vector3 radiansToRotate)   These methods are available for the RigidPart class as well as the CoordinateSystem class (see later section) but not for the Assembly class.   The parameter Vector3 angularVelocity has the form:   (Local yaw Velocity, Local pitch velocity, Local roll velocity) It uses the units radians/second.   The parameter Vector3 radiansToRotate has the form: (Delta yaw, Delta pitch, Delta roll) It uses radians as units.   Note: if using a positive Local yaw Velocity a positive Delta yaw must be used as a stop condition, because the rotation is around the local Y-axis in positive direction. Likewise, if using a negative Local yaw Velocity a negative Delta yaw must be used.   To know when the movement has finished the following events can be subscribed to: public event FinishedMoving LocalMovingFinished; public event FinishedRotating LocalRotationFinished; Example: (See Sample4.cs for full source code)   The method: LocalMovement(new Vector3(1, 0, 0), 1); This will create a movement with velocity (1,0,0) in local coordinates which stops after 1 meter. Note that the length must always be positive, otherwise the movement is ignored.   The method: LocalAngularMovement(new Vector3(1, 0, 0), new Vector3((float)Math.PI, 0, 0)); This will create a rotation which rotates around the local Y-axis with velocity 1 radian/second which stops when it has rotated PI degrees.   The method: LocalAngularMovement(new Vector3(-1, 0, 0), new Vector3(-(float)Math.PI, 0, 0)); This will create a rotation which rotates around the local Y-axis with velocity -1 radian/second which stops when it has rotated -PI degrees.   How to use coordinate systems When more advanced movements are created it can be useful to have several coordinate systems. This is, for example, the case when constructing a robot as the one in the Robot class in the DeveloperSamples catalog. When using more than one coordinate system a hierarchy of coordinate systems can be used, meaning that a coordinate system can have a subsystem and a parent system. The top most coordinate system (the one having no parent system) is used as the local coordinate system of the assembly.   Robot class In the Robot class in the DeveloperSamples catalog we use 5 coordinate systems as illustrated in Figure 8. The coordinate systems have been placed where the robot is able to move or rotate.   If the coordinate systems have been constructed and added to the assembly using the following method: protected CoordinateSystem AddCoordinateSystem(CoordinateSystem c)   Then parts can be added to the coordinate system. This can be done with either: coordinate0.AddPart(link0, new Vector3(-0.17f, 0.15f, 0));   or: link0.LocalCoordinateSystem = coordinate0; link0.LocalPosition = new Vector3(-0.17f, 0.15f, 0); When a part has been added to a coordinate system the LocalPosition property of the part will refer to that coordinate system. Figure 8   The coordinate system axes have the same colors as the coordinate system axes of the 3D environment of Experior, the X-axis is green, Y-axis is red and Z-axis is blue.   Constructing the Coordinate System The coordinate system class has the following constructor: public CoordinateSystem(CoordinateSystem SubSystem, Vector3 SubSystemPosition)   Here it can be specified which coordinate system should be the subsystem and where it should be placed SubSystemPosition. The subsystem will automatically be assigned to the coordinate system which will function as its parent system.   If the coordinate system should not have any subsystem use the constructor:   CoordinateSystem(null, Vector3.Empty); Linear and Angular Movement of Coordinate Systems   The CoordinateSystem class has some of the same methods and events as the IRigidPart class: public void LocalMovement(Vector3 localVelocity, float lengthToMove) public void LocalMovement(Vector3 localVelocity, float lengthToMove, float RampUpLength, float RampDownLength) public void LocalAngularMovement(Vector3 angularVelocity, Vector3 radiansToRotate) public event FinishedMoving LocalMovingFinished public event FinishedRotating LocalRotationFinished When these methods are used the coordinate system will rotate or move any parts that are added to the coordinate system.   Rotating a coordinate system relative its parent system   To rotate a coordinate system use the following method:   public void RotateRelativeParent(float deltaYaw, float deltaPitch, float deltaRoll) This will also rotate its subsystem if there is any.
View full article
Kasper.Vestrup Explorer
‎2026-01-14 06:10 AM

Labels:
  • Exp-6 Dev Assembly
  • Exp-6 Developer Guide
  • Experior 6
197 Views

Siemens Fetch & Write

The following section shows how to use the Siemens Fetch and Write protocol to program and run the basic psychics model example.   Click on the Communications tab on the right of the Experior window, just below the Catalogs tab Now right click on the first line and select Siemens and then click Fetch   Next, on the second line down, do the same again only this time select Write   Now it is time to configure the two communications devices Select the Fetch device first and fill out the Properties like so   Next select the Write device and configure the Properties like so   Now to setup the I/O for the devices that require it. For the moment just the addresses will be used The I/O is laid out below along with the associated items: INPUTS 1.1 Motor Control “Switch” 1.2 Feed Load “Button” & Feed Load “Sensor” (2nd Sensor in system) 1.3 Load In System “Sensor” (1st Sensor in system) OUTPUTS 1.1 Motor Drive Control 1.2 Feeder “Feed Load” Control 1.3 Load In System “Lamp” Let’s set up the Inputs first Select the switch called Motor Control in the Control Panel In the Properties panel, below PLC Input expand the properties by clicking the arrow to the left of where it says On/Off    Enter the Byte No. as 1 and the Bit No. as 1 Now select the push button Feed Load In the Properties scroll down to PLC Input and expand the section by clicking the arrow to the left of where it says Pushed   Enter the Byte No. as 1 and the Bit No. as 2 Now select the second sensor that was added to the model earlier In the Properties scroll down to PLC Input and expand the section by clicking the arrow to the left of where it says Blocked   Enter the Byte No. as 1 and the Bit No. as 2 Now select the first sensor that was added to the model As before scroll down to PLC Input in the Properties and expand the section called Blocked by clicking on the arrow   Enter the Byte No. as 1 and the Bit No. as 3 Now, if the Inputs tab at the bottom of the screen is selected, the list of the inputs in the model can be viewed   Now to add the Outputs to the system Select the Motor by clicking any of the red arrows in the model In the Properties scroll down to where it says Operations and expand the section for Forward (Output) by clicking on the arrow to the left of it   Enter the Byte No. as 1 and the Bit No. As 1 Now select the Feeder, that is the triangle/arrow located on the first straight that was added to the model Scroll down the Properties to the section PLC Output and expand the section for Feed by clicking on the arrow to the left of it   Enter the Byte No. as 1 and the Bit No. As 2 Lastly select the Lamp in the Control Panel In the Properties scroll down to PLC Output and expand the properties under Lighting by clicking the arrow to the left of it   Enter the Byte No. as 1 and the Bit No. As 3 Now if the Outputs tab at the bottom of the screen is selected the list of the outputs in the model can be viewed  
View full article
Kasper.Vestrup Explorer
‎2026-01-09 01:46 AM

Labels:
  • Exp-6 PLC
  • Experior 6
225 Views

Allen Bradley Communication

Experior communicates with Allen Bradley PLCs through the CIP protocol. The CIP protocol works by sending tables of data between Experior and the PLC. The datatype of these tables can be BOOL, SINT, INT, DINT or BIT64.   The PLC must have corresponding tables that contain the same datatype. At the start of the scan the values of PLC input tables can be mapped over to the correct variables in the PLC program. At the end of the scan the relevant output values can be mapped to the output tables.   The advantage of this approach is that input and output values will not change mid-cycle.   Experior Setup  First right-click in the communication panel and select EtherNet/IP – CIP   Select the connection. The properties for the connection will be shown in the properties window The property of interest is the Size property. This property defines the data type of the tables for this connection. The corresponding tables in the PLC must be of the same datatype   Next create a lamp and a button in the Control Panel. Select the lamp   The properties window will either have a category called PLC Input or PLC Output (depending on if you chose the lamp or the button).   The Connection id property defines which connection is being used. Slot defines what table is being used. In this case Local_1, can be changed to anything. Address defines what entry of the table is being used (starting from 0). Bit No. defines that bit of the selected Address will be used (starting from 0). Bit No. can only be chosen for PLC input/outputs that are of the type bool.   Set a value for the Address and Bit No. Do the same for the other component in the Control Panel.   PLC setup Each table that is created in Experior has two corresponding tables in the PLC – one for inputs and one for outputs. This means that in the button and lamp example, both can use the same Address and Bit No. in the same table since they will be sent/received from two separate tables in the PLC. Experior will expect the PLC to have tables corresponding to the tables that are in Experior. The tables in the PLC must be names as follows:   Exp_datatype_Input_Experior table name Exp_datatype_Output_Experior table name     An example in Studio 5000
View full article
Kasper.Vestrup Explorer
‎2026-01-09 01:36 AM

Labels:
  • Exp-6 PLC
  • Experior 6
151 Views

Adding an OPC Server and Symbols

As an alternative to using Fetch/Write, an OPC Server can also be used to test a model. This guide shows how to use an OPC Server to program and run the basic psychics model example.   KEPServerEX from Kepware and its predefined variables will be used for this example.   The server should be running on the PC before this exercise is attempted. First, click on the Communications tab on the right of the Experior window, just below where the Catalogs are displayed Now right click on the first line and select OPC   Select the newly created OPC Server and in the Properties panel edit it like so   If something other than Kepware is being used than that will appear in the dropdown instead The symbols and associated items are listed in the table below INPUTS Boolean1 Motor Control “Switch” Boolean2 Feed Load “Button” & Feed Load “Sensor” (2nd Sensor in system) Boolean3 Load In System “Sensor” (1st Sensor in system) OUTPUTS Boolean1 Motor Drive Control Boolean2 Feeder “Feed Load” Control Boolean3 Load In System “Lamp” Select the switch called Motor Control in the Control Panel In the Properties panel, below PLC Input expand the section by clicking the arrow to the left of where it says On/Off     In the Symbol field click the drop down button The structure of the OPC Server then appears as a drop down enabling the user to scroll through and select the correct symbols For this example the Booleans under K Registers is used Expand the folder that contains the symbols Select the symbol Boolean1 to have it added to the properties of the item Now select the push button Feed Load In the Properties scroll down to PLC Input and expand the section by clicking the arrow to the left of where it says Pushed Expand the folder that contains the symbols Select the symbol Boolean2 to have it added to the properties of the item Now select the second sensor that was added to the model In the Properties scroll down to PLC Input and expand the section by clicking the arrow to the left of where it says Blocked Expand the folder that contains the symbols Select the symbol Boolean2 to have it added to the properties of the item Now select the first sensor that was added to the model In the Properties scroll down to PLC Input and expand the section by clicking the arrow to the left of where it says Blocked Expand the folder that contains the symbols Select the symbol Boolean3 to have it added to the properties of the item Select the Motor by clicking any of the red arrows in the model In the Properties scroll down to where it says Operations and expand the section for Forward (Output) by clicking on the arrow to the left of it Expand the folder that contains the symbols Select the symbol Boolean1 to have it added to the properties of the item Now select the Feeder, that is the triangle/arrow located on the first straight that was added to the model Scroll down the Properties to the section PLC Output and expand the section for Feed by clicking on the arrow to the left of it Expand the folder that contains the symbols Select the symbol Boolean2 to have it added to the properties of the item Lastly select the Lamp in the Control Panel In the Properties scroll down to PLC Output and expand the section under Lighting by clicking the arrow to the left of it Expand the folder that contains the symbols Select the symbol Boolean3 to have it added to the properties of the item When finished the Inputs and Outputs tabs should look like so      
View full article
Kasper.Vestrup Explorer
‎2026-01-09 01:31 AM

Labels:
  • Exp-6 PLC
  • Experior 6
129 Views

Building a model in physics mode

This guide will cover constructing a model, adding controls and controllers, setting up PLC Inputs and Outputs on the components that need them and finally running and testing the model.   In this article a simple model using standard Experior components will be built and the guide will provide more information on some of the properties used by those components.   This is a screen-shot of what the model looks like when finished. Note the tracks are gold because they are locked in place.     Building the Model   To begin select the Basic catalog by clicking the tab Then click and drag a Conveyor (Straight) into the construction area Adjust the length of the straight by either clicking and dragging from one of the endpoints or by selecting the straight and in the properties window scrolling down to Position and changing the first number in either the Start or End row to adjust the length As a note, tracks, by default, run from the red point to the blue point, so when attaching additional items opposite coloured points must be snapped together to ensure the model flows correctly Next a motor should be added to the straight To do this select the straight and right click it Then move down so Insert Motor is highlighted and then move across to Surface so that is now highlighted and finally click New   Note the arrow that appears, this is the motor and indicates the direction in which it will be driving the conveyor A feeder now needs to be added to the conveyor, so once again right click on the conveyor, move down and click Insert Feeder     Lastly a sensor needs to be added To do this click on the Sensor tab in the catalog area and then click and drag a Photoeye into the working area When dropped reselect the photoeye and drag it to the edge of the conveyor so that it also becomes highlighted as shown   Now press the CTRL button and the photoeye will automatically align and re-size itself so that it fits across the width of the conveyor Now a curved section of conveyor will be added to the blue end of the straight In the Basic catalog find the Curve(Clockwise) item and drag it across into the working area Drop it away from the straight so it can be worked on first Select the curve so that it is highlighted In the Properties panel scroll down and find Yaw under the heading Orientation Change this value from 0 to 180 Now select and drag the curve to the blue end of the straight so the the blue and red points overlap and turn a pinkish colour Hold down CTRL when and it will snap the curve into place Lastly a motor needs to be added to the curve To do this select the curve and right click it Then move down so Insert Motor is highlighted and then move across to Surface so that is now highlighted and finally click MOTOR1 This then adds a motor to the curve which shares the properties of the motor that was added to the straight     Next a straight with a slight incline needs to be added As before select and drag a straight onto the working area Before connecting it to the curve, select it and in the Properties window scroll down to Position Adjust the second value in the End row to 1470, this changes the height at the end of the straight   Now the straight with an incline can be attached to the curve Now add a motor to the straight Add MOTOR1 in the same way as detailed for the curve above The next 4 parts to be added to the assembly are 2 curves, 1 straight and a photoeye sensor to go on the straight They will need to have their height adjusted to match the end of the straight that was just added The height of the parts will be 1470 and the value that needs modifying is the second one in the Position row These 3 parts will also have motors, to be added as MOTOR1 as before Finally two more straights need to be added, one with a downward slope and one short straight For the sloping straight the height should first be made 1470 in the second value of the Position row, then modify the second value in the End row to be 820 Next scroll down the Properties to Friction Expand the section by clicking the arrow on the left Next using the Coefficient drop down change the value to Slippy This straight will not have a motor as a gravity lane is being simulated here     Insert the last straight and ensure the height is set at 820 and link it to the downward sloping straight Add MOTOR1 to the last straight   Adding Controls Now some basic controls need to be added to the model. The Control Panel is located directly below the Catalog/Communications pane. Firstly a 2 state switch to control the motor should be created Select the first empty square in the Control Panel, move down to Switches On the pop out move across to 2 States and then on the final pop out select Classic   Now add a lamp, this will be used to show when a load has entered the simulation On the second empty square in the Control Panel select it, right click and select Lamp on the drop down   Lastly a simple push button will be added. This will be one method of introducing loads into the simulation On the third square select it, right click and then scroll down and select Button to insert a push button   To rename the controls to make them more easily identifiable, select them and in the Properties pane under Appearance change the Name field   Adding Communications and Symbols   Some of the items in the model have yellow triangles with exclamation marks in them next to them.   The reason for this is because the items or controls are waiting to be linked to a PLC and have either an Input or an Output associated to them.   For the purpose of this exercise three methods for testing inputs and outputs within Experior will be covered. These can be used as a temporary stopgap if you don’t have a PLC, SoftPLC or Controller available for testing. Click on the desired method, follow the guide and return to this guide when ready to run the simulation: Siemens Fetch & Write Adding an OPC Server and Symbols   Running the Simulation To run the simulation the communication device(s) must be connected and running If using the Fetch/Write method then in the Communications pane double click on the Write device and then double click on the Fetch device If an OPC Server is being used then it should automatically connect when the model is loaded, otherwise double click the OPC line in the Communications pane The Communications pane should now look like this:   Now press the Play button located at the top of the screen to start the simulation   Click the Motor Control switch into the ON position, so the arrows representing the motors change colour from red to green signifying that the motor is now running Press the Feed Load button to enter a load into the system and watch it as it passes through the system Note how the lamp lights as the load passes through the first sensor Also note how when the load passes through the second sensor a new load is introduced into the system
View full article
Kasper.Vestrup Explorer
‎2026-01-14 05:27 AM

Labels:
  • Exp-6 User Guides
  • Experior 6
140 Views

Startup Options

On occasion, it can be useful to launch Experior from the command line to change the program’s functionality.   This article details the functionality of each command line argument, that you can use can use when launching Experior.   <file name> Experior opens a model if an argument matches the name of an existing Experior model.   -event Starts Experior in Discrete Events Mode (only functional with the right privileges).   -physics Starts Experior in Physics Mode (only functional with the right privileges).   -menu Hides the main menu (ribbon).   This option can also be toggled within Experior from the main menu or by using F10 providing the -menu switch has not been used when starting Experior.   -comtest Display fetch/write durations.   -tester Startup in ‘Tester’ mode.   -debug Enable ‘Debug’ mode.   -config Display the ‘Catalog Selector’ dialog during startup.   -log <path> Set a temporary log directory (example: c:\Experior\Logs\).   <path> Set working directory (permanently) (example: c:\Experior\).   -reset Reset the Working directory.   A set of options also exists for automated startup and testing of models. These are detailed below. -autostart Run the model when it is loaded. This will only be executed when Experior has finished opening and the model has finished loading and initializing.   -stopafter <dur> Stop the model and close Experior after a period of time – <dur> (duration) defines the time in seconds before the model stops and Experior starts closing.   -atstart <sym/name> Here you provide a symbol name or assembly name that should be activated when a model is started (after connections are established) so that this can initiate some action in the model.   -seed <seed> The seed used by the random generator.   -invisible Start Experior invisible (rendering disabled). Only if <file name> is defined.   -oem Start Experior in OEM licence mode.
View full article
Kasper.Vestrup Explorer
‎2026-01-13 05:46 AM

Labels:
  • Exp-6 Getting Started
  • Experior 6
106 Views

Building a model in discrete events mode

These articles will go through building a basic routing model and coding a simple controller in the Discrete Events mode of Experior.   Building the Model   Open Experior using the config shortcut Select the options as shown below when the start-up screen appears   The screenshot below shows the final layout of the model Note the positions of the action points and their names   To begin select the Track catalog by clicking the tab Then click and drag a Straight into the construction area Adjust the length of the straight by either clicking and dragging from one of the endpoints or by selecting the straight and in the Properties window scroll down and adjust the value in the Length field As a note, tracks, by default, run from the red point to the blue point, so when attaching additional items opposite coloured points must be snapped together to ensure the model flows correctly Add the rest of the components, re-sizing as necessary To join the components together move them together so the the blue and red connection points merge, while holding down CTRL to snap the two components together To merge components to make diverters, simply drag one component over the other until both highlight, then hold the CTRL key to snap them together   To add an Action point right click on the component on which you want the Action point and selecting Insert Action point and then click Action point The Action point is represented by an X, initially in the center of the track   The Action point can be moved and modified by selecting it and editing the properties The ones needing to be changed as part of this exercise are outlined     You can add more than one Action point to a component Use the Distance property to ensure they are spaced apart correctly It is recommended to add them and position them one at a time so they don’t end up on top of each other Add a feeder to the first straight, by selecting the straight, right clicking and selecting Insert Feeder The properties for the Feeder should be as below As with the Action point, the properties that need changing are outlined in red   Once the model is built and all action points are added and named as in the initial picture, click the Routes tab and it should look like the one below   Creating the Controller Within Experior a simple controller can be programmed to dictate the actions of loads when they reach certain action points on the route The code has been included below in its entirety with comments to provide guidance in what the code is actually doing First, open the controller tab in Experior. It’s located on the same pane as the Model Construction area.   Copy the code below and paste it into the Controller pane so that it overwrites the default lines already present public class Main { //This line is autogenerated as part of the model. public void Arrived(INode node, Load load) { //If the Actionpoint is named CHECK then if (node.Name == “CHECK”) { //Generate a random number from 1 to 5 & if the number equals 3… if (Experior.Core.Environment.Random.Next(1, 5) == 3) //…move the load to Actionpoint REJECT1… load.MoveTo(“REJECT1”); else //…if the number is not equal to 3 move the load to Actionpoint ROUTE1 load.MoveTo(“ROUTE1”); } //If the Actionpoint is named REJECT1 then… if (node.Name == “REJECT1”) { //…remove the load from the model/system load.Dispose(); } //If the Actionpoint is named ROUTE1 then… if (node.Name == “ROUTE1”) { //Generate a random number from 1 to 5 & if the number equals 3… if (Experior.Core.Environment.Random.Next(1, 5) == 3) //…move the load to Actionpoint INSPECT1… load.MoveTo(“INSPECT1”); else //…if the number is not equal to 3 move the load to Actionpoint INSPECT2 load.MoveTo(“INSPECT2”); } //If the Actionpoint is named INSPECT1 then… if (node.Name == “INSPECT1”) { //…move the load to Actionpoint ROUTE2 load.MoveTo(“ROUTE2”); } //If the Actionpoint is named INSPECT2 then… if (node.Name == “INSPECT2”) { //…move the load to Actionpoint ROUTE2 load.MoveTo(“ROUTE2”); } //If the Actionpoint is named ROUTE2 then… if (node.Name == “ROUTE2”) { //Generate a random number from 1 to 5 & if the number equals 3… if (Experior.Core.Environment.Random.Next(1, 5) == 3) //…move the load to Actionpoint REJECT2… load.MoveTo(“REJECT2”); else //…if the number is not equal to 3 move the load to Actionpoint PACK load.MoveTo(“PACK”); } //If the Actionpoint is named REJECT2 then… if (node.Name == “REJECT2”) { //…remove the load from the model/system load.Dispose(); } //If the Actionpoint is named PACK then… if (node.Name == “PACK”) { //…remove the load from the model/system load.Dispose(); } } }   What the code basically does is randomly determine where loads should go if the Action point has more than one destination More advanced controllers can be scripted using Visual Studio. This topic is covered here: Build a Controller When the code has been entered into Experior, press the Compile button to compile the script   Now when the model runs loads, it will act according to the Controller code   Running the Simulation   Introduce loads to the system by selecting the feeder and pressing the Space bar Next, under the Model menu, press the Running Man button so that it turns blue Finally press the Play button to run the model
View full article
Kasper.Vestrup Explorer
‎2026-01-14 05:10 AM

Labels:
  • Exp-6 User Guides
  • Experior 6
69 Views

S7 Functions

The S7 Functions is a protocol to communicate with a Siemens PLC.   Important: The S7-3xx PLCs have a limitation (that cannot be changed) of PDU (Protocol Data Unit) data size 220 bytes. This is the number of bytes that can be read/written in single operation. The most obvious way to overcome this is to add multiple connections if you expect to exceed 220 bytes in length.   In Experior it is possible to allocate more than 220 bytes per connection but data will then be transmitted in fractions of maximum 220 bytes. Allocating 440 bytes on one connection should have same impact on the PLC performance-wise as setting up two connections with 220 bytes allocated on each. In both cases Experior will make two read/write operations.   But it is very important not to have too many unused bytes allocated: If there are some addressees in Experior that are positioned in the address area between 0 and 100 and the next address area of interest to the emulation is in the address area from 300 to 500 then it is important to split into two connections: one connection operating in the area between 0 and 100 and another connection operating in the area from 300 to 500. Unless there will in the current example be three read/write operations instead of only two.   If the length exceeds 220 bytes there will be a notification on the connection icon: It is also important to consider the update internal (see the description of the different properties below): If there are signals that has to be transmitted to the PLC as fast as possible, it is advised that these signals are isolated in a separate connection where only inputs are associated with this connection (like encoder and pulse generator signals). In the same way, if there are signals that does not have to be updated that frequently (like buttons and lamps) it is advised to isolate those signals on a separate connection and then set a higher update interval. Then the PLC have more “time” to answer the request from the connections with a smaller update interval.   Properties Identification Name – Customizable name Id – Customizable Id Address Rack – Number of rack that is being connected to Slot – Number of slot where CPU is located Transmission Bit/Byte Wise – Limited transmission. Changed inputs are only written bit-wise and byte-wise. This avoids interference with memory in the PLC that is allocated for Outputs (enabling this option can slow down transmission speed drastically) Communication IP Address – Type in IP address Update Interval – Measured in milliseconds. Less than 25ms activates fast mode updating Auto Connect – Activate or Deactivate whether Experior should try to automatically connect to the “Device” Memory Allocation (PLC Input) Automatic – Activate or Deactivate automatic memory allocation Source Name – Input – static value, can’t be changed (only available if Automatic = False) Length – Set data length (only available if Automatic = False) Offset – Minimum offset (only available if Automatic = False) Memory Allocation (PLC Output) Automatic – Activate or Deactivate automatic memory allocation Source Name – Output – static value, can’t be changed (only available if Automatic = False) Length – Set data length (only available if Automatic = False) Offset – Minimum offset (only available if Automatic = False)   If you are using a Siemens 1200 or 1500 series PLC, you will need to grant Experior full access through TIA.
View full article
Kasper.Vestrup Explorer
‎2026-01-09 05:32 AM

Labels:
  • Exp-6 Communication Protocols
  • Experior 6
83 Views

Fetch and Write

Fetch/Write is a protocol to communicate with a Siemens PLC. If you are using a Siemens 1200 or 1500 series PLC, you will need to grant Experior full access through TIA.   As part of the basic psychics model example guide, we show how to use the Siemens Fetch and Write protocol  to test the model.   Properties for Fetch Identification Name – Customizable name Id – Customizable Id Communication Port – Port used for communication between Experior and “Device” IP Address – Type in IP address (only available if Mode = Client) Mode – Select “Server” or “Client” Source – Choose the data area to be read from. Options are Flag Area(M), Input(I), Output(Q), Data Block(DB), Counter Cells(C) or Timer Cells(T) Update Interval – Measured in milliseconds. Less than 25ms activates fast mode updating Auto Connect – Activate or Deactivate whether Experior should try to automatically connect to the “Device” Memory Allocation Automatic – Activate or Deactivate automatic memory allocation Length – Set data length (only available if Automatic = False) Offset – Set offset for data (only available if Automatic = False)   Properties for Write Identification Name – Customizable name Id – Customizable Id Communication Port – Port used for communication between Experior and “Device” IP Address – Type in IP address (only available if Mode = Client) Mode – Select “Server” or “Client” Destination – Choose the data area to be written to. Options are Flag Area(M), Input(I), Output(Q), Data Block(DB), Counter Cells(C) or Timer Cells(T) Synchronized – Activate and Deactivate synchronisation Auto Connect – Activate or Deactivate whether Experior should try to automatically connect to the “Device” Memory Allocation Automatic – Activate or Deactivate automatic memory allocation Length – Set data length (only available if Automatic = False) Offset – Set offset for data (only available if Automatic = False)
View full article
Kasper.Vestrup Explorer
‎2026-01-09 05:28 AM

Labels:
  • Exp-6 Communication Protocols
  • Experior 6
120 Views

Ethernet IP – CIP

If Allen Bradley or Omron controllers are being used then Ethernet/IP-CIP needs to be selected from the list of protocols.   Click through to learn how to communicate with Allen Bradley PLCs through the CIP protocol.   Properties Identification Name – Customizable name Id – Customizable Id Communication CPU Slot Number – Enter the slot number of the PLCs CPU Size – Choose between BOOL, SINT, INT and DINT Port – Port used for communication between Experior and “Device” IP Address – Type in IP address (only available if Mode = Client) Mode – Select “Server” or “Client” Auto Connect – Activate or Deactivate whether Experior should try to automatically connect to the “Device”
View full article
Kasper.Vestrup Explorer
‎2026-01-09 05:27 AM

Labels:
  • Exp-6 Communication Protocols
  • Experior 6
132 Views

OPC

It is possible to use an OPC server (Data Access) in conjunction with Experior. Select this option if that is the device being used.   As part of the basic psychics model example guide, we show how to use an OPC Server to test the model.   Properties Identification Name – Customizable name Id – Customizable id Communication Host Name – IP address of the device running the server Server – Allows you select the current running OPC Comms Server
View full article
Kasper.Vestrup Explorer
‎2026-01-09 05:26 AM

Labels:
  • Exp-6 Communication Protocols
  • Experior 6
91 Views

Communications Protocols

This section provides a brief overview of the available Communications Protocols, what they are and how to use and configure them.   To insert a Communications Protocol, right click on the Communications pane and select it from the pop-up context menu.   There are 8 different main communication protocols.   Depending on the supplied Experior license, different low level communication protocols can be set up for use within Experior.   The following 5 protocols are generally used for direct connections to PLCs and allow Experior to use/respond to PLC symbolics, ladder logic code etc.   Siemens (which itself is split down into 2 different protocol types, Fetch & Write – which are generally used together – and S7 Functions) Ethernet/IP – CIP OPC Serial (RAW) Beckhoff ADS   These last 3 protocols are for configuring systems to allow Experior to send and receive system telegrams and messages.   STX/ETX (contains options for configuring Serial and TCP/IP connections) 3964R (contains options for configuring Serial and TCP/IP connections) RFC1006   Auto Connect   Under the Properties for each communications protocol is the option to Auto Connect when the model is loaded.   When set to True the communications protocol will try and automatically connect when the model is loaded.   The Delay property allows the user to define a time for the communications protocol to wait before it tries to automatically connect.  
View full article
Kasper.Vestrup Explorer
‎2026-01-09 05:23 AM

Labels:
  • Exp-6 Communication Protocols
  • Experior 6
238 Views

Advanced Interface Window

Change History Change History contains sequence of assembly work on the scene and allows you to undo/redo previous actions.   Alarms Displays any alarms in the system and the connection they are related to.   Nodes Nodes displays information about action-points in model: Name, if they are on a connected route and whether or not they are visible. Only available in Discrete Events Mode.   Loads Displays information about loads in the system, their route and destination.   Schedule Add timed events to the model, such as Pauses, Resets and Termination events.   Log File Log File displays log information throughout the model runtime.   Routes The Routes window shows the routing for the system. It will show the possible routes for loads moving from action point to action point. This panel is only available in Discrete Events Mode.   Controller Controller allows the user to create custom Controllers for the model. This window is only available in Discrete Events Mode.   Build a Controller   Script The scripting window will only appear in Physics Mode, a similar controller window will appear in Discrete Event Mode.   Script allows you to build script with functionality to support model testing.   Monitor Monitor displays information about I/O assigned to a particular part or parts.   For example, right click on a Motor and select Monitor to display all the I/O related to that motor and watch the states change for the active I/O.   Statistics Statistics displays information about the current number of loads in the system/model.   For example, right click on a sensor and select Observe to add it to the list. This will give you information about the number of loads passing through the sensor.    
View full article
Kasper.Vestrup Explorer
‎2026-01-09 01:05 AM

Labels:
  • Exp-6 Experior
  • Experior 6
127 Views

Experior 7 - API

Due to our move from a self hosted webpage to the following community structure, the API documentation is now available as static html files you need to download attached file, unzip and then open any one of the html files in the folder.
View full article
Kasper.Vestrup Explorer
‎2026-01-15 06:21 AM

on ‎2026-01-15 06:21 AM

Labels:
  • Exp-7 Developer
  • Experior 7
409 Views

Build a Controller

Step 1:   Make a C# project where the main class extends the Experior.Core.Controller or Experior.Core.Logic class. Experior.Core.Controller is for making controllers that interacts with a model running in the discrete event engine and Experior.Core.Logic is for controllers interacting with a model running in the physics engine.     Step 2:   To start Experior directly within Visual Studio set Start external program. Then you can insert break points in the controller code and debug the source code.     Step 3:   Make sure the output path is the same as Experior     Step 4:     Now build the model you want to control and link the compiled controller with the model.   You can add multiple controllers disable/enable a linked controller or unload an existing controller.  
View full article
Kasper.Vestrup Explorer
‎2026-01-15 05:59 AM

on ‎2026-01-15 05:59 AM

Labels:
  • Exp-6 Developer Guide
  • Experior 6
268 Views

Load class

Loads in Experior are used to model pallets, boxes, bags, that are transported by material handling equipment like conveyors and lifts.   The main namespace for loads is Experior.Core.Loads and the Experior.Core.Loads.Load contains some factory methods for creating loads with different load types.   The Experior.Core.Loads.Load class derives from the RigidPart class and hence inherits a lot of its interaction with the PhysX engine from it.   Note that there are some important differences related to loads depending on whether Experior is running in physics mode or discrete mode. In physics mode a load is considered a dynamic object (unless you disable the load or make it Kinematic). This implies that the position of the load and its orientation is determined by the underlying nVidia Physx engine who calculates this by applying all the forces/torques on it. In discrete mode no physics engine is used. There it is important to know that, unless a load is made undeletable, it will always be on a Route (Experior.Core.Routes.Route) or an Action Point (Experior.Core.Routes.ActionPoint). So, by default, if a load is no longer on a Route/Action Point then it will be deleted by the underlying engine.   Below we will illustrate a set of the main methods/properties of the Experior.Core.Loads.Load class.   Some methods/properties related to the interaction of the loads with the physics engine Sleep(): This is used in the physics mode to make the load unresponsive to the physics engine. The load will no longer respond to the forces applied to it. Note that you can WakeUp/Enable a load by clicking on it in the working area.   WakeUp(): This is used in the physics mode to “wakeup” a sleeping load and make it respond again to the physics engine. The load will again respond to the forces applied to it.   Vector3 CenterOfMassOffsetLocalPosition: When the physics engine applies a force to a load to make it moving it applies this force into the center of mass of a load. By default a loads density is equally distributed over the whole volume of the load and hence the center of mass of the load is also the geometrical center of the load. By providing the CenterOfMassOffsetLocalPosition you make it possible to move this center of mass and e.g. put the center of mass lower than the geometrical center to decrease the collapsing of a load.   NOTE: The value provided to this property is an absolute value. The CenterOfMassOffsetLocalPosition property provided in the property window of a feed is a relative one where 1 represents 100%.   Example and illustration. In the example below the CenterOfMassOffsetLocalPosition of the loads with dimensions (0.5f,0,5f,0.5f) is set to (0, -0.2f, 0) when the load enters a sensor: So the force will be applied 200mm below the geometrical center of the load. myLoad.CenterOfMassOffsetLocalPosition = new Vector3(0, -0.2f, 0);   You can clearly see that the force on the load is applied lower than before it entered the sensor.   bool Gravity: This indicates whether a load is subject to gravitational force. If you set it to false a load will not fall, but will remain subject to other forces like the force applied to it on a conveyor.   float Density: This represents the (uniform) density of the load. It is used to calculate the weight of the load ( Volume calculates as length times width times height multiplied with the Density).   bool Embedded: This indicates whether the load is embedded in another entity and hence whether it should be saved when saving the model. When the Embedded property is true the load is not saved. (In discrete mode loads are never saved).   bool Enabled: Setting Enabled to false is similar to calling Sleep() and setting Enabled to True is similar to calling WakeUp().   bool Kinematic: By default a load is a dynamic object by the PhysX engine which implies that its position and orientation will be determined by the physics engine by calculating all forces/torques applied to the load. By setting the Kinematic property to true, the load is made a kinematic object instead of a dynamic one. This implies that the load will no longer respond to the forces applied to it and the position and orientation of the load is controlled by the user. (Using the Methods/properties related to positioning of a load described below).   bool Rigid: Returns true when the load is a rigid body for the PhysX engine.   bool Sleeping : Returns true when the load has been “put to sleep” and is longer taken into account by the physics engine.   DeSelect(): Deselects the load.   Select(): Selects the load. The properties of the load will be shown in the properties window and the load will get the Select color.   HighLight(Color color): Highlights the load by changing the highlight color to the given color. This is only a temporary change. When the load is UnHighLighted is restores its original color (given by the Color property.   UnHighLight(). UnHighlights the load, as a result it will get the color back as defined by the Color property.   Color Color: Returns/sets the normal color of the load (when not selected or highlighted).   bool Selectable: Indicates whether a load can be selected by the user. If you set this property to False the user will not be able to select the load.   bool Selected: Returns True when the load is currently selected, False otherwise.   bool Transparent: Returns True when the color of the load is transparent.   Methods/properties related to deleting of a load Dispose(): Called when deleting the load   bool Deletable : Property to indicate whether the load can be deleted. If this property is set to False, trying to delete the load will fail (e.g. when resetting the model, which normally deletes all loads in the model)   bool UserDeletable: Property to indicate whether the user can delete the load (e.g.by selecting it and pressing the Delete button)   event DisposeEvent OnDisposed : This event is called when the load is completely disposed (deleted)   event DisposeEvent OnDisposing : This event is called beginning to dispose a load   Methods/properties related to grouping/deleting of a load Remark: In discrete mode the grouping/ungrouping of loads happens instantaneously and immediately after calling the Group/UnGroup methods the grouped load or ungrouped loads are available. Due to the nature of the physics engine this is postponed until the physics engine has finished its cycle of applying forces to loads. So in physics mode the grouped load is available when the OnGrouped event is raised.   Group(List<Load> loads): The current load will be grouped with all loads from the given list. They loads are grouped at their current relative position and the current load becomes the master load.   Group(Load load): The current load will be grouped with the given load. Both loads keep their relative position.   Group(Load load, Vector3 localposition): The given load will be grouped with the current load. It will be positioned given the relative position.    Group(List<Load> loads, List<Vector3> positions, List<Matrix> orientations): The given load is grouped with all loads from the given list of loads. Each load of the list is positioned according to the given relative position as provided in the positions list and with the orientation as described in the given orientations list of orientation matrices.   Group(Load load, Vector3 localposition, Matrix localorientation): The given load will be grouped with the current load. It will be positioned given the relative position and with the relative orientation as defined in the given orientation matrix.   Group(Load load, Vector3 localposition, float localyaw, float localpitch, float localroll): The given load will be grouped with the current load. It will be positioned given the relative position and with the relative orientation as defined by the relative Euler angles : localyaw, localpitch, localroll.   UnGroup(List<Load> loads): ungroups all loads from the given list of loads from the current load (masterload).   UnGroup(int loads): this will ungroup the given amount of loads from the current load. If the given number is larger then the total number of grouped loads it will ungroup all of them. If the number is smaller it will ungoup the given amount. The sequence of ungrouping is as follows: the last one grouped will be ungrouped first.   UnGroup(Load load): UnGroups the given load from the current load (masterload).   UnGroup(): UnGroups all loads that form the current load (masterload).   Collection Grouped: Returns the collection of loads that are grouped with the current load (the masterload). The Grouped collection allows to request the Length, Width, Height of the combined grouped load and you can iterate over all slave loads using the Items property of the Grouped property of the master load.   bool IsGrouped: Returns true for a load that has been grouped with a masterload. The materload itself will return false for this IsGrouped property.   event GroupedEvent OnGrouped: Is called when the load has been grouped. (See remark above concerning physics/discrete mode). The delegate has as argument the sender (masterload) and the result.   Below you find an example and screenshots of grouping: int createdloads=1;int totalnumber=10; Core.Resources.Mesh mesh=Common.Meshes.Get("Tote_Red"); Load ld1 = Load.Create(mesh, Length, Height, Width); ld1.Switch(linkedactionpoint); while (createdloads < totalnumber) { // create 4 more loads of given mesh and group them Load ld = Load.Create(mesh, Length, Height, Width); ld1.Group(ld,new Vector3(0,(Height-0.01f)*createdloads,0));//have totes slightly overlap // ld1.Group(ld,new Vector3(0,(Height+0.05f)*createdloads,0)) // create empty space between loads createdloads++; }   Above example results in the following stacks of totes being created depending whether we had loads overlapping or with empty space between them: Example of iterating over the grouped loads:   Experior.Core.Environment.Log.Write("Total dimensions are " + ld1.Grouped.Length + "; " + ld1.Grouped.Height + "; " + ld1.Grouped.Width); foreach (Load grl in ld1.Grouped.Items) { Experior.Core.Environment.Log.Write(" " + grl.Length + "; " + grl.Height + "; " + grl.Width); }   Methods/properties related to movement of a load in discrete mode MoveTo(string destination): This method will initiate a load traveling on its current route to the actionpoint with the name equal to the given destination. If the destination actionpoint is not reachable through routes connected to the current route then a message will be logged :  ‘Can’t continue: “destination” is unreachable (“current actionpoint name“)’   MoveTo(string source, string destination): This method will initiate a load traveling on its current route from the source actionpoint to the actionpoint with the name equal to the given destination.   Release(): This method will release a load that is stopped.   Release(float delay): This method will release a load that is stopped after the given delay has passed. The delay is given in seconds.   Stop(): This method will stop a load on its Route/ActionPoint. The load will wait there until it is released.   Switch(Route to): This method  will instantaneously take the load and put it at the start of the given route.   Switch(Route to, float distance): This method  will instantaneously take the load and put it at the given distance from the start of the given route.   Switch(Route to, bool keepGlobalOrientation): This method  will instantaneously take the load and put it at the start of the given route. When the keepGlobalOrientation argument is true than the load will keep its current global orientation (Yaw, Pitch, Roll), otherwise it will use the properties of the route.   Switch(Route to, float distance, bool keepGlobalOrientation): This method  will instantaneously take the load and put it at the given distance from the start of the given route. When the keepGlobalOrientation argument is true than the load will keep its current global orientation (Yaw, Pitch, Roll), otherwise it will use the properties of the route.   Switch(string actionpoint, bool keepGlobalOrientation): This method will put the load on the actionpoint with the given name.When the keepGlobalOrientation argument is true than the load will keep its current global orientation (Yaw, Pitch, Roll), otherwise it will use the properties of the actionpoint. If no actionpoint can be found with the given name the call is ignored.   Switch(ActionPoint ap, bool keepGlobalOrientation): this method will put the load on the given actionpoint. When the keepGlobalOrientation argument is true than the load will keep its current global orientation (Yaw, Pitch, Roll), otherwise it will use the properties of the actionpoint. In the illustrations below you can see the difference between switching a load (to AP6) with the keepGlobalOrientation argument true or false:       Switch(string actionpoint): This method will put the load on the actionpoint with the given name. If no actionpoint can be found with the given name the call is ignored.   Switch(ActionPoint ap, ActionPoint.Edges edge): This method will put the load on the actionpoint. The edge argument has 3 possible values ActionPoint.Edges.Leading, ActionPoint.Edges.Trailing and the defaultActionPoint.Edges.Center. If its value is Edges.Trailing then the load will be put on the actionpoint in such a way that the position of the actionpoint matches the trailing back of the load. If its value is Edges.Leading then the load will be put on the actionpoint in such a way that the position of the actionpoint matches the leading front of the load.   Note: This assumes that there is sufficient room on the route to do the switch, meaning that the center of the load should be on the route. Suppose you have an ActionPoint at the start of a route. In that case it is only possible to do the switch with edge ActionPoint.Edges.Center or ActionPoint.Edges.Trailing because using ActionPoint.Edges.Leading implies that the center of the load would not fit on the route.   Switch(ActionPoint ap): This method will put the load on the given actionpoint.   ActionPoint ActionPoint: This getter property returns the current actionpoint of the load or null if the load is on a route and not at an actionpoint.   string GoTo: This property allows to get of the name of the current final destination actionpoint. By setting this property to the name of an actionpoint the load will set it as its final destination and travel towards it.   Vector3 RouteOffset: Normally a load travels on the route with the center of the load moving over the route. By using the RouteOffset property you can chnage this and have the center of the load moving at the given relative position from the route.   Below you see an illustration of loads moving where load.RouteOffset = new Vector3(1.2f, 0.3f, 0f);   bool Stopped: This getter property returns True when the load is currently stopped, False otherwise.   float WaitingTime: Setting this property makes a load wait at its current position. The waiting time is provided in seconds. When this waiting time is elapsed the load will trigger the FinishedWaiting event and continue.   FinishedWaiting FinishedWaitingEvent: This event is triggered by a load when its WaitingTime has elapsed.   Methods/properties related to attaching a load to a RigidPart public bool IsAttached: This getter property returns true when the load is currently attached to a RigidPart and hence if following the movement of this part.   event AttachedEvent OnUnAttached: This event is triggered when the load gets unattached of the RigidPart it was attached to.   event AttachedEvent OnAttached: This event is triggered when the load gets attached to a RigidPart was attached to.   Attaching loads is done using one of the Attach methods of the Experior.Core.Parts.RigidPart class.   Custom Data object UserData: The developer can add custom data to a load by using this UserData property. E.g you can create you own TransportOrder class containing data from the WMS like PurchaseOrder,Customer, Source, Destination, DueDate,… and attach it to the load: myload.UserData = aTransportOrder;   You can inspect the data again by casting the UserData back to the class it was given: string customer = (myload.UserData as TransportOrder).Customer;   Methods/properties related to prositioning of a load float Yaw: This getter/setter property reflects the rotation angle (in radians) of the load around the Y-axis   float Pitch: This getter/setter property reflects the rotation angle (in radians) of the load around the X-axis   float Roll: This getter/setter property reflects the rotation angle (in radians) of the load around the Z-axis   Vector3 Position: This property returns the global 3 dimensional coordinates of the center of the load. In the physics mode the position is determined by the physics engine or its movement on tracks and in discrete mode by its movement on the routes. When the load is made Kinematic or Disabled then it makes sense to directly set the position of the load.   Matrix Orientation: This property returns or sets the orientation of the load as defined in the Microsoft.DirectX.Matrix structure.   Translate(Vector3 distance, float time): This will translate a stopped load over the given vector during the given time. After the given time the load remains at its position after the translation until it is released. In case the load continues moving on a route it will jump back to its position on the route. So note that the load should not be moving on a route when calling this translate method otherwise you get some strange wave movement during the given time where the load is trying to translate over the given vector but is pulled back by it having to move on the route.   Translate(Action action, Vector3 distance, float time): This method is similar to the Translate method above except that at the end of the translation of the load over the given vector distance the given action will be executed. The given System.Action is a delegate that you can use to pass a method as a parameter without explicitly declaring a custom delegate. The encapsulated method must correspond to the method signature that is defined by this delegate.This means that the encapsulated method must have no parameters and no return value.   In the example below a load is translated over 3 meter in the Y-direction in 2 seconds and at the end of the movement the load is switched to actionpoint  “AP10” and then released : currentload.Translate(()=>SwitchToAP10(), new Vector3(0, 3.0f, 0), 2f);   where: public void SwitchToAP10() { if(currentload != null) { currentload.Switch("AP10"); currentload.Release(); } }
View full article
Kasper.Vestrup Explorer
‎2026-01-15 05:55 AM

on ‎2026-01-15 05:55 AM

Labels:
  • Exp-6 Developer Guide
  • Experior 6
190 Views

Extending the GUI with a Plugin

A plugin can be used to add custom functionality to Experior and you can also use it to extend the GUI by adding menu items and/or adding your own forms. A plugin is a dll that will be automatically loaded by Experior (provided the dll can be found in the installation directory of Experior). You can create your own plugin by creating a separate Visual Studio project where your plugin class derives from Experior.Core.Plugin.    Toolbar.Button To extend the GUI you can create a Button (Core.Environment.UI.Toolbar.Button) and add it to a toolbar.   In the example below a button is created and added to Model Toolbar in a Tab with name TestPlugin : Core.Environment.UI.Toolbar.Button IOButton = new Core.Environment.UI.Toolbar.Button("SensorOutputs", btnIOToggle_Click); IOButton.Tooltip = "Show outputs from sensors"; // add the button to the Model toolbar in a Tab with name "TestPlugin" Core.Environment.UI.Toolbar.Add(IOButton, "TestPlugin");   This will look as follows:   When the example SensorOutputs button is clicked it will trigger the associated btnIOToggle_Click method.   In this example this will update a custom form.   Experior.Core.Forms.Form Experior allows to add your own forms. You create your form similar to a normal System.Windows.Forms.Form.   However if you want to have a form that behaves similar to other Experior forms and is dockable, the created form should derive from Experior.Core.Forms.Form instead.   Also the FormType property has to be overridden. public override Core.Forms.Docking.DockContent.FormTypes FormType { get { return Core.Forms.Docking.DockContent.FormTypes.Permanent; } }   In attached example is a custom form that contains a datagrid will info of all Outputs for the sensors in your model. The form looks as follows when it is docked:   You can download the complete plugin attached to this article
View full article
Kasper.Vestrup Explorer
‎2026-01-15 05:47 AM

on ‎2026-01-15 05:47 AM

Labels:
  • Exp-6 Developer Guide
  • Experior 6
143 Views
  • « Previous
    • 1
    • 2
    • 3
    • …
    • 8
  • Next »
To The Top!

Forums

  • APC UPS Data Center Backup Solutions
  • EcoStruxure IT
  • EcoStruxure Geo SCADA Expert
  • Metering & Power Quality
  • Schneider Electric Wiser

Knowledge Center

Events & webinars

Ideas

Blogs

Get Started

  • Ask the Community
  • Community Guidelines
  • Community User Guide
  • How-To & Best Practice
  • Experts Leaderboard
  • Contact Support

    Ask our Experts

    Have a question related to our products, solutions or services? Get quick support on community Forums

    Email Us

    For Community platform-related support, please email us

Subscribing is a smart move!
You can subscribe to this board after you log in or create your free account.
Forum-Icon

Create your free account or log in to subscribe to the board - and gain access to more than 10,000+ support articles along with insights from experts and peers.

Register today for FREE

Register Now

Already have an account? Login

Terms & Conditions Privacy Notice Change your Cookie Settings © 2026 Schneider Electric

Welcome!

Welcome to your new personalized space.

of

Explore