diff --git a/C#/Benchtop/UDXC/App.config b/C#/Benchtop/UDXC/App.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/C#/Benchtop/UDXC/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/C#/Benchtop/UDXC/Program.cs b/C#/Benchtop/UDXC/Program.cs
new file mode 100644
index 0000000..0cbe8f4
--- /dev/null
+++ b/C#/Benchtop/UDXC/Program.cs
@@ -0,0 +1,176 @@
+// Title: UDXC
+// Created Date: 10/27/2025
+// Last Modified Date: 10/27/2025
+// .NET Framework version: 4.8.2
+// Thorlabs DLL version: Kinesis 1.14.56
+// Example Description:
+// This example demonstrates how to set-up the communication for the Thorlabs UDXC Benchtop controllers.
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Timers;
+using Thorlabs.MotionControl.Benchtop.PiezoCLI.UDXC;
+using Thorlabs.MotionControl.DeviceManagerCLI;
+
+namespace UDXC_CSharp
+{
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ // Uncomment this line (and SimulationManager.Instance.UninitializeSimulations() at the end on Main)
+ // If you are using a simulated device
+ // SimulationManager.Instance.InitializeSimulations();
+
+ // Enter the serial number for your device
+ string serialNo = "122000001";
+
+ try
+ {
+ // Tell the device manager to get the list of all devices connected to the computer
+ DeviceManagerCLI.BuildDeviceList();
+ }
+ catch (Exception ex)
+ {
+ // An error occurred - see ex for details
+ Console.WriteLine("Exception raised by BuildDeviceList {0}", ex);
+ Console.ReadKey();
+ return;
+ }
+
+ // Get available UDXC and check out serial number is correct - by using the device prefix
+ // (i.e. for serial number 122000123, the device prefix is 122)
+ List serialNumbers = DeviceManagerCLI.GetDeviceList(InertialStageController.DevicePrefix_UDXC);
+ if (!serialNumbers.Contains(serialNo))
+ {
+ // The requested serial number is not a UDXC or is not connected
+ Console.WriteLine("{0} is not a valid serial number", serialNo);
+ Console.ReadKey();
+ return;
+ }
+
+ // Create the device
+ InertialStageController device = InertialStageController.CreateInertialStageController(serialNo);
+ if (device == null)
+ {
+ // An error occured
+ Console.WriteLine("{0} is not a UDXC Controller", serialNo);
+ Console.ReadKey();
+ return;
+ }
+
+ // Open a connection to the device.
+ try
+ {
+ Console.WriteLine("Opening device {0}", serialNo);
+ device.Connect(serialNo);
+ }
+ catch (Exception)
+ {
+ // Connection failed
+ Console.WriteLine("Failed to open device {0}", serialNo);
+ Console.ReadKey();
+ return;
+ }
+
+ // Wait for the device settings to initialize - timeout 5000ms
+ if (!device.IsSettingsInitialized())
+ {
+ try
+ {
+ device.WaitForSettingsInitialized(5000);
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Settings failed to initialize");
+ }
+ }
+
+ // Display info about device
+ DeviceInfo deviceInfo = device.GetDeviceInfo();
+ Console.WriteLine("Device {0} = {1}", deviceInfo.SerialNumber, deviceInfo.Name);
+
+ // Start the device polling
+ // The polling loop requests regular status requests to the motor to ensure the program keeps track of the device.
+ device.StartPolling(200);
+ // Needs a delay so that the current enabled state can be obtained
+ Thread.Sleep(500);
+ // Enable the device otherwise any move is ignored
+ device.EnableDevice();
+ // Needs a delay to give time for the device to be enabled
+ Thread.Sleep(500);
+
+ // Call GetUDXCConfiguration on the device to initialize the settings
+ UDXCConfiguration udxcConfiguration = device.GetUDXCConfiguration(serialNo, DeviceConfiguration.DeviceSettingsUseOptionType.UseDeviceSettings);
+ UDXCSettings currentDeviceSettings = UDXCSettings.GetSettings(udxcConfiguration);
+ device.SetSettings(currentDeviceSettings, true, true);
+
+ // Performance Optimize
+ device.PulseParamsAcquireStart();
+ Thread.Sleep(500);
+ Console.WriteLine("Optimizing performance, please wait...");
+ // When IsPulseParamsAcquired is true, it indicates the optimization has finished
+ while (device.Status.IsPulseParamsAcquired == false)
+ Thread.Sleep(500);
+
+ //Home the stage - timeout 60000ms
+ Console.WriteLine("Home the device");
+ device.Home(60000);
+
+ //Optionally move the stage to target position (position is set in "nm")
+ int closeLoopPosition = 0;
+ if (closeLoopPosition != 0)
+ {
+ // Set the target position
+ device.SetClosedLoopTarget(closeLoopPosition);
+
+ // Get and Set the velocity and acceleration
+ UDXCClosedLoopParams closedLoopParams = device.GetClosedLoopParameters();
+ closedLoopParams.RefSpeed = 10000000; // velocity is set in nm/s
+ closedLoopParams.Acceleration = 10000000; // acceleration is set in nm/s^2
+ device.SetClosedLoopParameters(closedLoopParams);
+
+ try
+ {
+ // Move the stage
+ device.MoveStart();
+ Console.WriteLine("Moving the device to {0} nm", closeLoopPosition);
+
+ // Monitor the position
+ int posCheckCnt = 0, newPos = 0;
+ for(int i = 0; i < 100; i++)
+ {
+ newPos = device.GetCurrentPosition();
+ if (Math.Abs(closeLoopPosition - newPos) < 6000)
+ if (posCheckCnt > 3)
+ break;
+ else
+ {
+ Thread.Sleep(200);
+ posCheckCnt++;
+ }
+ else
+ Thread.Sleep(200);
+ }
+
+ // Print the current position
+ Console.WriteLine("Device moved to {0} nm", newPos);
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Fail to move to the position");
+ }
+ }
+
+ // Tidy up and exit
+ device.StopPolling();
+ device.Disconnect(true);
+ Console.WriteLine("Program finished");
+
+ // Uncomment this line if you are using Simulations
+ // SimulationManager.Instance.UninitializeSimulations();
+ Console.ReadKey();
+ }
+ }
+}
diff --git a/C#/Benchtop/UDXC/Properties/AssemblyInfo.cs b/C#/Benchtop/UDXC/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..01640e8
--- /dev/null
+++ b/C#/Benchtop/UDXC/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("UDXC CSharp")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("UDXC CSharp")]
+[assembly: AssemblyCopyright("Copyright © 2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("8a27c61f-7728-462f-9607-2628bdaaa99e")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/C#/Benchtop/UDXC/UDXC CSharp.csproj b/C#/Benchtop/UDXC/UDXC CSharp.csproj
new file mode 100644
index 0000000..31356f4
--- /dev/null
+++ b/C#/Benchtop/UDXC/UDXC CSharp.csproj
@@ -0,0 +1,66 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {8A27C61F-7728-462F-9607-2628BDAAA99E}
+ Exe
+ UDXC_CSharp
+ UDXC CSharp
+ v4.7.2
+ 512
+ true
+ true
+
+
+ x64
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ false
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+ False
+ bin\Debug\Thorlabs.MotionControl.Benchtop.PiezoCLI.dll
+
+
+ False
+ bin\Debug\Thorlabs.MotionControl.DeviceManagerCLI.dll
+
+
+ False
+ bin\Debug\Thorlabs.MotionControl.GenericPiezoCLI.dll
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/C#/Benchtop/UDXC/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs b/C#/Benchtop/UDXC/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
new file mode 100644
index 0000000..3871b18
--- /dev/null
+++ b/C#/Benchtop/UDXC/obj/Debug/.NETFramework,Version=v4.7.2.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
diff --git a/C#/Benchtop/UDXC/obj/Debug/UDXC CSharp.csproj.FileListAbsolute.txt b/C#/Benchtop/UDXC/obj/Debug/UDXC CSharp.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..da4a7f9
--- /dev/null
+++ b/C#/Benchtop/UDXC/obj/Debug/UDXC CSharp.csproj.FileListAbsolute.txt
@@ -0,0 +1,13 @@
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\bin\Debug\UDXC CSharp.exe.config
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\bin\Debug\UDXC CSharp.exe
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\bin\Debug\UDXC CSharp.pdb
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\obj\Debug\UDXC CSharp.csproj.AssemblyReference.cache
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\obj\Debug\UDXC CSharp.csproj.CoreCompileInputs.cache
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\obj\Debug\UDXC CSharp.exe
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\obj\Debug\UDXC CSharp.pdb
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\bin\Debug\Thorlabs.MotionControl.PrivateInternal.dll
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\bin\Debug\Thorlabs.MotionControl.Tools.Common.dll
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\bin\Debug\Thorlabs.MotionControl.Tools.Logging.dll
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\bin\Debug\Thorlabs.MotionControl.Tools.WPF.dll
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\obj\Debug\UDXC CSharp.exe.config
+C:\Users\zizhang\OneDrive - THORLABS Inc\Documents\4. SW Project\UDXC\UDXC CSharp\obj\Debug\UDXC CSh.3079E5E8.Up2Date
diff --git a/C#/Benchtop/UDXC/obj/Debug/UDXC CSharp.exe.config b/C#/Benchtop/UDXC/obj/Debug/UDXC CSharp.exe.config
new file mode 100644
index 0000000..56efbc7
--- /dev/null
+++ b/C#/Benchtop/UDXC/obj/Debug/UDXC CSharp.exe.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/C++/Benchtop/UDXC/Required DLLs.txt b/C++/Benchtop/UDXC/Required DLLs.txt
new file mode 100644
index 0000000..22a7e07
--- /dev/null
+++ b/C++/Benchtop/UDXC/Required DLLs.txt
@@ -0,0 +1,4 @@
+Thorlabs.MotionControl.DeviceManager.dll
+Thorlabs.MotionControl.Benchtop.Piezo.dll
+Thorlabs.MotionControl.Benchtop.Piezo.UDXC.h
+Thorlabs.MotionControl.Benchtop.Piezo.lib
\ No newline at end of file
diff --git a/C++/Benchtop/UDXC/Thorlabs.MotionControl.Benchtop.Piezo.UDXC.h b/C++/Benchtop/UDXC/Thorlabs.MotionControl.Benchtop.Piezo.UDXC.h
new file mode 100644
index 0000000..7c74e4f
--- /dev/null
+++ b/C++/Benchtop/UDXC/Thorlabs.MotionControl.Benchtop.Piezo.UDXC.h
@@ -0,0 +1,855 @@
+#pragma once
+
+#ifdef BENCHPIEZODLL_EXPORTS
+#define BENCHPIEZO_API __declspec(dllexport)
+#else
+#define BENCHPIEZO_API __declspec(dllimport)
+#endif
+
+#include
+
+/** @defgroup BenchtopPiezoUDXC Benchtop Piezo UDXC
+ * This section details the Structures and Functions relavent to the @ref UDXC_page "UDXC"
+ * For an example of how to connect to the device and perform simple operations use the following links:
+ *
+ * - \ref namespaces_pdxc2_ex_1 "Example of using the Thorlabs.MotionControl.Benchtop.Piezo.DLL from a C or C++ project."
+ * This requires the DLL to be dynamical linked.
+ * - \ref namespaces_pdxc2_ex_2 "Example of using the Thorlabs.MotionControl.Benchtop.Piezo.DLL from a C# project"
+ * This uses Marshalling to load and access the C DLL.
+ *
+ * The Thorlabs.MotionControl.Benchtop.Piezo.DLL requires the following DLLs
+ *
+ * - Thorlabs.MotionControl.DeviceManager.
+ *
+ * @{
+ */
+
+extern "C"
+{
+ /// \cond NOT_MASTER
+ /// Values that represent FT_Status.
+ typedef enum FT_Status : short
+ {
+ FT_OK = 0x00, /// Values that represent THORLABSDEVICE_API.
+ typedef enum MOT_MotorTypes
+ {
+ MOT_NotMotor = 0,
+ MOT_DCMotor = 1,
+ MOT_StepperMotor = 2,
+ MOT_BrushlessMotor = 3,
+ MOT_CustomMotor = 100,
+ } MOT_MotorTypes;
+
+ /// Information about the device generated from serial number.
+#pragma pack(1)
+ typedef struct TLI_DeviceInfo
+ {
+ /// The device Type ID, see \ref C_DEVICEID_page "Device serial numbers".
+ DWORD typeID;
+ /// The device description.
+ char description[65];
+ /// The device serial number.
+ char serialNo[16];
+ /// The USB PID number.
+ DWORD PID;
+
+ /// true if this object is a type known to the Motion Control software.
+ bool isKnownType;
+ /// The motor type (if a motor).
+ ///
+ /// - MOT_NotMotor0
+ /// - MOT_DCMotor1
+ /// - MOT_StepperMotor2
+ /// - MOT_BrushlessMotor3
+ /// - MOT_CustomMotor100
+ ///
+ MOT_MotorTypes motorType;
+
+ /// true if the device is a piezo device.
+ bool isPiezoDevice;
+ /// true if the device is a laser.
+ bool isLaser;
+ /// true if the device is a custom type.
+ bool isCustomType;
+ /// true if the device is a rack.
+ bool isRack;
+ /// Defines the number of channels available in this device.
+ short maxChannels;
+ } TLI_DeviceInfo;
+
+ /// Structure containing the Hardware Information.
+ /// Hardware Information retrieved from tthe device.
+ typedef struct TLI_HardwareInformation
+ {
+ /// The device serial number.
+ /// The device serial number is a serial number,
starting with 2 digits representing the device type
and a 6 digit unique value.
+ DWORD serialNumber;
+ /// The device model number.
+ /// The model number uniquely identifies the device type as a string.
+ char modelNumber[8];
+ /// The type.
+ /// Do not use this value to identify a particular device type. Please use typeID for this purpose.
+ WORD type;
+ /// The device firmware version.
+ DWORD firmwareVersion;
+ /// The device notes read from the device.
+ char notes[48];
+ /// The device dependant data.
+ BYTE deviceDependantData[12];
+ /// The device hardware version.
+ WORD hardwareVersion;
+ /// The device modification state.
+ WORD modificationState;
+ /// The number of channels the device provides.
+ short numChannels;
+ } TLI_HardwareInformation;
+
+ /// The Piezo Control Modes.
+ /// \ingroup Common
+ //typedef enum PZ_ControlModeTypes : short
+ //{
+ // PZ_Undefined = 0, /// Values that represent Travel Modes.
+ enum MOT_TravelDirection : short
+ {
+ MOT_TravelDirectionDisabled = 0x00,/// Values that represent Piezo Jog Mode.
+ enum PZ_JogModes : unsigned __int16
+ {
+ /// An enum constant representing the jog continuous option.
+ JogContinuous = 0x01,
+ /// An enum constant representing the jog step option.
+ JogStep = 0x02,
+ };
+ /// \endcond
+
+ // UDXC Jog parameters.
+ BENCHPIEZO_API typedef struct
+ {
+ /// The jog mode
+ PZ_JogModes JogMode;
+ /// Size of the open loop jog step.
+ __int32 OpenLoopStepSize;
+ /// The open loop jog rate.
+ __int32 OpenLoopStepRate;
+ /// The open loop jog acceleration.
+ __int32 OpenLoopAcceleration;
+ /// Size of the closed loop jog step.
+ __int32 ClosedLoopStepSize;
+ /// The closed loop speed.
+ __int32 ClosedLoopSpeed;
+ /// The closed loop jog acceleration.
+ __int32 ClosedLoopAcceleration;
+ } UDXC_JogParameters;
+
+ /// \cond NOT_MASTER
+ /// Values that represent Output Amplitude parameters .
+ enum PZ_AmpOutMode : unsigned __int16
+ {
+ /// use one output to control stage forward and backward.
+ BothDirections = 0x01,
+ /// use one output to control stage forward,another to control backward.
+ OneOutputPerDirection = 0x02,
+ };
+
+ /// Structure containing stage axis parameters.
+ /// The stage parameters for one axis.
+ typedef struct
+ {
+ /// Two digit identifier of stage type.
+ WORD stageID;
+ /// 0 for x axis, 1 for y axis or 2 for z axis.
+ WORD axisID;
+ /// Catalogue part number.
+ char partNumber[16];
+ /// Eight digit serial number.
+ DWORD serialNumber;
+ /// Encoder counts per mm or degree.
+ DWORD countsPerUnit;
+ /// Minimum position in encoder counts usually 0.
+ int minPosition;
+ /// Maximum position in encoder counts.
+ int maxPosition;
+ /// Maximum acceleration in encoder counts per cycle per cycle.
+ int maxAcceleration;
+ /// Maximum deceleration in encoder counts per cycle per cycle.
+ int maxDeceleration;
+ /// Maximum speed in encoder counts per cycle.
+ int maxVelocity;
+ /// reserved.
+ WORD reserved1;
+ /// reserved.
+ WORD reserved2;
+ /// reserved.
+ WORD reserved3;
+ /// reserved.
+ WORD reserved4;
+ /// reserved.
+ DWORD reserved5;
+ /// reserved.
+ DWORD reserved6;
+ /// reserved.
+ DWORD reserved7;
+ /// reserved.
+ DWORD reserved8;
+ } PZ_StageAxisParameters;
+ /// \endcond
+
+ /// Values that represent Trigger Modes.
+ enum UDXC_TriggerModes : unsigned __int16
+ {
+ /// Manual mode, no external triggering.
+ Manual = 0x00,
+ /// Analog input with rising trigger edge mode.
+ AnalogRising = 0x01,
+ /// Analog input with falling trigger edge mode.
+ AnalogFalling = 0x02,
+ /// Fixed step distance with rising trigger edge mode.
+ FixedStepRising = 0x03,
+ /// Fixed step distance with falling trigger edge mode.
+ FixedStepFalling = 0x04,
+ /// Two Fixed positions with rising trigger edge mode.
+ TwoPositionRising = 0x05,
+ /// Two Fixed positions with falling trigger edge mode.
+ TwoPositionFalling = 0x06,
+ };
+
+ /// UDXC Closed Loop Parameters.
+ typedef struct
+ {
+ /// Reference Speed for the stage.
+ unsigned __int32 RefSpeed;
+ /// The proportional component.
+ unsigned __int32 Proportional;
+ /// The integral component.
+ unsigned __int32 Integral;
+ /// The differential component.
+ unsigned __int32 Differential;
+ /// The acceleration.
+ unsigned __int32 Acceleration;
+ } UDXC_ClosedLoopParameters;
+
+ /// UDXC Status struct.
+ typedef struct
+ {
+ /// The current position in nm
+ __int32 Position;
+ /// Unused data (structure is based on MGMSG_PZMOT_GET_STATUSUPDATE)
+ __int32 Unused;
+ /// Status Bits
+ __int32 StatusBits;
+ } UDXC_Status;
+
+ /// UDXC Trigger Params Struct.
+ typedef struct
+ {
+ /// The rising edge fixed step in nm
+ __int32 RiseFixedStep;
+ /// The falling edge fixed step in nm
+ __int32 FallFixedStep;
+ /// The rising edge fixed position 1
+ __int32 RisePosition1;
+ /// The falling edge fixed position 1
+ __int32 FallPosition1;
+ /// The rising edge fixed position 2
+ __int32 RisePosition2;
+ /// The falling edge fixed position 2
+ __int32 FallPosition2;
+ /// The analog input gain
+ float AnalogInGain;
+ /// The analog input offset
+ float AnalogInOffset;
+ /// The analog output gain
+ float AnalogOutGain;
+ /// The analog output offset
+ float AnalogOutOffset;
+ } UDXC_TriggerParams;
+
+#pragma pack()
+
+ /// Build the DeviceList.
+ /// This function builds an internal collection of all devices found on the USB that are not currently open.
+ /// NOTE, if a device is open, it will not appear in the list until the device has been closed.
+ /// If you are attempting to connect to a device using TCP/IP you will need to call this method twice
+ /// with a delay of a few seconds between calls to give time for the list of TCP/IP connected devices to be built.
+ ///
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_BuildDeviceList(void);
+
+ /// Gets the device list size.
+ /// \include CodeSnippet_identification.cpp
+ /// Number of devices in device list.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceListSize();
+
+ /// Get the entire contents of the device list.
+ /// Outputs a SAFEARRAY of strings holding device serial numbers.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceList(SAFEARRAY** stringsReceiver);
+
+ /// Get the contents of the device list which match the supplied typeID.
+ /// Outputs a SAFEARRAY of strings holding device serial numbers.
+ /// The typeID of devices to match.
+ /// The typeID of devices to match, see \ref C_DEVICEID_page "Device serial numbers".
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceListByType(SAFEARRAY** stringsReceiver, int typeID);
+
+ /// Get the contents of the device list which match the supplied typeIDs.
+ /// Outputs a SAFEARRAY of strings holding device serial numbers.
+ /// list of typeIDs of devices to be matched, see \ref C_DEVICEID_page "Device serial numbers"
+ /// length of type list
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceListByTypes(SAFEARRAY** stringsReceiver, int* typeIDs, int length);
+
+ /// Get the entire contents of the device list.
+ /// a buffer in which to receive the list as a comma separated string.
+ /// The size of the output string buffer.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceListExt(char* receiveBuffer, DWORD sizeOfBuffer);
+
+ /// Get the contents of the device list which match the supplied typeID.
+ /// a buffer in which to receive the list as a comma separated string.
+ /// The size of the output string buffer.
+ /// The typeID of devices to be matched, see \ref C_DEVICEID_page "Device serial numbers"
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceListByTypeExt(char* receiveBuffer, DWORD sizeOfBuffer, int typeID);
+
+ /// Get the contents of the device list which match the supplied typeIDs.
+ /// a buffer in which to receive the list as a comma separated string.
+ /// The size of the output string buffer.
+ /// list of typeIDs of devices to be matched, see \ref C_DEVICEID_page "Device serial numbers"
+ /// length of type list
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceListByTypesExt(char* receiveBuffer, DWORD sizeOfBuffer, int* typeIDs, int length);
+
+ /// Get the device information from the USB port.
+ /// The Device Info is read from the USB port not from the device itself.
+ /// The serial number of the device.
+ /// The device information.
+ /// 1 if successful, 0 if not.
+ /// \include CodeSnippet_identification.cpp
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl TLI_GetDeviceInfo(char const* serialNo, TLI_DeviceInfo* info);
+
+ /// Initialize a connection to the Simulation Manager, which must already be running.
+ /// Call TLI_InitializeSimulations before TLI_BuildDeviceList at the start of the program to make a connection to the simulation manager.
+ /// Any devices configured in the simulation manager will become visible TLI_BuildDeviceList is called and can be accessed using TLI_GetDeviceList.
+ /// Call TLI_UninitializeSimulations at the end of the program to release the simulator.
+ ///
+ ///
+ ///
+ BENCHPIEZO_API void __cdecl TLI_InitializeSimulations();
+
+ /// Uninitialize a connection to the Simulation Manager, which must already be running.
+ ///
+ BENCHPIEZO_API void __cdecl TLI_UninitializeSimulations();
+
+ /// Scans a range of addresses and returns a list of the ip addresses of Thorlabs devices found.
+ /// The start IP address.
+ /// The end IP address.
+ /// The port no, usually 40303.
+ /// The timeout used when attempting to open a connection.
+ /// The character array to receive a comma seperated list of Thorlabs IP adresses.
+ /// The size of the Buffer.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl TLI_ScanEthernetRange(char* startIPAddress, char* endIPAddress, int portNo, int openTimeout, char* foundAddressesBuffer, DWORD sizeOfBuffer);
+
+ /// Open the device for communications.
+ /// The serial no of the device to be connected.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_connectionN.cpp
+ ///
+ BENCHPIEZO_API short __cdecl UDXC_Open(char const* serialNo);
+
+ /// Disconnect and close the device.
+ /// The serial no of the device to be disconnected.
+ /// \include CodeSnippet_connectionN.cpp
+ ///
+ BENCHPIEZO_API void __cdecl UDXC_Close(char const* serialNo);
+
+ /// Check connection.
+ /// The device serial no.
+ /// true if the USB is listed by the ftdi controller
+ /// \include CodeSnippet_CheckConnection.cpp
+ BENCHPIEZO_API bool __cdecl UDXC_CheckConnection(char const* serialNo);
+
+ /// Sends a command to the device to make it identify iteself.
+ /// The device serial no.
+ BENCHPIEZO_API void __cdecl UDXC_Identify(char const* serialNo);
+
+ /// Tells the device that it is being disconnected.
+ /// This does not disconnect the communications.
+ /// To disconnect the communications, call the function.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_Disconnect(char const* serialNo);
+
+ /// Gets the hardware information from the device.
+ /// The device serial no.
+ /// Address of a buffer to receive the model number string. Minimum 8 characters
+ /// The size of the model number buffer, minimum of 8 characters.
+ /// Address of a WORD to receive the hardware type number.
+ /// Address of a short to receive the number of channels.
+ /// Address of a buffer to receive the notes describing the device.
+ /// The size of the notes buffer, minimum of 48 characters.
+ /// Address of a DWORD to receive the firmware version number made up of 4 byte parts.
+ /// Address of a WORD to receive the hardware version number.
+ /// Address of a WORD to receive the hardware modification state number.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identify.cpp
+ BENCHPIEZO_API short __cdecl UDXC_GetHardwareInfo(char const* serialNo, char* modelNo, DWORD sizeOfModelNo, WORD* type, WORD* numChannels,
+ char* notes, DWORD sizeOfNotes, DWORD* firmwareVersion, WORD* hardwareVersion, WORD* modificationState);
+
+ /// Gets the hardware information in a block.
+ /// The device serial no.
+ /// Address of a TLI_HardwareInformation structure to receive the hardware information.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ /// \include CodeSnippet_identify.cpp
+ BENCHPIEZO_API short __cdecl UDXC_GetHardwareInfoBlock(char const* serialNo, TLI_HardwareInformation* hardwareInfo);
+
+ /// Gets version number of the device firmware.
+ /// The device serial no.
+ /// The device firmware version number made up of 4 byte parts.
+ /// \include CodeSnippet_identify.cpp
+ BENCHPIEZO_API DWORD __cdecl UDXC_GetFirmwareVersion(char const* serialNo);
+
+ /// Gets version number of the device software.
+ /// The device serial no.
+ /// The device software version number made up of 4 byte parts.
+ /// \include CodeSnippet_identify.cpp
+ BENCHPIEZO_API DWORD __cdecl UDXC_GetSoftwareVersion(char const* serialNo);
+
+ /// Update device with stored settings.
+ /// The device serial no.
+ /// true if successful, false if not.
+ /// \include CodeSnippet_connection1.cpp
+ BENCHPIEZO_API bool __cdecl UDXC_LoadSettings(char const* serialNo);
+
+ /// Update device with named settings.
+ /// The device serial no.
+ /// Name of settings stored away from device.
+ /// true if successful, false if not.
+ /// \include CodeSnippet_connection1.cpp
+ BENCHPIEZO_API bool __cdecl UDXC_LoadNamedSettings(char const* serialNo, char const* settingsName);
+
+ /// Persist device settings to device.
+ /// The serial no.
+ /// True if it succeeds, false if it fails.
+ BENCHPIEZO_API bool __cdecl UDXC_PersistSettings(char const* serialNo);
+
+ /// Disable the channel so that motor can be moved by hand.
+ /// When disabled power is removed from the actuator.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ ///
+ BENCHPIEZO_API short __cdecl UDXC_Disable(char const* serialNo);
+
+ /// Enable channel for computer control.
+ /// When enabled power is applied to the actuator so it is fixed in position.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ ///
+ BENCHPIEZO_API short __cdecl UDXC_Enable(char const* serialNo);
+
+ /// Registers a callback on the message queue.
+ /// see \ref C_MESSAGES_page "Device Messages" for details on how to use messages.
+ /// The device serial no.
+ /// A function pointer to be called whenever messages are received.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RegisterMessageCallback(char const* serialNo, void (*functionPointer)());
+
+ /// Gets the MessageQueue size.
+ /// see \ref C_MESSAGES_page "Device Messages" for details on how to use messages.
+ /// The device serial no.
+ /// number of messages in the queue.
+ BENCHPIEZO_API int __cdecl UDXC_MessageQueueSize(char const* serialNo);
+
+ /// Clears the device message queue.
+ /// see \ref C_MESSAGES_page "Device Messages" for details on how to use messages.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_ClearMessageQueue(char const* serialNo);
+
+ /// Get the next MessageQueue item if it is available.
+ /// see \ref C_MESSAGES_page "Device Messages" for details on how to use messages.
+ /// The device serial no.
+ /// Address of the WORD to receive the message type.
+ /// Address of the WORD to receive themessage ID.
+ /// Address of the DWORD to receive the messageData.
+ /// true if successful, false if not.
+ BENCHPIEZO_API bool __cdecl UDXC_GetNextMessage(char const* serialNo, WORD* messageType, WORD* messageID, DWORD* messageData);
+
+ /// Get the next MessageQueue item if it is available.
+ /// see \ref C_MESSAGES_page "Device Messages" for details on how to use messages.
+ /// The device serial no.
+ /// Address of the WORD to receive the message type.
+ /// Address of the WORD to receive themessage ID.
+ /// Address of the DWORD to receive the messageData.
+ /// true if successful, false if not.
+ BENCHPIEZO_API bool __cdecl UDXC_WaitForMessage(char const* serialNo, WORD* messageType, WORD* messageID, DWORD* messageData);
+
+ /// Starts the internal polling loop which continuously requests position and status.
+ /// The device serial no.
+ /// The milliseconds polling rate.
+ /// true if successful, false if not.
+ ///
+ ///
+ ///
+ ///
+ /// \include CodeSnippet_connectionN.cpp
+ BENCHPIEZO_API bool __cdecl UDXC_StartPolling(char const* serialNo, int milliseconds);
+
+ /// Gets the polling loop duration.
+ /// The device serial no.
+ /// The time between polls in milliseconds or 0 if polling is not active.
+ ///
+ ///
+ /// \include CodeSnippet_connectionN.cpp
+ BENCHPIEZO_API long __cdecl UDXC_PollingDuration(char const* serialNo);
+
+ /// Stops the internal polling loop.
+ /// The device serial no.
+ ///
+ ///
+ /// \include CodeSnippet_connectionN.cpp
+ BENCHPIEZO_API void __cdecl UDXC_StopPolling(char const* serialNo);
+
+ /// Gets the time in milliseconds since tha last message was received from the device.
+ /// This can be used to determine whether communications with the device is still good
+ /// The device serial no.
+ /// The time since the last message was received in milliseconds.
+ /// True if monitoring is enabled otherwize False.
+ ///
+ ///
+ /// \include CodeSnippet_connectionMonitoring.cpp
+ BENCHPIEZO_API bool __cdecl UDXC_TimeSinceLastMsgReceived(char const* serialNo, __int64& lastUpdateTimeMS);
+
+ /// Enables the last message monitoring timer.
+ /// This can be used to determine whether communications with the device is still good
+ /// The device serial no.
+ /// True to enable monitoring otherwise False to disable.
+ /// The last message error timeout in ms. 0 to disable.
+ ///
+ ///
+ /// \include CodeSnippet_connectionMonitoring.cpp
+ BENCHPIEZO_API void __cdecl UDXC_EnableLastMsgTimer(char const* serialNo, bool enable, __int32 lastMsgTimeout);
+
+ /// Queries if the time since the last message has exceeded the lastMsgTimeout set by .
+ /// This can be used to determine whether communications with the device is still good
+ /// The device serial no.
+ /// True if last message timer has elapsed, False if monitoring is not enabled or if time of last message received is less than lastMsgTimeout.
+ ///
+ ///
+ /// \include CodeSnippet_connectionMonitoring.cpp
+ BENCHPIEZO_API bool __cdecl UDXC_HasLastMsgTimerOverrun(char const* serialNo);
+
+ /// Requests that all settings are download from device.
+ /// This function requests that the device upload all it's settings to the DLL.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successfully requested.
+ BENCHPIEZO_API short __cdecl UDXC_RequestSettings(char const* serialNo);
+
+ /// Requests the status bits and position.
+ /// This needs to be called to get the device to send it's current position and status bits.
+ /// NOTE this is called automatically if Polling is enabled for the device using .
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successfully requested.
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl UDXC_RequestStatus(char const* serialNo);
+
+ /// Request the status bits which identify the current device state.
+ /// This needs to be called to get the device to send it's current status bits.
+ /// NOTE this is called automatically if Polling is enabled for the device using .
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successfully requested.
+ ///
+ ///
+ BENCHPIEZO_API short __cdecl UDXC_RequestStatusBits(char const* serialNo);
+
+ /// Get the current status bits.
+ /// This returns the latest status bits received from the device.
+ /// To get new status bits, use
+ /// or use
+ /// or use the polling functions, .
+ /// The device serial no.
+ /// The status bits from the device
+ /// - 0x00000010In motion, moving forward (CW).
+ /// - 0x00000020In motion, moving backward (CCW).
+ /// - 0x00000200in motion, homing.
+ /// - 0x00000400Homed.
+ /// - 0x00000800Closed loop working state.
+ /// - 0x00200000Acquiring pulse parameters.
+ /// - 0x00400000Pulse parameters acquired.
+ /// - 0x00800000Error - device in wrong mode.
+ /// - 0x01000000Error - excessive current.
+ /// - 0x02000000Error - excessive temperature.
+ /// - 0x04000000Error - abnormal stage movement.
+ /// - 0x08000000Error - wrong stage detected.
+ /// - 0x40000000Error.
+ ///
+ ///
+ ///
+ ///
+ BENCHPIEZO_API DWORD __cdecl UDXC_GetStatusBits(char const* serialNo);
+
+ /// Resets all parameters to power-up values.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_ResetParameters(char const* serialNo);
+
+ /// Sets the current position to the Home position (Position = 0).
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_Home(char const* serialNo);
+
+ /// Move jog.
+ /// The device serial no.
+ /// The jog direction.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_MoveJog(char const* serialNo, MOT_TravelDirection jogDirection);
+
+ /// Move start.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_MoveStart(char const* serialNo);
+
+ /// Move stop.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_MoveStop(char const* serialNo);
+
+ /// Start pulse parameter acquistion.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_PulseParamsAcquireStart(char const* serialNo);
+
+ /// Request the closed loop parameters.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestClosedLoopParams(char const* serialNo);
+
+ /// Sets the closed loop parameters.
+ /// The device serial no.
+ /// Options for controlling closed loop parameters.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_SetClosedLoopParams(char const* serialNo, UDXC_ClosedLoopParameters* params);
+
+ /// Gets the closed loop parameters.
+ /// The device serial no.
+ /// Options for controlling closed loop parameters.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_GetClosedLoopParams(char const* serialNo, UDXC_ClosedLoopParameters* params);
+
+ /// Request the closed loop target position.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestClosedLoopTarget(char const* serialNo);
+
+ /// Sets the closed loop target position.
+ /// The device serial no.
+ /// The target in nm units.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_SetClosedLoopTarget(char const* serialNo, int target);
+
+ /// Gets the closed loop target position.
+ /// The device serial no.
+ /// The target in nm units.
+ BENCHPIEZO_API int __cdecl UDXC_GetClosedLoopTarget(char const* serialNo);
+
+ /// Request the jog parameters.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestJogParams(char const* serialNo);
+
+ /// Sets the jog parameters.
+ /// The device serial no.
+ /// Options for controlling jog parameters.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_SetJogParams(char const* serialNo, UDXC_JogParameters* params);
+
+ /// Gets the jog parameters.
+ /// The device serial no.
+ /// Options for controlling jog parameters.
+ /// The Options for controlling joge parameters.
+ BENCHPIEZO_API short __cdecl UDXC_GetJogParams(char const* serialNo, UDXC_JogParameters* params);
+
+ /// Request the abnormal mode detection state.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestAbnormalMoveDetectionEnabled(char const* serialNo);
+
+ /// Sets the abnormal mode detection state.
+ /// The device serial no.
+ /// True to enable, false to disable.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_SetAbnormalMoveDetectionEnabled(char const* serialNo, bool isEnabled);
+
+ /// Gets the abnormal mode detection state.
+ /// The device serial no.
+ /// The abnormal mode detection state.
+ BENCHPIEZO_API bool __cdecl UDXC_GetAbnormalMoveDetectionEnabled(char const* serialNo);
+
+ /// Request the external trigger mode.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestExternalTriggerConfig(char const* serialNo);
+
+ /// Sets the external trigger mode.
+ /// The device serial no.
+ /// The trigger mode.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_SetExternalTriggerConfig(char const* serialNo, UDXC_TriggerModes mode);
+
+ /// Gets the external trigger mode.
+ /// The device serial no.
+ /// The Trigger Mode
+ BENCHPIEZO_API UDXC_TriggerModes __cdecl UDXC_GetExternalTriggerConfig(char const* serialNo);
+
+ /// Request the external trigger parameters.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestExternalTriggerParams(char const* serialNo);
+
+ /// Sets the external trigger parameters.
+ /// The device serial no.
+ /// The trigger parameters.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_SetExternalTriggerParams(char const* serialNo, UDXC_TriggerParams* params);
+
+ /// Gets the external trigger parameters.
+ /// The device serial no.
+ /// The trigger parameters.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_GetExternalTriggerParams(char const* serialNo, UDXC_TriggerParams* params);
+
+ /// Request the external trigger target.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestExternalTriggerTarget(char const* serialNo);
+
+ /// Gets the external trigger target.
+ /// The device serial no.
+ /// The trigger target.
+ BENCHPIEZO_API int __cdecl UDXC_GetExternalTriggerTarget(char const* serialNo);
+
+ /// Requests the stage axis parameters.
+ /// The device serial no.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_RequestStageAxisParams(char const* serialNo);
+
+ /// Gets the stage axis parameters.
+ /// The device serial no.
+ /// The stage axis parameters.
+ /// The error code (see \ref C_DLL_ERRORCODES_page "Error Codes") or zero if successful.
+ BENCHPIEZO_API short __cdecl UDXC_GetStageAxisParams(char const* serialNo, PZ_StageAxisParameters* params);
+
+ ///
+ /// Requests the current position.
+ ///
+ /// The device serial no.
+ ///
+ BENCHPIEZO_API short __cdecl UDXC_RequestPosition(char const* serialNo);
+
+ ///
+ /// Get the current position.
+ ///
+ /// The device serial no.
+ /// The device position. In closed loop mode the position value is in nanometres, in open loop mode the value is in steps.
+ ///
+ BENCHPIEZO_API short __cdecl UDXC_GetPosition(char const* serialNo, __int32* position);
+}
+
+/** @} */ // BenchtopPiezoUDXC
diff --git a/C++/Benchtop/UDXC/UDXC C++.vcxproj b/C++/Benchtop/UDXC/UDXC C++.vcxproj
new file mode 100644
index 0000000..4879ff6
--- /dev/null
+++ b/C++/Benchtop/UDXC/UDXC C++.vcxproj
@@ -0,0 +1,132 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 17.0
+ Win32Proj
+ {6a459811-d79d-4cd6-9960-4b644665fa09}
+ UDXCC
+ 10.0
+
+
+
+ Application
+ true
+ v143
+ Unicode
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+
+
+ Application
+ true
+ v143
+ Unicode
+
+
+ Application
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level3
+ true
+ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+
+
+
+
+ Level3
+ true
+ _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+ Thorlabs.MotionControl.Benchtop.Piezo.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ true
+
+
+ Console
+ true
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/C++/Benchtop/UDXC/UDXC C++.vcxproj.filters b/C++/Benchtop/UDXC/UDXC C++.vcxproj.filters
new file mode 100644
index 0000000..437997a
--- /dev/null
+++ b/C++/Benchtop/UDXC/UDXC C++.vcxproj.filters
@@ -0,0 +1,22 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+
\ No newline at end of file
diff --git a/C++/Benchtop/UDXC/UDXC Example.cpp b/C++/Benchtop/UDXC/UDXC Example.cpp
new file mode 100644
index 0000000..17a8346
--- /dev/null
+++ b/C++/Benchtop/UDXC/UDXC Example.cpp
@@ -0,0 +1,147 @@
+/*
+UDXC Simple Example
+Date of Creation(YYYY-MM-DD): 2025-10-27
+Date of Last Modification on Github: 2025-10-27
+C++ Version Used: ISO C++ 14
+Kinesis Version Tested: 1.14.56
+*/
+
+#include
+#include
+#include
+
+// Include device-specific header file
+#include "Thorlabs.MotionControl.Benchtop.Piezo.UDXC.h"
+
+
+int __cdecl wmain(int argc, wchar_t* argv[])
+{
+ // Uncomment this line (and TLI_UnitializeSimulations at the bottom of the page)
+ // If you are using a simulated device
+ // TLI_InitializeSimulations();
+
+ // Change this line to reflect your device's serial number
+ int serialNo = 122000001;
+
+ // Set the target position of the device (unit: nm)
+ int position = 10000;
+
+ // identify and access device
+ char testSerialNo[16];
+ sprintf_s(testSerialNo, "%d", serialNo);
+
+ // Build list of connected device
+ if (TLI_BuildDeviceList() == 0)
+ {
+ // get device list size
+ short n = TLI_GetDeviceListSize();
+ // get BBD serial numbers
+ char serialNos[100];
+ TLI_GetDeviceListByTypeExt(serialNos, 100, 122);
+
+ // Search serial numbers for given serial number
+ if (strstr(serialNos, testSerialNo))
+ {
+ printf("Device %s found.\r\n", testSerialNo);
+ }
+ else
+ {
+ printf("Device %s not found.\r\n", testSerialNo);
+ return -1;
+ }
+
+ // open device
+ if (UDXC_Open(testSerialNo) == 0)
+ {
+ // start the device polling at 200ms intervals
+ UDXC_StartPolling(testSerialNo, 200);
+ Sleep(500);
+
+ // enable device
+ UDXC_Enable(testSerialNo);
+ Sleep(500);
+
+ // performance optimize
+ UDXC_PulseParamsAcquireStart(testSerialNo);
+ Sleep(500);
+ printf("Optimizing performance, please wait...\r\n");
+ bool pulseParamAcquired = false;
+ // When pulseParamAcquired is true, it indicates the optimization has finished
+ while (pulseParamAcquired == false)
+ {
+ pulseParamAcquired = (UDXC_GetStatusBits(testSerialNo) & 0x00400000) != 0;
+ Sleep(500);
+ }
+
+ // home the device
+ printf("Home the device.\r\n");
+ UDXC_Home(testSerialNo);
+ // wait for completion
+ int posCheckCnt = 0, newPos = 0;
+ for (int i = 0; i < 100; i++)
+ {
+ UDXC_GetPosition(testSerialNo,&newPos);
+
+ if (abs(newPos - 0) < 6000)
+ {
+ if (posCheckCnt > 3)
+ break;
+ else
+ {
+ Sleep(200);
+ posCheckCnt++;
+ }
+ }
+ else
+ Sleep(200);
+ }
+
+ // Set the target position
+ UDXC_SetClosedLoopTarget(testSerialNo, position);
+
+ // Get and Set the velocity and acceleration
+ UDXC_ClosedLoopParameters closedLoopParams;
+ UDXC_GetClosedLoopParams(testSerialNo, &closedLoopParams);
+ closedLoopParams.RefSpeed = 10000000; // velocity is set in nm/s
+ closedLoopParams.Acceleration = 10000000; // acceleration is set in nm/s^2
+ UDXC_SetClosedLoopParams(testSerialNo, &closedLoopParams);
+
+ // Move the stage to the target position
+ UDXC_MoveStart(testSerialNo);
+ printf("Start moving.\r\n");
+ // wait for completion
+ posCheckCnt = 0;
+ newPos = 0;
+ for (int i = 0; i < 100; i++)
+ {
+ UDXC_GetPosition(testSerialNo, &newPos);
+ if (abs(newPos - position) < 6000)
+ {
+ if (posCheckCnt > 3)
+ break;
+ else
+ {
+ Sleep(200);
+ posCheckCnt++;
+ }
+ }
+ else
+ Sleep(200);
+ }
+
+ // Stage moved to the target position. Display the current position
+ printf("Device moved to %d nm.\r\n", newPos);
+
+ // stop polling
+ UDXC_StopPolling(testSerialNo);
+ // close device
+ UDXC_Close(testSerialNo);
+ printf("Program Finished.");
+ }
+ }
+
+ // Uncomment this line if you are using simulations
+ // TLI_UninitializeSimulations;
+ char c = _getch();
+ return 0;
+}
diff --git a/Labview/Kinesis - BSC203 - Connect Home Move/BSC203ConnectMoveTo.vi b/Labview/Kinesis - BSC203 - Connect Home Move/BSC203ConnectMoveTo.vi
new file mode 100644
index 0000000..c3598cf
Binary files /dev/null and b/Labview/Kinesis - BSC203 - Connect Home Move/BSC203ConnectMoveTo.vi differ
diff --git a/Labview/Kinesis - BSC203 - Connect Home Move/Block.PNG b/Labview/Kinesis - BSC203 - Connect Home Move/Block.PNG
new file mode 100644
index 0000000..2953c8a
Binary files /dev/null and b/Labview/Kinesis - BSC203 - Connect Home Move/Block.PNG differ
diff --git a/Labview/Kinesis - BSC203 - Connect Home Move/Front.PNG b/Labview/Kinesis - BSC203 - Connect Home Move/Front.PNG
new file mode 100644
index 0000000..9fef1a3
Binary files /dev/null and b/Labview/Kinesis - BSC203 - Connect Home Move/Front.PNG differ
diff --git a/Labview/Kinesis - BSC203 - Connect Home Move/README.md b/Labview/Kinesis - BSC203 - Connect Home Move/README.md
new file mode 100644
index 0000000..4465e10
--- /dev/null
+++ b/Labview/Kinesis - BSC203 - Connect Home Move/README.md
@@ -0,0 +1,22 @@
+Thorlabs Hardware: BSC203 -Benchtop Stepper Motor Controllers
+https://www.thorlabs.com/thorproduct.cfm?partnumber=BSC203
+
+Description: This VI will enable you to communicate with BSC203 series to control stepper motors. This example enables all 3 channels, but only channel 1 is wired to move commands.
+
+Instructions:
+1) Connect your BSC203 device to your PC & power the device, ensuring your stage/actutator is connected. For full device setup, the device product manual can be found on our website.
+2) Enter the device serial number below.
+3) Click 'Run' in the LabVIEW Toolbar which will attempt a connection, and enable the device.
+4) Ensure the device move path is clear for homing, and press Home.
+5) Await for device to be be available, and to have finished homing (Home indicator in control panel should be green).
+6) Input desired absolute position, and press 'Set Abs Pos' to set that for absolute moves.
+7) Similarly input desired direction and step size for relative moves.
+8) To end the Program click 'STOP'.
+
+Tested on labVIEW 2023 Q1 64-bit.
+
+### Front Panel
+
+
+### Block Diagram
+
\ No newline at end of file
diff --git a/Labview/Kinesis - KPC101 - Connect Closed Loop/Block.PNG b/Labview/Kinesis - KPC101 - Connect Closed Loop/Block.PNG
new file mode 100644
index 0000000..da8da39
Binary files /dev/null and b/Labview/Kinesis - KPC101 - Connect Closed Loop/Block.PNG differ
diff --git a/Labview/Kinesis - KPC101 - Connect Closed Loop/Front.PNG b/Labview/Kinesis - KPC101 - Connect Closed Loop/Front.PNG
new file mode 100644
index 0000000..d10ec39
Binary files /dev/null and b/Labview/Kinesis - KPC101 - Connect Closed Loop/Front.PNG differ
diff --git a/Labview/Kinesis - KPC101 - Connect Closed Loop/KPC101ClosedLoop.vi b/Labview/Kinesis - KPC101 - Connect Closed Loop/KPC101ClosedLoop.vi
new file mode 100644
index 0000000..e0086aa
Binary files /dev/null and b/Labview/Kinesis - KPC101 - Connect Closed Loop/KPC101ClosedLoop.vi differ
diff --git a/Labview/Kinesis - KPC101 - Connect Closed Loop/README.md b/Labview/Kinesis - KPC101 - Connect Closed Loop/README.md
new file mode 100644
index 0000000..52b6658
--- /dev/null
+++ b/Labview/Kinesis - KPC101 - Connect Closed Loop/README.md
@@ -0,0 +1,21 @@
+Thorlabs Hardware: KPC - K-Cube Piezo Controller and Strain Gauge Reader
+https://www.thorlabs.com/thorproduct.cfm?partnumber=KPC101
+
+Description: This VI will enable you to communicate with KPC101 in closed loop mode to control Piezos via to a user set position. The VI will first connect and initialize the device, set a zero point, wait 10 seconds, and go in to closed loop mode awaiting user command to move to a specified position.
+
+Instructions:
+1) Connect your KPC101 device to your PC & power the device, ensuring your stage/actutator is connected. For full device setup, the device product manual can be found on our website here. -https://www.thorlabs.com/thorproduct.cfm?partnumber=KPC101
+2) Enter the device serial number below.
+3) Ensure the device move path is clear.
+4) Click 'Run' in the LabVIEW Toolbar which will attempt a connection,set a zero point, and go into closed loop mode in that order.
+5) Await for device to be be available.
+6) Input desired movement position, and press 'Move To Position'.
+7) To end the Program click
+
+Tested on labVIEW 2023 Q1 64-bit.
+
+### Front Panel
+
+
+### Block Diagram
+
\ No newline at end of file
diff --git a/Labview/Kinesis - KPC101 - Connect Open Loop/Block.PNG b/Labview/Kinesis - KPC101 - Connect Open Loop/Block.PNG
new file mode 100644
index 0000000..34678c5
Binary files /dev/null and b/Labview/Kinesis - KPC101 - Connect Open Loop/Block.PNG differ
diff --git a/Labview/Kinesis - KPC101 - Connect Open Loop/Front.PNG b/Labview/Kinesis - KPC101 - Connect Open Loop/Front.PNG
new file mode 100644
index 0000000..a7eb1f3
Binary files /dev/null and b/Labview/Kinesis - KPC101 - Connect Open Loop/Front.PNG differ
diff --git a/Labview/Kinesis - KPC101 - Connect Open Loop/KPC101OpenLoop.vi b/Labview/Kinesis - KPC101 - Connect Open Loop/KPC101OpenLoop.vi
new file mode 100644
index 0000000..5e8a4f6
Binary files /dev/null and b/Labview/Kinesis - KPC101 - Connect Open Loop/KPC101OpenLoop.vi differ
diff --git a/Labview/Kinesis - KPC101 - Connect Open Loop/README.md b/Labview/Kinesis - KPC101 - Connect Open Loop/README.md
new file mode 100644
index 0000000..789afd2
--- /dev/null
+++ b/Labview/Kinesis - KPC101 - Connect Open Loop/README.md
@@ -0,0 +1,21 @@
+Thorlabs Hardware: KPC - K-Cube Piezo Controller and Strain Gauge Reader
+https://www.thorlabs.com/thorproduct.cfm?partnumber=KPC101
+
+Description: This VI will enable you to communicate with KPC101 in open loop mode to control Piezos via to a user set voltage. The VI will first connect and initialize the device, set a zero point, wait 10 seconds, and go in to open loop mode awaiting user command to move to a specified voltage.
+
+Instructions:
+1) Connect your KPC101 device to your PC & power the device, ensuring your stage/actutator is connected. For full device setup, the device product manual can be found on our website here. -https://www.thorlabs.com/thorproduct.cfm?partnumber=KPC101
+2) Enter the device serial number below.
+3) Ensure the device move path is clear.
+4) Click 'Run' in the LabVIEW Toolbar which will attempt a connection,set a zero point, and go into open loop mode in that order.
+5) Await for device to be be available.
+6) Input desired voltage, and press 'Set Voltage'.
+7) To end the Program click 'STOP'.
+
+Tested on labVIEW 2023 Q1 64-bit.
+
+### Front Panel
+
+
+### Block Diagram
+
\ No newline at end of file
diff --git a/Labview/Kinesis - LTS300C - Connect Home Move/Block.PNG b/Labview/Kinesis - LTS300C - Connect Home Move/Block.PNG
new file mode 100644
index 0000000..ad12060
Binary files /dev/null and b/Labview/Kinesis - LTS300C - Connect Home Move/Block.PNG differ
diff --git a/Labview/Kinesis - LTS300C - Connect Home Move/Front.PNG b/Labview/Kinesis - LTS300C - Connect Home Move/Front.PNG
new file mode 100644
index 0000000..3a5967f
Binary files /dev/null and b/Labview/Kinesis - LTS300C - Connect Home Move/Front.PNG differ
diff --git a/Labview/Kinesis - LTS300C - Connect Home Move/LTS300CConnectMove.vi b/Labview/Kinesis - LTS300C - Connect Home Move/LTS300CConnectMove.vi
new file mode 100644
index 0000000..95f4acb
Binary files /dev/null and b/Labview/Kinesis - LTS300C - Connect Home Move/LTS300CConnectMove.vi differ
diff --git a/Labview/Kinesis - LTS300C - Connect Home Move/README.md b/Labview/Kinesis - LTS300C - Connect Home Move/README.md
new file mode 100644
index 0000000..5ceae97
--- /dev/null
+++ b/Labview/Kinesis - LTS300C - Connect Home Move/README.md
@@ -0,0 +1,21 @@
+Thorlabs Hardware: LTS300C - 300 mm Translation Stage with Stepper Motor, Integrated Controller
+https://www.thorlabs.com/thorproduct.cfm?partnumber=LTS300C
+
+Description: This VI will enable you to communicate with LTC300C integrated controller stepper motor stage.
+
+Instructions:
+1) Connect your LTC300C device to your PC & power the device, ensuring your stage/actutator is connected. For full device setup, the device product manual can be found on our website.
+2) Enter the device serial number.
+3) Ensure the device move path is clear for homing and movement.
+4) Click 'Run' in the LabVIEW Toolbar which will attempt a connection, enable the device, and home.
+5) Await for device to be be available, and to have finished homing (Home indicator in control panel should be green).
+6) Input desired position,and press the associated button to initiate the move.
+7) To end the Program click 'STOP'.
+
+Tested on labVIEW 2023 Q1 64-bit.
+
+### Front Panel
+
+
+### Block Diagram
+
\ No newline at end of file
diff --git a/Labview/Kinesis - PDXC2 - Connect Move/Block.png b/Labview/Kinesis - PDXC2 - Connect Move/Block.png
index 21379b7..105fce8 100644
Binary files a/Labview/Kinesis - PDXC2 - Connect Move/Block.png and b/Labview/Kinesis - PDXC2 - Connect Move/Block.png differ
diff --git a/Labview/Kinesis - PDXC2 - Connect Move/Kinesis - PDXC2 - Connect Move.vi b/Labview/Kinesis - PDXC2 - Connect Move/Kinesis - PDXC2 - Connect Move.vi
index 91e5939..dbb24a0 100644
Binary files a/Labview/Kinesis - PDXC2 - Connect Move/Kinesis - PDXC2 - Connect Move.vi and b/Labview/Kinesis - PDXC2 - Connect Move/Kinesis - PDXC2 - Connect Move.vi differ
diff --git a/Labview/Kinesis - TTC001 - Connect Operate/Block.PNG b/Labview/Kinesis - TTC001 - Connect Operate/Block.PNG
new file mode 100644
index 0000000..987c7db
Binary files /dev/null and b/Labview/Kinesis - TTC001 - Connect Operate/Block.PNG differ
diff --git a/Labview/Kinesis - TTC001 - Connect Operate/Front.PNG b/Labview/Kinesis - TTC001 - Connect Operate/Front.PNG
new file mode 100644
index 0000000..84d1a57
Binary files /dev/null and b/Labview/Kinesis - TTC001 - Connect Operate/Front.PNG differ
diff --git a/Labview/Kinesis - TTC001 - Connect Operate/README.md b/Labview/Kinesis - TTC001 - Connect Operate/README.md
new file mode 100644
index 0000000..82c29cf
--- /dev/null
+++ b/Labview/Kinesis - TTC001 - Connect Operate/README.md
@@ -0,0 +1,20 @@
+Thorlabs Hardware: TTC001 - T-Cube TEC Controller
+https://www.thorlabs.com/thorproduct.cfm?partnumber=TTC001
+
+Description: This VI will enable you to communicate with TTC001 to set a desired temperature and get live readings of current temperature. The VI will first connect and initialize the device, and waits for user command for the temperature set point.
+
+Instructions:
+1) Connect your TTC001 device to your PC & power the device, ensuring your TEC is connected. For full device setup, the device product manual can be found on our website here. -https://www.thorlabs.com/thorproduct.cfm?partnumber=TTC001
+2) Enter the device serial number below.
+3) Click 'Run' in the LabVIEW Toolbar which will attempt a connection.
+4) Await for device to be be available.
+5) Input desired temperature, and press 'Set Temp'.
+6) To end the Program click 'STOP'.
+
+Tested on labVIEW 2023 Q1 64-bit.
+
+### Front Panel
+
+
+### Block Diagram
+
\ No newline at end of file
diff --git a/Labview/Kinesis - TTC001 - Connect Operate/TTC001ConnectSetDisplayTemp.vi b/Labview/Kinesis - TTC001 - Connect Operate/TTC001ConnectSetDisplayTemp.vi
new file mode 100644
index 0000000..187f16d
Binary files /dev/null and b/Labview/Kinesis - TTC001 - Connect Operate/TTC001ConnectSetDisplayTemp.vi differ
diff --git a/Labview/Kinesis - UDXC - Connect Move/Block.png b/Labview/Kinesis - UDXC - Connect Move/Block.png
new file mode 100644
index 0000000..6ec2a92
Binary files /dev/null and b/Labview/Kinesis - UDXC - Connect Move/Block.png differ
diff --git a/Labview/Kinesis - UDXC - Connect Move/Front.png b/Labview/Kinesis - UDXC - Connect Move/Front.png
new file mode 100644
index 0000000..2b571ad
Binary files /dev/null and b/Labview/Kinesis - UDXC - Connect Move/Front.png differ
diff --git a/Labview/Kinesis - UDXC - Connect Move/Kinesis - UDXC.vi b/Labview/Kinesis - UDXC - Connect Move/Kinesis - UDXC.vi
new file mode 100644
index 0000000..b40307d
Binary files /dev/null and b/Labview/Kinesis - UDXC - Connect Move/Kinesis - UDXC.vi differ
diff --git a/Labview/Kinesis - UDXC - Connect Move/Readme.md b/Labview/Kinesis - UDXC - Connect Move/Readme.md
new file mode 100644
index 0000000..7f14fcc
--- /dev/null
+++ b/Labview/Kinesis - UDXC - Connect Move/Readme.md
@@ -0,0 +1,12 @@
+### Thorlabs Hardware: UDXC - Compact ORIC Ultrasonic Piezoelectric Drive Stage Controller
+https://www.thorlabs.com/thorproduct.cfm?partnumber=UDXC
+
+# Description:
+This VI will enable you to communicate with UDXC series to control ultrasonic piezo stages. The VI will first connect and initialize the device, home the stage and move the stage to a specified location.
+
+# Instructions:
+1) Connect your device to your PC & power the device. ensuring your stage/actutator is connected prior to power the device. For full device setup, the device product manual can be found on our website.
+2) Enter the device serial number, reference speed and the target position below.
+3) Ensure the device move path is clear for homing.
+4) Click 'Run' in the LabVIEW Toolbar which will attempt a connection. And a home command will be sent.
+5) Await for device to be available, the stage will move to the target position.
diff --git a/Matlab/Benchtop/BBD30X/BBD30X_TriggerOut.m b/Matlab/Benchtop/BBD30X/BBD30X_TriggerOut.m
new file mode 100644
index 0000000..b33bfe5
--- /dev/null
+++ b/Matlab/Benchtop/BBD30X/BBD30X_TriggerOut.m
@@ -0,0 +1,90 @@
+%% Header
+% BBD30X_TriggerOut.m
+% Created Date: 2025-09-16
+% Last modified date: 2025-09-16
+% Matlab Version: R2024b
+% Thorlabs DLL version: Kinesis 1.14.56
+%% Notes
+%
+% Example for the BBD303 that sends a trigger signal when stage goes into
+% motion
+%%
+%% Start of code
+clear all; close all; clc
+
+%% Add and Import Assemblies
+devCLI = NET.addAssembly('C:\Program Files\Thorlabs\Kinesis\Thorlabs.MotionControl.DeviceManagerCLI.dll');
+genCLI = NET.addAssembly('C:\Program Files\Thorlabs\Kinesis\Thorlabs.MotionControl.GenericMotorCLI.dll');
+motCLI = NET.addAssembly('C:\Program Files\Thorlabs\Kinesis\Thorlabs.MotionControl.Benchtop.BrushlessMotorCLI.dll');
+
+import Thorlabs.MotionControl.DeviceManagerCLI.*
+import Thorlabs.MotionControl.GenericMotorCLI.*
+import Thorlabs.MotionControl.Benchtop.BrushlessMotorCLI.*
+
+%% Create Simulation (Comment out for real device)
+SimulationManager.Instance.InitializeSimulations();
+
+%% Connect to device
+% Build Device list
+DeviceManagerCLI.BuildDeviceList();
+DeviceManagerCLI.GetDeviceListSize();
+DeviceManagerCLI.GetDeviceList();
+
+% Input Parameters
+serialNumber = '103000001'; % BBD30X controller serial number
+timeout= 60000;
+position = 10; % mm
+
+% Connect to device
+device = BenchtopBrushlessMotor.CreateBenchtopBrushlessMotor(serialNumber); %;The output of this line must be suppressed
+device.Connect(serialNumber)
+try
+ % Try/Catch statement used to disconnect correctly after an error
+
+ % Channels are connected using the same serial number
+ % Connect to the channel
+ channel = device.GetChannel(1); % Get Channel 1
+ channel.WaitForSettingsInitialized(10000);
+ channel.StartPolling(250);
+
+ % Enable device on channel 1
+ channel.EnableDevice();
+ pause(3);
+
+ motorSettings = channel.LoadMotorConfiguration(channel.DeviceID);
+ pause(1);
+
+ % Home Motor
+ fprintf("Homing...\n")
+ channel.Home(timeout);
+ fprintf("Homed\n")
+ pause(2);
+
+ %% Setup trigger out when in motion
+ trigParams = Thorlabs.MotionControl.GenericMotorCLI.ControlParameters.TriggerIOConfigParameters();
+ trigParams.CycleCount=1;
+ trigParams.PulseWidth=1;
+ trigParams.PulseCountFwd=1;
+ trigParams.TriggerOutPolarity=Thorlabs.MotionControl.GenericMotorCLI.Settings.PolarityType.High;
+ trigParams.TriggerOutMode=Thorlabs.MotionControl.GenericMotorCLI.Settings.TriggerOutModeType.TrigOutput_InMotion;
+ channel.SetTriggerIOConfigParams(trigParams);
+
+ %% Move to position
+ fprintf("Moving...\n")
+ channel.MoveTo(position, timeout);
+ fprintf("Moved\n")
+ pause(1);
+catch e
+ fprintf("Error has caused the program to stop, disconnecting..\n")
+ fprintf(e.identifier);
+ fprintf("\n");
+ fprintf(e.message);
+end
+
+%% Disconnect
+channel.StopPolling();
+channel.DisableDevice();
+device.Disconnect();
+
+%% Close Simulations (Comment out if using a real device)
+SimulationManager.Instance.UninitializeSimulations(); %Close Simulations
diff --git a/Matlab/Benchtop/BSC20X/BSC20X_Trigger.m b/Matlab/Benchtop/BSC20X/BSC20X_Trigger.m
new file mode 100644
index 0000000..97dd442
--- /dev/null
+++ b/Matlab/Benchtop/BSC20X/BSC20X_Trigger.m
@@ -0,0 +1,102 @@
+%% Header
+% BSC101.m
+% Created Date: 2024-01-16
+% Last modified date: 2024-09-16
+% Matlab Version: R2024b
+% Thorlabs DLL version: Kinesis 1.14.56
+%% Notes
+%
+% Example for the BSC201 with Triggering
+%%
+%% Start of code
+clear all; close all; clc
+
+%% Add and Import Assemblies
+devCLI = NET.addAssembly('C:\Program Files\Thorlabs\Kinesis\Thorlabs.MotionControl.DeviceManagerCLI.dll');
+genCLI = NET.addAssembly('C:\Program Files\Thorlabs\Kinesis\Thorlabs.MotionControl.GenericMotorCLI.dll');
+motCLI = NET.addAssembly('C:\Program Files\Thorlabs\Kinesis\Thorlabs.MotionControl.Benchtop.StepperMotorCLI.dll');
+
+import Thorlabs.MotionControl.DeviceManagerCLI.*
+import Thorlabs.MotionControl.GenericMotorCLI.*
+import Thorlabs.MotionControl.Benchtop.StepperMotorCLI.*
+
+%% Create Simulation (Comment out for real device)
+SimulationManager.Instance.InitializeSimulations();
+
+%% Connect to device
+% Build Device list
+DeviceManagerCLI.BuildDeviceList();
+
+% Update serial number to correct device
+serialNumber = '70000001';
+timeout_val = 60000;
+
+% Trigger Settings Bit String Library
+TriggerDisabledHome = uint8(0b01000000);
+TriggerDisabledAbsolute = uint8(0b000100000);
+TriggerDisabledRelative = uint8(0b000010000);
+TriggerInHome = uint8(0b001000001);
+TriggerInAbsolute = uint8(0b000100001);
+TriggerInRelative = uint8(0b000010001);
+TriggerOutHome = uint8(0b001000010);
+TriggerOutAbsolute = uint8(0b000100010);
+TriggerOutRelative = uint8(0b000010010);
+TriggerInOutHome = uint8(0b001000011);
+TriggerInOutAbsolute = uint8(0b000100011);
+TriggerInOutRelative = uint8(0b000010011);
+
+
+% Connect to the Device
+device = BenchtopStepperMotor.CreateBenchtopStepperMotor(serialNumber); %The output of this line must be suppressed
+device.Connect(serialNumber)
+try
+ % Try/Catch statement used to disconnect correctly after an error
+
+ % Channels are connected using the same serial number
+ % Connect to the channel
+ channel = device.GetChannel(1);
+ % Settings should be initialized as soon as the channel is connected.
+ channel.WaitForSettingsInitialized(50000);
+ channel.StartPolling(250);
+
+ % Pull the enumeration values from the DeviceManagerCLI
+ optionTypeHandle = devCLI.AssemblyHandle.GetType('Thorlabs.MotionControl.DeviceManagerCLI.DeviceSettingsSectionBase+SettingsUseOptionType');
+ optionTypeEnums = optionTypeHandle.GetEnumValues();
+
+ % Load Settings to the controller
+ motorConfiguration = channel.LoadMotorConfiguration(serialNumber);
+ motorConfiguration.LoadSettingsOption = optionTypeEnums.Get(1); % File Settings Option
+ motorConfiguration.DeviceSettingsName = 'HDR50'; %The actuator type needs to be set here. This specifically loads a HDR50
+ factory = ThorlabsBenchtopStepperMotorSettingsFactory();
+ channel.SetSettings(factory.GetSettings(motorConfiguration), true, false);
+
+ % Set Trigger Mode (change input using library above)
+ channel.SetTriggerSwitches(TriggerOutHome);
+
+ %Enable the device and start sending commands
+ channel.EnableDevice();
+ pause(1); %wait to make sure Ch1 is enabled
+
+ % Home the stage
+ fprintf("Homing...\n")
+ channel.Home(timeout_val);
+ fprintf("Homed\n")
+
+ % Move the stage
+ fprintf("Moving...\n")
+ channel.MoveTo(50, timeout_val)
+ fprintf("Moved.\n")
+catch e
+ fprintf("Error has caused the program to stop, disconnecting..\n")
+ fprintf(e.identifier);
+ fprintf("\n");
+ fprintf(e.message);
+end
+
+%% Disconnect the channel and chassis
+channel.StopPolling();
+channel.Disconnect(true);
+device.Disconnect(true);
+
+%% Close Simulations (Comment out if using a real device)
+SimulationManager.Instance.UninitializeSimulations(); %Close Simulations
diff --git a/Matlab/Intergrated/MPC320/MPC.m b/Matlab/Intergrated/MPC320/MPC.m
index ec9896b..c79544c 100644
--- a/Matlab/Intergrated/MPC320/MPC.m
+++ b/Matlab/Intergrated/MPC320/MPC.m
@@ -1,9 +1,9 @@
%% Header
% MPC320.m
% Created Date: 2024-08-22
-% Last modified date: 2024-08-22
-% Matlab Version: R2023b
-% Thorlabs DLL version: Kinesis 1.14.49
+% Last modified date: 2025-09-23
+% Matlab Version: R2024b
+% Thorlabs DLL version: Kinesis 1.14.56
%% Notes
%
% Example for the MPC320 intergrated rotation stage
@@ -21,7 +21,7 @@
%% Create Simulation (Comment out for real device)
-%SimulationManager.Instance.InitializeSimulations();
+SimulationManager.Instance.InitializeSimulations();
%% Connect to device
% Build Device list
@@ -45,23 +45,22 @@
Paddle3 = PolarizerPaddles.Paddle3;
% Move the stage
-device.Home(paddle, 6000);
+device.Home(paddle1, 6000);
pause(2);
-device.Home(paddle, 6000);
+device.Home(paddle2, 6000);
pause(2);
-device.Home(paddle, 6000);
+device.Home(Paddle3, 6000);
pause(2);
-device.MoveTo(new_pos, paddle1, 6000);
+new_pos1 = 10;
+device.MoveRelative(new_pos1, paddle1, 6000);
pause(2);
+Position1 = device.Position(paddle1);
+Position1 = str2double(char(Position1.ToString()))
-device.MoveTo(new_pos, paddle2, 6000);
-pause(2);
-device.MoveTo(new_pos, paddle3, 6000);
-pause(2);
%% Disconnect the channel and chassis
device.StopPolling();
diff --git a/Python/Kinesis/Benchtop/PDXC2/README.md b/Python/Kinesis/Benchtop/PDXC2/README.md
index aadc6b5..0a21350 100644
--- a/Python/Kinesis/Benchtop/PDXC2/README.md
+++ b/Python/Kinesis/Benchtop/PDXC2/README.md
@@ -19,26 +19,4 @@ Please follow the following steps to setup a Virtual Communication Port for Wind
6. In the device manager, click ‘Ports (COM & LPT)’, and note the ‘APT USB Device Serial Port’ COM port number (e.g. COM3). This COM port can then be used for low level protocol messages.
#### Serial Command Protocol
Please download the detailed APT Serial Commands Documentation from this link:
-https://www.thorlabs.com/software_pages/ViewSoftwarePage.cfm?Code=Motion_Control&viewtab=2
-The example also includes some commands that are specialized for PDXC2.
->1. **MGMSG_PZMOT_MOVE_START**
- Command Head: `0x2100`
- Command Structure: 00 21 (ChanIdent) (StartMove) d s
- Data: StartMove = `0x01`: Start move, StartMove = `Others`: Don't move.
- Description: Used to start a open/close loop move. Upon completion of the open/close loop move sequence, the controller sends a MGMSG_PZMOT_MOVE_COMPLETED. Please find the description of MGMSG_PZMOT_MOVE_COMPLETED in the APT Serial Commands documentation.
->2. **MGMSG_PZMOT_SET_PARAMS**
- Command Head: `0x08C0`
- Command Structure: C0 08 (PackLen) d s + (SubCode)
- Description: This generic parameter set/request message is used to control the functionality of the PDXC2 controllers. Need to be used with sub-message ID and Sub Code listed in below table.
- > * **Set_PZMOT_OpenMoveParams**
- Sub-message ID: `0x46`
- Sub-message Structure: (SubMsgID) (ChanIdent) (StepSize)
- Data: SubMsgID ( word ) : always `0x46`; ChanIdent ( word ) : Channel select. Fixed to `0x1`; StepSize ( long ) : Set the move step size, range from -10000000 to +10000000.
- Description: Used to set the open loop move parameters.
- > * **Set_PZMOT_CloseMoveParams**
- Sub-message ID: `0x47`
- Sub-message Structure: (SubMsgID) (ChanIdent) (DePos)
- Data: SubMsgID ( word ) : always `0x47`; ChanIdent ( word ) : Channel select. Fixed to `0x1`; DePos ( long ) : Set desired position, the range is from -1000000 to +1000000 nm. The min set unit is 10nm.
- Description: Used to set the close loop move parameters.
-
-The complete serial commands for PDXC2 will be updated to the APT Serial Commands Documentation in the near future.
+https://www.thorlabs.com/software_pages/ViewSoftwarePage.cfm?Code=Motion_Control&viewtab=3
diff --git a/Python/Kinesis/Benchtop/UDXC/UDXC_pythonnet.py b/Python/Kinesis/Benchtop/UDXC/UDXC_pythonnet.py
new file mode 100644
index 0000000..167497b
--- /dev/null
+++ b/Python/Kinesis/Benchtop/UDXC/UDXC_pythonnet.py
@@ -0,0 +1,119 @@
+"""
+UDXC Pythonnet Example
+Date of Creation(YYYY-MM-DD): 2025-11-3
+Date of Last Modification on Github: 2025-11-3
+Python Version Used: python3.12
+Kinesis Version Tested: 1.14.56
+"""
+
+import os
+import time
+import sys
+import clr
+
+# Add References to .NET libraries
+clr.AddReference("C:\\Program Files\\Thorlabs\\Kinesis\\Thorlabs.MotionControl.Benchtop.PiezoCLI.dll")
+clr.AddReference("C:\\Program Files\\Thorlabs\\Kinesis\\Thorlabs.MotionControl.DeviceManagerCLI.dll.")
+clr.AddReference("C:\\Program Files\\Thorlabs\\Kinesis\\Thorlabs.MotionControl.GenericPiezoCLI.dll")
+
+from Thorlabs.MotionControl.DeviceManagerCLI import *
+from Thorlabs.MotionControl.Benchtop.PiezoCLI import *
+from Thorlabs.MotionControl.Benchtop.PiezoCLI.UDXC import *
+from Thorlabs.MotionControl.GenericPiezoCLI.Piezo import *
+
+
+def main():
+ """The main entry point for the application"""
+ # Uncomment this line if you are using Simulations
+ # SimulationManager.Instance.InitializeSimulations()
+ try:
+
+ # Build device list so that the library can find your devices
+ DeviceManagerCLI.BuildDeviceList()
+ # create new device
+ serial_no = str("122000001") # Replace this line with your device's serial number
+ device = InertialStageController.CreateInertialStageController(serial_no)
+
+ # Connect, begin polling, and enable
+ device.Connect(serial_no)
+ time.sleep(0.25)
+ device.StartPolling(250) #250ms polling rate
+ time.sleep(0.25) # wait statements are important to allow settings to be sent to the device
+ device.EnableDevice()
+ time.sleep(0.25) # Wait for device to enable
+
+ # Get Device information
+ deviceInfo = device.GetDeviceInfo()
+ print(deviceInfo.Description)
+
+ # Wait for Settings to Initialise
+ if not device.IsSettingsInitialized():
+ device.WaitForSettingsInitialized(10000) # 10 second timeout
+ assert device.IsSettingsInitialized() is True
+
+ # Get Device Configuration
+ udxcConfiguration = device.GetUDXCConfiguration(serial_no, DeviceConfiguration.DeviceSettingsUseOptionType.UseDeviceSettings)
+ # Not used directly in example but illustrates how to obtain device settings
+ currentDeviceSettings = UDXCSettings.GetSettings(udxcConfiguration)
+ device.SetSettings(currentDeviceSettings,True,True)
+
+ time.sleep(1)
+
+ # Performance Optimize
+ device.PulseParamsAcquireStart()
+ time.sleep(0.5)
+ print("Optimizing performance, please wait...")
+ # When IsPulseParamsAcquired is 1, it indicates the optimization has finished
+ while (not device.Status.IsPulseParamsAcquired):
+ time.sleep(0.5)
+
+ # Home the device
+ print("Homing device...")
+ device.Home(60000) #60 second timeout
+ print("Device homed")
+
+ # Optionally move the stage to target position (position is set in "nm")
+ closeLoopPosition = 100000
+ if (closeLoopPosition != 0):
+
+ # Set the target position
+ device.SetClosedLoopTarget(closeLoopPosition)
+
+ # Get and Set the velocity and acceleration
+ closedLoopParams = device.GetClosedLoopParameters()
+ closedLoopParams.RefSpeed = 10000000 # velocity is set in nm/s
+ closedLoopParams.Acceleration = 10000000 # acceleration is set in nm/s^2
+ device.SetClosedLoopParameters(closedLoopParams)
+
+ # Move the stage
+ device.MoveStart()
+ print("Moving the device to ",closeLoopPosition," nm")
+
+ # Monitor the position
+ posCheckCnt = 0
+ for i in range(200):
+ newPos = device.GetCurrentPosition()
+ if abs(closeLoopPosition - newPos) < 6000:
+ if (posCheckCnt > 3):
+ break
+ else:
+ time.sleep(0.25)
+ posCheckCnt = posCheckCnt + 1
+ else:
+ time.sleep(0.25)
+
+ # Print the current position
+ print("Device moved to ", newPos," nm")
+
+ # Stop polling and close device
+ device.StopPolling()
+ device.Disconnect(True)
+ except Exception as e:
+ print(e)
+
+ # Uncomment this line if you are using Simulations
+ # SimulationManager.Instance.UninitializeSimulations()
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/Python/XA/README.md b/Python/XA/README.md
index 05002cb..4a9107f 100644
--- a/Python/XA/README.md
+++ b/Python/XA/README.md
@@ -3,9 +3,10 @@
Before testing the examples, be sure to install the XA software from the Thorlabs website [here](https://www.thorlabs.com/software_pages/ViewSoftwarePage.cfm?Code=Motion_Control&viewtab=0). You will also need to install the xa_sdk_setup.zip file. This can be installed with pip using the following commands from the Windows Command Prompt
```
-CD C:/LOCATION_TO_THE_ZIP_FOLDER
-pip install xa_sdk_setup.zip
+pip install C:/LOCATION_TO_THE_ZIP_FOLDER/xa_sdk_setup.zip
```
-Once installed, the dll needed for these examples will be found on your PC here: C:\Program Files\Thorlabs XA\SDK\Native (C, C++)\Libraries
+This version is still in the beta stages but once installed,
+the dll needed for these examples will be installed with XA
+here: C:\Program Files\Thorlabs XA\SDK\Native (C, C++)\Libraries
This should be copied to the location of the examples being run.
diff --git a/Python/XA/xa_sdk_setup.zip b/Python/XA/xa_sdk_setup.zip
index b6e95ed..cd104b4 100644
Binary files a/Python/XA/xa_sdk_setup.zip and b/Python/XA/xa_sdk_setup.zip differ