New script engine
The XScript execution engine has been rebuilt from scratch and is now the default. Error detection is far more accurate, and scripts run as compiled bytecode.
A rebuilt script engine, sequence testing without hardware, and a thorough overhaul of screens, messages and licensing. This is the official release covering everything developed in 2026.
The eight biggest changes in 4.0. See the detailed sections below for everything else.
The XScript execution engine has been rebuilt from scratch and is now the default. Error detection is far more accurate, and scripts run as compiled bytecode.
One option turns IO and motors into built-in virtual devices, so you can run a sequence end to end without any hardware.
Ship compiled scripts (.xmc) without the source (.xms). The deployed package runs but cannot be opened in Studio or edited.
Switch the development UI — menus, toolbar, tabs, dialogs — between English and Korean instantly. Compile error messages are translated too.
More than fifteen new controls including charts, alarm lists, a sequence monitor and loading spinners, plus SVG vector image support.
Work with SQLite and MSSQL straight from scripts via DB["name"], and manage schemas and queries in Database Studio.
Accounts were rewritten with password policies, lockout, audit trails and automatic logout.
Three clear editions, plus grace operation so a loose dongle contact no longer stops the line immediately.
The language itself grew considerably. Existing scripts keep working; the new syntax is there when you need it.
The default script engine is now the new engine (Bytecode). You can switch back to Legacy in Tools > Options > Script Engine.
Scripts are compiled to bytecode before running. A build cache (.xmc) skips recompiling when the source is unchanged.
The active engine and its version appear in the system and startup logs. From a script, use SYS.GetScriptEngine().
Integer arithmetic is now handled at full 64-bit precision, so very large values compare and calculate correctly.
Writing past the end of an array used to silently grow it; it is now a runtime error, consistent with reads and with the legacy engine.
char type — character literals ('A'), comparison, character/number arithmetic and string indexing (str[i]).
byte type and byte arrays — for binary protocol buffers. Values wrap automatically when out of range.
switch statement — match several values with case 1, 2, with automatic break.
Hex and binary literals — 0xFF, 0b1111_1111, with _ as a digit separator.
Single-line bodies without braces — if(a) Log(a); in the usual C#/C++ style.
Multi-line statements — break expressions and calls across lines inside brackets, no trailing backslash needed.
Function return types — FUNCTION bool Foo() / FUNCTION void Bar(). Omitting the type behaves as before.
ref parameters — return a value and a success flag from the same function.
Short-circuit evaluation — in if(A && B()), B() is skipped once A settles the result.
C# enum support — enums exposed by drivers are usable directly as TypeName_ValueName constants.
CONTROL["Module::Control"] — read and write screen control properties from a script.
DRIVER["DriverName"] / LIB["Name"] — call driver-specific features and your own project library.
DB["Name"] — run queries, transactions and backups from a script.
CONTAINER["Name"] — direct container access. Material handling is now organised as DEVICEMGR / CONTAINER / DEVICE (existing syntax still works).
Thread synchronisation — SYS.CreateEvent/WaitEvent and SYS.CreateSemaphore/WaitSemaphore, so you can wait on a signal instead of polling with Sleep.
Cursor-based table API — UseTable/AddRow/SetField/GetField handle rows and fields without index arithmetic.
Serial number manager — register rules, generate and preview serial numbers from a script (SN.*).
Sequence state queries — SYS.GetCurrentStep(module) and SYS.GetCurrentStepIndex(module).
Suppress repetitive debug logs with SYS.SetDebugLog(true/false).
Switch job files at runtime — SYS.ChangeJobFile("Default.JOB", false) for a silent change.
HTTP calls (SYS.SendHttpPost/Get/Patch/Delete) gained per-request timeouts and much better throughput under concurrent load. SendHttpPostFireAndForget was added for status reports that need no response.
Exclude unused communication devices — COM["Name"].SetUse(false) stops auto-connect and connection-failure alerts.
Mistakes that used to surface only at run time are now caught at build time — far fewer lines stopped by a typo or a wrong argument.
Object name checking — IO, motor, device and module names written as string constants are verified against the project at build time. If only the letter case differs, a hint is shown.
Property and argument checking — unknown property names, wrong argument counts, and values passed to a ref parameter are reported as errors.
Type checking — assigning a string to a bool, using += on a bool, and mismatched return types are detected.
Duplicate function declarations are now build errors (previously one of them was silently ignored).
Screen binding validation — DataName problems on design controls are reported as "name not found" or "type mismatch". Renaming a variable re-links every control on the next build.
IO and motor function links — if a link breaks because of a typo or a deleted function, a build warning is shown.
Compile error messages are shown in English or Korean, and the list switches language immediately when you change the display language.
F8 / Shift+F8 jump to the next and previous error.
Errors now report the real function or step name with the line number inside it, and double-clicking opens that script.
Identical consecutive errors are collapsed into one line with a repeat count (xN).
Dark and light themes in the script editor (keywords, comments, strings, numbers, line numbers, search highlight).
Syntax highlighting control (SyntaxEditor) — display XScript, C#, C++, HTML, JSON or XML code on your own screens with highlighting and line numbers.
Search results open as one tab per keyword (up to 10, navigate with F3 / Shift+F3).
Stronger code completion — array members, name lists for CONTROL[, DEVICE[, VISION[ and DB[, automatic correction of lowercase sys. to SYS., and adding a missing parameter on the spot.
Code formatting (Ctrl+D) now indents brace-less bodies and } else { correctly.
Semicolons are no longer inserted automatically on save. Your source is preserved exactly as typed, and misplaced semicolons are reported as warnings instead.
Editing .xms / .xmd in an external editor is detected automatically; after you confirm, files are reloaded and the open tab and caret position are restored.
Simulation mode — enable it in the project options and IO and motors switch to built-in virtual devices, so sequences run without hardware. Virtual motors compute travel time from the speed and acceleration settings so the position advances like a real board (homing, jog, stop and pause supported), and virtual IO remembers its state and injects the expected value on a Wait call so the sequence keeps moving on its own. A SIMULATION banner appears in the title bar, and returning to normal mode turns all outputs off and requires re-homing every axis.
Maintenance mode — a LOTO-style safe working mode. Entering it blocks the screen with a full-screen overlay and disables motor motion, event functions, external switches and shortcuts; only Engineer level or above can leave it. Control it from a script with SYS.EnterMaintenance/ExitMaintenance.
Tray mode — when started in machine mode, run in the background from the system tray (Show / Hide / Exit from the tray menu).
Windows shutdown handling — operation is stopped and run data saved automatically when the PC shuts down or the user logs off. The OnWindowsShutdown script event can also refuse the shutdown (configurable in the project options).
System issue notification in machine mode — driver loading, setup data files, communication connections and script errors are reported in a dialog on the machine screen (optional; nothing appears when there are no problems).
An option to switch to the Run screen automatically when operation starts (off by default).
Charts — line, bar (XBarChart) and radial (XRadialChart). X-axis label formats, category labels and label steps, value labels on top of bars, and multilingual series titles.
Alarm and event lists (XAlarmListView / XEventListView) — search, filter, CSV export, auto-scroll, Ack/Reset/Detail buttons and priority colour badges.
Sequence monitor (XSequenceDisplay) — current step, cycle time, per-step pass count and last execution time on one screen.
Loading spinner — five shapes × four animations, switching on and off from a bound value.
Arrow button (ArrowButton) — up/down/left/right/CW/CCW/Stop vector icons, Click/Momentary/Toggle modes, LED indicator and label.
Circular progress bar (XCircularProgressBar), timer (XTimer, not shown at run time), touch gesture area (XTouchArea, swipes), date picker (XDatePicker), password box (XPasswordBox), circle/ellipse shape (ShapeCircle), item list box (XItemListBox) and a serial rule editor (XSerialNumberRuleEditor).
SVG vector images — Image, ImageButton, ImageDisplay and AnimateImage accept .svg files just like PNG, staying sharp at any resolution.
DataGrid column sorting — click a header to cycle ascending, descending, off. Live updates pause while sorted so the order stays stable.
Value colours and status badges — colour cell text or show a pill badge based on the value, with a dedicated editor dialog and template galleries (OK/NG, Traffic, Grade and more).
Conditional formatting — text contains, and numeric greater/less/at-least/at-most rules.
CheckBox columns, with a header checkbox for tri-state select-all.
New design properties for the outer border, corner radius, row height and scrollbar visibility.
Multilingual column headers and combo items (opt-in, no effect on existing projects).
Force a refresh from a script — CONTROL["Module::Control"].RefreshData().
Property categories — properties are grouped into collapsible Layout / Appearance / Behavior / Data / Event sections, with Name and Caption always at the top. Collapse state is remembered and you can sort by Name or Category.
Selecting a small control no longer covers it with resize handles, so it can still be dragged; a move cursor is shown over the selected control.
An unknown control on a design page used to disappear silently; a warning now explains the risk of losing it on save.
Fixed a renamed control disappearing only in RUN mode, and copied control names accumulating as _1_1_1.
Double-clicking a control creates or opens the matching event script function.
Show Design Window scales oversized designs down proportionally so the whole page is visible.
Multi-touch on the vision display (XvDisplay) — pinch to zoom, drag to pan, double-tap to fit.
The virtual keyboard was substantially reworked: 50–300% scaling, a Hangul/English toggle synchronised with the physical keyboard, caret and delete keys (Home/◀/▶/End/Del), auto-repeat on hold, and Enter to commit. Double input on a single tap and the keyboard closing by itself on touch monitors are both fixed.
Fixed key caps showing Korean characters on operating systems without a Korean IME.
Tools > Display Language (English / Korean) — menus, toolbar, tabs, Solution Explorer, project options and shared dialogs switch immediately. Names of already-open tabs update as well.
Fixed messages continuing in the previous language after changing the project language (a restart used to be required).
Message language resolution is now consistent: if the project language is missing from the catalogue, English is used.
Every prompt and confirmation now comes from a message catalogue. Windows message boxes were removed and roughly 380 hard-coded strings were replaced with message codes, so English/Korean switching and per-project wording both work.
The message and error editor is now a single JSON catalogue editor (Ctrl+4 / Ctrl+5). Built-in, project message and project error catalogues are edited on one page, with a category tree, search, inline multilingual editing and validation.
Excel export/import for translation — a single sheet with code, source and translation columns to hand to a translator, and an import preview showing new, changed and unchanged counts. Placeholder ({0}) consistency is verified and a backup is taken automatically.
A button to copy built-in messages into the project catalogue (only codes not already present).
Multi-line message handling was cleaned up — \n appearing literally in edit fields, and line breaks corrupting the error dialog and logs, are both fixed.
Alarm state machine — Active → Acknowledged → Cleared → ResetRequired → Resetting → Completed, separating Ack (operator acknowledgement) from Reset (recovery command). A legacy compatibility mode is on by default.
Alarm detail dialog — code, time, module, state, priority and acknowledging user in a structured header, with message, cause and action sections and a copy-all button.
Toast notifications — ShowTimerMessage now appears as a non-modal toast. Position, duration, font, colours and how many can appear at once are configurable, with a live preview.
New script functions ShowWarning, RegisterAlarmHandler, ClearAlarm and LogEvent.
Custom themes — pick a theme file (.xaml) from the project's Themes folder. A separate theme editor utility (QmsThemeEditor) is included.
Text disappearing against the background in dark and custom themes was addressed across the product (menu hover, button captions, title bars, tree selection, property headers, input fields). Colours missing from a custom theme file are filled in from the built-in theme.
The unused Green theme was removed. The built-in themes are Light and Dark.
Database access from scripts — DB["Name"] handles SELECT queries, parameterised statements, transactions, JSON-schema table creation and online backup, for SQLite and MSSQL.
Database Studio — Structure / Data / SQL tabs. Edit schemas in a table form (dropdowns, templates, one-click columns) and use the SQL editor with syntax highlighting, F5 execution, run-selection and history.
Database Connections — connections are managed as a card list with connection tests and automatic backup. Changing an SQLite path asks whether to move or copy the file.
Database Events — see which of the eight DB events (opened, closed, error, backup, remote, …) are implemented and add them in one click.
Code completion for DB[ names and members.
Fixed the application exiting without a log during database queries such as CSV export, and crashing when loading a table schema.
Rewritten account system — passwords stored with PBKDF2-SHA256 and user data encrypted with AES-256. The audit trail uses a hash chain so tampering is detectable.
Policy settings — minimum password length, expiry period, advance expiry warning, password history reuse ban, lockout after failed logins, deactivation of unused accounts, and forced change after an administrator reset.
Automatic logout — idle timeout and in-operation logout time, both in minutes (0 disables). Automatic operation suppresses it, and a script API can suspend it temporarily.
User management screen — Users / Audit Log / Policy tabs, account state shown with colours and badges, unlock and temporary password actions, and live refresh when something changes.
Script login API — GUI.Login(id, pw), GUI.IsLoggedIn, GUI.CurrentUserId/CurrentUserName and failure details (LastLoginResult / LastLoginMessage).
The option that skips the login dialog when the required level is below Developer and that built-in account's password is empty is now on by default. Turn it off in the project options if you always want the dialog. Developer level always prompts regardless of the option.
The default minimum password length changed from 8 to 0 (no limit).
The login and password-change dialogs are multilingual and use the project design font.
Pause and resume — a moving axis decelerates to a stop and, on resume, continues to its original target. Choose between stopping immediately (MotionHold) or finishing the current move first (StepBoundary). Homing, sensor-search moves and gantry slave axes are excluded, and axes that must keep running (conveyors) can be excluded individually with PauseEnable.
Function link visibility — the motor list shows Check/PreHome/AfterHome link lamps with the function names and a 'Check Function' column. Functions that are named but not linked are dimmed with a tooltip explaining why.
+/X buttons in the motor setup screen create and link Check/PreHome/AfterHome functions immediately.
The motor test screen was reworked — a STATUS bar showing the result of the last action, functional colour icons in the status header, an 'In Motion' column, and automatic hiding of unused signals.
Motor Repeat and Cylinder Test now raise an error alarm with the reason when an action fails.
MotorDisplay lets you configure status icons, lamp colours and which fields are shown.
Function links in the IO editor — create and link check and event functions with +/X buttons; links are stored in the settings file. The list shows link state (green dot plus function name) and refreshes automatically even while the editor is open.
IO check and event functions receive the on/off value directly as a second (name, state) argument.
IO monitoring moved to a dedicated thread, so a Sleep inside an event script no longer freezes the screen.
Custom IO modules — enter the direction and point counts yourself to build modules such as IN32OUT32 or IN48OUT48 (asymmetric counts supported, up to 1000 points per module).
Fixed sluggish list behaviour when selecting a module with a large number of IO points.
Multi-buzzer support — buzzer mode (single / 4-channel / 15-combination), K1–K4 IO, and a sound number per state. Scripts gained TOWERLAMP.SetBuzzerSound/PlayBuzzerSound.
The tower lamp editor was cleaned up — colour-coded headers, automatic hiding of unused colours, delete confirmation, and fixes for lost edits and duplicated items changing the original.
Container features were extended — map position search (GetDevicePos family), capacity and map size settings, EmptyCount/IsFull/IsEmpty, and atomic material moves that verify the target can accept the item first.
EasyVision has been renamed QVision (driver name "QVision", sample project QVisionSample).
OCR tool — recognises characters by segmenting character regions and matching against a trained font, storing the OCR settings and character patterns together in a single font file.
Shape find accuracy — edge polarity matching (six modes including Normal/Inverse/Any), model-edge based scoring, an edge match tolerance, automatic Canny thresholds for dark or low-contrast backgrounds, and a fix for low scores when searching the very image the model was trained on.
New gauges — a rhombus gauge, plus display improvements for the circle gauge.
The vision object editor was reworked — camera, image and tool lists were merged into a single tree and the UI is multilingual. Edits being lost without a save prompt is also fixed.
RTSP/IP camera driver (XRtspCamera) — connect by entering an rtsp:// URL as the CameraID, with automatic reconnection, low-latency options and GPU hardware decoding.
USB camera auto-recovery — dropped frames are detected and the camera reconnects, and an unresponsive camera no longer keeps returning stale frames.
Overall QR grading (ISO 15415 / ISO 29158) is available.
FCAT — Floware EtherCAT motion and IO driver, with limit and home sensor readout, InPosition signal, CiA402 homing method selection, and detection of a master restart or abnormal termination.
LS PLC (XGT FEnet) — TCP client. Addresses can be entered in short form such as D7000 or M100.5, without the % prefix.
Dynamark K300 printer — ink level, temperature, voltage and RPM readout, job switching, and error messages in five languages.
UV Controller (RS485) and the Phoseon FireJet UV curing unit.
Web remote control (QWebRemote) — connect from a phone, tablet or PC browser to view IO, motors and cylinders. Motors get a directional jog dial with speed selection; control is blocked while the machine is running, and a motor stops automatically if the connection drops.
QMachineNet — per-unit RGB LED control, StallGuard time-series capture and firmware version readout.
Ajin motion drivers gained acceleration profile modes (symmetric/asymmetric trapezoid, pseudo S-curve, symmetric/asymmetric S-curve) and S-curve jerk settings. Defaults are unchanged.
Ajin EtherCAT missing slave detection — if the configured axis count differs from what the driver recognises, a clear error is logged and motion is blocked, preventing commands going to the wrong axis after a shift.
Communication robustness was strengthened overall — ModBus TCP/RTU fragmented packets, TCP reconnection and LS PLC response matching.
Drivers now find their dependent DLLs, including native runtimes, in subfolders as well.
Redesigned deployment tool — instead of combining 17 checkboxes, you pick one of four purposes (Project Update / Project Full / Program Update / Full Package). Estimated and elapsed time are shown with a progress bar, and the output folder opens when finished. Development files (.git, DevDocs, *.bak/tmp/log and similar) are excluded automatically.
Binary deployment — ship only the compiled scripts (.xmc) without the source (.xms). The deployed package is run-only: Studio cannot be entered and code cannot be edited. Requires the Bytecode script engine.
Git integration — Git Add, Revert and Push were added to the File menu. Select changed files with checkboxes and commit directly, see file status as vector icons (modified, added, deleted, renamed and so on), and double-click a file name for a diff. The dialogs are available in English and Korean.
Installer (Inno Setup) — a setup wizard and licence agreement in Korean, English and Japanese. These release notes can be opened in your chosen language when installation finishes.
Open source licence notice — the Help menu lists the open source packages in use with their copyright and full licence text, and a Licenses folder ships with the product.
Release notes — this document is available from the Help menu in English, Korean, Japanese and Chinese.
Register a machine icon (.ico) in the project options and a desktop shortcut is created automatically, so each customer can have their own icon.
Editions are now Trial, QMachineStudio Free (development only) and Licensed. Creating, editing, saving and building projects is unrestricted in every edition, and development and simulation remain available indefinitely after the trial ends.
The trial period is 30 days.
Grace operation — a momentary loss of dongle contact during operation is ignored for up to 30 seconds, and once a loss is confirmed the machine keeps running for 48 hours, so the line does not stop while a temporary code is issued. The remaining grace time is shown as a banner at the top of the screen, and the grace state clears as soon as the dongle is recognised again.
Software licence registration — no separate program needed. Read and copy the system code in the License dialog and import the issued file directly; it is verified automatically for this PC.
USB dongle V2 format — encrypted against tampering and carrying the project code. Existing V1 dongles are still recognised.
Project-specific licences — a key issued for one project only runs projects whose code matches. A Project Code tab was added to the project options (visible only with a Master key inserted).
QMS License Studio — a new licence issuing tool with multi-dongle target selection, a change review before writing, issue history, templates that carry the full specification, multilingual UI and light/dark themes.
Dongle reads are much faster (about 140 ms to about 16 ms for 256 bytes), with automatic retries on failure and read-back verification after writing. The application freezing on an unresponsive dongle is also fixed.
Fixed axis-count and project-code checks being skipped whenever a dongle was present. Camera counts are now checked as well.
The About, splash and licence screens show the current edition and licence grade (RunTime / Developer / Master).
Project open and startup time — parallel loading of IO, motors, cylinders and vision, a shared control scan cache for design views, no double parsing of files, deferred toolbox construction, background preparation of the system font list, and a shorter splash fade-out (2 s to 0.5 s).
Memory leaks fixed — memory no longer grows when switching repeatedly between developer and runtime modes (previous RUN screen generations not released, window-type view modules not closed, blinking controls left subscribed to global events, message and alarm popups accumulating, vision screen generations piling up).
Thread safety — rare errors and hangs in concurrent script array use, random number generation, database access and licence polling were eliminated.
Log flooding suppressed — a repeating step error is logged once with a repeat count, and a summary is written when it clears. Repeated failures from disconnected devices are throttled too.
Abnormal termination is now logged. Previously the application could exit with nothing in the log; crashes caused by file dialogs and shell extensions are also guarded.
Fixed monitoring and sequence threads continuing after a module was deleted, and duplicate refresh timers on data display controls raising CPU use.
Fixed motor, IO, cylinder and page level data from the previous project remaining after closing it and opening another.
Automatic project backup — set a backup folder and how many generations to keep; older folders are removed automatically.
ScriptTutorial — an 18-lesson XScript curriculum with the code on the left and the execution result on the right.
ScriptSyntaxSample — test syntax by category with buttons, and run the same code on the legacy and new engines to compare the results.
SequenceSample — a sequence tutorial with five interlocked picker and conveyor modules, showing device movement and sequence state on screen.
ChartDemo (charts), CameraSample (RTSP camera), DB_Sqlite (database CRUD and transactions) and a ModBus TCP client sample.
These behaviours may differ when a 3.x project is opened in 4.0. Please review them before deploying to a machine.
The default script engine is now the new engine (Bytecode). Most scripts run unchanged, but errors that used to pass silently may now surface as compile errors. If that causes trouble, switch back to Legacy in Tools > Options > Script Engine.
The deployed .xmc format changed. Rebuild scripts (F6) before a binary deployment. Orphaned .xmc files whose source is gone are excluded automatically.
A function with the same name as a step used to stop that sequence step from running; step and function names are now separated. Declaring the same function name twice is a build error.
Writing past the end of an array is a runtime error. Change array size only by setting arr.Count.
Automatic semicolon insertion was removed. Your source is saved exactly as typed.
Auto-login for empty passwords is now on by default, and the default minimum password length is 0. Adjust both in the project options if needed.
Toast defaults changed to top-centre position and font size 20 (Project Options > Toast).
New functions are created with a bool return type (FUNCTION bool Name() plus return true).
The Green theme was removed. Use Light, Dark or a custom theme.
Map container row search functions (GetDeviceRow / GetDeviceRankRow / GetEmptyRow) were removed in favour of the GetDevicePos family.
The MOTION keyword was removed. Call interpolated motion through DRIVER["DriverName"].
Renames — EasyVision → QVision, JogArrowButton → ArrowButton (existing saved files remain compatible), Message Editor → Message Error Editor.
The serial rule file (SerialRules.XDF) moves from the project root to the XData folder, automatically when the project is opened. No action is required.
The message/error translation Excel format is now a single combined sheet. Older three-sheet files are still recognised on import.
Deleting a script or design module deletes it immediately (previously it was moved to a Backup folder). Use the automatic project backup option if you need a safety net.