<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.commander4j.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dgarratt</id>
	<title>Commander4j - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.commander4j.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dgarratt"/>
	<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Special:Contributions/Dgarratt"/>
	<updated>2026-06-14T20:39:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1878</id>
		<title>LogoClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1878"/>
		<updated>2026-06-13T19:43:05Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoClient&#039;&#039;&#039; (&#039;&#039;c4j_logoclient&#039;&#039;) is a standalone desktop application — and underlying client library — for communicating with [[Logopak]] PowerLeap label printers over the network. It connects to a labeller, transfers layout and data files to and from it, sends commands and field data, browses the printer&#039;s on-board storage and retrieves its logs. It exists so that the software-to-labeller conversation can be developed, exercised and diagnosed &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the client half of a pair: where a real labeller is not to hand, [[LogoRenderer]] can emulate one, and LogoClient talks to that emulator exactly as it would talk to real hardware. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoClient is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Software from Logopak DE drives labellers in production. When developing or supporting that software it is useful to be able to perform the same low-level operations by hand, and to see exactly what goes across the wire. LogoClient is that tool. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;send a layout or data file to a labeller&#039;&#039;&#039; and confirm it loads correctly.&lt;br /&gt;
* You want to &#039;&#039;&#039;browse, upload, download or delete files&#039;&#039;&#039; on the printer&#039;s on-board drives.&lt;br /&gt;
* You are &#039;&#039;&#039;debugging the protocol&#039;&#039;&#039; and want a live, byte-level trace of everything sent and received.&lt;br /&gt;
* You need to &#039;&#039;&#039;send raw commands or field data&#039;&#039;&#039; to a labeller and read its replies.&lt;br /&gt;
* You want to &#039;&#039;&#039;poll a labeller&#039;s pallet log&#039;&#039;&#039; and capture one file per SSCC as labels are applied.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; by pointing LogoClient at the [[LogoRenderer]] printer emulator instead of real hardware.&lt;br /&gt;
&lt;br /&gt;
== Supported Printers and Protocols ==&lt;br /&gt;
&lt;br /&gt;
LogoClient supports both current Logopak controller generations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mode !! Hardware !! Transport&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; || PowerLeap III || Direct TCP socket on the data ports (8000 / 8100 / 8200 / 8300). Carries the full LEAP, LAMA/LACE and LSP command set — layout activation, field data, firmware queries, file management, I/O monitoring and asynchronous reporting.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL6 (SFTP)&#039;&#039;&#039; || PowerLeap 6 || File transfer over SFTP (port 22). PL6 is driven by exchanging files rather than TCP commands, so this mode is focused on uploading, downloading and listing files and reading the pallet log.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoClient is part of the open-source Commander4j suite and is distributed under the GNU General Public License. The source code and release downloads are hosted on GitHub, and native install packages for every platform are listed on the Commander4j [[Downloads]] page.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/LogoClient https://github.com/C4J/LogoClient]&lt;br /&gt;
* &#039;&#039;&#039;Releases (download media):&#039;&#039;&#039; [https://github.com/C4J/LogoClient/releases https://github.com/C4J/LogoClient/releases]&lt;br /&gt;
* &#039;&#039;&#039;All Commander4j downloads:&#039;&#039;&#039; [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoClient&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar c4j_logoclient.jar&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 21 or later). The bundled JSch library is required only for PL6 (SFTP); PL3 (TCP) has no external dependencies.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, a central &#039;&#039;&#039;file-transfer and directory area&#039;&#039;&#039;, a &#039;&#039;&#039;message pane&#039;&#039;&#039; for composing raw commands, and a pair of log panes along the bottom — an &#039;&#039;&#039;activity log&#039;&#039;&#039; and a &#039;&#039;&#039;wire trace&#039;&#039;&#039;. All transfer and command actions are disabled until a connection is open.&lt;br /&gt;
&lt;br /&gt;
=== Connecting ===&lt;br /&gt;
&lt;br /&gt;
In the connection bar you choose the connection &#039;&#039;&#039;Type&#039;&#039;&#039; (PL3 TCP or PL6 SFTP), enter the labeller&#039;s &#039;&#039;&#039;host / IP address&#039;&#039;&#039; and &#039;&#039;&#039;port&#039;&#039;&#039;, and — for PL6 — a &#039;&#039;&#039;username and password&#039;&#039;&#039;. Pressing the connect button opens the link; a status indicator shows the connected host and port. For example, the [[LogoRenderer]] emulator running on the same PC is reached at &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Options in the connection area let you list the remote directory automatically on connect, send a periodic &#039;&#039;&#039;heartbeat&#039;&#039;&#039; to detect a dropped link, and set the socket read timeout.&lt;br /&gt;
&lt;br /&gt;
=== Transferring and Managing Files ===&lt;br /&gt;
&lt;br /&gt;
The central area lists the files on the printer for a chosen remote path and file mask, showing each file&#039;s name, size, modified time and type. From here you can:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Upload&#039;&#039;&#039; a local file to the printer.&lt;br /&gt;
* &#039;&#039;&#039;Download&#039;&#039;&#039; one or more selected files to a chosen local folder.&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; selected files from the printer (with confirmation).&lt;br /&gt;
* &#039;&#039;&#039;Refresh&#039;&#039;&#039; the listing, and on PL6 navigate into sub-folders.&lt;br /&gt;
&lt;br /&gt;
PL3 exposes the printer&#039;s storage areas (&amp;lt;code&amp;gt;/c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/r0/&amp;lt;/code&amp;gt;) with file masks such as &amp;lt;code&amp;gt;*.llf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*.pcx&amp;lt;/code&amp;gt;; PL6 exposes its SFTP folders.&lt;br /&gt;
&lt;br /&gt;
=== Sending Commands and Field Data ===&lt;br /&gt;
&lt;br /&gt;
In PL3 mode the message pane composes and transmits raw text to the labeller. Control characters can be entered as readable tokens such as &amp;lt;code&amp;gt;&amp;lt;STX&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;ETX&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;CR&amp;gt;&amp;lt;/code&amp;gt;, and the end-of-line terminator appended on send is selectable. This is how layouts are activated, field data is sent, and LAMA/LSP queries are issued by hand. Replies appear in the activity log and the raw bytes in the wire trace.&lt;br /&gt;
&lt;br /&gt;
=== Pallet Log Polling ===&lt;br /&gt;
&lt;br /&gt;
LogoClient can poll the labeller&#039;s pallet log at a chosen interval and write the results to disk — one timestamped file per unique SSCC — into a chosen log folder. This reproduces, by hand, the &amp;quot;what was printed&amp;quot; feedback that production software collects, and works against both PL3 and PL6.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log and Wire Trace ===&lt;br /&gt;
&lt;br /&gt;
Two panes record what happens. The &#039;&#039;&#039;activity log&#039;&#039;&#039; is a readable, timestamped narrative of connects, transfers, commands and errors. The &#039;&#039;&#039;wire trace&#039;&#039;&#039; shows the raw bytes in both directions — transmitted and received — with control characters rendered as tokens, which is invaluable when diagnosing exactly what a labeller sent or expected. Both panes can be saved to a text file or cleared.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection details and interface preferences are saved when you quit and restored on the next start, so the tool reopens ready to reconnect to the labeller you last used.&lt;br /&gt;
&lt;br /&gt;
== Using LogoClient and LogoRenderer Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoRenderer]]&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;LogoClient&#039;&#039;&#039;, choose &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039;, set the host to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; and the matching port, and connect.&lt;br /&gt;
# &#039;&#039;&#039;Upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoClient stands in for the driving software so you can develop and test against the renderer, while LogoRenderer stands in for the printer so you have something to talk to.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoRenderer]] — the companion tool that renders labels and emulates a Logopak printer&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — other Commander4j components in the labelling workflow&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1877</id>
		<title>LogoRenderer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1877"/>
		<updated>2026-06-13T19:43:03Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; (&#039;&#039;c4j_logorenderer&#039;&#039;) is a standalone desktop application that renders [[Logopak]] PowerLeap label layout files to a visual on-screen preview &#039;&#039;&#039;and&#039;&#039;&#039; can stand in for a physical label printer by emulating its TCP communication protocol. It exists so that label layouts and the software that drives them can be developed and tested &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the rendering and printer-emulation half of a pair: [[LogoClient]] is the client that sends layouts and data to a printer, and LogoRenderer can play the part of that printer. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoRenderer is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
A Logopak PowerLeap labeller normally lives on the factory floor and is driven over the network by software provided by Logopak DE. When developing or supporting that software — or designing the label layouts themselves — it is often impractical to have a real labeller on the bench. LogoRenderer removes that dependency. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;see what a label layout will look like&#039;&#039;&#039; without printing it, by opening a &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; file and viewing a faithful preview.&lt;br /&gt;
* You are &#039;&#039;&#039;writing or debugging software that talks to a labeller&#039;&#039;&#039; and need something on the network that answers the same protocol — without owning the hardware.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; altogether: render layouts, emulate the printer, and feed it from [[LogoClient]] or your own client code.&lt;br /&gt;
* You need to &#039;&#039;&#039;check field data and operator prompts&#039;&#039;&#039; (LQF query fields) by typing values and watching the rendered label update.&lt;br /&gt;
* You are &#039;&#039;&#039;tuning fonts&#039;&#039;&#039; so the on-screen rendering matches a real printed label.&lt;br /&gt;
&lt;br /&gt;
== Label and Data File Types ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer understands the PowerLeap LEAP layout family:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt; || Layout File — a complete label layout with all field data embedded. Opening one renders the label immediately.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; || Query Layout File — a base layout containing &amp;lt;code&amp;gt;QUE&amp;lt;/code&amp;gt; operator prompts for fields that are filled in at print time. Opening one also populates the &#039;&#039;&#039;QUE Input&#039;&#039;&#039; tab so values can be typed in.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; || Data File — a data-only file that references a master layout. Opening one runs its &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; commands to load the referenced layout and populate its fields.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Layouts may reference &amp;lt;code&amp;gt;.pcx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bmp&amp;lt;/code&amp;gt; images (logotypes) and a range of barcode types. A reference list of the wider Logopak file-type ecosystem is maintained alongside the project.&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer is part of the open-source Commander4j suite and is distributed under the GNU General Public License. The source code and release downloads are hosted on GitHub, and native install packages for every platform are listed on the Commander4j [[Downloads]] page.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/LogoRenderer https://github.com/C4J/LogoRenderer]&lt;br /&gt;
* &#039;&#039;&#039;Releases (download media):&#039;&#039;&#039; [https://github.com/C4J/LogoRenderer/releases https://github.com/C4J/LogoRenderer/releases]&lt;br /&gt;
* &#039;&#039;&#039;All Commander4j downloads:&#039;&#039;&#039; [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application. It is built with Maven:&lt;br /&gt;
&lt;br /&gt;
 mvn package&lt;br /&gt;
 java -jar c4j_logorenderer.jar [file.llf]&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 25 or later). If a layout file is supplied on the command line it is opened on start-up; otherwise the application starts with an empty canvas. Demo layouts and data files are provided in the &amp;lt;code&amp;gt;virtual_disk/c0/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window is divided into a &#039;&#039;&#039;label preview canvas&#039;&#039;&#039; on the left and a &#039;&#039;&#039;tabbed working area&#039;&#039;&#039; on the right, with a menu bar and toolbars around them and a status bar along the bottom. The title bar shows the program name, version and the name of the open file.&lt;br /&gt;
&lt;br /&gt;
The status bar reports the current file, the layout dimensions in printer dots and millimetres, the zoom level, and the number of fields in the layout.&lt;br /&gt;
&lt;br /&gt;
=== Preview Canvas ===&lt;br /&gt;
&lt;br /&gt;
The canvas shows the rendered label exactly as the layout describes it — text, scalable text, barcodes, graphic lines and boxes, and embedded logotype images. The rendering engine replicates the coordinate system and geometry of a PowerLeap III print head, including the upside-down (180°) print orientation. Clicking a rendered element highlights the source lines that produce it.&lt;br /&gt;
&lt;br /&gt;
=== Source / QUE Input / Log Tabs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tab !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Source&#039;&#039;&#039; || Lists the raw layout commands, one per line, each with a checkbox and a plain-language description. Un-checking a line excludes it from the render, so individual elements can be toggled on and off. Selecting a line shows its properties for editing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;QUE Input&#039;&#039;&#039; || For LQF layouts, presents one input box per operator prompt. Type values and apply them to see the populated label. This mirrors what an operator would be asked for at the machine.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Log&#039;&#039;&#039; || A colour-coded activity log showing file loads, parser messages, and all traffic to and from the printer emulator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Viewing Controls ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;File&#039;&#039;&#039; menu opens and reloads layout files and exports the rendered label as a PNG image. The &#039;&#039;&#039;View&#039;&#039;&#039; menu provides zoom (preset levels, zoom in/out, and fit-to-window) and a &#039;&#039;&#039;Rotate 180°&#039;&#039;&#039; toggle that flips the preview to match the printer&#039;s print orientation.&lt;br /&gt;
&lt;br /&gt;
== Font Mapping ==&lt;br /&gt;
&lt;br /&gt;
Because Logopak fonts are not present on a development PC, LogoRenderer maps each Logopak font name to a Java font for rendering. The &#039;&#039;&#039;Settings → Font Mappings&#039;&#039;&#039; dialog lists every mapping and lets you set the Java font family (or a bundled TrueType file), style, reference cell size and calibration factors so that the on-screen text closely matches a real printed label. The mappings are stored in &amp;lt;code&amp;gt;xml/config/fonts.xml&amp;lt;/code&amp;gt;; fonts found in a layout but not yet mapped are added automatically with sensible defaults, ready to be fine-tuned.&lt;br /&gt;
&lt;br /&gt;
== The Printer Emulator ==&lt;br /&gt;
&lt;br /&gt;
This is the feature that makes hardware-free development possible. LogoRenderer can open a TCP server that emulates a Logopak PowerLeap III labeller, answering the same &#039;&#039;&#039;LEAP / LAMA&#039;&#039;&#039; protocol commands a real machine would.&lt;br /&gt;
&lt;br /&gt;
=== Starting the emulator ===&lt;br /&gt;
&lt;br /&gt;
The connection bar at the top of the window selects the &#039;&#039;&#039;IP address&#039;&#039;&#039; (default &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; for the local machine) and &#039;&#039;&#039;port&#039;&#039;&#039; (default &#039;&#039;&#039;8000&#039;&#039;&#039;, the PowerLeap III primary data port; &amp;lt;code&amp;gt;8100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8200&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;8300&amp;lt;/code&amp;gt; are also offered). Pressing &#039;&#039;&#039;Start Server&#039;&#039;&#039; begins listening; the Log tab shows when a client connects. Pressing the button again stops the server.&lt;br /&gt;
&lt;br /&gt;
=== What it emulates ===&lt;br /&gt;
&lt;br /&gt;
A connected client can do, against the emulator, the things it would do against a real labeller:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Browse and transfer files&#039;&#039;&#039; on an emulated drive — the &amp;lt;code&amp;gt;virtual_disk/&amp;lt;/code&amp;gt; folder provides the labeller&#039;s storage areas (&amp;lt;code&amp;gt;c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r0/&amp;lt;/code&amp;gt;), so directory listings, downloads, uploads and deletes all behave realistically.&lt;br /&gt;
* &#039;&#039;&#039;Load a layout and send field data&#039;&#039;&#039; — when the client issues a &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; command the emulator loads that layout into the preview, and as &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; field-data commands arrive the on-screen label updates. The PC screen therefore shows what the real printer would be putting on a label.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve logs&#039;&#039;&#039; — the emulator can serve pallet/label log files back to the client, so software that polls a labeller for &amp;quot;what was printed&amp;quot; can be tested end to end.&lt;br /&gt;
&lt;br /&gt;
=== Pallet print simulation ===&lt;br /&gt;
&lt;br /&gt;
When a loaded layout contains the pallet SSCC field, a &#039;&#039;&#039;Print Label&#039;&#039;&#039; control appears. Each press simulates a pallet print — two labels per pallet sharing one [https://en.wikipedia.org/wiki/Serial_Shipping_Container_Code SSCC] — increments the SSCC counter (persisted in &amp;lt;code&amp;gt;sscc.dat&amp;lt;/code&amp;gt;), and queues a log entry that a client can later retrieve. This lets log-polling and pallet-tracking logic be exercised without a real production run.&lt;br /&gt;
&lt;br /&gt;
== Using LogoRenderer and LogoClient Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoClient]]&#039;&#039;&#039;, connect in &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; mode to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; on the same port.&lt;br /&gt;
# From LogoClient, &#039;&#039;&#039;upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoRenderer stands in for the printer so you can develop and test a client, while LogoClient stands in for the driving software so you can drive the renderer.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoClient]] — the client-side companion tool that sends layouts and data to a labeller (real or emulated)&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — other Commander4j components in the labelling workflow&lt;br /&gt;
* [[ZPLRenderer]] — the equivalent preview tool for Zebra ZPL labels&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1876</id>
		<title>LogoClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1876"/>
		<updated>2026-06-13T19:41:08Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoClient&#039;&#039;&#039; (&#039;&#039;c4j_logoclient&#039;&#039;) is a standalone desktop application — and underlying client library — for communicating with [[Logopak]] PowerLeap label printers over the network. It connects to a labeller, transfers layout and data files to and from it, sends commands and field data, browses the printer&#039;s on-board storage and retrieves its logs. It exists so that the software-to-labeller conversation can be developed, exercised and diagnosed &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the client half of a pair: where a real labeller is not to hand, [[LogoRenderer]] can emulate one, and LogoClient talks to that emulator exactly as it would talk to real hardware. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoClient is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Software from Logopak DE drives labellers in production. When developing or supporting that software it is useful to be able to perform the same low-level operations by hand, and to see exactly what goes across the wire. LogoClient is that tool. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;send a layout or data file to a labeller&#039;&#039;&#039; and confirm it loads correctly.&lt;br /&gt;
* You want to &#039;&#039;&#039;browse, upload, download or delete files&#039;&#039;&#039; on the printer&#039;s on-board drives.&lt;br /&gt;
* You are &#039;&#039;&#039;debugging the protocol&#039;&#039;&#039; and want a live, byte-level trace of everything sent and received.&lt;br /&gt;
* You need to &#039;&#039;&#039;send raw commands or field data&#039;&#039;&#039; to a labeller and read its replies.&lt;br /&gt;
* You want to &#039;&#039;&#039;poll a labeller&#039;s pallet log&#039;&#039;&#039; and capture one file per SSCC as labels are applied.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; by pointing LogoClient at the [[LogoRenderer]] printer emulator instead of real hardware.&lt;br /&gt;
&lt;br /&gt;
== Supported Printers and Protocols ==&lt;br /&gt;
&lt;br /&gt;
LogoClient supports both current Logopak controller generations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mode !! Hardware !! Transport&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; || PowerLeap III || Direct TCP socket on the data ports (8000 / 8100 / 8200 / 8300). Carries the full LEAP, LAMA/LACE and LSP command set — layout activation, field data, firmware queries, file management, I/O monitoring and asynchronous reporting.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL6 (SFTP)&#039;&#039;&#039; || PowerLeap 6 || File transfer over SFTP (port 22). PL6 is driven by exchanging files rather than TCP commands, so this mode is focused on uploading, downloading and listing files and reading the pallet log.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoClient is part of the open-source Commander4j suite and is distributed under the GNU General Public License. The source code and release downloads are hosted on GitHub, and native install packages for every platform are listed on the Commander4j [[Downloads]] page.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/LogoClient https://github.com/C4J/LogoClient]&lt;br /&gt;
* &#039;&#039;&#039;Releases (download media):&#039;&#039;&#039; [https://github.com/C4J/LogoClient/releases https://github.com/C4J/LogoClient/releases]&lt;br /&gt;
* &#039;&#039;&#039;All Commander4j downloads:&#039;&#039;&#039; [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoClient&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar c4j_logoclient.jar&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 21 or later). The bundled JSch library is required only for PL6 (SFTP); PL3 (TCP) has no external dependencies.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, a central &#039;&#039;&#039;file-transfer and directory area&#039;&#039;&#039;, a &#039;&#039;&#039;message pane&#039;&#039;&#039; for composing raw commands, and a pair of log panes along the bottom — an &#039;&#039;&#039;activity log&#039;&#039;&#039; and a &#039;&#039;&#039;wire trace&#039;&#039;&#039;. All transfer and command actions are disabled until a connection is open.&lt;br /&gt;
&lt;br /&gt;
=== Connecting ===&lt;br /&gt;
&lt;br /&gt;
In the connection bar you choose the connection &#039;&#039;&#039;Type&#039;&#039;&#039; (PL3 TCP or PL6 SFTP), enter the labeller&#039;s &#039;&#039;&#039;host / IP address&#039;&#039;&#039; and &#039;&#039;&#039;port&#039;&#039;&#039;, and — for PL6 — a &#039;&#039;&#039;username and password&#039;&#039;&#039;. Pressing the connect button opens the link; a status indicator shows the connected host and port. A real labeller is typically reached at its own network address (for example &amp;lt;code&amp;gt;192.168.1.100&amp;lt;/code&amp;gt;); the [[LogoRenderer]] emulator is reached at &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Options in the connection area let you list the remote directory automatically on connect, send a periodic &#039;&#039;&#039;heartbeat&#039;&#039;&#039; to detect a dropped link, and set the socket read timeout.&lt;br /&gt;
&lt;br /&gt;
=== Transferring and Managing Files ===&lt;br /&gt;
&lt;br /&gt;
The central area lists the files on the printer for a chosen remote path and file mask, showing each file&#039;s name, size, modified time and type. From here you can:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Upload&#039;&#039;&#039; a local file to the printer.&lt;br /&gt;
* &#039;&#039;&#039;Download&#039;&#039;&#039; one or more selected files to a chosen local folder.&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; selected files from the printer (with confirmation).&lt;br /&gt;
* &#039;&#039;&#039;Refresh&#039;&#039;&#039; the listing, and on PL6 navigate into sub-folders.&lt;br /&gt;
&lt;br /&gt;
PL3 exposes the printer&#039;s storage areas (&amp;lt;code&amp;gt;/c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/r0/&amp;lt;/code&amp;gt;) with file masks such as &amp;lt;code&amp;gt;*.llf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*.pcx&amp;lt;/code&amp;gt;; PL6 exposes its SFTP folders.&lt;br /&gt;
&lt;br /&gt;
=== Sending Commands and Field Data ===&lt;br /&gt;
&lt;br /&gt;
In PL3 mode the message pane composes and transmits raw text to the labeller. Control characters can be entered as readable tokens such as &amp;lt;code&amp;gt;&amp;lt;STX&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;ETX&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;CR&amp;gt;&amp;lt;/code&amp;gt;, and the end-of-line terminator appended on send is selectable. This is how layouts are activated, field data is sent, and LAMA/LSP queries are issued by hand. Replies appear in the activity log and the raw bytes in the wire trace.&lt;br /&gt;
&lt;br /&gt;
=== Pallet Log Polling ===&lt;br /&gt;
&lt;br /&gt;
LogoClient can poll the labeller&#039;s pallet log at a chosen interval and write the results to disk — one timestamped file per unique SSCC — into a chosen log folder. This reproduces, by hand, the &amp;quot;what was printed&amp;quot; feedback that production software collects, and works against both PL3 and PL6.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log and Wire Trace ===&lt;br /&gt;
&lt;br /&gt;
Two panes record what happens. The &#039;&#039;&#039;activity log&#039;&#039;&#039; is a readable, timestamped narrative of connects, transfers, commands and errors. The &#039;&#039;&#039;wire trace&#039;&#039;&#039; shows the raw bytes in both directions — transmitted and received — with control characters rendered as tokens, which is invaluable when diagnosing exactly what a labeller sent or expected. Both panes can be saved to a text file or cleared.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection details and interface preferences are saved when you quit and restored on the next start, so the tool reopens ready to reconnect to the labeller you last used.&lt;br /&gt;
&lt;br /&gt;
== Using LogoClient and LogoRenderer Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoRenderer]]&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;LogoClient&#039;&#039;&#039;, choose &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039;, set the host to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; and the matching port, and connect.&lt;br /&gt;
# &#039;&#039;&#039;Upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoClient stands in for the driving software so you can develop and test against the renderer, while LogoRenderer stands in for the printer so you have something to talk to. LogoClient can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoRenderer]] — the companion tool that renders labels and emulates a Logopak printer&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — other Commander4j components in the labelling workflow&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1875</id>
		<title>LogoRenderer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1875"/>
		<updated>2026-06-13T19:41:07Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; (&#039;&#039;c4j_logorenderer&#039;&#039;) is a standalone desktop application that renders [[Logopak]] PowerLeap label layout files to a visual on-screen preview &#039;&#039;&#039;and&#039;&#039;&#039; can stand in for a physical label printer by emulating its TCP communication protocol. It exists so that label layouts and the software that drives them can be developed and tested &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the rendering and printer-emulation half of a pair: [[LogoClient]] is the client that sends layouts and data to a printer, and LogoRenderer can play the part of that printer. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoRenderer is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
A Logopak PowerLeap labeller normally lives on the factory floor and is driven over the network by software provided by Logopak DE. When developing or supporting that software — or designing the label layouts themselves — it is often impractical to have a real labeller on the bench. LogoRenderer removes that dependency. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;see what a label layout will look like&#039;&#039;&#039; without printing it, by opening a &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; file and viewing a faithful preview.&lt;br /&gt;
* You are &#039;&#039;&#039;writing or debugging software that talks to a labeller&#039;&#039;&#039; and need something on the network that answers the same protocol — without owning the hardware.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; altogether: render layouts, emulate the printer, and feed it from [[LogoClient]] or your own client code.&lt;br /&gt;
* You need to &#039;&#039;&#039;check field data and operator prompts&#039;&#039;&#039; (LQF query fields) by typing values and watching the rendered label update.&lt;br /&gt;
* You are &#039;&#039;&#039;tuning fonts&#039;&#039;&#039; so the on-screen rendering matches a real printed label.&lt;br /&gt;
&lt;br /&gt;
== Label and Data File Types ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer understands the PowerLeap LEAP layout family:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt; || Layout File — a complete label layout with all field data embedded. Opening one renders the label immediately.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; || Query Layout File — a base layout containing &amp;lt;code&amp;gt;QUE&amp;lt;/code&amp;gt; operator prompts for fields that are filled in at print time. Opening one also populates the &#039;&#039;&#039;QUE Input&#039;&#039;&#039; tab so values can be typed in.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; || Data File — a data-only file that references a master layout. Opening one runs its &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; commands to load the referenced layout and populate its fields.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Layouts may reference &amp;lt;code&amp;gt;.pcx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bmp&amp;lt;/code&amp;gt; images (logotypes) and a range of barcode types. A reference list of the wider Logopak file-type ecosystem is maintained alongside the project.&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer is part of the open-source Commander4j suite and is distributed under the GNU General Public License. The source code and release downloads are hosted on GitHub, and native install packages for every platform are listed on the Commander4j [[Downloads]] page.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/LogoRenderer https://github.com/C4J/LogoRenderer]&lt;br /&gt;
* &#039;&#039;&#039;Releases (download media):&#039;&#039;&#039; [https://github.com/C4J/LogoRenderer/releases https://github.com/C4J/LogoRenderer/releases]&lt;br /&gt;
* &#039;&#039;&#039;All Commander4j downloads:&#039;&#039;&#039; [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application. It is built with Maven:&lt;br /&gt;
&lt;br /&gt;
 mvn package&lt;br /&gt;
 java -jar c4j_logorenderer.jar [file.llf]&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 25 or later). If a layout file is supplied on the command line it is opened on start-up; otherwise the application starts with an empty canvas. Demo layouts and data files are provided in the &amp;lt;code&amp;gt;virtual_disk/c0/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window is divided into a &#039;&#039;&#039;label preview canvas&#039;&#039;&#039; on the left and a &#039;&#039;&#039;tabbed working area&#039;&#039;&#039; on the right, with a menu bar and toolbars around them and a status bar along the bottom. The title bar shows the program name, version and the name of the open file.&lt;br /&gt;
&lt;br /&gt;
The status bar reports the current file, the layout dimensions in printer dots and millimetres, the zoom level, and the number of fields in the layout.&lt;br /&gt;
&lt;br /&gt;
=== Preview Canvas ===&lt;br /&gt;
&lt;br /&gt;
The canvas shows the rendered label exactly as the layout describes it — text, scalable text, barcodes, graphic lines and boxes, and embedded logotype images. The rendering engine replicates the coordinate system and geometry of a PowerLeap III print head, including the upside-down (180°) print orientation. Clicking a rendered element highlights the source lines that produce it.&lt;br /&gt;
&lt;br /&gt;
=== Source / QUE Input / Log Tabs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tab !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Source&#039;&#039;&#039; || Lists the raw layout commands, one per line, each with a checkbox and a plain-language description. Un-checking a line excludes it from the render, so individual elements can be toggled on and off. Selecting a line shows its properties for editing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;QUE Input&#039;&#039;&#039; || For LQF layouts, presents one input box per operator prompt. Type values and apply them to see the populated label. This mirrors what an operator would be asked for at the machine.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Log&#039;&#039;&#039; || A colour-coded activity log showing file loads, parser messages, and all traffic to and from the printer emulator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Viewing Controls ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;File&#039;&#039;&#039; menu opens and reloads layout files and exports the rendered label as a PNG image. The &#039;&#039;&#039;View&#039;&#039;&#039; menu provides zoom (preset levels, zoom in/out, and fit-to-window) and a &#039;&#039;&#039;Rotate 180°&#039;&#039;&#039; toggle that flips the preview to match the printer&#039;s print orientation.&lt;br /&gt;
&lt;br /&gt;
== Font Mapping ==&lt;br /&gt;
&lt;br /&gt;
Because Logopak fonts are not present on a development PC, LogoRenderer maps each Logopak font name to a Java font for rendering. The &#039;&#039;&#039;Settings → Font Mappings&#039;&#039;&#039; dialog lists every mapping and lets you set the Java font family (or a bundled TrueType file), style, reference cell size and calibration factors so that the on-screen text closely matches a real printed label. The mappings are stored in &amp;lt;code&amp;gt;xml/config/fonts.xml&amp;lt;/code&amp;gt;; fonts found in a layout but not yet mapped are added automatically with sensible defaults, ready to be fine-tuned.&lt;br /&gt;
&lt;br /&gt;
== The Printer Emulator ==&lt;br /&gt;
&lt;br /&gt;
This is the feature that makes hardware-free development possible. LogoRenderer can open a TCP server that emulates a Logopak PowerLeap III labeller, answering the same &#039;&#039;&#039;LEAP / LAMA&#039;&#039;&#039; protocol commands a real machine would.&lt;br /&gt;
&lt;br /&gt;
=== Starting the emulator ===&lt;br /&gt;
&lt;br /&gt;
The connection bar at the top of the window selects the &#039;&#039;&#039;IP address&#039;&#039;&#039; (default &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; for the local machine) and &#039;&#039;&#039;port&#039;&#039;&#039; (default &#039;&#039;&#039;8000&#039;&#039;&#039;, the PowerLeap III primary data port; &amp;lt;code&amp;gt;8100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8200&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;8300&amp;lt;/code&amp;gt; are also offered). Pressing &#039;&#039;&#039;Start Server&#039;&#039;&#039; begins listening; the Log tab shows when a client connects. Pressing the button again stops the server.&lt;br /&gt;
&lt;br /&gt;
=== What it emulates ===&lt;br /&gt;
&lt;br /&gt;
A connected client can do, against the emulator, the things it would do against a real labeller:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Browse and transfer files&#039;&#039;&#039; on an emulated drive — the &amp;lt;code&amp;gt;virtual_disk/&amp;lt;/code&amp;gt; folder provides the labeller&#039;s storage areas (&amp;lt;code&amp;gt;c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r0/&amp;lt;/code&amp;gt;), so directory listings, downloads, uploads and deletes all behave realistically.&lt;br /&gt;
* &#039;&#039;&#039;Load a layout and send field data&#039;&#039;&#039; — when the client issues a &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; command the emulator loads that layout into the preview, and as &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; field-data commands arrive the on-screen label updates. The PC screen therefore shows what the real printer would be putting on a label.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve logs&#039;&#039;&#039; — the emulator can serve pallet/label log files back to the client, so software that polls a labeller for &amp;quot;what was printed&amp;quot; can be tested end to end.&lt;br /&gt;
&lt;br /&gt;
=== Pallet print simulation ===&lt;br /&gt;
&lt;br /&gt;
When a loaded layout contains the pallet SSCC field, a &#039;&#039;&#039;Print Label&#039;&#039;&#039; control appears. Each press simulates a pallet print — two labels per pallet sharing one [https://en.wikipedia.org/wiki/Serial_Shipping_Container_Code SSCC] — increments the SSCC counter (persisted in &amp;lt;code&amp;gt;sscc.dat&amp;lt;/code&amp;gt;), and queues a log entry that a client can later retrieve. This lets log-polling and pallet-tracking logic be exercised without a real production run.&lt;br /&gt;
&lt;br /&gt;
== Using LogoRenderer and LogoClient Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoClient]]&#039;&#039;&#039;, connect in &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; mode to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; on the same port.&lt;br /&gt;
# From LogoClient, &#039;&#039;&#039;upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoRenderer stands in for the printer so you can develop and test a client, while LogoClient stands in for the driving software so you can drive the renderer. Either tool can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoClient]] — the client-side companion tool that sends layouts and data to a labeller (real or emulated)&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — other Commander4j components in the labelling workflow&lt;br /&gt;
* [[ZPLRenderer]] — the equivalent preview tool for Zebra ZPL labels&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1874</id>
		<title>LogoClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1874"/>
		<updated>2026-06-13T19:40:36Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoClient&#039;&#039;&#039; (&#039;&#039;c4j_logoclient&#039;&#039;) is a standalone desktop application — and underlying client library — for communicating with [[Logopak]] PowerLeap label printers over the network. It connects to a labeller, transfers layout and data files to and from it, sends commands and field data, browses the printer&#039;s on-board storage and retrieves its logs. It exists so that the software-to-labeller conversation can be developed, exercised and diagnosed &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the client half of a pair: where a real labeller is not to hand, [[LogoRenderer]] can emulate one, and LogoClient talks to that emulator exactly as it would talk to real hardware. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoClient is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Software from Logopak DE drives labellers in production. When developing or supporting that software it is useful to be able to perform the same low-level operations by hand, and to see exactly what goes across the wire. LogoClient is that tool. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;send a layout or data file to a labeller&#039;&#039;&#039; and confirm it loads correctly.&lt;br /&gt;
* You want to &#039;&#039;&#039;browse, upload, download or delete files&#039;&#039;&#039; on the printer&#039;s on-board drives.&lt;br /&gt;
* You are &#039;&#039;&#039;debugging the protocol&#039;&#039;&#039; and want a live, byte-level trace of everything sent and received.&lt;br /&gt;
* You need to &#039;&#039;&#039;send raw commands or field data&#039;&#039;&#039; to a labeller and read its replies.&lt;br /&gt;
* You want to &#039;&#039;&#039;poll a labeller&#039;s pallet log&#039;&#039;&#039; and capture one file per SSCC as labels are applied.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; by pointing LogoClient at the [[LogoRenderer]] printer emulator instead of real hardware.&lt;br /&gt;
&lt;br /&gt;
== Supported Printers and Protocols ==&lt;br /&gt;
&lt;br /&gt;
LogoClient supports both current Logopak controller generations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mode !! Hardware !! Transport&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; || PowerLeap III || Direct TCP socket on the data ports (8000 / 8100 / 8200 / 8300). Carries the full LEAP, LAMA/LACE and LSP command set — layout activation, field data, firmware queries, file management, I/O monitoring and asynchronous reporting.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL6 (SFTP)&#039;&#039;&#039; || PowerLeap 6 || File transfer over SFTP (port 22). PL6 is driven by exchanging files rather than TCP commands, so this mode is focused on uploading, downloading and listing files and reading the pallet log.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoClient is part of the open-source Commander4j suite and is distributed under the GNU General Public License. The source code and release downloads are hosted on GitHub, and native install packages for every platform are listed on the Commander4j [[Downloads]] page.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/LogoClient https://github.com/C4J/LogoClient]&lt;br /&gt;
* &#039;&#039;&#039;Releases (download media):&#039;&#039;&#039; [https://github.com/C4J/LogoClient/releases https://github.com/C4J/LogoClient/releases]&lt;br /&gt;
* &#039;&#039;&#039;All Commander4j downloads:&#039;&#039;&#039; [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoClient&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar c4j_logoclient.jar&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 21 or later). The bundled JSch library is required only for PL6 (SFTP); PL3 (TCP) has no external dependencies.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, a central &#039;&#039;&#039;file-transfer and directory area&#039;&#039;&#039;, a &#039;&#039;&#039;message pane&#039;&#039;&#039; for composing raw commands, and a pair of log panes along the bottom — an &#039;&#039;&#039;activity log&#039;&#039;&#039; and a &#039;&#039;&#039;wire trace&#039;&#039;&#039;. All transfer and command actions are disabled until a connection is open.&lt;br /&gt;
&lt;br /&gt;
=== Connecting ===&lt;br /&gt;
&lt;br /&gt;
In the connection bar you choose the connection &#039;&#039;&#039;Type&#039;&#039;&#039; (PL3 TCP or PL6 SFTP), enter the labeller&#039;s &#039;&#039;&#039;host / IP address&#039;&#039;&#039; and &#039;&#039;&#039;port&#039;&#039;&#039;, and — for PL6 — a &#039;&#039;&#039;username and password&#039;&#039;&#039;. Pressing the connect button opens the link; a status indicator shows the connected host and port. A real labeller is typically reached at its own network address (for example &amp;lt;code&amp;gt;192.168.1.100&amp;lt;/code&amp;gt;); the [[LogoRenderer]] emulator is reached at &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Options in the connection area let you list the remote directory automatically on connect, send a periodic &#039;&#039;&#039;heartbeat&#039;&#039;&#039; to detect a dropped link, and set the socket read timeout.&lt;br /&gt;
&lt;br /&gt;
=== Transferring and Managing Files ===&lt;br /&gt;
&lt;br /&gt;
The central area lists the files on the printer for a chosen remote path and file mask, showing each file&#039;s name, size, modified time and type. From here you can:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Upload&#039;&#039;&#039; a local file to the printer.&lt;br /&gt;
* &#039;&#039;&#039;Download&#039;&#039;&#039; one or more selected files to a chosen local folder.&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; selected files from the printer (with confirmation).&lt;br /&gt;
* &#039;&#039;&#039;Refresh&#039;&#039;&#039; the listing, and on PL6 navigate into sub-folders.&lt;br /&gt;
&lt;br /&gt;
PL3 exposes the printer&#039;s storage areas (&amp;lt;code&amp;gt;/c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/r0/&amp;lt;/code&amp;gt;) with file masks such as &amp;lt;code&amp;gt;*.llf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*.pcx&amp;lt;/code&amp;gt;; PL6 exposes its SFTP folders.&lt;br /&gt;
&lt;br /&gt;
=== Sending Commands and Field Data ===&lt;br /&gt;
&lt;br /&gt;
In PL3 mode the message pane composes and transmits raw text to the labeller. Control characters can be entered as readable tokens such as &amp;lt;code&amp;gt;&amp;lt;STX&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;ETX&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;CR&amp;gt;&amp;lt;/code&amp;gt;, and the end-of-line terminator appended on send is selectable. This is how layouts are activated, field data is sent, and LAMA/LSP queries are issued by hand. Replies appear in the activity log and the raw bytes in the wire trace.&lt;br /&gt;
&lt;br /&gt;
=== Pallet Log Polling ===&lt;br /&gt;
&lt;br /&gt;
LogoClient can poll the labeller&#039;s pallet log at a chosen interval and write the results to disk — one timestamped file per unique SSCC — into a chosen log folder. This reproduces, by hand, the &amp;quot;what was printed&amp;quot; feedback that production software collects, and works against both PL3 and PL6.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log and Wire Trace ===&lt;br /&gt;
&lt;br /&gt;
Two panes record what happens. The &#039;&#039;&#039;activity log&#039;&#039;&#039; is a readable, timestamped narrative of connects, transfers, commands and errors. The &#039;&#039;&#039;wire trace&#039;&#039;&#039; shows the raw bytes in both directions — transmitted and received — with control characters rendered as tokens, which is invaluable when diagnosing exactly what a labeller sent or expected. Both panes can be saved to a text file or cleared.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection details and interface preferences are saved when you quit and restored on the next start, so the tool reopens ready to reconnect to the labeller you last used.&lt;br /&gt;
&lt;br /&gt;
== Using LogoClient and LogoRenderer Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoRenderer]]&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;LogoClient&#039;&#039;&#039;, choose &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039;, set the host to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; and the matching port, and connect.&lt;br /&gt;
# &#039;&#039;&#039;Upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoClient stands in for the driving software so you can develop and test against the renderer, while LogoRenderer stands in for the printer so you have something to talk to. LogoClient can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoRenderer]] — the companion tool that renders labels and emulates a Logopak printer&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — production software that drives Logopak labellers&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1873</id>
		<title>LogoRenderer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1873"/>
		<updated>2026-06-13T19:40:34Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; (&#039;&#039;c4j_logorenderer&#039;&#039;) is a standalone desktop application that renders [[Logopak]] PowerLeap label layout files to a visual on-screen preview &#039;&#039;&#039;and&#039;&#039;&#039; can stand in for a physical label printer by emulating its TCP communication protocol. It exists so that label layouts and the software that drives them can be developed and tested &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the rendering and printer-emulation half of a pair: [[LogoClient]] is the client that sends layouts and data to a printer, and LogoRenderer can play the part of that printer. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoRenderer is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
A Logopak PowerLeap labeller normally lives on the factory floor and is driven over the network by software provided by Logopak DE. When developing or supporting that software — or designing the label layouts themselves — it is often impractical to have a real labeller on the bench. LogoRenderer removes that dependency. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;see what a label layout will look like&#039;&#039;&#039; without printing it, by opening a &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; file and viewing a faithful preview.&lt;br /&gt;
* You are &#039;&#039;&#039;writing or debugging software that talks to a labeller&#039;&#039;&#039; and need something on the network that answers the same protocol — without owning the hardware.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; altogether: render layouts, emulate the printer, and feed it from [[LogoClient]] or your own client code.&lt;br /&gt;
* You need to &#039;&#039;&#039;check field data and operator prompts&#039;&#039;&#039; (LQF query fields) by typing values and watching the rendered label update.&lt;br /&gt;
* You are &#039;&#039;&#039;tuning fonts&#039;&#039;&#039; so the on-screen rendering matches a real printed label.&lt;br /&gt;
&lt;br /&gt;
== Label and Data File Types ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer understands the PowerLeap LEAP layout family:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt; || Layout File — a complete label layout with all field data embedded. Opening one renders the label immediately.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; || Query Layout File — a base layout containing &amp;lt;code&amp;gt;QUE&amp;lt;/code&amp;gt; operator prompts for fields that are filled in at print time. Opening one also populates the &#039;&#039;&#039;QUE Input&#039;&#039;&#039; tab so values can be typed in.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; || Data File — a data-only file that references a master layout. Opening one runs its &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; commands to load the referenced layout and populate its fields.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Layouts may reference &amp;lt;code&amp;gt;.pcx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bmp&amp;lt;/code&amp;gt; images (logotypes) and a range of barcode types. A reference list of the wider Logopak file-type ecosystem is maintained alongside the project.&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer is part of the open-source Commander4j suite and is distributed under the GNU General Public License. The source code and release downloads are hosted on GitHub, and native install packages for every platform are listed on the Commander4j [[Downloads]] page.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/LogoRenderer https://github.com/C4J/LogoRenderer]&lt;br /&gt;
* &#039;&#039;&#039;Releases (download media):&#039;&#039;&#039; [https://github.com/C4J/LogoRenderer/releases https://github.com/C4J/LogoRenderer/releases]&lt;br /&gt;
* &#039;&#039;&#039;All Commander4j downloads:&#039;&#039;&#039; [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application. It is built with Maven:&lt;br /&gt;
&lt;br /&gt;
 mvn package&lt;br /&gt;
 java -jar c4j_logorenderer.jar [file.llf]&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 25 or later). If a layout file is supplied on the command line it is opened on start-up; otherwise the application starts with an empty canvas. Demo layouts and data files are provided in the &amp;lt;code&amp;gt;virtual_disk/c0/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window is divided into a &#039;&#039;&#039;label preview canvas&#039;&#039;&#039; on the left and a &#039;&#039;&#039;tabbed working area&#039;&#039;&#039; on the right, with a menu bar and toolbars around them and a status bar along the bottom. The title bar shows the program name, version and the name of the open file.&lt;br /&gt;
&lt;br /&gt;
The status bar reports the current file, the layout dimensions in printer dots and millimetres, the zoom level, and the number of fields in the layout.&lt;br /&gt;
&lt;br /&gt;
=== Preview Canvas ===&lt;br /&gt;
&lt;br /&gt;
The canvas shows the rendered label exactly as the layout describes it — text, scalable text, barcodes, graphic lines and boxes, and embedded logotype images. The rendering engine replicates the coordinate system and geometry of a PowerLeap III print head, including the upside-down (180°) print orientation. Clicking a rendered element highlights the source lines that produce it.&lt;br /&gt;
&lt;br /&gt;
=== Source / QUE Input / Log Tabs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tab !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Source&#039;&#039;&#039; || Lists the raw layout commands, one per line, each with a checkbox and a plain-language description. Un-checking a line excludes it from the render, so individual elements can be toggled on and off. Selecting a line shows its properties for editing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;QUE Input&#039;&#039;&#039; || For LQF layouts, presents one input box per operator prompt. Type values and apply them to see the populated label. This mirrors what an operator would be asked for at the machine.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Log&#039;&#039;&#039; || A colour-coded activity log showing file loads, parser messages, and all traffic to and from the printer emulator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Viewing Controls ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;File&#039;&#039;&#039; menu opens and reloads layout files and exports the rendered label as a PNG image. The &#039;&#039;&#039;View&#039;&#039;&#039; menu provides zoom (preset levels, zoom in/out, and fit-to-window) and a &#039;&#039;&#039;Rotate 180°&#039;&#039;&#039; toggle that flips the preview to match the printer&#039;s print orientation.&lt;br /&gt;
&lt;br /&gt;
== Font Mapping ==&lt;br /&gt;
&lt;br /&gt;
Because Logopak fonts are not present on a development PC, LogoRenderer maps each Logopak font name to a Java font for rendering. The &#039;&#039;&#039;Settings → Font Mappings&#039;&#039;&#039; dialog lists every mapping and lets you set the Java font family (or a bundled TrueType file), style, reference cell size and calibration factors so that the on-screen text closely matches a real printed label. The mappings are stored in &amp;lt;code&amp;gt;xml/config/fonts.xml&amp;lt;/code&amp;gt;; fonts found in a layout but not yet mapped are added automatically with sensible defaults, ready to be fine-tuned.&lt;br /&gt;
&lt;br /&gt;
== The Printer Emulator ==&lt;br /&gt;
&lt;br /&gt;
This is the feature that makes hardware-free development possible. LogoRenderer can open a TCP server that emulates a Logopak PowerLeap III labeller, answering the same &#039;&#039;&#039;LEAP / LAMA&#039;&#039;&#039; protocol commands a real machine would.&lt;br /&gt;
&lt;br /&gt;
=== Starting the emulator ===&lt;br /&gt;
&lt;br /&gt;
The connection bar at the top of the window selects the &#039;&#039;&#039;IP address&#039;&#039;&#039; (default &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; for the local machine) and &#039;&#039;&#039;port&#039;&#039;&#039; (default &#039;&#039;&#039;8000&#039;&#039;&#039;, the PowerLeap III primary data port; &amp;lt;code&amp;gt;8100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8200&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;8300&amp;lt;/code&amp;gt; are also offered). Pressing &#039;&#039;&#039;Start Server&#039;&#039;&#039; begins listening; the Log tab shows when a client connects. Pressing the button again stops the server.&lt;br /&gt;
&lt;br /&gt;
=== What it emulates ===&lt;br /&gt;
&lt;br /&gt;
A connected client can do, against the emulator, the things it would do against a real labeller:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Browse and transfer files&#039;&#039;&#039; on an emulated drive — the &amp;lt;code&amp;gt;virtual_disk/&amp;lt;/code&amp;gt; folder provides the labeller&#039;s storage areas (&amp;lt;code&amp;gt;c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r0/&amp;lt;/code&amp;gt;), so directory listings, downloads, uploads and deletes all behave realistically.&lt;br /&gt;
* &#039;&#039;&#039;Load a layout and send field data&#039;&#039;&#039; — when the client issues a &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; command the emulator loads that layout into the preview, and as &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; field-data commands arrive the on-screen label updates. The PC screen therefore shows what the real printer would be putting on a label.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve logs&#039;&#039;&#039; — the emulator can serve pallet/label log files back to the client, so software that polls a labeller for &amp;quot;what was printed&amp;quot; can be tested end to end.&lt;br /&gt;
&lt;br /&gt;
=== Pallet print simulation ===&lt;br /&gt;
&lt;br /&gt;
When a loaded layout contains the pallet SSCC field, a &#039;&#039;&#039;Print Label&#039;&#039;&#039; control appears. Each press simulates a pallet print — two labels per pallet sharing one [https://en.wikipedia.org/wiki/Serial_Shipping_Container_Code SSCC] — increments the SSCC counter (persisted in &amp;lt;code&amp;gt;sscc.dat&amp;lt;/code&amp;gt;), and queues a log entry that a client can later retrieve. This lets log-polling and pallet-tracking logic be exercised without a real production run.&lt;br /&gt;
&lt;br /&gt;
== Using LogoRenderer and LogoClient Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoClient]]&#039;&#039;&#039;, connect in &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; mode to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; on the same port.&lt;br /&gt;
# From LogoClient, &#039;&#039;&#039;upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoRenderer stands in for the printer so you can develop and test a client, while LogoClient stands in for the driving software so you can drive the renderer. Either tool can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoClient]] — the client-side companion tool that sends layouts and data to a labeller (real or emulated)&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — production software that drives Logopak labellers&lt;br /&gt;
* [[ZPLRenderer]] — the equivalent preview tool for Zebra ZPL labels&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1872</id>
		<title>LogoClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1872"/>
		<updated>2026-06-13T19:35:33Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoClient&#039;&#039;&#039; (&#039;&#039;c4j_logoclient&#039;&#039;) is a standalone desktop application — and underlying client library — for communicating with [[Logopak]] PowerLeap label printers over the network. It connects to a labeller, transfers layout and data files to and from it, sends commands and field data, browses the printer&#039;s on-board storage and retrieves its logs. It exists so that the software-to-labeller conversation can be developed, exercised and diagnosed &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the client half of a pair: where a real labeller is not to hand, [[LogoRenderer]] can emulate one, and LogoClient talks to that emulator exactly as it would talk to real hardware. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoClient is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Software from Logopak DE drives labellers in production. When developing or supporting that software it is useful to be able to perform the same low-level operations by hand, and to see exactly what goes across the wire. LogoClient is that tool. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;send a layout or data file to a labeller&#039;&#039;&#039; and confirm it loads correctly.&lt;br /&gt;
* You want to &#039;&#039;&#039;browse, upload, download or delete files&#039;&#039;&#039; on the printer&#039;s on-board drives.&lt;br /&gt;
* You are &#039;&#039;&#039;debugging the protocol&#039;&#039;&#039; and want a live, byte-level trace of everything sent and received.&lt;br /&gt;
* You need to &#039;&#039;&#039;send raw commands or field data&#039;&#039;&#039; to a labeller and read its replies.&lt;br /&gt;
* You want to &#039;&#039;&#039;poll a labeller&#039;s pallet log&#039;&#039;&#039; and capture one file per SSCC as labels are applied.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; by pointing LogoClient at the [[LogoRenderer]] printer emulator instead of real hardware.&lt;br /&gt;
&lt;br /&gt;
== Supported Printers and Protocols ==&lt;br /&gt;
&lt;br /&gt;
LogoClient supports both current Logopak controller generations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mode !! Hardware !! Transport&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; || PowerLeap III || Direct TCP socket on the data ports (8000 / 8100 / 8200 / 8300). Carries the full LEAP, LAMA/LACE and LSP command set — layout activation, field data, firmware queries, file management, I/O monitoring and asynchronous reporting.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL6 (SFTP)&#039;&#039;&#039; || PowerLeap 6 || File transfer over SFTP (port 22). PL6 is driven by exchanging files rather than TCP commands, so this mode is focused on uploading, downloading and listing files and reading the pallet log.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoClient is part of the open-source Commander4j suite and is distributed under the GNU General Public License.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoClient&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar c4j_logoclient.jar&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 21 or later). The bundled JSch library is required only for PL6 (SFTP); PL3 (TCP) has no external dependencies.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, a central &#039;&#039;&#039;file-transfer and directory area&#039;&#039;&#039;, a &#039;&#039;&#039;message pane&#039;&#039;&#039; for composing raw commands, and a pair of log panes along the bottom — an &#039;&#039;&#039;activity log&#039;&#039;&#039; and a &#039;&#039;&#039;wire trace&#039;&#039;&#039;. All transfer and command actions are disabled until a connection is open.&lt;br /&gt;
&lt;br /&gt;
=== Connecting ===&lt;br /&gt;
&lt;br /&gt;
In the connection bar you choose the connection &#039;&#039;&#039;Type&#039;&#039;&#039; (PL3 TCP or PL6 SFTP), enter the labeller&#039;s &#039;&#039;&#039;host / IP address&#039;&#039;&#039; and &#039;&#039;&#039;port&#039;&#039;&#039;, and — for PL6 — a &#039;&#039;&#039;username and password&#039;&#039;&#039;. Pressing the connect button opens the link; a status indicator shows the connected host and port. A real labeller is typically reached at its own network address (for example &amp;lt;code&amp;gt;192.168.1.100&amp;lt;/code&amp;gt;); the [[LogoRenderer]] emulator is reached at &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Options in the connection area let you list the remote directory automatically on connect, send a periodic &#039;&#039;&#039;heartbeat&#039;&#039;&#039; to detect a dropped link, and set the socket read timeout.&lt;br /&gt;
&lt;br /&gt;
=== Transferring and Managing Files ===&lt;br /&gt;
&lt;br /&gt;
The central area lists the files on the printer for a chosen remote path and file mask, showing each file&#039;s name, size, modified time and type. From here you can:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Upload&#039;&#039;&#039; a local file to the printer.&lt;br /&gt;
* &#039;&#039;&#039;Download&#039;&#039;&#039; one or more selected files to a chosen local folder.&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; selected files from the printer (with confirmation).&lt;br /&gt;
* &#039;&#039;&#039;Refresh&#039;&#039;&#039; the listing, and on PL6 navigate into sub-folders.&lt;br /&gt;
&lt;br /&gt;
PL3 exposes the printer&#039;s storage areas (&amp;lt;code&amp;gt;/c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/r0/&amp;lt;/code&amp;gt;) with file masks such as &amp;lt;code&amp;gt;*.llf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*.pcx&amp;lt;/code&amp;gt;; PL6 exposes its SFTP folders.&lt;br /&gt;
&lt;br /&gt;
=== Sending Commands and Field Data ===&lt;br /&gt;
&lt;br /&gt;
In PL3 mode the message pane composes and transmits raw text to the labeller. Control characters can be entered as readable tokens such as &amp;lt;code&amp;gt;&amp;lt;STX&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;ETX&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;CR&amp;gt;&amp;lt;/code&amp;gt;, and the end-of-line terminator appended on send is selectable. This is how layouts are activated, field data is sent, and LAMA/LSP queries are issued by hand. Replies appear in the activity log and the raw bytes in the wire trace.&lt;br /&gt;
&lt;br /&gt;
=== Pallet Log Polling ===&lt;br /&gt;
&lt;br /&gt;
LogoClient can poll the labeller&#039;s pallet log at a chosen interval and write the results to disk — one timestamped file per unique SSCC — into a chosen log folder. This reproduces, by hand, the &amp;quot;what was printed&amp;quot; feedback that production software collects, and works against both PL3 and PL6.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log and Wire Trace ===&lt;br /&gt;
&lt;br /&gt;
Two panes record what happens. The &#039;&#039;&#039;activity log&#039;&#039;&#039; is a readable, timestamped narrative of connects, transfers, commands and errors. The &#039;&#039;&#039;wire trace&#039;&#039;&#039; shows the raw bytes in both directions — transmitted and received — with control characters rendered as tokens, which is invaluable when diagnosing exactly what a labeller sent or expected. Both panes can be saved to a text file or cleared.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection details and interface preferences are saved when you quit and restored on the next start, so the tool reopens ready to reconnect to the labeller you last used.&lt;br /&gt;
&lt;br /&gt;
== Using LogoClient and LogoRenderer Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoRenderer]]&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;LogoClient&#039;&#039;&#039;, choose &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039;, set the host to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; and the matching port, and connect.&lt;br /&gt;
# &#039;&#039;&#039;Upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoClient stands in for the driving software so you can develop and test against the renderer, while LogoRenderer stands in for the printer so you have something to talk to. LogoClient can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoRenderer]] — the companion tool that renders labels and emulates a Logopak printer&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — production software that drives Logopak labellers&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1871</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1871"/>
		<updated>2026-06-13T19:34:01Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LaunchPad/releases LaunchPad] || Menu system for Macos to replicate Launchpad&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LogoClient/releases LogoClient] || Client for communication with LogoRenderer&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LogoRenderer/releases LogoRenderer] || Interpret and view Logopak templates.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusServer/releases Modbus Server] || Modbus Server&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpTransfer/releases SFTP-Transfer] || SFTP Send and Receive Automatically.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/TreeDoc/releases TreeDoc] || Easy way to create a document for directory structure&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/XML-Viewer/releases XML-Viewer] || Utility for viewing XML documents &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ZPL-Renderer/releases ZPL-Renderer] || Emulates a Zebra ZPL labeller.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1870</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1870"/>
		<updated>2026-06-13T19:31:25Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpTransfer/releases SFTP-Transfer] || SFTP Send and Receive Automatically.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ZPL-Renderer/releases ZPL-Renderer] || Emulates a Zebra ZPL labeller.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/XML-Viewer/releases XML-Viewer] || Utility for viewing XML documents &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusServer/releases Modbus Server] || Modbus Server&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/TreeDoc/releases TreeDoc] || Easy way to create a document for directory structure&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LaunchPad/releases LaunchPad] || Menu system for Macos to replicate Launchpad&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LogoRenderer/releases LogoRenderer] || Interpret and view Logopak templates.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LogoClient/releases LogoClient] || Client for communication with LogoRenderer&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1869</id>
		<title>LogoRenderer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1869"/>
		<updated>2026-06-13T19:28:23Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; (&#039;&#039;c4j_logorenderer&#039;&#039;) is a standalone desktop application that renders [[Logopak]] PowerLeap label layout files to a visual on-screen preview &#039;&#039;&#039;and&#039;&#039;&#039; can stand in for a physical label printer by emulating its TCP communication protocol. It exists so that label layouts and the software that drives them can be developed and tested &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the rendering and printer-emulation half of a pair: [[LogoClient]] is the client that sends layouts and data to a printer, and LogoRenderer can play the part of that printer. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoRenderer is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
A Logopak PowerLeap labeller normally lives on the factory floor and is driven over the network by software provided by Logopak DE. When developing or supporting that software — or designing the label layouts themselves — it is often impractical to have a real labeller on the bench. LogoRenderer removes that dependency. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;see what a label layout will look like&#039;&#039;&#039; without printing it, by opening a &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; file and viewing a faithful preview.&lt;br /&gt;
* You are &#039;&#039;&#039;writing or debugging software that talks to a labeller&#039;&#039;&#039; and need something on the network that answers the same protocol — without owning the hardware.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; altogether: render layouts, emulate the printer, and feed it from [[LogoClient]] or your own client code.&lt;br /&gt;
* You need to &#039;&#039;&#039;check field data and operator prompts&#039;&#039;&#039; (LQF query fields) by typing values and watching the rendered label update.&lt;br /&gt;
* You are &#039;&#039;&#039;tuning fonts&#039;&#039;&#039; so the on-screen rendering matches a real printed label.&lt;br /&gt;
&lt;br /&gt;
== Label and Data File Types ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer understands the PowerLeap LEAP layout family:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt; || Layout File — a complete label layout with all field data embedded. Opening one renders the label immediately.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; || Query Layout File — a base layout containing &amp;lt;code&amp;gt;QUE&amp;lt;/code&amp;gt; operator prompts for fields that are filled in at print time. Opening one also populates the &#039;&#039;&#039;QUE Input&#039;&#039;&#039; tab so values can be typed in.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; || Data File — a data-only file that references a master layout. Opening one runs its &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; commands to load the referenced layout and populate its fields.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Layouts may reference &amp;lt;code&amp;gt;.pcx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bmp&amp;lt;/code&amp;gt; images (logotypes) and a range of barcode types. A reference list of the wider Logopak file-type ecosystem is maintained alongside the project.&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer is part of the open-source Commander4j suite and is distributed under the GNU General Public License.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application. It is built with Maven:&lt;br /&gt;
&lt;br /&gt;
 mvn package&lt;br /&gt;
 java -jar c4j_logorenderer.jar [file.llf]&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 25 or later). If a layout file is supplied on the command line it is opened on start-up; otherwise the application starts with an empty canvas. Demo layouts and data files are provided in the &amp;lt;code&amp;gt;virtual_disk/c0/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window is divided into a &#039;&#039;&#039;label preview canvas&#039;&#039;&#039; on the left and a &#039;&#039;&#039;tabbed working area&#039;&#039;&#039; on the right, with a menu bar and toolbars around them and a status bar along the bottom. The title bar shows the program name, version and the name of the open file.&lt;br /&gt;
&lt;br /&gt;
The status bar reports the current file, the layout dimensions in printer dots and millimetres, the zoom level, and the number of fields in the layout.&lt;br /&gt;
&lt;br /&gt;
=== Preview Canvas ===&lt;br /&gt;
&lt;br /&gt;
The canvas shows the rendered label exactly as the layout describes it — text, scalable text, barcodes, graphic lines and boxes, and embedded logotype images. The rendering engine replicates the coordinate system and geometry of a PowerLeap III print head, including the upside-down (180°) print orientation. Clicking a rendered element highlights the source lines that produce it.&lt;br /&gt;
&lt;br /&gt;
=== Source / QUE Input / Log Tabs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tab !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Source&#039;&#039;&#039; || Lists the raw layout commands, one per line, each with a checkbox and a plain-language description. Un-checking a line excludes it from the render, so individual elements can be toggled on and off. Selecting a line shows its properties for editing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;QUE Input&#039;&#039;&#039; || For LQF layouts, presents one input box per operator prompt. Type values and apply them to see the populated label. This mirrors what an operator would be asked for at the machine.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Log&#039;&#039;&#039; || A colour-coded activity log showing file loads, parser messages, and all traffic to and from the printer emulator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Viewing Controls ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;File&#039;&#039;&#039; menu opens and reloads layout files and exports the rendered label as a PNG image. The &#039;&#039;&#039;View&#039;&#039;&#039; menu provides zoom (preset levels, zoom in/out, and fit-to-window) and a &#039;&#039;&#039;Rotate 180°&#039;&#039;&#039; toggle that flips the preview to match the printer&#039;s print orientation.&lt;br /&gt;
&lt;br /&gt;
== Font Mapping ==&lt;br /&gt;
&lt;br /&gt;
Because Logopak fonts are not present on a development PC, LogoRenderer maps each Logopak font name to a Java font for rendering. The &#039;&#039;&#039;Settings → Font Mappings&#039;&#039;&#039; dialog lists every mapping and lets you set the Java font family (or a bundled TrueType file), style, reference cell size and calibration factors so that the on-screen text closely matches a real printed label. The mappings are stored in &amp;lt;code&amp;gt;xml/config/fonts.xml&amp;lt;/code&amp;gt;; fonts found in a layout but not yet mapped are added automatically with sensible defaults, ready to be fine-tuned.&lt;br /&gt;
&lt;br /&gt;
== The Printer Emulator ==&lt;br /&gt;
&lt;br /&gt;
This is the feature that makes hardware-free development possible. LogoRenderer can open a TCP server that emulates a Logopak PowerLeap III labeller, answering the same &#039;&#039;&#039;LEAP / LAMA&#039;&#039;&#039; protocol commands a real machine would.&lt;br /&gt;
&lt;br /&gt;
=== Starting the emulator ===&lt;br /&gt;
&lt;br /&gt;
The connection bar at the top of the window selects the &#039;&#039;&#039;IP address&#039;&#039;&#039; (default &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; for the local machine) and &#039;&#039;&#039;port&#039;&#039;&#039; (default &#039;&#039;&#039;8000&#039;&#039;&#039;, the PowerLeap III primary data port; &amp;lt;code&amp;gt;8100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8200&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;8300&amp;lt;/code&amp;gt; are also offered). Pressing &#039;&#039;&#039;Start Server&#039;&#039;&#039; begins listening; the Log tab shows when a client connects. Pressing the button again stops the server.&lt;br /&gt;
&lt;br /&gt;
=== What it emulates ===&lt;br /&gt;
&lt;br /&gt;
A connected client can do, against the emulator, the things it would do against a real labeller:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Browse and transfer files&#039;&#039;&#039; on an emulated drive — the &amp;lt;code&amp;gt;virtual_disk/&amp;lt;/code&amp;gt; folder provides the labeller&#039;s storage areas (&amp;lt;code&amp;gt;c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r0/&amp;lt;/code&amp;gt;), so directory listings, downloads, uploads and deletes all behave realistically.&lt;br /&gt;
* &#039;&#039;&#039;Load a layout and send field data&#039;&#039;&#039; — when the client issues a &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; command the emulator loads that layout into the preview, and as &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; field-data commands arrive the on-screen label updates. The PC screen therefore shows what the real printer would be putting on a label.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve logs&#039;&#039;&#039; — the emulator can serve pallet/label log files back to the client, so software that polls a labeller for &amp;quot;what was printed&amp;quot; can be tested end to end.&lt;br /&gt;
&lt;br /&gt;
=== Pallet print simulation ===&lt;br /&gt;
&lt;br /&gt;
When a loaded layout contains the pallet SSCC field, a &#039;&#039;&#039;Print Label&#039;&#039;&#039; control appears. Each press simulates a pallet print — two labels per pallet sharing one [https://en.wikipedia.org/wiki/Serial_Shipping_Container_Code SSCC] — increments the SSCC counter (persisted in &amp;lt;code&amp;gt;sscc.dat&amp;lt;/code&amp;gt;), and queues a log entry that a client can later retrieve. This lets log-polling and pallet-tracking logic be exercised without a real production run.&lt;br /&gt;
&lt;br /&gt;
== Using LogoRenderer and LogoClient Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoClient]]&#039;&#039;&#039;, connect in &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; mode to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; on the same port.&lt;br /&gt;
# From LogoClient, &#039;&#039;&#039;upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoRenderer stands in for the printer so you can develop and test a client, while LogoClient stands in for the driving software so you can drive the renderer. Either tool can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoClient]] — the client-side companion tool that sends layouts and data to a labeller (real or emulated)&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — production software that drives Logopak labellers&lt;br /&gt;
* [[ZPLRenderer]] — the equivalent preview tool for Zebra ZPL labels&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1868</id>
		<title>LogoRenderer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1868"/>
		<updated>2026-06-13T19:27:28Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; (&#039;&#039;c4j_logorenderer&#039;&#039;) is a standalone desktop application that renders [[Logopak]] PowerLeap label layout files to a visual on-screen preview &#039;&#039;&#039;and&#039;&#039;&#039; can stand in for a physical label printer by emulating its TCP communication protocol. It exists so that label layouts and the software that drives them can be developed and tested &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the rendering and printer-emulation half of a pair: [[LogoClient]] is the client that sends layouts and data to a printer, and LogoRenderer can play the part of that printer. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoRenderer is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
A Logopak PowerLeap labeller normally lives on the factory floor and is driven over the network by software provided by Logopak DE. When developing or supporting that software — or designing the label layouts themselves — it is often impractical to have a real labeller on the bench. LogoRenderer removes that dependency. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;see what a label layout will look like&#039;&#039;&#039; without printing it, by opening a &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; file and viewing a faithful preview.&lt;br /&gt;
* You are &#039;&#039;&#039;writing or debugging software that talks to a labeller&#039;&#039;&#039; and need something on the network that answers the same protocol — without owning the hardware.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; altogether: render layouts, emulate the printer, and feed it from [[LogoClient]] or your own client code.&lt;br /&gt;
* You need to &#039;&#039;&#039;check field data and operator prompts&#039;&#039;&#039; (LQF query fields) by typing values and watching the rendered label update.&lt;br /&gt;
* You are &#039;&#039;&#039;tuning fonts&#039;&#039;&#039; so the on-screen rendering matches a real printed label.&lt;br /&gt;
&lt;br /&gt;
== Label and Data File Types ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer understands the PowerLeap LEAP layout family:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt; || Layout File — a complete label layout with all field data embedded. Opening one renders the label immediately.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; || Query Layout File — a base layout containing &amp;lt;code&amp;gt;QUE&amp;lt;/code&amp;gt; operator prompts for fields that are filled in at print time. Opening one also populates the &#039;&#039;&#039;QUE Input&#039;&#039;&#039; tab so values can be typed in.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; || Data File — a data-only file that references a master layout. Opening one runs its &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; commands to load the referenced layout and populate its fields.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Layouts may reference &amp;lt;code&amp;gt;.pcx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bmp&amp;lt;/code&amp;gt; images (logotypes) and a range of barcode types. A reference list of the wider Logopak file-type ecosystem is maintained alongside the project.&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer is part of the open-source Commander4j suite and is distributed under the GNU General Public License.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application. It is built with Maven:&lt;br /&gt;
&lt;br /&gt;
 mvn package&lt;br /&gt;
 java -jar c4j_logorenderer.jar [file.llf]&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 21 or later). If a layout file is supplied on the command line it is opened on start-up; otherwise the application starts with an empty canvas. Demo layouts and data files are provided in the &amp;lt;code&amp;gt;virtual_disk/c0/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window is divided into a &#039;&#039;&#039;label preview canvas&#039;&#039;&#039; on the left and a &#039;&#039;&#039;tabbed working area&#039;&#039;&#039; on the right, with a menu bar and toolbars around them and a status bar along the bottom. The title bar shows the program name, version and the name of the open file.&lt;br /&gt;
&lt;br /&gt;
The status bar reports the current file, the layout dimensions in printer dots and millimetres, the zoom level, and the number of fields in the layout.&lt;br /&gt;
&lt;br /&gt;
=== Preview Canvas ===&lt;br /&gt;
&lt;br /&gt;
The canvas shows the rendered label exactly as the layout describes it — text, scalable text, barcodes, graphic lines and boxes, and embedded logotype images. The rendering engine replicates the coordinate system and geometry of a PowerLeap III print head, including the upside-down (180°) print orientation. Clicking a rendered element highlights the source lines that produce it.&lt;br /&gt;
&lt;br /&gt;
=== Source / QUE Input / Log Tabs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tab !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Source&#039;&#039;&#039; || Lists the raw layout commands, one per line, each with a checkbox and a plain-language description. Un-checking a line excludes it from the render, so individual elements can be toggled on and off. Selecting a line shows its properties for editing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;QUE Input&#039;&#039;&#039; || For LQF layouts, presents one input box per operator prompt. Type values and apply them to see the populated label. This mirrors what an operator would be asked for at the machine.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Log&#039;&#039;&#039; || A colour-coded activity log showing file loads, parser messages, and all traffic to and from the printer emulator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Viewing Controls ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;File&#039;&#039;&#039; menu opens and reloads layout files and exports the rendered label as a PNG image. The &#039;&#039;&#039;View&#039;&#039;&#039; menu provides zoom (preset levels, zoom in/out, and fit-to-window) and a &#039;&#039;&#039;Rotate 180°&#039;&#039;&#039; toggle that flips the preview to match the printer&#039;s print orientation.&lt;br /&gt;
&lt;br /&gt;
== Font Mapping ==&lt;br /&gt;
&lt;br /&gt;
Because Logopak fonts are not present on a development PC, LogoRenderer maps each Logopak font name to a Java font for rendering. The &#039;&#039;&#039;Settings → Font Mappings&#039;&#039;&#039; dialog lists every mapping and lets you set the Java font family (or a bundled TrueType file), style, reference cell size and calibration factors so that the on-screen text closely matches a real printed label. The mappings are stored in &amp;lt;code&amp;gt;xml/config/fonts.xml&amp;lt;/code&amp;gt;; fonts found in a layout but not yet mapped are added automatically with sensible defaults, ready to be fine-tuned.&lt;br /&gt;
&lt;br /&gt;
== The Printer Emulator ==&lt;br /&gt;
&lt;br /&gt;
This is the feature that makes hardware-free development possible. LogoRenderer can open a TCP server that emulates a Logopak PowerLeap III labeller, answering the same &#039;&#039;&#039;LEAP / LAMA&#039;&#039;&#039; protocol commands a real machine would.&lt;br /&gt;
&lt;br /&gt;
=== Starting the emulator ===&lt;br /&gt;
&lt;br /&gt;
The connection bar at the top of the window selects the &#039;&#039;&#039;IP address&#039;&#039;&#039; (default &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; for the local machine) and &#039;&#039;&#039;port&#039;&#039;&#039; (default &#039;&#039;&#039;8000&#039;&#039;&#039;, the PowerLeap III primary data port; &amp;lt;code&amp;gt;8100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8200&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;8300&amp;lt;/code&amp;gt; are also offered). Pressing &#039;&#039;&#039;Start Server&#039;&#039;&#039; begins listening; the Log tab shows when a client connects. Pressing the button again stops the server.&lt;br /&gt;
&lt;br /&gt;
=== What it emulates ===&lt;br /&gt;
&lt;br /&gt;
A connected client can do, against the emulator, the things it would do against a real labeller:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Browse and transfer files&#039;&#039;&#039; on an emulated drive — the &amp;lt;code&amp;gt;virtual_disk/&amp;lt;/code&amp;gt; folder provides the labeller&#039;s storage areas (&amp;lt;code&amp;gt;c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r0/&amp;lt;/code&amp;gt;), so directory listings, downloads, uploads and deletes all behave realistically.&lt;br /&gt;
* &#039;&#039;&#039;Load a layout and send field data&#039;&#039;&#039; — when the client issues a &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; command the emulator loads that layout into the preview, and as &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; field-data commands arrive the on-screen label updates. The PC screen therefore shows what the real printer would be putting on a label.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve logs&#039;&#039;&#039; — the emulator can serve pallet/label log files back to the client, so software that polls a labeller for &amp;quot;what was printed&amp;quot; can be tested end to end.&lt;br /&gt;
&lt;br /&gt;
=== Pallet print simulation ===&lt;br /&gt;
&lt;br /&gt;
When a loaded layout contains the pallet SSCC field, a &#039;&#039;&#039;Print Label&#039;&#039;&#039; control appears. Each press simulates a pallet print — two labels per pallet sharing one [https://en.wikipedia.org/wiki/Serial_Shipping_Container_Code SSCC] — increments the SSCC counter (persisted in &amp;lt;code&amp;gt;sscc.dat&amp;lt;/code&amp;gt;), and queues a log entry that a client can later retrieve. This lets log-polling and pallet-tracking logic be exercised without a real production run.&lt;br /&gt;
&lt;br /&gt;
== Using LogoRenderer and LogoClient Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoClient]]&#039;&#039;&#039;, connect in &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; mode to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; on the same port.&lt;br /&gt;
# From LogoClient, &#039;&#039;&#039;upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoRenderer stands in for the printer so you can develop and test a client, while LogoClient stands in for the driving software so you can drive the renderer. Either tool can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoClient]] — the client-side companion tool that sends layouts and data to a labeller (real or emulated)&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — production software that drives Logopak labellers&lt;br /&gt;
* [[ZPLRenderer]] — the equivalent preview tool for Zebra ZPL labels&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1867</id>
		<title>LogoClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoClient&amp;diff=1867"/>
		<updated>2026-06-13T19:23:13Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoClient&#039;&#039;&#039; (&#039;&#039;c4j_logoclient&#039;&#039;) is a standalone desktop application — and underlying client library — for communicating with [[Logopak]] PowerLeap label printers over the network. It connects to a labeller, transfers layout and data files to and from it, sends commands and field data, browses the printer&#039;s on-board storage and retrieves its logs. It exists so that the software-to-labeller conversation can be developed, exercised and diagnosed &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the client half of a pair: where a real labeller is not to hand, [[LogoRenderer]] can emulate one, and LogoClient talks to that emulator exactly as it would talk to real hardware. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoClient is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Software such as [[Middleware4j]], [[LabelServer4j]] and [[AutoLab4j]] drives Logopak labellers in production. When developing or supporting that software it is useful to be able to perform the same low-level operations by hand, and to see exactly what goes across the wire. LogoClient is that tool. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;send a layout or data file to a labeller&#039;&#039;&#039; and confirm it loads correctly.&lt;br /&gt;
* You want to &#039;&#039;&#039;browse, upload, download or delete files&#039;&#039;&#039; on the printer&#039;s on-board drives.&lt;br /&gt;
* You are &#039;&#039;&#039;debugging the protocol&#039;&#039;&#039; and want a live, byte-level trace of everything sent and received.&lt;br /&gt;
* You need to &#039;&#039;&#039;send raw commands or field data&#039;&#039;&#039; to a labeller and read its replies.&lt;br /&gt;
* You want to &#039;&#039;&#039;poll a labeller&#039;s pallet log&#039;&#039;&#039; and capture one file per SSCC as labels are applied.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; by pointing LogoClient at the [[LogoRenderer]] printer emulator instead of real hardware.&lt;br /&gt;
&lt;br /&gt;
== Supported Printers and Protocols ==&lt;br /&gt;
&lt;br /&gt;
LogoClient supports both current Logopak controller generations:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mode !! Hardware !! Transport&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; || PowerLeap III || Direct TCP socket on the data ports (8000 / 8100 / 8200 / 8300). Carries the full LEAP, LAMA/LACE and LSP command set — layout activation, field data, firmware queries, file management, I/O monitoring and asynchronous reporting.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PL6 (SFTP)&#039;&#039;&#039; || PowerLeap 6 || File transfer over SFTP (port 22). PL6 is driven by exchanging files rather than TCP commands, so this mode is focused on uploading, downloading and listing files and reading the pallet log.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoClient is part of the open-source Commander4j suite and is distributed under the GNU General Public License.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoClient&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar c4j_logoclient.jar&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 21 or later). The bundled JSch library is required only for PL6 (SFTP); PL3 (TCP) has no external dependencies.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, a central &#039;&#039;&#039;file-transfer and directory area&#039;&#039;&#039;, a &#039;&#039;&#039;message pane&#039;&#039;&#039; for composing raw commands, and a pair of log panes along the bottom — an &#039;&#039;&#039;activity log&#039;&#039;&#039; and a &#039;&#039;&#039;wire trace&#039;&#039;&#039;. All transfer and command actions are disabled until a connection is open.&lt;br /&gt;
&lt;br /&gt;
=== Connecting ===&lt;br /&gt;
&lt;br /&gt;
In the connection bar you choose the connection &#039;&#039;&#039;Type&#039;&#039;&#039; (PL3 TCP or PL6 SFTP), enter the labeller&#039;s &#039;&#039;&#039;host / IP address&#039;&#039;&#039; and &#039;&#039;&#039;port&#039;&#039;&#039;, and — for PL6 — a &#039;&#039;&#039;username and password&#039;&#039;&#039;. Pressing the connect button opens the link; a status indicator shows the connected host and port. A real labeller is typically reached at its own network address (for example &amp;lt;code&amp;gt;192.168.1.100&amp;lt;/code&amp;gt;); the [[LogoRenderer]] emulator is reached at &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Options in the connection area let you list the remote directory automatically on connect, send a periodic &#039;&#039;&#039;heartbeat&#039;&#039;&#039; to detect a dropped link, and set the socket read timeout.&lt;br /&gt;
&lt;br /&gt;
=== Transferring and Managing Files ===&lt;br /&gt;
&lt;br /&gt;
The central area lists the files on the printer for a chosen remote path and file mask, showing each file&#039;s name, size, modified time and type. From here you can:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Upload&#039;&#039;&#039; a local file to the printer.&lt;br /&gt;
* &#039;&#039;&#039;Download&#039;&#039;&#039; one or more selected files to a chosen local folder.&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; selected files from the printer (with confirmation).&lt;br /&gt;
* &#039;&#039;&#039;Refresh&#039;&#039;&#039; the listing, and on PL6 navigate into sub-folders.&lt;br /&gt;
&lt;br /&gt;
PL3 exposes the printer&#039;s storage areas (&amp;lt;code&amp;gt;/c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/r0/&amp;lt;/code&amp;gt;) with file masks such as &amp;lt;code&amp;gt;*.llf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;*.pcx&amp;lt;/code&amp;gt;; PL6 exposes its SFTP folders.&lt;br /&gt;
&lt;br /&gt;
=== Sending Commands and Field Data ===&lt;br /&gt;
&lt;br /&gt;
In PL3 mode the message pane composes and transmits raw text to the labeller. Control characters can be entered as readable tokens such as &amp;lt;code&amp;gt;&amp;lt;STX&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;ETX&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;CR&amp;gt;&amp;lt;/code&amp;gt;, and the end-of-line terminator appended on send is selectable. This is how layouts are activated, field data is sent, and LAMA/LSP queries are issued by hand. Replies appear in the activity log and the raw bytes in the wire trace.&lt;br /&gt;
&lt;br /&gt;
=== Pallet Log Polling ===&lt;br /&gt;
&lt;br /&gt;
LogoClient can poll the labeller&#039;s pallet log at a chosen interval and write the results to disk — one timestamped file per unique SSCC — into a chosen log folder. This reproduces, by hand, the &amp;quot;what was printed&amp;quot; feedback that production software collects, and works against both PL3 and PL6.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log and Wire Trace ===&lt;br /&gt;
&lt;br /&gt;
Two panes record what happens. The &#039;&#039;&#039;activity log&#039;&#039;&#039; is a readable, timestamped narrative of connects, transfers, commands and errors. The &#039;&#039;&#039;wire trace&#039;&#039;&#039; shows the raw bytes in both directions — transmitted and received — with control characters rendered as tokens, which is invaluable when diagnosing exactly what a labeller sent or expected. Both panes can be saved to a text file or cleared.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection details and interface preferences are saved when you quit and restored on the next start, so the tool reopens ready to reconnect to the labeller you last used.&lt;br /&gt;
&lt;br /&gt;
== Using LogoClient and LogoRenderer Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoRenderer]]&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;LogoClient&#039;&#039;&#039;, choose &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039;, set the host to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; and the matching port, and connect.&lt;br /&gt;
# &#039;&#039;&#039;Upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoClient stands in for the driving software so you can develop and test against the renderer, while LogoRenderer stands in for the printer so you have something to talk to. LogoClient can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoRenderer]] — the companion tool that renders labels and emulates a Logopak printer&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — production software that drives Logopak labellers&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1866</id>
		<title>LogoRenderer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LogoRenderer&amp;diff=1866"/>
		<updated>2026-06-13T19:23:10Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; (&#039;&#039;c4j_logorenderer&#039;&#039;) is a standalone desktop application that renders [[Logopak]] PowerLeap label layout files to a visual on-screen preview &#039;&#039;&#039;and&#039;&#039;&#039; can stand in for a physical label printer by emulating its TCP communication protocol. It exists so that label layouts and the software that drives them can be developed and tested &#039;&#039;&#039;on an ordinary PC, in environments where no physical Logopak labeller is available&#039;&#039;&#039; to test against.&lt;br /&gt;
&lt;br /&gt;
It is the rendering and printer-emulation half of a pair: [[LogoClient]] is the client that sends layouts and data to a printer, and LogoRenderer can play the part of that printer. Together they let you exercise the whole label-printing workflow with no hardware at all.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disclaimer: LogoRenderer is an independent open-source tool and is &#039;&#039;&#039;not&#039;&#039;&#039; a Logopak product. It is not affiliated with, endorsed by, or supported by Logopak. Logopak, PowerLeap and related names are trademarks of their respective owners and are used solely to describe interoperability. The software is intended for local test and development use only — it must not be relied upon for production label printing.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
A Logopak PowerLeap labeller normally lives on the factory floor and is driven over the network by software such as [[Middleware4j]], [[LabelServer4j]] or [[AutoLab4j]]. When developing or supporting that software — or designing the label layouts themselves — it is often impractical to have a real labeller on the bench. LogoRenderer removes that dependency. It is useful when:&lt;br /&gt;
&lt;br /&gt;
* You need to &#039;&#039;&#039;see what a label layout will look like&#039;&#039;&#039; without printing it, by opening a &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; file and viewing a faithful preview.&lt;br /&gt;
* You are &#039;&#039;&#039;writing or debugging software that talks to a labeller&#039;&#039;&#039; and need something on the network that answers the same protocol — without owning the hardware.&lt;br /&gt;
* You want to &#039;&#039;&#039;develop without a physical Logopak&#039;&#039;&#039; altogether: render layouts, emulate the printer, and feed it from [[LogoClient]] or your own client code.&lt;br /&gt;
* You need to &#039;&#039;&#039;check field data and operator prompts&#039;&#039;&#039; (LQF query fields) by typing values and watching the rendered label update.&lt;br /&gt;
* You are &#039;&#039;&#039;tuning fonts&#039;&#039;&#039; so the on-screen rendering matches a real printed label.&lt;br /&gt;
&lt;br /&gt;
== Label and Data File Types ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer understands the PowerLeap LEAP layout family:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.llf&amp;lt;/code&amp;gt; || Layout File — a complete label layout with all field data embedded. Opening one renders the label immediately.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lqf&amp;lt;/code&amp;gt; || Query Layout File — a base layout containing &amp;lt;code&amp;gt;QUE&amp;lt;/code&amp;gt; operator prompts for fields that are filled in at print time. Opening one also populates the &#039;&#039;&#039;QUE Input&#039;&#039;&#039; tab so values can be typed in.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ldf&amp;lt;/code&amp;gt; || Data File — a data-only file that references a master layout. Opening one runs its &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; commands to load the referenced layout and populate its fields.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Layouts may reference &amp;lt;code&amp;gt;.pcx&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.bmp&amp;lt;/code&amp;gt; images (logotypes) and a range of barcode types. A reference list of the wider Logopak file-type ecosystem is maintained alongside the project.&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
LogoRenderer is part of the open-source Commander4j suite and is distributed under the GNU General Public License.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039; are available from the [[Downloads]] page and are the preferred installation method. Each installer bundles its own Java runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;. Installing creates a native &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039; launcher that can be started like any other desktop application.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly as an ordinary Java (Swing) application. It is built with Maven:&lt;br /&gt;
&lt;br /&gt;
 mvn package&lt;br /&gt;
 java -jar c4j_logorenderer.jar [file.llf]&lt;br /&gt;
&lt;br /&gt;
Running the jar requires a recent Java runtime (Java 21 or later). If a layout file is supplied on the command line it is opened on start-up; otherwise the application starts with an empty canvas. Demo layouts and data files are provided in the &amp;lt;code&amp;gt;virtual_disk/c0/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window is divided into a &#039;&#039;&#039;label preview canvas&#039;&#039;&#039; on the left and a &#039;&#039;&#039;tabbed working area&#039;&#039;&#039; on the right, with a menu bar and toolbars around them and a status bar along the bottom. The title bar shows the program name, version and the name of the open file.&lt;br /&gt;
&lt;br /&gt;
The status bar reports the current file, the layout dimensions in printer dots and millimetres, the zoom level, and the number of fields in the layout.&lt;br /&gt;
&lt;br /&gt;
=== Preview Canvas ===&lt;br /&gt;
&lt;br /&gt;
The canvas shows the rendered label exactly as the layout describes it — text, scalable text, barcodes, graphic lines and boxes, and embedded logotype images. The rendering engine replicates the coordinate system and geometry of a PowerLeap III print head, including the upside-down (180°) print orientation. Clicking a rendered element highlights the source lines that produce it.&lt;br /&gt;
&lt;br /&gt;
=== Source / QUE Input / Log Tabs ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Tab !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Source&#039;&#039;&#039; || Lists the raw layout commands, one per line, each with a checkbox and a plain-language description. Un-checking a line excludes it from the render, so individual elements can be toggled on and off. Selecting a line shows its properties for editing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;QUE Input&#039;&#039;&#039; || For LQF layouts, presents one input box per operator prompt. Type values and apply them to see the populated label. This mirrors what an operator would be asked for at the machine.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Log&#039;&#039;&#039; || A colour-coded activity log showing file loads, parser messages, and all traffic to and from the printer emulator.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Viewing Controls ===&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;File&#039;&#039;&#039; menu opens and reloads layout files and exports the rendered label as a PNG image. The &#039;&#039;&#039;View&#039;&#039;&#039; menu provides zoom (preset levels, zoom in/out, and fit-to-window) and a &#039;&#039;&#039;Rotate 180°&#039;&#039;&#039; toggle that flips the preview to match the printer&#039;s print orientation.&lt;br /&gt;
&lt;br /&gt;
== Font Mapping ==&lt;br /&gt;
&lt;br /&gt;
Because Logopak fonts are not present on a development PC, LogoRenderer maps each Logopak font name to a Java font for rendering. The &#039;&#039;&#039;Settings → Font Mappings&#039;&#039;&#039; dialog lists every mapping and lets you set the Java font family (or a bundled TrueType file), style, reference cell size and calibration factors so that the on-screen text closely matches a real printed label. The mappings are stored in &amp;lt;code&amp;gt;xml/config/fonts.xml&amp;lt;/code&amp;gt;; fonts found in a layout but not yet mapped are added automatically with sensible defaults, ready to be fine-tuned.&lt;br /&gt;
&lt;br /&gt;
== The Printer Emulator ==&lt;br /&gt;
&lt;br /&gt;
This is the feature that makes hardware-free development possible. LogoRenderer can open a TCP server that emulates a Logopak PowerLeap III labeller, answering the same &#039;&#039;&#039;LEAP / LAMA&#039;&#039;&#039; protocol commands a real machine would.&lt;br /&gt;
&lt;br /&gt;
=== Starting the emulator ===&lt;br /&gt;
&lt;br /&gt;
The connection bar at the top of the window selects the &#039;&#039;&#039;IP address&#039;&#039;&#039; (default &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; for the local machine) and &#039;&#039;&#039;port&#039;&#039;&#039; (default &#039;&#039;&#039;8000&#039;&#039;&#039;, the PowerLeap III primary data port; &amp;lt;code&amp;gt;8100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8200&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;8300&amp;lt;/code&amp;gt; are also offered). Pressing &#039;&#039;&#039;Start Server&#039;&#039;&#039; begins listening; the Log tab shows when a client connects. Pressing the button again stops the server.&lt;br /&gt;
&lt;br /&gt;
=== What it emulates ===&lt;br /&gt;
&lt;br /&gt;
A connected client can do, against the emulator, the things it would do against a real labeller:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Browse and transfer files&#039;&#039;&#039; on an emulated drive — the &amp;lt;code&amp;gt;virtual_disk/&amp;lt;/code&amp;gt; folder provides the labeller&#039;s storage areas (&amp;lt;code&amp;gt;c0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;c9/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;d0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f0/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;r0/&amp;lt;/code&amp;gt;), so directory listings, downloads, uploads and deletes all behave realistically.&lt;br /&gt;
* &#039;&#039;&#039;Load a layout and send field data&#039;&#039;&#039; — when the client issues a &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; command the emulator loads that layout into the preview, and as &amp;lt;code&amp;gt;FD&amp;lt;/code&amp;gt; field-data commands arrive the on-screen label updates. The PC screen therefore shows what the real printer would be putting on a label.&lt;br /&gt;
* &#039;&#039;&#039;Retrieve logs&#039;&#039;&#039; — the emulator can serve pallet/label log files back to the client, so software that polls a labeller for &amp;quot;what was printed&amp;quot; can be tested end to end.&lt;br /&gt;
&lt;br /&gt;
=== Pallet print simulation ===&lt;br /&gt;
&lt;br /&gt;
When a loaded layout contains the pallet SSCC field, a &#039;&#039;&#039;Print Label&#039;&#039;&#039; control appears. Each press simulates a pallet print — two labels per pallet sharing one [https://en.wikipedia.org/wiki/Serial_Shipping_Container_Code SSCC] — increments the SSCC counter (persisted in &amp;lt;code&amp;gt;sscc.dat&amp;lt;/code&amp;gt;), and queues a log entry that a client can later retrieve. This lets log-polling and pallet-tracking logic be exercised without a real production run.&lt;br /&gt;
&lt;br /&gt;
== Using LogoRenderer and LogoClient Together ==&lt;br /&gt;
&lt;br /&gt;
The two tools form a complete bench setup for label development with no Logopak hardware:&lt;br /&gt;
&lt;br /&gt;
# In &#039;&#039;&#039;LogoRenderer&#039;&#039;&#039;, start the &#039;&#039;&#039;printer emulator&#039;&#039;&#039; on a port (default 8000).&lt;br /&gt;
# In &#039;&#039;&#039;[[LogoClient]]&#039;&#039;&#039;, connect in &#039;&#039;&#039;PL3 (TCP)&#039;&#039;&#039; mode to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; on the same port.&lt;br /&gt;
# From LogoClient, &#039;&#039;&#039;upload a layout&#039;&#039;&#039;, &#039;&#039;&#039;send field data&#039;&#039;&#039;, &#039;&#039;&#039;browse the emulated drives&#039;&#039;&#039; or &#039;&#039;&#039;poll the pallet log&#039;&#039;&#039; — and watch LogoRenderer render the result and log the traffic.&lt;br /&gt;
&lt;br /&gt;
In this arrangement LogoRenderer stands in for the printer so you can develop and test a client, while LogoClient stands in for the driving software so you can drive the renderer. Either tool can equally be pointed at a real Logopak labeller when one is available.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[LogoClient]] — the client-side companion tool that sends layouts and data to a labeller (real or emulated)&lt;br /&gt;
* [[Middleware4j]], [[LabelServer4j]], [[AutoLab4j]] — production software that drives Logopak labellers&lt;br /&gt;
* [[ZPLRenderer]] — the equivalent preview tool for Zebra ZPL labels&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=File:LogoRenderer_256x256.png&amp;diff=1865</id>
		<title>File:LogoRenderer 256x256.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=File:LogoRenderer_256x256.png&amp;diff=1865"/>
		<updated>2026-06-13T12:36:10Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=File:LogoClient_256x256.png&amp;diff=1864</id>
		<title>File:LogoClient 256x256.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=File:LogoClient_256x256.png&amp;diff=1864"/>
		<updated>2026-06-13T12:35:43Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Template:Menu_Applications&amp;diff=1863</id>
		<title>Template:Menu Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Template:Menu_Applications&amp;diff=1863"/>
		<updated>2026-06-13T12:35:26Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: /* Applications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Applications=&lt;br /&gt;
{| cellpadding=&amp;quot;8&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||[[file:AutoLab4j_256x256.png|link=[[AutoLab4j]]|100px]]&lt;br /&gt;
====[[AutoLab4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[File:Commander4j_256x256.png|link=[[Commander4j]]|100px]]&lt;br /&gt;
====[[Commander4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:LabelServer4j_256x256.png|link=[[LabelServer4j]]|100px]]&lt;br /&gt;
====[[LabelServer4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:LaunchPad_256x256.png|link=[[LaunchPad]]|100px]]&lt;br /&gt;
====[[LaunchPad]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:LogoClient_256x256.png|link=[[LogoClient]]|100px]]&lt;br /&gt;
====[[LogoClient]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:LogoRenderer_256x256.png|link=[[LogoRenderer]]|100px]]&lt;br /&gt;
====[[LogoRenderer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Menu4j_256x256.png|link=[[Menu4j]]|100px]]&lt;br /&gt;
====[[Menu4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Middleware4j_256x256.png|link=[[Middleware4j]]|100px]]&lt;br /&gt;
====[[Middleware4j]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:Modbus_256x256.png|link=[[ModbusClient]]|100px]]&lt;br /&gt;
====[[ModbusClient]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Modbus_256x256.png|link=[[ModbusServer]]|100px]]&lt;br /&gt;
====[[ModbusServer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SFTGet4j_256x256.png|link=[[SFTPGet]]|100px]]&lt;br /&gt;
====[[SFTPGet]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SFTPSend4j_256x256.png|link=[[SFTPSend]]|100px]]&lt;br /&gt;
====[[SFTPSend]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:sftpTransfer_256x256.png|link=[[SFTPTransfer]]|100px]]&lt;br /&gt;
====[[SFTPTransfer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SocketTest_256x256.png|link=[[SocketTest]]|100px]]&lt;br /&gt;
====[[SocketTest]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:TreeDoc_256x256.png|link=[[TreeDoc]]|100px]]&lt;br /&gt;
====[[TreeDoc]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:XMLViewer_256x256.png|link=[[XMLViewer]]|100px]]&lt;br /&gt;
====[[XMLViewer]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:ZPLRenderer_256x256.png|link=[[ZPLRenderer]]|100px]]&lt;br /&gt;
====[[ZPLRenderer]]====&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Template:Menu_Applications&amp;diff=1862</id>
		<title>Template:Menu Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Template:Menu_Applications&amp;diff=1862"/>
		<updated>2026-06-11T11:42:28Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: /* Applications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Applications=&lt;br /&gt;
{| cellpadding=&amp;quot;8&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||[[file:AutoLab4j_256x256.png|link=[[AutoLab4j]]|100px]]&lt;br /&gt;
====[[AutoLab4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[File:Commander4j_256x256.png|link=[[Commander4j]]|100px]]&lt;br /&gt;
====[[Commander4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:LabelServer4j_256x256.png|link=[[LabelServer4j]]|100px]]&lt;br /&gt;
====[[LabelServer4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:LaunchPad_256x256.png|link=[[LaunchPad]]|100px]]&lt;br /&gt;
====[[LaunchPad]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:Menu4j_256x256.png|link=[[Menu4j]]|100px]]&lt;br /&gt;
====[[Menu4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Middleware4j_256x256.png|link=[[Middleware4j]]|100px]]&lt;br /&gt;
====[[Middleware4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Modbus_256x256.png|link=[[ModbusClient]]|100px]]&lt;br /&gt;
====[[ModbusClient]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Modbus_256x256.png|link=[[ModbusServer]]|100px]]&lt;br /&gt;
====[[ModbusServer]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:SFTGet4j_256x256.png|link=[[SFTPGet]]|100px]]&lt;br /&gt;
====[[SFTPGet]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SFTPSend4j_256x256.png|link=[[SFTPSend]]|100px]]&lt;br /&gt;
====[[SFTPSend]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:sftpTransfer_256x256.png|link=[[SFTPTransfer]]|100px]]&lt;br /&gt;
====[[SFTPTransfer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SocketTest_256x256.png|link=[[SocketTest]]|100px]]&lt;br /&gt;
====[[SocketTest]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:TreeDoc_256x256.png|link=[[TreeDoc]]|100px]]&lt;br /&gt;
====[[TreeDoc]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:XMLViewer_256x256.png|link=[[XMLViewer]]|100px]]&lt;br /&gt;
====[[XMLViewer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:ZPLRenderer_256x256.png|link=[[ZPLRenderer]]|100px]]&lt;br /&gt;
====[[ZPLRenderer]]====&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Installation&amp;diff=1861</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Installation&amp;diff=1861"/>
		<updated>2026-06-10T16:50:00Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Install Database ==&lt;br /&gt;
&lt;br /&gt;
Commander4j can work with [[mySQL]], [[MSSQL]] or [[Oracle]] databases. Without going into the specifics of how each database product works the following is a checklist of what needs to be done in order to prepare the database for use with Commander4j.&lt;br /&gt;
&lt;br /&gt;
General recommendations. If we assume that your just wanting to get the application working with the least amount of work then I would recommend installing SQL Server Express for Windows based computers. For MacOS I would recommend mySQL and for Linux you have the choice of mySQL or Oracle. To be accurate most databases will work with most operating systems using Docker these days - but in the interest of simplicity I would use the previous recommendations. Apologies to any Oracle DBA&#039;s out there but I would not recommend it unless you have a lot of previous experience.&lt;br /&gt;
&lt;br /&gt;
== mySQL ==&lt;br /&gt;
&lt;br /&gt;
A detailed guide showing how to install mySQL under windows can be found [https://dev.mysql.com/doc/mysql-installation-excerpt/8.2/en/ here].&lt;br /&gt;
&lt;br /&gt;
* Create a database/schema user account for Commander4j to use.&lt;br /&gt;
* Create a user which has the newly created database as its default schema.&lt;br /&gt;
* Ensure that the new user has sufficient permissions to create tables/indexes/views etc.&lt;br /&gt;
* Better to grant too much rather than too little initially.&lt;br /&gt;
* Ensure that the database is accepting remote connections.&lt;br /&gt;
* Ensure that the user is allowed to connect remotely.&lt;br /&gt;
&lt;br /&gt;
== MariaDB ==&lt;br /&gt;
&lt;br /&gt;
Installation is fundamentally as per mySQL - however when you use the Setup4j program within Commander4j you need to make sure you select the following settings.&lt;br /&gt;
&lt;br /&gt;
 Collation      utf8mb4_general_ci&lt;br /&gt;
 Char Set       utf8mb4&lt;br /&gt;
&lt;br /&gt;
== Microsoft SQL Server ==&lt;br /&gt;
&lt;br /&gt;
A detailed guide showing how to install MS SQL Server under windows can be found [https://learn.microsoft.com/en-us/sql/database-engine/install-windows/install-sql-server?view=sql-server-ver16 here].&lt;br /&gt;
&lt;br /&gt;
* Enable the TCP/IP communication protocol as it may be disabled by default.&lt;br /&gt;
* Create a database/schema user account for Commander4j to use.&lt;br /&gt;
* Create a user which has the newly created database as its default schema.&lt;br /&gt;
* Ensure that the new user has sufficient permissions to create tables/indexes/views etc.&lt;br /&gt;
* Better to grant too much rather than too little initially.&lt;br /&gt;
* Ensure that the database is accepting remote connections.&lt;br /&gt;
* Check firewall rules allow connections on port 1433.&lt;br /&gt;
* Ensure that the user is allowed to connect remotely.&lt;br /&gt;
&lt;br /&gt;
== Oracle ==&lt;br /&gt;
&lt;br /&gt;
A detailed guide showing how to install Oracle under windows can be found [https://docs.oracle.com/en/database/oracle/oracle-database/23/install.html here].&lt;br /&gt;
&lt;br /&gt;
* Create a database/schema user account for Commander4j to use.&lt;br /&gt;
* Create a user which has the newly created database as its default schema.&lt;br /&gt;
* Ensure that the new user has sufficient permissions to create tables/indexes/views etc.&lt;br /&gt;
* Better to grant too much rather than too little initially.&lt;br /&gt;
* Ensure that the database is using TCP/IP.&lt;br /&gt;
* Ensure that the database is accepting remote connections.&lt;br /&gt;
* Check firewall rules allow connections.&lt;br /&gt;
&lt;br /&gt;
== Install Java ==&lt;br /&gt;
&lt;br /&gt;
* Java 25 is needed if you are installing:&lt;br /&gt;
** The desktop application on a Linux operating system.&lt;br /&gt;
** The web components onto a server using Apache Tomcat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that the web applications should be installed on a nominated server machine and not on workstations.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Recommend installing the Azul Zulu JDK from [https://www.azul.com/downloads/#zulu https://www.azul.com/downloads/#zulu].&lt;br /&gt;
&lt;br /&gt;
== Install Tomcat 11.x ==&lt;br /&gt;
&lt;br /&gt;
* Download from [http://tomcat.apache.org/ Apache Tomcat Site].&lt;br /&gt;
&lt;br /&gt;
Ensure you download the 32/64Bit Windows Service Installer package.&lt;br /&gt;
&lt;br /&gt;
== Install Commander4j ==&lt;br /&gt;
&lt;br /&gt;
* Obtain the required installation package.&lt;br /&gt;
&lt;br /&gt;
This can be downloaded from [http://www.commander4j.com Commander4j Website].&lt;br /&gt;
On a server select the &amp;quot;Full&amp;quot; install option from the setup screen — normally a user&#039;s PC will require the &amp;quot;Workstation&amp;quot; install.&lt;br /&gt;
&lt;br /&gt;
[[File:Install1.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Run the appropriate installer for your operating system.&lt;br /&gt;
&lt;br /&gt;
[[File:Install2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Review and agree the licence agreement.&lt;br /&gt;
&lt;br /&gt;
[[File:Install3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Select the install destination.&lt;br /&gt;
&lt;br /&gt;
[[File:Install4.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Choose the appropriate install type.&lt;br /&gt;
Select Full if you are installing the main machine (server) which will run the interfaces, and Workstation for every other machine.&lt;br /&gt;
&lt;br /&gt;
[[File:Install5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Amend the name of the folder shortcut if needed. Typically you would change the name if you wanted to install more than one copy of the software on the same computer.&lt;br /&gt;
&lt;br /&gt;
[[File:Install6.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Allow the installer to copy files to the destination.&lt;br /&gt;
&lt;br /&gt;
[[File:Install7.png|400px]]&lt;br /&gt;
&lt;br /&gt;
The software is now installed.&lt;br /&gt;
&lt;br /&gt;
== Configure Commander4j ==&lt;br /&gt;
&lt;br /&gt;
* [[Setup4j|Setup Hosts]] (Database Connections)&lt;br /&gt;
&lt;br /&gt;
When Commander4j is initially installed you will find a number of dummy database connections already defined. You may find it easier to amend one of these rather than create a new connection. To manage the database connections run [[Setup4j]] from the Commander4j program shortcuts.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The first step is to install and/or identify the database software that you plan to use with Commander4j. As mentioned previously this can be mySQL, Microsoft SQL Server (including SQL Express) or Oracle (including XE).&lt;br /&gt;
&lt;br /&gt;
== Configure Tomcat / Web Application ==&lt;br /&gt;
&lt;br /&gt;
The web components of Commander4j are contained in the .war files which you download. You won&#039;t need all of them and their names may change with updated releases.&lt;br /&gt;
&lt;br /&gt;
The servlet (.war) files shown below are intended to work on Zebra Mobile Computers which have the Zebra Enterprise Browser installed.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Servlet !! Purpose !! Environment !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;c4j_web_react.war&#039;&#039;&#039; || Pallet Transactions || Any Mobile Browser || * Recommended&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;c4j_web_WS.war&#039;&#039;&#039; || Quality — Product Grading || Any Mobile Browser || Only needed for Quality Control&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;c4j_web_Issue.war&#039;&#039;&#039; || Issue Pallets to Order &amp;amp; Location || Tablet Mobile Browser || Issue/Return of Stock&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Installing the web element of Commander4j is straightforward and requires copying files from the Commander4j install directory into the Tomcat directory:&lt;br /&gt;
&lt;br /&gt;
* Stop the Apache Tomcat service if it is running.&lt;br /&gt;
* Copy the file &#039;&#039;&#039;chosen_servlet.war&#039;&#039;&#039; from the Commander4j directory into the WebApps subdirectory of the Tomcat installation directory.&lt;br /&gt;
* Start the Apache Tomcat service.&lt;br /&gt;
* You should then notice that the &#039;&#039;&#039;chosen_servlet&#039;&#039;&#039; directory has been created under WebApps.&lt;br /&gt;
* Update the list of hosts the web application can connect to by copying &amp;quot;Commander4j/xml/hosts/hosts.xml&amp;quot; into &amp;quot;Tomcat/WebApps/&#039;&#039;&#039;chosen_servlet&#039;&#039;&#039;/xml/hosts&amp;quot;.&lt;br /&gt;
* Confirm this is working by opening the URL &#039;&#039;&#039;http://servername:8080/chosen_servlet/&#039;&#039;&#039;&lt;br /&gt;
* If you update the hosts.xml file for a servlet you will need to either restart Apache Tomcat or stop and start the servlet from the [http://localhost:8080/manager/html Apache Tomcat Manager].&lt;br /&gt;
* If you want to connect to a SQL Server database using Windows Integrated Authentication, copy the appropriate version of the auth DLL from the downloaded MS JDBC drivers (e.g. mssql-jdbc_auth-12.10.0.x64.dll) into the Java bin folder.&lt;br /&gt;
&lt;br /&gt;
== Create Commander4j Services ==&lt;br /&gt;
&lt;br /&gt;
See [[Install_Interface_Services|Install Interface Services]].&lt;br /&gt;
&lt;br /&gt;
== Install Local Middleware ==&lt;br /&gt;
&lt;br /&gt;
The local middleware service handles the processing of inbound and outbound interface files between Commander4j and external systems such as an ERP. It runs as a background service on the Commander4j server machine and is configured via the [[Interface_Admin|Interface Admin]] screen within the application.&lt;br /&gt;
&lt;br /&gt;
To install the interface service:&lt;br /&gt;
&lt;br /&gt;
* Ensure Commander4j has been installed using the &#039;&#039;&#039;Full&#039;&#039;&#039; install option, which includes the service wrapper components.&lt;br /&gt;
* Open Commander4j, navigate to &#039;&#039;&#039;System &amp;gt; Interface Admin&#039;&#039;&#039; and verify that your interface definitions are configured correctly.&lt;br /&gt;
* Use the &#039;&#039;&#039;Assign Service&#039;&#039;&#039; function within the application to register the interface process as a Windows service (on Windows) or configure it as a startup process on Linux/macOS.&lt;br /&gt;
* Once registered, start the service and monitor the [[Interface_Log|Interface Log]] to confirm that messages are being processed correctly.&lt;br /&gt;
&lt;br /&gt;
If you are using [[Middleware4j]] to transform files before they reach Commander4j, install and configure Middleware4j separately — see the [[Middleware4j]] wiki page for details.&lt;br /&gt;
&lt;br /&gt;
== Install Print Queues ==&lt;br /&gt;
&lt;br /&gt;
Commander4j uses two distinct methods for printing, and each requires a different type of print queue to be set up on the workstation or server.&lt;br /&gt;
&lt;br /&gt;
=== Standard Reports (JasperReports) ===&lt;br /&gt;
&lt;br /&gt;
Standard reports — such as pallet summaries, despatch notes and audit reports — are printed using JasperReports and sent to a regular operating system print queue, exactly as you would print a document from a word processor. Any printer visible to the operating system can be used. The report type is configured in the [[Modules|Modules]] screen.&lt;br /&gt;
&lt;br /&gt;
On Windows, ensure the printer is installed and visible in the Windows Printers &amp;amp; Scanners settings. On Linux, CUPS-managed queues are supported.&lt;br /&gt;
&lt;br /&gt;
=== Barcode Labels (ZPL) ===&lt;br /&gt;
&lt;br /&gt;
Barcode labels — pallet labels, case labels and sample labels — are printed by sending raw ZPL (Zebra Printer Language) commands directly to a ZPL compatible printer. This bypasses the normal print driver rendering pipeline entirely, so the print queue must be configured as a raw / pass-through queue.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Windows&#039;&#039;&#039; — install the printer using the [https://www.seagullscientific.com/support/downloads/drivers/ Seagull Scientific Generic Label] driver, or configure a &#039;&#039;Generic / Text Only&#039;&#039; queue. Do not use a standard Zebra Windows driver, as this will re-interpret the ZPL rather than passing it through.&lt;br /&gt;
* &#039;&#039;&#039;macOS&#039;&#039;&#039; — configure a raw printer queue using a tool such as [https://qz.io QZ Tray] or follow the guidance at [https://qz.io/docs/Setting-Up-A-Raw-Printer-in-OSX qz.io]. A standard macOS printer queue will not work for ZPL output.&lt;br /&gt;
* &#039;&#039;&#039;Linux&#039;&#039;&#039; — configure a CUPS raw queue pointing at the printer&#039;s IP address and port 9100.&lt;br /&gt;
&lt;br /&gt;
If a label is accidentally sent to a standard print queue rather than a raw queue, the printer will output pages of ZPL text commands instead of a label. This is harmless but confirms the queue type needs to be changed.&lt;br /&gt;
&lt;br /&gt;
See also: [[Zebra_ZPL_Label|Zebra ZPL Label]], [[Intermec_IPL_Label|Intermec IPL Label]], [[Label_Template_Syntax|Label Template Syntax]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Web_Applications_Overview&amp;diff=1860</id>
		<title>Web Applications Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Web_Applications_Overview&amp;diff=1860"/>
		<updated>2026-06-10T16:49:34Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Commander4j includes three web applications that run on Apache Tomcat alongside the main desktop application. Each is deployed as a WAR file and communicates with the same database. They are designed primarily for use on mobile devices and tablets on the shop floor, where a full desktop installation is not practical.&lt;br /&gt;
&lt;br /&gt;
== Web Applications ==&lt;br /&gt;
&lt;br /&gt;
=== c4j_web_react — Pallet Confirmation and Despatch ===&lt;br /&gt;
&lt;br /&gt;
This is the primary shop-floor web application. It provides browser-based screens for operators using wireless barcode scanners or handheld devices.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key functions:&#039;&#039;&#039;&lt;br /&gt;
* Scanning SSCC barcodes to confirm pallet production against a process order&lt;br /&gt;
* Creating and managing despatch records&lt;br /&gt;
* Assigning pallets to a despatch and confirming shipment&lt;br /&gt;
* Recording waste transactions&lt;br /&gt;
* Viewing pallet information&lt;br /&gt;
* Changing user passwords&lt;br /&gt;
&lt;br /&gt;
The application uses a traditional servlet and JSP architecture. A single &#039;&#039;&#039;Process&#039;&#039;&#039; servlet handles all form submissions. Sessions time out after 60 minutes of inactivity.&lt;br /&gt;
&lt;br /&gt;
Deployed as: &#039;&#039;&#039;c4j_web_react.war&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== c4j_web_WS — Quality Panel Web Interface ===&lt;br /&gt;
&lt;br /&gt;
This application provides a REST API and browser-based interface for recording quality panel inspection results. It is designed for use by quality technicians and trained panellists on tablets.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key functions:&#039;&#039;&#039;&lt;br /&gt;
* Creating and managing panel sessions&lt;br /&gt;
* Organising samples into trays&lt;br /&gt;
* Recording graded results against each sample&lt;br /&gt;
* Progressing panels through their lifecycle (Panel → Complete → Closed)&lt;br /&gt;
&lt;br /&gt;
The application exposes a JSON REST API consumed by a browser front end. Results feed into the main Commander4j QM module and are visible in the desktop [[Results Analysis and Reporting]] screen.&lt;br /&gt;
&lt;br /&gt;
Deployed as: &#039;&#039;&#039;c4j_web_WS.war&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
See also: [[Quality Panel Web Interface]]&lt;br /&gt;
&lt;br /&gt;
=== c4j_web_Issue — Material Issue Validation ===&lt;br /&gt;
&lt;br /&gt;
This application is intended to validate that operators issue the correct raw materials to a production line. It cross-checks scanned SSCCs against the Bill of Materials for the active process order, confirms the pick location, and records the transaction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key functions:&#039;&#039;&#039;&lt;br /&gt;
* Scanning material pallets (SSCC) for issue to a process order&lt;br /&gt;
* Validating material and location against the BOM&lt;br /&gt;
* Recording returns of unused material&lt;br /&gt;
* Viewing pallet information and transaction history&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; This application has been developed but is not yet deployed in production. It is included here for reference.&lt;br /&gt;
&lt;br /&gt;
Deployed as: &#039;&#039;&#039;c4j_web_Issue.war&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Shared Configuration ==&lt;br /&gt;
&lt;br /&gt;
All three web applications use a &#039;&#039;&#039;hosts.xml&#039;&#039;&#039; file (located in the application&#039;s &#039;&#039;&#039;xml/hosts/&#039;&#039;&#039; directory within the deployed WAR) to define their database connections. This is the same format used by the Commander4j desktop and [[Setup4j]]. When updating database connection details, each web application&#039;s hosts.xml must be updated separately.&lt;br /&gt;
&lt;br /&gt;
The [[Setup4j]] tool is used to create and maintain hosts.xml files. After editing, the updated file must be copied into the relevant folder inside each deployed WAR, and Tomcat restarted (or the application reloaded) for the change to take effect.&lt;br /&gt;
&lt;br /&gt;
== Relationship to the Desktop Application ==&lt;br /&gt;
&lt;br /&gt;
The web applications share the &#039;&#039;&#039;commander4j.jar&#039;&#039;&#039; library with the desktop application. This library provides the full database access layer, business logic, barcode utilities, and configuration handling. The web applications do not duplicate this logic — they call into the shared library directly.&lt;br /&gt;
&lt;br /&gt;
All data written by the web applications is immediately visible in the desktop application, and vice versa. There is no synchronisation step.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* Apache Tomcat 11.x&lt;br /&gt;
* Java 25&lt;br /&gt;
* A configured and accessible Commander4j database (MySQL, MS SQL Server, or Oracle)&lt;br /&gt;
* A valid &#039;&#039;&#039;hosts.xml&#039;&#039;&#039; deployed with each WAR&lt;br /&gt;
&lt;br /&gt;
See also: [[Installation]], [[Setup4j]], [[Production Confirmation]], [[Despatch]], [[Quality Panel Web Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Menu4j&amp;diff=1859</id>
		<title>Menu4j</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Menu4j&amp;diff=1859"/>
		<updated>2026-06-10T16:49:12Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Menu4j (JMenuTree) is a desktop command launcher that organises shell commands, scripts, and applications into a hierarchical tree menu. It provides a configurable, script-aware alternative to Finder shortcuts and shell aliases, with support for real-time terminal output, multiple linked menu trees, and optional startup password protection.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Menu4j is used to organise the day-to-day development and operational commands for the Commander4j suite in a single, structured interface. Menu items can run shell scripts, open applications, pass parameters, capture output, and link to other menu tree files.&lt;br /&gt;
&lt;br /&gt;
== Running Menu4j ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method.&lt;br /&gt;
&lt;br /&gt;
Alternatively, Menu4j can be run directly from the distribution archive. It is a Java 25 desktop (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar JMenu.jar&lt;br /&gt;
&lt;br /&gt;
On first launch, if no configuration file is found, Menu4j copies a template configuration from &amp;lt;code&amp;gt;xml/config/init/config.xml&amp;lt;/code&amp;gt; and a template menu tree from &amp;lt;code&amp;gt;xml/tree/init/tree.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If a startup password has been configured, you are prompted to enter it before the menu is shown. Three failed attempts close the application.&lt;br /&gt;
&lt;br /&gt;
== The Menu Tree ==&lt;br /&gt;
&lt;br /&gt;
The main window displays a JTree. There are two node types:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| Branch || A folder that contains other branches or leaves&lt;br /&gt;
|-&lt;br /&gt;
| Leaf || An executable item — a command, script, or application&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Double-click a leaf to execute it. Double-click a branch to expand or collapse it.&lt;br /&gt;
&lt;br /&gt;
=== Adding and Editing Items ===&lt;br /&gt;
&lt;br /&gt;
The right sidebar toolbar provides:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Add&#039;&#039;&#039; — insert a new branch or leaf under the selected node&lt;br /&gt;
* &#039;&#039;&#039;Edit&#039;&#039;&#039; — open the editor for the selected node&lt;br /&gt;
* &#039;&#039;&#039;Delete&#039;&#039;&#039; — remove the selected node&lt;br /&gt;
* &#039;&#039;&#039;Duplicate&#039;&#039;&#039; — copy the selected node&lt;br /&gt;
&lt;br /&gt;
=== Leaf Properties ===&lt;br /&gt;
&lt;br /&gt;
When editing a leaf node, the following properties are available:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Description || The label shown in the menu tree&lt;br /&gt;
|-&lt;br /&gt;
| Directory || The working directory for the command&lt;br /&gt;
|-&lt;br /&gt;
| Command || The executable or system command to run&lt;br /&gt;
|-&lt;br /&gt;
| Parameters || A list of arguments to pass to the command&lt;br /&gt;
|-&lt;br /&gt;
| Shell Script Required || Whether to wrap the command in the configured shell wrapper script&lt;br /&gt;
|-&lt;br /&gt;
| Terminal Window Required || Whether to open a terminal output window to show command output&lt;br /&gt;
|-&lt;br /&gt;
| Confirm Execute || Whether to show a confirmation prompt before running&lt;br /&gt;
|-&lt;br /&gt;
| Link to Menu Tree || Whether this item opens a different tree file instead of running a command&lt;br /&gt;
|-&lt;br /&gt;
| Hint || A tooltip shown when hovering over the item&lt;br /&gt;
|-&lt;br /&gt;
| Icon || An image file to display next to the item label&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Executing Commands ==&lt;br /&gt;
&lt;br /&gt;
When a leaf is executed:&lt;br /&gt;
&lt;br /&gt;
# Menu4j validates that the directory and command exist&lt;br /&gt;
# If &#039;&#039;&#039;Shell Script Required&#039;&#039;&#039; is set, the command is wrapped using the script configured in Settings (typically a shell wrapper that sources the user&#039;s environment)&lt;br /&gt;
# If &#039;&#039;&#039;Terminal Window Required&#039;&#039;&#039; is set, a terminal output window opens and displays stdout and stderr in real time; otherwise the command runs silently in the background&lt;br /&gt;
# Environment variables configured in Settings are injected before execution&lt;br /&gt;
&lt;br /&gt;
=== Terminal Output Window ===&lt;br /&gt;
&lt;br /&gt;
The terminal window displays command output with configurable foreground and background colours and font (configured in Settings). A &#039;&#039;&#039;Respond&#039;&#039;&#039; button allows text to be sent to the command&#039;s standard input for interactive commands. When the command completes, the return code is displayed.&lt;br /&gt;
&lt;br /&gt;
== Multiple Tree Files ==&lt;br /&gt;
&lt;br /&gt;
A leaf node can be configured to switch to a different menu tree rather than execute a command. Set &#039;&#039;&#039;Link to Menu Tree&#039;&#039;&#039; and specify the filename. Double-clicking the leaf saves the current tree&#039;s expansion state and loads the linked tree. The application title bar updates to show the active tree filename.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== config.xml ===&lt;br /&gt;
&lt;br /&gt;
Located at &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt;. This file stores global settings including the active tree filename, shell script settings, colours, fonts, environment variables, system command whitelist, and the encrypted startup password.&lt;br /&gt;
&lt;br /&gt;
=== tree.xml ===&lt;br /&gt;
&lt;br /&gt;
Located at &amp;lt;code&amp;gt;xml/tree/tree.xml&amp;lt;/code&amp;gt; (or a different filename if you have switched trees). This is the menu structure file. It is written automatically when you save from the application.&lt;br /&gt;
&lt;br /&gt;
=== tree.xml.state ===&lt;br /&gt;
&lt;br /&gt;
Located alongside the tree file. Records which branches were expanded on the last exit and restores them on next launch.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
Open Settings from the toolbar to configure:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Password || Optional startup password (stored AES-encrypted)&lt;br /&gt;
|-&lt;br /&gt;
| Shell script || Enable/disable the shell wrapper and set the script filename&lt;br /&gt;
|-&lt;br /&gt;
| Terminal colours || Foreground and background colours for the terminal output window&lt;br /&gt;
|-&lt;br /&gt;
| Tree colours || Foreground colours for leaf and branch labels&lt;br /&gt;
|-&lt;br /&gt;
| Fonts || Font choice and size for the terminal window, leaf labels, and branch labels&lt;br /&gt;
|-&lt;br /&gt;
| Environment variables || Key/value pairs injected into every executed process&lt;br /&gt;
|-&lt;br /&gt;
| System commands || Whitelist of system commands (such as &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;) that do not require a file path to be validated&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tree Navigation ==&lt;br /&gt;
&lt;br /&gt;
The top toolbar provides four buttons for expanding and collapsing the tree:&lt;br /&gt;
&lt;br /&gt;
* Expand All&lt;br /&gt;
* Expand Selected Branch&lt;br /&gt;
* Collapse Selected Branch&lt;br /&gt;
* Collapse All&lt;br /&gt;
&lt;br /&gt;
== Saving ==&lt;br /&gt;
&lt;br /&gt;
Changes to the tree structure are saved using the &#039;&#039;&#039;Save&#039;&#039;&#039; button in the sidebar toolbar. You are prompted to save if you close the application with unsaved changes.&lt;br /&gt;
&lt;br /&gt;
See also: [[LaunchPad]], [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=XML_Viewer&amp;diff=1858</id>
		<title>XML Viewer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=XML_Viewer&amp;diff=1858"/>
		<updated>2026-06-10T16:48:56Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;XML Viewer is a desktop application for exploring XML documents as an interactive, expandable tree. It supports configurable display modes, multi-language element name translation, and adjustable tree expansion depth. It is designed for viewing structured XML files such as SAP IDoc messages, Commander4j configuration files, and production schedule exports.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
XML Viewer makes it practical to inspect complex XML files that are difficult to read as raw text. Element names can be translated into plain-language descriptions (for example, the SAP field code &amp;lt;code&amp;gt;ABWKZ&amp;lt;/code&amp;gt; becomes &amp;quot;Deviation indicator&amp;quot; in the English translation), and the tree can be expanded to a specific depth to give a high-level overview without showing every leaf value.&lt;br /&gt;
&lt;br /&gt;
== Running XML Viewer ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method.&lt;br /&gt;
&lt;br /&gt;
Alternatively, XML Viewer can be run directly from the distribution archive. It is a Java 25 desktop (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar xmlviewer.jar [optional path to XML file]&lt;br /&gt;
&lt;br /&gt;
If a file path is provided on the command line, that file is opened immediately on launch. Otherwise, the last-opened file from the configuration is loaded.&lt;br /&gt;
&lt;br /&gt;
== Loading a Document ==&lt;br /&gt;
&lt;br /&gt;
Click the &#039;&#039;&#039;Open XML Document&#039;&#039;&#039; button in the right sidebar, or pass a file path on the command line. Only well-formed XML files are supported. Click &#039;&#039;&#039;Reload XML Document&#039;&#039;&#039; to re-read the current file after it has been changed externally.&lt;br /&gt;
&lt;br /&gt;
== Display Modes ==&lt;br /&gt;
&lt;br /&gt;
=== Standard Mode ===&lt;br /&gt;
&lt;br /&gt;
The XML hierarchy is displayed exactly as it appears in the file — elements nest within their parent elements, forming a tree that mirrors the XML structure.&lt;br /&gt;
&lt;br /&gt;
=== Flat Mode ===&lt;br /&gt;
&lt;br /&gt;
Leaf elements (those containing only text, no child elements) are collapsed into their parent&#039;s row rather than appearing as separate tree nodes. Only elements that contain child elements appear as tree nodes. This produces a more compact view of documents with many small leaf values.&lt;br /&gt;
&lt;br /&gt;
Toggle between modes using the &#039;&#039;&#039;View Mode&#039;&#039;&#039; button in the right sidebar.&lt;br /&gt;
&lt;br /&gt;
== Tree Expansion Control ==&lt;br /&gt;
&lt;br /&gt;
The top toolbar provides four buttons:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Expand All&#039;&#039;&#039; — expand every node in the tree&lt;br /&gt;
* &#039;&#039;&#039;Expand Selected&#039;&#039;&#039; — expand only the selected subtree&lt;br /&gt;
* &#039;&#039;&#039;Collapse Selected&#039;&#039;&#039; — collapse the selected subtree&lt;br /&gt;
* &#039;&#039;&#039;Collapse All&#039;&#039;&#039; — collapse everything to root level&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;−&#039;&#039;&#039; and &#039;&#039;&#039;+&#039;&#039;&#039; buttons in the toolbar adjust the current expansion level (shown as a number between the buttons). Clicking &#039;&#039;&#039;Refresh&#039;&#039;&#039; after changing the level re-expands the tree to that depth.&lt;br /&gt;
&lt;br /&gt;
The expansion level is saved in the configuration and restored on next launch.&lt;br /&gt;
&lt;br /&gt;
== Translation ==&lt;br /&gt;
&lt;br /&gt;
XML Viewer can replace technical XML element names and values with plain-language descriptions from a translation file.&lt;br /&gt;
&lt;br /&gt;
=== Enabling Translation ===&lt;br /&gt;
&lt;br /&gt;
Toggle translations using the &#039;&#039;&#039;View Translations&#039;&#039;&#039; button. The &#039;&#039;&#039;Translation&#039;&#039;&#039; dropdown at the bottom of the window selects which translation file to use. The &#039;&#039;&#039;Language&#039;&#039;&#039; dropdown selects the language within that file.&lt;br /&gt;
&lt;br /&gt;
=== Built-in Translation Files ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! File !! Contents&lt;br /&gt;
|-&lt;br /&gt;
| matmas05.xml || SAP MATMAS05 IDoc field translations&lt;br /&gt;
|-&lt;br /&gt;
| zmatmas03.xml || SAP ZMATMAS03 IDoc field translations&lt;br /&gt;
|-&lt;br /&gt;
| productionschedule.xml || Production schedule export field translations&lt;br /&gt;
|-&lt;br /&gt;
| config.xml || Commander4j configuration element translations&lt;br /&gt;
|-&lt;br /&gt;
| default.xml || Generic fallback translations&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Languages ===&lt;br /&gt;
&lt;br /&gt;
The default installation includes English, French, German, and Italian. The active language can be changed at any time from the Language dropdown.&lt;br /&gt;
&lt;br /&gt;
=== Adding Translations ===&lt;br /&gt;
&lt;br /&gt;
Translation files are XML documents located in &amp;lt;code&amp;gt;xml/translations/&amp;lt;/code&amp;gt;. Each file maps element names, attribute names, element values, and attribute values to their translated equivalents for each language. Elements without a translation entry are shown using their original name from the XML file.&lt;br /&gt;
&lt;br /&gt;
== Other Display Options ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Button !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| View Icons || Show or hide the icon column next to each tree node&lt;br /&gt;
|-&lt;br /&gt;
| View Brackets || Wrap element values in &amp;lt;code&amp;gt;[ ]&amp;lt;/code&amp;gt; brackets to distinguish them from element names&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== config.xml ===&lt;br /&gt;
&lt;br /&gt;
Located at &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt;. Stores the last-opened file path, selected translation file, selected language, current expansion level, and the state of all four display toggles (mode, translations, brackets, icons). Updated automatically on exit.&lt;br /&gt;
&lt;br /&gt;
=== log4j2.xml ===&lt;br /&gt;
&lt;br /&gt;
Located at &amp;lt;code&amp;gt;xml/log/log4j2.xml&amp;lt;/code&amp;gt;. Controls logging to &amp;lt;code&amp;gt;logs/XML_View.log&amp;lt;/code&amp;gt;. Log files rotate at 10 MB and are retained for 14 days.&lt;br /&gt;
&lt;br /&gt;
=== fonts.xml / icons ===&lt;br /&gt;
&lt;br /&gt;
Icons are loaded from &amp;lt;code&amp;gt;images/xmlIcons/&amp;lt;/code&amp;gt;. If an icon file referenced by a translation is not found, the icon column is left blank for that element without an error.&lt;br /&gt;
&lt;br /&gt;
See also: [[TreeDoc]], [[Middleware4j]], [[Label Template Syntax]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=TreeDoc&amp;diff=1857</id>
		<title>TreeDoc</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=TreeDoc&amp;diff=1857"/>
		<updated>2026-06-10T16:48:39Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TreeDoc is a desktop utility that generates an ASCII directory tree from a folder you select and displays it in a scrollable text window. The output can be copied to the clipboard or saved as a plain text file.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
TreeDoc is useful for producing a human-readable snapshot of a folder structure — for example, documenting a Commander4j installation layout, comparing the contents of two directories, or quickly exploring an unfamiliar project. The output uses box-drawing characters (├──, └──, │) to show the hierarchy clearly in any monospace environment.&lt;br /&gt;
&lt;br /&gt;
== Running TreeDoc ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method.&lt;br /&gt;
&lt;br /&gt;
Alternatively, TreeDoc can be run directly from the distribution archive. It is a Java 25 desktop (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar Tree.jar&lt;br /&gt;
&lt;br /&gt;
The window opens at 900 × 750 pixels.&lt;br /&gt;
&lt;br /&gt;
== Generating a Tree ==&lt;br /&gt;
&lt;br /&gt;
# Click &#039;&#039;&#039;Browse&#039;&#039;&#039; to choose the root folder, or type a path directly into the folder field.&lt;br /&gt;
# Adjust &#039;&#039;&#039;Max Depth&#039;&#039;&#039; and &#039;&#039;&#039;Max Entries&#039;&#039;&#039; if needed (see below).&lt;br /&gt;
# Check &#039;&#039;&#039;Include Files&#039;&#039;&#039; if you want files shown alongside directories.&lt;br /&gt;
# Click &#039;&#039;&#039;Refresh&#039;&#039;&#039; to generate the tree.&lt;br /&gt;
&lt;br /&gt;
The output appears in the central text area. The status bar at the bottom shows the total number of entries printed, and indicates if the output was truncated.&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Option !! Default !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Max Depth || 9999 || Maximum folder depth to traverse. Set to a small number (e.g. 3) to get a high-level overview of a deep tree.&lt;br /&gt;
|-&lt;br /&gt;
| Max Entries || 10,000 || Maximum number of lines to print. Prevents the output from becoming unmanageable for very large trees.&lt;br /&gt;
|-&lt;br /&gt;
| Include Files || Off || When off, only directory names are shown. When on, files are listed inside their parent directory.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Output Format ==&lt;br /&gt;
&lt;br /&gt;
The output is plain UTF-8 text using box-drawing characters:&lt;br /&gt;
&lt;br /&gt;
 project/&lt;br /&gt;
 ├── src/&lt;br /&gt;
 │   ├── main/&lt;br /&gt;
 │   └── test/&lt;br /&gt;
 ├── docs/&lt;br /&gt;
 └── build.xml&lt;br /&gt;
&lt;br /&gt;
Directories are always included. Files appear indented under their parent directory when &#039;&#039;&#039;Include Files&#039;&#039;&#039; is enabled.&lt;br /&gt;
&lt;br /&gt;
=== What is Excluded ===&lt;br /&gt;
&lt;br /&gt;
The following are always omitted regardless of settings:&lt;br /&gt;
&lt;br /&gt;
* Hidden files and folders (system hidden flag)&lt;br /&gt;
* &amp;lt;code&amp;gt;.DS_Store&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.localized&amp;lt;/code&amp;gt; (macOS metadata)&lt;br /&gt;
* &amp;lt;code&amp;gt;.app&amp;lt;/code&amp;gt; bundles (macOS application packages)&lt;br /&gt;
* Symbolic links (skipped to prevent infinite loops)&lt;br /&gt;
&lt;br /&gt;
== Saving and Copying Output ==&lt;br /&gt;
&lt;br /&gt;
The right sidebar provides:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Save&#039;&#039;&#039; — save the output as a &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; file (default filename: &amp;lt;code&amp;gt;tree.txt&amp;lt;/code&amp;gt;, UTF-8 encoded)&lt;br /&gt;
* &#039;&#039;&#039;Clipboard&#039;&#039;&#039; — copy the entire output to the system clipboard&lt;br /&gt;
* &#039;&#039;&#039;Clear&#039;&#039;&#039; — clear the output area&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
TreeDoc saves your last-used folder path and the Include Files checkbox state to &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; automatically on exit. These are restored the next time the application opens.&lt;br /&gt;
&lt;br /&gt;
If the saved folder path no longer exists, TreeDoc prompts you to choose a new folder on startup.&lt;br /&gt;
&lt;br /&gt;
== Log Files ==&lt;br /&gt;
&lt;br /&gt;
Activity is written to &amp;lt;code&amp;gt;logs/TreeDoc.log&amp;lt;/code&amp;gt;. Log files rotate at 10 MB and are retained for 14 days.&lt;br /&gt;
&lt;br /&gt;
See also: [[XML Viewer]], [[Menu4j]], [[Downloads]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Getting_Started&amp;diff=1856</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Getting_Started&amp;diff=1856"/>
		<updated>2026-06-10T16:48:19Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page provides a suggested sequence for getting Commander4j up and running for the first time.&lt;br /&gt;
&lt;br /&gt;
== 1. Check Requirements ==&lt;br /&gt;
&lt;br /&gt;
Before installing, confirm that your environment meets the [[Requirements]]. You will need:&lt;br /&gt;
&lt;br /&gt;
* A supported operating system (Windows 10/11, macOS, or Linux)&lt;br /&gt;
* A supported database (MySQL, MariaDB, MS SQL Server, or Oracle) installed and accessible&lt;br /&gt;
* Java 25 (included in the Windows &amp;amp; Mac installers; required separately on Linux)&lt;br /&gt;
&lt;br /&gt;
For shop-floor scanner access you will also need Apache Tomcat 11.x. See [[Requirements]] for the full list.&lt;br /&gt;
&lt;br /&gt;
== 2. Install Commander4j ==&lt;br /&gt;
&lt;br /&gt;
Follow the [[Installation]] guide to install the application and configure your database connection. The [[Setup4j]] tool is used to create and test your database connection settings (stored in &amp;lt;code&amp;gt;hosts.xml&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 3. Log In ==&lt;br /&gt;
&lt;br /&gt;
See [[Default Username &amp;amp; Password]] for the initial login credentials. On first login you will be prompted to change the default password.&lt;br /&gt;
&lt;br /&gt;
See [[Logon]] for a description of the login process and account states.&lt;br /&gt;
&lt;br /&gt;
== 4. Configure Core Reference Data ==&lt;br /&gt;
&lt;br /&gt;
Before the system can be used for production, you need to populate the core reference tables. A suggested order is:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;[[Locations]]&#039;&#039;&#039; — define your warehouse and production locations&lt;br /&gt;
# &#039;&#039;&#039;[[Units of Measure]]&#039;&#039;&#039; — define the units used for materials and weights&lt;br /&gt;
# &#039;&#039;&#039;[[Materials]]&#039;&#039;&#039; — add your product and material records (this is the most important step)&lt;br /&gt;
# &#039;&#039;&#039;[[Customers]]&#039;&#039;&#039; — add your customer records (or edit the default SELF record with your company name)&lt;br /&gt;
# &#039;&#039;&#039;[[Process Orders]]&#039;&#039;&#039; — create or import your first production orders&lt;br /&gt;
&lt;br /&gt;
== 5. Set Up Users and Security ==&lt;br /&gt;
&lt;br /&gt;
# Create [[Groups]] representing different roles (e.g. Warehouse, Quality, Admin)&lt;br /&gt;
# Assign modules to each group via the [[Permissions]] screen&lt;br /&gt;
# Create [[Users|user accounts]] and assign them to the appropriate groups&lt;br /&gt;
# Review [[System Keys]] for password policy and other global settings&lt;br /&gt;
&lt;br /&gt;
== 6. Configure Printing ==&lt;br /&gt;
&lt;br /&gt;
If you are printing pallet or case labels:&lt;br /&gt;
&lt;br /&gt;
# Define your [[Printer Queues]]&lt;br /&gt;
# Assign printers to users or workstations&lt;br /&gt;
# For automatic labelling lines, see [[Production Lines &amp;amp; Labellers]]&lt;br /&gt;
&lt;br /&gt;
== 7. Explore the Modules ==&lt;br /&gt;
&lt;br /&gt;
With reference data in place, explore the main functional areas:&lt;br /&gt;
&lt;br /&gt;
* [[Production Confirmation]] and [[Despatch]] for day-to-day operations&lt;br /&gt;
* [[Inspections]] and [[Quality Control Sample]] for quality management&lt;br /&gt;
* [[Waste Recording]] for waste tracking&lt;br /&gt;
* [[Weight Checks Module]] for weight compliance&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
* [[Overview]] — a summary of what Commander4j does&lt;br /&gt;
* [[Installation]] — full installation guide&lt;br /&gt;
* [[Upgrading]] — how to upgrade an existing installation&lt;br /&gt;
* [[Standard Reports]] — the built-in reporting system&lt;br /&gt;
* [[Interface Message Formats]] — integrating with external ERP systems&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Installation_Middleware4j&amp;diff=1855</id>
		<title>Installation Middleware4j</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Installation_Middleware4j&amp;diff=1855"/>
		<updated>2026-06-10T16:47:48Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers deploying Middleware4j on a server or integration host.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* Network access to any input or output directories defined in the map configuration (local paths, UNC shares, or mounted network drives)&lt;br /&gt;
* If using the EMAIL connector: network access to an SMTP server&lt;br /&gt;
* If using the SOCKET connector: network access to the target TCP/IP device&lt;br /&gt;
* Windows, Linux, or macOS&lt;br /&gt;
* Java 25 — required only when running from the distribution archive; the native install package bundles its own Java runtime&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method. The installer creates the application directory, copies all configuration templates, and handles the Java runtime dependency automatically.&lt;br /&gt;
&lt;br /&gt;
Alternatively, a distribution archive can be extracted to a suitable directory, for example:&lt;br /&gt;
&lt;br /&gt;
 C:\Commander4j\Middleware4j\          (Windows)&lt;br /&gt;
 /opt/commander4j/middleware4j/        (Linux)&lt;br /&gt;
&lt;br /&gt;
The extracted directory contains:&lt;br /&gt;
&lt;br /&gt;
 c4jMiddleware.jar&lt;br /&gt;
 Middleware_Service.exe     (Windows — service launcher)&lt;br /&gt;
 Middleware_GUI.exe         (Windows — desktop GUI launcher)&lt;br /&gt;
 Encrypt_String.exe         (Windows — utility to encrypt passwords)&lt;br /&gt;
 start.cmd                  (Windows — fallback start script)&lt;br /&gt;
 start.sh                   (Linux/macOS — start script)&lt;br /&gt;
 xml/config/&lt;br /&gt;
 xslt/&lt;br /&gt;
 interface/&lt;br /&gt;
 logs/&lt;br /&gt;
 samples/&lt;br /&gt;
&lt;br /&gt;
== Configuration Before First Run ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Maps ===&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; to define the transformation maps. Each map specifies one input connector, one or more output connectors, and optionally an XSLT stylesheet. See [[Maps]] for the full configuration reference.&lt;br /&gt;
&lt;br /&gt;
=== 2. XSLT Stylesheets ===&lt;br /&gt;
&lt;br /&gt;
Place any XSLT stylesheets used by your maps in the &amp;lt;code&amp;gt;xslt/&amp;lt;/code&amp;gt; directory. A library of over 60 sample stylesheets is included covering common integration scenarios with SAP, Sage, Tropos, B2MML, and others.&lt;br /&gt;
&lt;br /&gt;
=== 3. Email Notifications (Optional) ===&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;xml/config/email.xml&amp;lt;/code&amp;gt; with your SMTP server details and recipient addresses for error notifications.&lt;br /&gt;
&lt;br /&gt;
=== 4. Password Encryption ===&lt;br /&gt;
&lt;br /&gt;
Any passwords stored in configuration files (SMTP, database connections) must be AES-encrypted. Use the included &amp;lt;code&amp;gt;Encrypt_String.exe&amp;lt;/code&amp;gt; utility (Windows) to generate encrypted values. On Linux/macOS, use the equivalent utility from the Commander4j installation.&lt;br /&gt;
&lt;br /&gt;
== Installing as a Windows Service ==&lt;br /&gt;
&lt;br /&gt;
The native install package includes &amp;lt;code&amp;gt;Middleware_Service.exe&amp;lt;/code&amp;gt;, a service-mode launcher built with install4j. This executable manages the Windows service directly — no additional wrapper (such as WinSW) is required.&lt;br /&gt;
&lt;br /&gt;
All service commands must be run from an elevated command prompt (Run as Administrator).&lt;br /&gt;
&lt;br /&gt;
The default Windows service name is &#039;&#039;&#039;Middleware Service&#039;&#039;&#039; (the launcher name defined in the installer). You can specify a different name as an optional second parameter — useful if you need to run multiple instances on the same machine. If a custom name is used at install time, that same name must be passed to every subsequent command.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /install&amp;lt;/code&amp;gt; || Register as &#039;&#039;&#039;Middleware Service&#039;&#039;&#039; with automatic startup on boot&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /install &amp;quot;My Middleware&amp;quot;&amp;lt;/code&amp;gt; || Register with a custom service name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /install-demand&amp;lt;/code&amp;gt; || Register with manual startup only&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /start&amp;lt;/code&amp;gt; || Start the service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /stop&amp;lt;/code&amp;gt; || Stop the service (waits for graceful shutdown)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /restart&amp;lt;/code&amp;gt; || Restart the service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /status&amp;lt;/code&amp;gt; || Query status (exit code: 0 = running, 3 = stopped)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Middleware_Service.exe /uninstall&amp;lt;/code&amp;gt; || Remove the service registration&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If a custom service name was used at install time, append it to all subsequent commands:&lt;br /&gt;
&lt;br /&gt;
 Middleware_Service.exe /start &amp;quot;My Middleware&amp;quot;&lt;br /&gt;
 Middleware_Service.exe /stop &amp;quot;My Middleware&amp;quot;&lt;br /&gt;
 Middleware_Service.exe /uninstall &amp;quot;My Middleware&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Once installed, the service also appears in the Windows Services management console (&amp;lt;code&amp;gt;services.msc&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Testing Before Installing as a Service ===&lt;br /&gt;
&lt;br /&gt;
Before committing to service installation, run Middleware4j in desktop GUI mode using:&lt;br /&gt;
&lt;br /&gt;
 Middleware_GUI.exe&lt;br /&gt;
&lt;br /&gt;
This launches a desktop window showing all configured maps, their current status, and real-time message counts. Use this mode to confirm that maps are reading from the correct input directories and that XSLT transformations produce the expected output. Once satisfied, switch to service mode for production deployment.&lt;br /&gt;
&lt;br /&gt;
== Starting on Linux / macOS ==&lt;br /&gt;
&lt;br /&gt;
Use the provided shell script:&lt;br /&gt;
&lt;br /&gt;
 ./start.sh&lt;br /&gt;
&lt;br /&gt;
The mode (GUI or Service) is passed as an argument by the script. The process runs in the foreground. For production deployment, use systemd, launchd, or nohup to manage it as a background process.&lt;br /&gt;
&lt;br /&gt;
== Verifying the Installation ==&lt;br /&gt;
&lt;br /&gt;
After starting Middleware4j:&lt;br /&gt;
&lt;br /&gt;
# Check &amp;lt;code&amp;gt;logs/&amp;lt;/code&amp;gt; for startup messages confirming that each map thread has initialised.&lt;br /&gt;
# Place a test input file in the input directory of one of the configured maps.&lt;br /&gt;
# Confirm the file is consumed and the expected output appears in the output directory.&lt;br /&gt;
# Check &amp;lt;code&amp;gt;interface/log/&amp;lt;/code&amp;gt; for the message transaction record.&lt;br /&gt;
&lt;br /&gt;
== Log Files ==&lt;br /&gt;
&lt;br /&gt;
All activity is written to the Log4j log file in the &amp;lt;code&amp;gt;logs/&amp;lt;/code&amp;gt; directory. Log rotation and retention are configured in &amp;lt;code&amp;gt;xml/config/log4j2.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
See also: [[Overview_Middleware4j]], [[Maps]], [[Connectors]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Middleware4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Installation_LabelServer4j&amp;diff=1854</id>
		<title>Installation LabelServer4j</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Installation_LabelServer4j&amp;diff=1854"/>
		<updated>2026-06-10T16:47:31Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers deploying LabelServer4j on a server or PC connected to the production network.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* Network access to each label printer (TCP/IP — Zebra port 9100, Logopak port 9100 or as configured)&lt;br /&gt;
* Network access to the Commander4j server (to receive CSV request files)&lt;br /&gt;
* Windows, Linux, or macOS&lt;br /&gt;
* Java 25 — required only when running from the distribution archive; the native install package bundles its own Java runtime&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method. The installer creates the application directory, copies all configuration templates, and handles the Java runtime dependency automatically.&lt;br /&gt;
&lt;br /&gt;
Alternatively, a distribution archive can be extracted to a suitable directory, for example:&lt;br /&gt;
&lt;br /&gt;
 C:\Commander4j\LabelServer4j\          (Windows)&lt;br /&gt;
 /opt/commander4j/labelserver4j/        (Linux)&lt;br /&gt;
&lt;br /&gt;
The extracted directory contains:&lt;br /&gt;
&lt;br /&gt;
 LabelServer.jar&lt;br /&gt;
 LabelServer.exe           (Windows — service launcher)&lt;br /&gt;
 LabelServerDebug.exe      (Windows — console launcher for testing)&lt;br /&gt;
 start_labeller.cmd        (Windows — fallback start script)&lt;br /&gt;
 start_labeller.sh         (Linux/macOS — start script)&lt;br /&gt;
 lib/&lt;br /&gt;
 xml/config/&lt;br /&gt;
 labeller_files/&lt;br /&gt;
 labeller_requests/&lt;br /&gt;
 labeller_cmd/&lt;br /&gt;
 labeller_backups/&lt;br /&gt;
 logs/&lt;br /&gt;
&lt;br /&gt;
== Configuration Before First Run ==&lt;br /&gt;
&lt;br /&gt;
Before starting LabelServer4j, complete the following configuration steps.&lt;br /&gt;
&lt;br /&gt;
=== 1. Site and Labeller Definitions ===&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; to set the active site identifier. Then create or edit the &amp;lt;code&amp;gt;labellers.xml&amp;lt;/code&amp;gt; file for that site in &amp;lt;code&amp;gt;xml/config/&amp;lt;/code&amp;gt;. Each labeller entry defines:&lt;br /&gt;
&lt;br /&gt;
* The labeller name (must match the name used in Commander4j)&lt;br /&gt;
* The printer IP address and TCP port&lt;br /&gt;
* The path to the command script&lt;br /&gt;
* The input directory where Commander4j writes CSV files&lt;br /&gt;
&lt;br /&gt;
See [[LabelServer4j Configuration]] for the full XML structure.&lt;br /&gt;
&lt;br /&gt;
=== 2. Command Scripts ===&lt;br /&gt;
&lt;br /&gt;
Place the command script files (plain text &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; files) for each labeller in the &amp;lt;code&amp;gt;labeller_cmd/&amp;lt;/code&amp;gt; directory. The script filename is referenced in &amp;lt;code&amp;gt;labellers.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 3. Label Files (Logopak only) ===&lt;br /&gt;
&lt;br /&gt;
If using Logopak printers with stored label templates, place the binary label files in the appropriate subdirectory of &amp;lt;code&amp;gt;labeller_files/&amp;lt;/code&amp;gt;. LabelServer4j can upload these to the printer using the &amp;lt;code&amp;gt;SEND_FILE_INTELHEX&amp;lt;/code&amp;gt; command.&lt;br /&gt;
&lt;br /&gt;
=== 4. Database Connection (Optional) ===&lt;br /&gt;
&lt;br /&gt;
If the command scripts use &amp;lt;code&amp;gt;DB_QUERY&amp;lt;/code&amp;gt; to enrich label data from the Commander4j database, configure the database connection in &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; with the JDBC URL, username, and AES-encrypted password.&lt;br /&gt;
&lt;br /&gt;
=== 5. Email Notifications (Optional) ===&lt;br /&gt;
&lt;br /&gt;
To receive alerts on print failures or service events, configure &amp;lt;code&amp;gt;xml/config/email.xml&amp;lt;/code&amp;gt; with SMTP server details and recipient addresses.&lt;br /&gt;
&lt;br /&gt;
== Installing as a Windows Service ==&lt;br /&gt;
&lt;br /&gt;
The native install package includes &amp;lt;code&amp;gt;LabelServer.exe&amp;lt;/code&amp;gt;, a service-mode launcher built with install4j. This executable manages the Windows service directly — no additional wrapper (such as WinSW) is required.&lt;br /&gt;
&lt;br /&gt;
All service commands must be run from an elevated command prompt (Run as Administrator).&lt;br /&gt;
&lt;br /&gt;
The default Windows service name is &#039;&#039;&#039;LabelService&#039;&#039;&#039; (the launcher name defined in the installer). You can specify a different name as an optional second parameter — useful if you need to run multiple instances on the same machine. If a custom name is used at install time, that same name must be passed to every subsequent command.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /install&amp;lt;/code&amp;gt; || Register as &#039;&#039;&#039;LabelService&#039;&#039;&#039; with automatic startup on boot&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /install &amp;quot;My Label Service&amp;quot;&amp;lt;/code&amp;gt; || Register with a custom service name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /install-demand&amp;lt;/code&amp;gt; || Register with manual startup only&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /start&amp;lt;/code&amp;gt; || Start the service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /stop&amp;lt;/code&amp;gt; || Stop the service (waits for graceful shutdown)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /restart&amp;lt;/code&amp;gt; || Restart the service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /status&amp;lt;/code&amp;gt; || Query status (exit code: 0 = running, 3 = stopped)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LabelServer.exe /uninstall&amp;lt;/code&amp;gt; || Remove the service registration&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If a custom service name was used at install time, append it to all subsequent commands:&lt;br /&gt;
&lt;br /&gt;
 LabelServer.exe /start &amp;quot;My Label Service&amp;quot;&lt;br /&gt;
 LabelServer.exe /stop &amp;quot;My Label Service&amp;quot;&lt;br /&gt;
 LabelServer.exe /uninstall &amp;quot;My Label Service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Once installed, the service also appears in the Windows Services management console (&amp;lt;code&amp;gt;services.msc&amp;lt;/code&amp;gt;) and can be started and stopped from there.&lt;br /&gt;
&lt;br /&gt;
=== Testing Before Installing as a Service ===&lt;br /&gt;
&lt;br /&gt;
Before committing to service installation, run LabelServer4j in a visible console window using the debug launcher:&lt;br /&gt;
&lt;br /&gt;
 LabelServerDebug.exe&lt;br /&gt;
&lt;br /&gt;
This runs the same application code with all log output written to the console window. Use this mode to confirm that labellers connect to their printers and that the configuration is correct before installing as a service.&lt;br /&gt;
&lt;br /&gt;
== Starting on Linux / macOS ==&lt;br /&gt;
&lt;br /&gt;
Use the provided shell script:&lt;br /&gt;
&lt;br /&gt;
 ./start_labeller.sh&lt;br /&gt;
&lt;br /&gt;
Or directly:&lt;br /&gt;
&lt;br /&gt;
 java -cp ./LabelServer.jar:./lib/devonly/i4jruntime.jar com.commander4j.labeller.Service&lt;br /&gt;
&lt;br /&gt;
The process runs in the foreground. For production deployment, use a process manager (systemd, launchd, or nohup) to run it as a background service.&lt;br /&gt;
&lt;br /&gt;
== Verifying the Installation ==&lt;br /&gt;
&lt;br /&gt;
After starting LabelServer4j:&lt;br /&gt;
&lt;br /&gt;
# Check &amp;lt;code&amp;gt;logs/c4jLabelServer.log&amp;lt;/code&amp;gt; — there should be startup and thread initialisation messages.&lt;br /&gt;
# Verify that each labeller thread reports a successful TCP connection to its printer.&lt;br /&gt;
# Place a test CSV file in a labeller&#039;s input directory to trigger an end-to-end print cycle.&lt;br /&gt;
# Confirm the CSV file is consumed (deleted on success, or moved to the error directory on failure).&lt;br /&gt;
&lt;br /&gt;
== Log Files ==&lt;br /&gt;
&lt;br /&gt;
All activity is written to &amp;lt;code&amp;gt;logs/c4jLabelServer.log&amp;lt;/code&amp;gt;. Log files rotate at 10 MB and are retained for 14 days.&lt;br /&gt;
&lt;br /&gt;
See also: [[Overview LabelServer4j]], [[LabelServer4j Operation]], [[LabelServer4j Configuration]], [[LabelServer4j Example User Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Category:LabelServer4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Installation_AutoLab4j&amp;diff=1853</id>
		<title>Installation AutoLab4j</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Installation_AutoLab4j&amp;diff=1853"/>
		<updated>2026-06-10T16:47:14Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page covers deploying AutoLab4j on a server or PC connected to the production network.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
* Network access to the Modbus I/O device on each production line (TCP port 502 by default)&lt;br /&gt;
* Network access to each Zebra printer (TCP port 9100)&lt;br /&gt;
* Network access to the Commander4j server (to receive CSV dataset files)&lt;br /&gt;
* Windows, Linux, or macOS&lt;br /&gt;
* Java 25 (JRE or JDK) — required only when running from the distribution archive; the native install package bundles its own Java runtime&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method. The installer creates the application directory, registers it with the operating system, and handles the Java runtime dependency automatically.&lt;br /&gt;
&lt;br /&gt;
Alternatively, a distribution archive can be downloaded from the [[Downloads]] page and extracted to a suitable directory, for example:&lt;br /&gt;
&lt;br /&gt;
 C:\Commander4j\AutoLab4j\          (Windows)&lt;br /&gt;
 /opt/commander4j/autolab4j/        (Linux)&lt;br /&gt;
&lt;br /&gt;
The extracted directory contains:&lt;br /&gt;
&lt;br /&gt;
 AutoLab.jar&lt;br /&gt;
 lib/&lt;br /&gt;
 xml/&lt;br /&gt;
 labels/&lt;br /&gt;
 logs/&lt;br /&gt;
 interface/&lt;br /&gt;
 running/&lt;br /&gt;
&lt;br /&gt;
== Configuration Before First Run ==&lt;br /&gt;
&lt;br /&gt;
Before starting AutoLab4j, complete the following configuration steps.&lt;br /&gt;
&lt;br /&gt;
=== 1. Production Lines ===&lt;br /&gt;
&lt;br /&gt;
Edit &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; and define each production line. For each line you need:&lt;br /&gt;
&lt;br /&gt;
* The Modbus device IP address and port&lt;br /&gt;
* The coil address that signals a pallet complete event&lt;br /&gt;
* The coil address for semi-pallet detection&lt;br /&gt;
* The printer name (must match the name used in Commander4j)&lt;br /&gt;
&lt;br /&gt;
See [[AutoLab4j Configuration]] for the full XML structure.&lt;br /&gt;
&lt;br /&gt;
=== 2. SSCC Sequence Files ===&lt;br /&gt;
&lt;br /&gt;
Create one SSCC sequence file per printer in &amp;lt;code&amp;gt;xml/sscc/&amp;lt;/code&amp;gt;. The filename must match the printer name configured in &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt;. For example, for a printer named &amp;lt;code&amp;gt;PRINTER 1&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 xml/sscc/PRINTER 1.xml&lt;br /&gt;
&lt;br /&gt;
The file must contain the SSCC prefix, starting sequence number, warning limit, and upper limit. Your GS1 member organisation will provide the prefix. Example:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;sscc&amp;gt;&lt;br /&gt;
   &amp;lt;prefix&amp;gt;384133182&amp;lt;/prefix&amp;gt;&lt;br /&gt;
   &amp;lt;sequence&amp;gt;00000001&amp;lt;/sequence&amp;gt;&lt;br /&gt;
   &amp;lt;checkDigit&amp;gt;0&amp;lt;/checkDigit&amp;gt;&lt;br /&gt;
   &amp;lt;upperlimit&amp;gt;00009999&amp;lt;/upperlimit&amp;gt;&lt;br /&gt;
   &amp;lt;warninglimit&amp;gt;00009000&amp;lt;/warninglimit&amp;gt;&lt;br /&gt;
 &amp;lt;/sscc&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Label Templates ===&lt;br /&gt;
&lt;br /&gt;
Copy the ZPL label template files into the &amp;lt;code&amp;gt;labels/&amp;lt;/code&amp;gt; directory. The filename for each template is specified in the CSV dataset file in the &amp;lt;code&amp;gt;REPORT_FILENAME&amp;lt;/code&amp;gt; field. See [[Zebra ZPL Label]] for information on ZPL label authoring.&lt;br /&gt;
&lt;br /&gt;
=== 4. Dataset Directory ===&lt;br /&gt;
&lt;br /&gt;
Ensure the directory configured as &amp;lt;code&amp;gt;dataSet path&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt; is accessible. This is where Commander4j writes the CSV files when an operator assigns a process order to a labeller. The directory can be a local path or a network share.&lt;br /&gt;
&lt;br /&gt;
=== 5. Output Directory ===&lt;br /&gt;
&lt;br /&gt;
Ensure the directory configured as &amp;lt;code&amp;gt;output path&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt; exists and is writable. AutoLab4j writes Production Declaration XML files here after each pallet is printed.&lt;br /&gt;
&lt;br /&gt;
=== 6. Email Notifications (Optional) ===&lt;br /&gt;
&lt;br /&gt;
If you want email alerts for SSCC warnings and service start/stop events, configure &amp;lt;code&amp;gt;xml/config/email.xml&amp;lt;/code&amp;gt; with your SMTP server details and distribution lists.&lt;br /&gt;
&lt;br /&gt;
== Starting AutoLab4j ==&lt;br /&gt;
&lt;br /&gt;
=== Windows — Native Package ===&lt;br /&gt;
&lt;br /&gt;
The native install package creates &amp;lt;code&amp;gt;AutoLab4j_Startup.exe&amp;lt;/code&amp;gt; in the installation directory. Double-click this launcher, or create a shortcut to it, to start AutoLab4j. It enforces single-instance operation — a second launch will signal the running instance to shut down before the new one starts.&lt;br /&gt;
&lt;br /&gt;
AutoLab4j is a GUI application and does not include a built-in Windows service launcher. To run it automatically at boot without an interactive session, use a service wrapper such as WinSW configured to launch &amp;lt;code&amp;gt;AutoLab4j_Startup.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Windows — Distribution Archive ===&lt;br /&gt;
&lt;br /&gt;
If running from the extracted archive rather than the native package:&lt;br /&gt;
&lt;br /&gt;
 java -jar AutoLab.jar&lt;br /&gt;
&lt;br /&gt;
=== Linux / macOS ===&lt;br /&gt;
&lt;br /&gt;
 java -jar AutoLab.jar&lt;br /&gt;
&lt;br /&gt;
Use systemd, launchd, or nohup for production deployment as a background process.&lt;br /&gt;
&lt;br /&gt;
When running, AutoLab4j appears in the system tray with one icon per production line. The System Log window shows startup progress.&lt;br /&gt;
&lt;br /&gt;
== Exclusive Runtime ==&lt;br /&gt;
&lt;br /&gt;
AutoLab4j uses a TCP port (default: 8000) as an exclusive runtime lock. Only one instance can run at a time. If you start a second instance, it sends a shutdown signal to the running instance and waits for it to stop before starting. The watchdog port can be changed in &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Verifying the Installation ==&lt;br /&gt;
&lt;br /&gt;
After starting AutoLab4j:&lt;br /&gt;
&lt;br /&gt;
# Check the system tray — there should be one icon per enabled production line.&lt;br /&gt;
# Open the System Log window (right-click the system tray icon).&lt;br /&gt;
# Verify that each production line shows a Modbus connection attempt in its log window.&lt;br /&gt;
# Place a test CSV file in the dataset directory and trigger the Modbus coil to confirm end-to-end operation.&lt;br /&gt;
&lt;br /&gt;
== Log Files ==&lt;br /&gt;
&lt;br /&gt;
All activity is written to &amp;lt;code&amp;gt;logs/AutoLab.log&amp;lt;/code&amp;gt;. Log files rotate at 10 MB and are retained for 14 days. Review this file if any production line fails to connect or if labels are not printing.&lt;br /&gt;
&lt;br /&gt;
See also: [[AutoLab4j Configuration]], [[Overview AutoLab4j]], [[AutoLab4j Operation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AutoLab4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Requirements&amp;diff=1852</id>
		<title>Requirements</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Requirements&amp;diff=1852"/>
		<updated>2026-06-10T16:46:46Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
== Operating System (Required) ==&lt;br /&gt;
* Windows 10 or 11 Intel or ARM (64bit)&lt;br /&gt;
* MacOS (Intel or Apple Silicon)&lt;br /&gt;
* Linux (Separate install of Java 25 required)&lt;br /&gt;
&lt;br /&gt;
== Database (Required) ==&lt;br /&gt;
* [https://wiki.commander4j.com/index.php?title=Installation#mySQL mySQL]&lt;br /&gt;
* [https://wiki.commander4j.com/index.php?title=Installation#Microsoft_SQL_Server MSSQL]&lt;br /&gt;
* [https://wiki.commander4j.com/index.php?title=Installation#Oracle Oracle]&lt;br /&gt;
* [https://wiki.commander4j.com/index.php?title=Installation#MariaDB MariaDB]&lt;br /&gt;
&lt;br /&gt;
== Web Server for Mobile Scanners (Optional) ==&lt;br /&gt;
* [https://tomcat.apache.org/index.html Apache Tomcat]&lt;br /&gt;
&lt;br /&gt;
== Java (Optional) ==&lt;br /&gt;
* [https://www.azul.com/downloads/#zulu Java JDK]&lt;br /&gt;
&lt;br /&gt;
== Barcode Scanner (Optional) ==&lt;br /&gt;
* [https://www.zebra.com/us/en/products/mobile-computers/handheld.html?page=1 Zebra Mobile Scanner]&lt;br /&gt;
* [https://www.zebra.com/us/en/software/mobile-computer-software/enterprise-browser.html Zebra Enterprise Browse]&lt;br /&gt;
&lt;br /&gt;
== Barcode Printer (Optional) ==&lt;br /&gt;
* [https://www.zebra.com/us/en/products/printers/industrial.html?page=1 Zebra ZPL Compatible Printer]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Overview&amp;diff=1851</id>
		<title>Overview</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Overview&amp;diff=1851"/>
		<updated>2026-06-10T16:46:26Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Overview2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Commander4j is an open-source production recording, labelling and traceability application aimed at food, drink and consumer goods manufacturing sites. It is designed to act as a resilient local system that sits between your production lines and your central ERP — ensuring that barcoding and production recording continue uninterrupted even when the ERP is unavailable.&lt;br /&gt;
&lt;br /&gt;
At its core, Commander4j manages the full lifecycle of a finished goods pallet from the moment a [[Process_Orders|Process Order]] arrives from the ERP, through [[Pallet_Label|label printing]] and [[Production_Declaration|production declaration]], to [[Despatch|despatch confirmation]] and outbound interface back to the ERP. All pallet movements are recorded in a local database, providing a complete [[Pallet_History|pallet history]] at all times.&lt;br /&gt;
&lt;br /&gt;
The application has grown significantly from its original labelling roots and now includes the following functional areas:&lt;br /&gt;
&lt;br /&gt;
* [[Pallet_Label|Pallet Labelling]] — print EAN 128 / GS1 compliant SSCC pallet labels directly or via automatic labellers&lt;br /&gt;
* [[Case_Label|Case &amp;amp; Tray Labelling]] — print case and tray labels linked to production lines&lt;br /&gt;
* [[Despatch|Despatching]] — build and confirm despatch loads with journey and equipment tracking&lt;br /&gt;
* [[Quality_Control_Sample|Quality Control]] — sample labelling, panel inspections, pallet sorting and isolation (Master Hold Notices)&lt;br /&gt;
* [[Waste_Recording|Waste Recording]] — log waste by material, location, container and reason&lt;br /&gt;
* [[Weight_Checks_Data_Capture|Weight Checks]] — capture and report on in-line weight check data against tolerances&lt;br /&gt;
* [[Interface_Admin|Interfaces]] — bi-directional XML file-based interfaces to ERP systems such as SAP&lt;br /&gt;
* Mobile Device Scanning — browser-based scanner pages for Zebra mobile computers via Apache Tomcat&lt;br /&gt;
&lt;br /&gt;
Commander4j supports [[Requirements|three database platforms]] (MySQL, Microsoft SQL Server and Oracle) and runs on Windows, macOS and Linux. Installers for Windows and macOS include a bundled Java 25 runtime so no separate Java installation is required on those platforms.&lt;br /&gt;
&lt;br /&gt;
See [[Introduction]] for a more detailed explanation of the application&#039;s background and design philosophy, or [[Requirements]] for a full list of supported platforms and optional components.&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=SocketTest&amp;diff=1850</id>
		<title>SocketTest</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=SocketTest&amp;diff=1850"/>
		<updated>2026-06-10T16:45:55Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SocketTest is a TCP/IP network testing utility with a graphical interface. It acts as both a TCP client and a TCP server, allowing you to send and receive arbitrary data over a socket connection, debug protocol implementations, and simulate network endpoints. It is a companion tool to LabelServer4j, AutoLab4j, and ZPL Renderer, which all communicate with devices over raw TCP/IP sockets.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
SocketTest is useful when:&lt;br /&gt;
&lt;br /&gt;
* Testing whether a printer or other device is accepting connections on a given IP address and port&lt;br /&gt;
* Checking what a device responds with when given a specific command&lt;br /&gt;
* Sending raw ZPL or Logopak commands to a printer to verify a script without running the full service&lt;br /&gt;
* Acting as a test server to capture what LabelServer4j or AutoLab4j is actually transmitting&lt;br /&gt;
&lt;br /&gt;
== Running SocketTest ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method.&lt;br /&gt;
&lt;br /&gt;
Alternatively, SocketTest can be run directly from the distribution archive. It is a Java 25 desktop (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar SocketTest.jar&lt;br /&gt;
&lt;br /&gt;
The main window contains two tabs: &#039;&#039;&#039;Client&#039;&#039;&#039; and &#039;&#039;&#039;Server&#039;&#039;&#039;. Both tabs can be used independently or together in proxy mode.&lt;br /&gt;
&lt;br /&gt;
== Client Tab ==&lt;br /&gt;
&lt;br /&gt;
The client tab connects to a remote TCP server.&lt;br /&gt;
&lt;br /&gt;
=== Connecting ===&lt;br /&gt;
&lt;br /&gt;
Enter the IP address and port of the remote server and click &#039;&#039;&#039;Connect&#039;&#039;&#039;. The IP address dropdown is pre-populated with the network interfaces found on the local machine. The default port is &#039;&#039;&#039;9100&#039;&#039;&#039; (the standard raw Zebra print port).&lt;br /&gt;
&lt;br /&gt;
=== Sending Data ===&lt;br /&gt;
&lt;br /&gt;
Type or load the message you want to send in the left-hand text area. Use the prefix and suffix dropdowns to select control character sequences that will be prepended or appended to the message:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Token !! Character&lt;br /&gt;
|-&lt;br /&gt;
| (none) || No delimiter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;CR&amp;amp;gt;&amp;lt;/code&amp;gt; || Carriage return (0x0D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;LF&amp;amp;gt;&amp;lt;/code&amp;gt; || Line feed (0x0A)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;CR&amp;amp;gt;&amp;amp;lt;LF&amp;amp;gt;&amp;lt;/code&amp;gt; || Carriage return + line feed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;STX&amp;amp;gt;&amp;lt;/code&amp;gt; || Start of text (0x02)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;ETX&amp;amp;gt;&amp;lt;/code&amp;gt; || End of text (0x03)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;ESC&amp;amp;gt;&amp;lt;/code&amp;gt; || Escape (0x1B)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;ACK&amp;amp;gt;&amp;lt;/code&amp;gt; || Acknowledge (0x06)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;NAK&amp;amp;gt;&amp;lt;/code&amp;gt; || Negative acknowledge (0x15)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Click &#039;&#039;&#039;Send&#039;&#039;&#039; to transmit. The right-hand log pane shows all data sent and received, colour-coded in green on a black background.&lt;br /&gt;
&lt;br /&gt;
=== Loading and Saving Messages ===&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Load&#039;&#039;&#039; to populate the input area from a text file, and &#039;&#039;&#039;Save&#039;&#039;&#039; to persist the input area contents. Use &#039;&#039;&#039;Clear&#039;&#039;&#039; and &#039;&#039;&#039;Save&#039;&#039;&#039; on the log pane to manage the communication history.&lt;br /&gt;
&lt;br /&gt;
== Server Tab ==&lt;br /&gt;
&lt;br /&gt;
The server tab listens for incoming TCP connections.&lt;br /&gt;
&lt;br /&gt;
=== Starting the Server ===&lt;br /&gt;
&lt;br /&gt;
Enter the bind IP address (or &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; to listen on all interfaces) and the port, then click &#039;&#039;&#039;Open&#039;&#039;&#039;. When a client connects, its hostname and IP address are shown in the panel border. The &#039;&#039;&#039;Disconnect&#039;&#039;&#039; button closes the current client connection without stopping the server.&lt;br /&gt;
&lt;br /&gt;
=== Sending Responses ===&lt;br /&gt;
&lt;br /&gt;
Once a client is connected you can type a response in the input area and click &#039;&#039;&#039;Send&#039;&#039;&#039; to transmit it back to the client. All data received from the client is shown in the log pane, colour-coded in white on a black background.&lt;br /&gt;
&lt;br /&gt;
== Proxy Mode ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Proxy&#039;&#039;&#039; button on the server tab enables transparent data relay. When proxy mode is active, data received on the server side is automatically forwarded to whatever the client tab is connected to, and vice versa. This allows SocketTest to sit between a client and a real device and relay all traffic in both directions, which is useful for capturing a complete protocol conversation.&lt;br /&gt;
&lt;br /&gt;
== Control Characters ==&lt;br /&gt;
&lt;br /&gt;
Control characters are entered in human-readable token notation (&amp;lt;code&amp;gt;&amp;amp;lt;STX&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;CR&amp;amp;gt;&amp;lt;/code&amp;gt;, etc.) in the input area and converted to the actual byte values before transmission. Incoming bytes are decoded back to token notation in the log. SocketTest supports the full standard ASCII control character set (NUL through DEL).&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
SocketTest has no persistent configuration file. IP addresses, ports, and message formatting options are per-session only and reset when the application is closed.&lt;br /&gt;
&lt;br /&gt;
== Log Files ==&lt;br /&gt;
&lt;br /&gt;
SocketTest does not write a log file. All communication history is displayed in the on-screen log panes and can optionally be saved to a text file using the Save button on each pane.&lt;br /&gt;
&lt;br /&gt;
See also: [[LabelServer4j]], [[ZPLRenderer]], [[Production Lines &amp;amp; Labellers]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Template:AutoLab4j&amp;diff=1849</id>
		<title>Template:AutoLab4j</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Template:AutoLab4j&amp;diff=1849"/>
		<updated>2026-06-08T18:06:38Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: /* User Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Getting Started=&lt;br /&gt;
*[[Overview AutoLab4j|Overview]]&lt;br /&gt;
*[[Downloads]]&lt;br /&gt;
*[[Installation AutoLab4j|Install]]&lt;br /&gt;
*[[AutoLab4j Example User Interface|Example Screens]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
&lt;br /&gt;
=User Guide=&lt;br /&gt;
*[[AutoLab4j Configuration|Configuration]]&lt;br /&gt;
*[[AutoLab4j Operation|Operation]]&lt;br /&gt;
*[[AutoLab4j Dataset CSV|Dataset CSV]]&lt;br /&gt;
*[[Zebra ZPL Label]]&lt;br /&gt;
*[[Label Template Syntax]]&lt;br /&gt;
*[[Label Function Syntax]]&lt;br /&gt;
*[[AutoLab4j Folder Structure|Folder Structure]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Template:AutoLab4j&amp;diff=1848</id>
		<title>Template:AutoLab4j</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Template:AutoLab4j&amp;diff=1848"/>
		<updated>2026-06-08T18:05:37Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: /* User Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Getting Started=&lt;br /&gt;
*[[Overview AutoLab4j|Overview]]&lt;br /&gt;
*[[Downloads]]&lt;br /&gt;
*[[Installation AutoLab4j|Install]]&lt;br /&gt;
*[[AutoLab4j Example User Interface|Example Screens]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
&lt;br /&gt;
=User Guide=&lt;br /&gt;
*[[AutoLab4j Configuration|Configuration]]&lt;br /&gt;
*[[AutoLab4j Operation|Operation]]&lt;br /&gt;
*[[AutoLab4j Dataset CSV|Dataset CSV]]&lt;br /&gt;
*[[Zebra ZPL Label]]&lt;br /&gt;
*[[Label Function Syntax]]&lt;br /&gt;
*[[AutoLab4j Folder Structure|Folder Structure]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=LabelServer4j&amp;diff=1847</id>
		<title>LabelServer4j</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=LabelServer4j&amp;diff=1847"/>
		<updated>2026-06-08T18:03:21Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;LabelServer4j&#039;&#039;&#039; is a background label printing service that bridges Commander4j and physical label printer devices on a production line. When an operator assigns a [[Process Orders|Process Order]] to a production line, Commander4j exports a data file which LabelServer4j picks up, processes through a configurable script, and uses to drive the printer over TCP/IP.&lt;br /&gt;
&lt;br /&gt;
LabelServer4j supports Zebra ZPL printers, Logopak labellers, and any device that accepts raw TCP/IP text commands. It runs as a headless background service with no graphical interface, and can manage multiple printers simultaneously in independent threads.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Overview LabelServer4j]] || What LabelServer4j does and how it differs from AutoLab4j&lt;br /&gt;
|-&lt;br /&gt;
| [[Downloads]] || Download the latest release&lt;br /&gt;
|-&lt;br /&gt;
| [[Installation LabelServer4j]] || Installing LabelServer4j and configuring as a Windows service&lt;br /&gt;
|-&lt;br /&gt;
| [[LabelServer4j Configuration]] || Configuring sites, labellers, and database connections&lt;br /&gt;
|-&lt;br /&gt;
| [[LabelServer4j Folder Structure]] || Directory layout and purpose of each folder&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Guide ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[LabelServer4j Operation]] || End-to-end workflow from order assignment to label printed&lt;br /&gt;
|-&lt;br /&gt;
| [[LabelServer4j Dataset CSV]] || Fields available in the CSV data file from Commander4j&lt;br /&gt;
|-&lt;br /&gt;
| [[LabelServer4j Example User Interface]] || Deployment, startup, monitoring, and log file reference&lt;br /&gt;
|-&lt;br /&gt;
| [[Label Function Syntax]] || Functions available within label template&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Related Pages ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Production Lines &amp;amp; Labellers]] || Configuring production lines in Commander4j&lt;br /&gt;
|-&lt;br /&gt;
| [[Process Order Assign to Labeller]] || Assigning orders to labellers from Commander4j&lt;br /&gt;
|-&lt;br /&gt;
| [[Zebra ZPL Label]] || ZPL label template syntax reference&lt;br /&gt;
|-&lt;br /&gt;
| [[Label Template Syntax]] || Commander4j label template language&lt;br /&gt;
|-&lt;br /&gt;
| [[ZPLRenderer]] || Tool for previewing ZPL labels before printing&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:LabelServer4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1846</id>
		<title>ModbusClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1846"/>
		<updated>2026-06-04T10:42:39Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Commander4j Modbus Client&#039;&#039;&#039; (&#039;&#039;util_modbusClient&#039;&#039;) is a desktop tool that acts as a [https://en.wikipedia.org/wiki/Modbus Modbus/TCP] client — a Modbus master. It connects to a remote Modbus server (a device, PLC, or the [[ModbusServer|Commander4j Modbus Server]]), continuously polls its four data tables across a chosen address window, and shows them in a single live grid. Coil and Holding Register values can be edited to drive the connected server. It is a test, troubleshooting and bench tool, and is the client-side companion to the [[ModbusServer|Commander4j Modbus Server]].&lt;br /&gt;
&lt;br /&gt;
== A Quick Modbus Primer ==&lt;br /&gt;
&lt;br /&gt;
If you are new to Modbus, the following terms are used throughout this page. Modbus is a simple, widely used industrial protocol for moving numeric and on/off values between automation equipment.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Master / Client&#039;&#039;&#039; — the device that initiates requests (reads and writes). This tool is a client.&lt;br /&gt;
* &#039;&#039;&#039;Slave / Server / Device&#039;&#039;&#039; — the device that holds the data and answers requests. The [[ModbusServer]] is a server.&lt;br /&gt;
* &#039;&#039;&#039;Unit ID&#039;&#039;&#039; (also &amp;quot;slave address&amp;quot;) — a number (0–247) identifying which device a request is for. A client must use the same unit ID the server is configured to answer as.&lt;br /&gt;
* &#039;&#039;&#039;Modbus/TCP&#039;&#039;&#039; — Modbus carried over an ordinary TCP/IP network connection, as opposed to serial (RTU) wiring. These tools speak Modbus/TCP only.&lt;br /&gt;
&lt;br /&gt;
Modbus organises all data into &#039;&#039;&#039;four tables&#039;&#039;&#039;, each addressed separately starting at zero:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Table !! Holds !! Size !! Can a client write it?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coils&#039;&#039;&#039; || On/off output bits || 1 bit || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete Inputs&#039;&#039;&#039; || On/off input bits || 1 bit || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input Registers&#039;&#039;&#039; || Numeric inputs (readings) || 16 bits (0–65535) || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding Registers&#039;&#039;&#039; || Numeric settings / values || 16 bits (0–65535) || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;input&amp;quot; tables represent values a device &#039;&#039;produces&#039;&#039; (sensor states, measurements), so a client can only read them. Coils and holding registers represent values a client is allowed to &#039;&#039;set&#039;&#039;. Each table also has a conventional &#039;&#039;&#039;reference number&#039;&#039;&#039; that operators quote instead of the raw zero-based address: coils start at 1, discrete inputs at 10001, input registers at 30001 and holding registers at 40001.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client is useful when:&lt;br /&gt;
&lt;br /&gt;
* Reading the live coils and registers of a PLC or other Modbus device to confirm it is responding&lt;br /&gt;
* Writing a coil or holding register to command a device during commissioning or fault-finding&lt;br /&gt;
* Checking that a device is reachable on a given host, port and unit ID&lt;br /&gt;
* Driving the [[ModbusServer]] during testing, or reading values the server is staging&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client is open source and hosted on GitHub:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/ModbusClient https://github.com/C4J/ModbusClient]&lt;br /&gt;
* &#039;&#039;&#039;Releases (downloads):&#039;&#039;&#039; [https://github.com/C4J/ModbusClient/releases https://github.com/C4J/ModbusClient/releases]&lt;br /&gt;
&lt;br /&gt;
== Running the Modbus Client ==&lt;br /&gt;
&lt;br /&gt;
The recommended way to install the Modbus Client is to download a native installer for your platform, either from the [[Downloads]] page or from the [https://github.com/C4J/ModbusClient/releases GitHub releases page]. Native installers are provided for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039;. Each installer bundles its own Java 25 runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Installing creates a native &#039;&#039;&#039;ModbusClient&#039;&#039;&#039; launcher that you run like any other desktop application — from the Start menu, Applications folder, or desktop — which opens the window described below.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly from its distribution folder as an ordinary Java 25 (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar modbusClient.jar&lt;br /&gt;
&lt;br /&gt;
The supplied &amp;lt;code&amp;gt;start_modbusClient.sh&amp;lt;/code&amp;gt; (macOS/Linux) and &amp;lt;code&amp;gt;start_modbusClient.cmd&amp;lt;/code&amp;gt; (Windows) scripts launch it the same way. Run the jar from its own folder so the bundled &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; dependencies are found alongside it.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has three parts: a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, the &#039;&#039;&#039;register table&#039;&#039;&#039; in the centre with a vertical button toolbar down the right-hand side, and an &#039;&#039;&#039;activity log&#039;&#039;&#039; along the bottom.&lt;br /&gt;
&lt;br /&gt;
=== Connection Bar ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Server host&#039;&#039;&#039; || The host name or IP address of the Modbus server to connect to. Defaults to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; (this machine) for quick loopback testing against a local [[ModbusServer]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Port&#039;&#039;&#039; || The TCP port of the server. The Modbus standard is &#039;&#039;&#039;502&#039;&#039;&#039;; match whatever the server is listening on.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unit ID&#039;&#039;&#039; || The unit / slave address to address requests to (0–247, default &#039;&#039;&#039;1&#039;&#039;&#039;). This must match the unit ID the server answers as, or every request will be rejected.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Status&#039;&#039;&#039; || Shows &#039;&#039;&#039;Disconnected&#039;&#039;&#039;, or &#039;&#039;&#039;Connected&#039;&#039;&#039; with the server address and unit ID in green.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039; button (the toggle at the top of the right-hand toolbar) opens and closes the connection. The host, port and unit ID can only be changed while disconnected. Once connected, the client polls the server roughly four times a second and the grid updates live.&lt;br /&gt;
&lt;br /&gt;
=== Register Table ===&lt;br /&gt;
&lt;br /&gt;
A single grid shows one row per address, with every Modbus data table side by side and colour-coded:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Column group !! Contents !! Editable here&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039; || The zero-based Modbus protocol address (the same address for the whole row). || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coil&#039;&#039;&#039; || Modbus reference (1…) and an on/off checkbox. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete&#039;&#039;&#039; || Discrete input reference (10001…) and an on/off checkbox. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input&#039;&#039;&#039; || Input register reference (30001…), a decimal value and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding&#039;&#039;&#039; || Holding register reference (40001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the &#039;&#039;&#039;Coil&#039;&#039;&#039; and &#039;&#039;&#039;Holding Register&#039;&#039;&#039; value cells can be edited, and only while connected — because Modbus has no function code for a client to write the discrete-input and input-register tables. Editing a cell writes the new value straight through to the server; the displayed value updates immediately and is reverted if the server rejects the write.&lt;br /&gt;
&lt;br /&gt;
Below the table, the &#039;&#039;&#039;Start address&#039;&#039;&#039; and &#039;&#039;&#039;Count&#039;&#039;&#039; fields choose which window of addresses the client polls; click the tick button (Apply range) to apply them. Up to 2000 rows can be shown at once.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Zero registers&#039;&#039;&#039; button (eraser icon) on the toolbar opens a menu to clear the visible window of the writable tables — &#039;&#039;&#039;Zero Coils&#039;&#039;&#039;, &#039;&#039;&#039;Zero Holding Registers&#039;&#039;&#039;, or &#039;&#039;&#039;Zero All&#039;&#039;&#039; for both. Only the writable tables appear, because the read-only ones cannot be cleared by a client.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
Connection events, writes, and any errors are written to the log at the bottom with a millisecond timestamp. The log keeps the most recent 400 lines. The two buttons beside it &#039;&#039;&#039;Save&#039;&#039;&#039; the log to a text file and &#039;&#039;&#039;Clear&#039;&#039;&#039; it. If the connection is lost (for example the server stops or the network drops), the client reports it in the log and returns to the disconnected state automatically.&lt;br /&gt;
&lt;br /&gt;
== Toolbar Buttons ==&lt;br /&gt;
&lt;br /&gt;
The vertical toolbar to the right of the register table provides, from top to bottom: &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039;, &#039;&#039;&#039;Open settings&#039;&#039;&#039;, &#039;&#039;&#039;Save settings&#039;&#039;&#039;, &#039;&#039;&#039;Zero registers&#039;&#039;&#039;, &#039;&#039;&#039;About&#039;&#039;&#039;, &#039;&#039;&#039;Licences&#039;&#039;&#039;, &#039;&#039;&#039;Help&#039;&#039;&#039; (opens this wiki page) and &#039;&#039;&#039;Close&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection settings (server host, port and unit ID) are stored in a small XML file, by default &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; beneath the application folder:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;config&amp;gt;&lt;br /&gt;
   &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;&lt;br /&gt;
   &amp;lt;port&amp;gt;502&amp;lt;/port&amp;gt;&lt;br /&gt;
   &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
 &amp;lt;/config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default settings are loaded automatically at start-up. Use the &#039;&#039;&#039;Open settings&#039;&#039;&#039; and &#039;&#039;&#039;Save settings&#039;&#039;&#039; toolbar buttons to load or store a configuration from any location. If you change the settings and then close the application, you are prompted to save the changes first.&lt;br /&gt;
&lt;br /&gt;
== Using the Client and Server Together ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client and the [[ModbusServer|Modbus Server]] are designed to be used as a pair to exercise a Modbus link from both ends without any real hardware:&lt;br /&gt;
&lt;br /&gt;
# Start the [[ModbusServer]] on one machine (or the same machine), choose a &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In the Modbus Client, set &#039;&#039;&#039;Server host&#039;&#039;&#039; to that machine (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; if both run on the same PC), set the matching &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Client → Server:&#039;&#039;&#039; edit a Coil or Holding Register in the client; the value is written to the server and appears in the server&#039;s grid and activity log.&lt;br /&gt;
# &#039;&#039;&#039;Server → Client:&#039;&#039;&#039; edit any value in the server — including discrete inputs and input registers, which the client can only read; the client&#039;s grid reflects it on the next poll.&lt;br /&gt;
&lt;br /&gt;
This makes the pair a complete bench setup: the server stands in for a device so you can develop or test a Modbus master, and the client stands in for a master so you can stage and inspect a device&#039;s data. Either tool can also be pointed at real third-party Modbus/TCP equipment.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Connection refused&amp;quot; or a timeout on Connect&#039;&#039;&#039; — check the server host and port, that the server is running and listening, and that no firewall is blocking the connection.&lt;br /&gt;
* &#039;&#039;&#039;Connected, but every read fails or the connection drops immediately&#039;&#039;&#039; — the &#039;&#039;&#039;Unit ID&#039;&#039;&#039; probably does not match the server. The client must address the exact unit ID the server answers as.&lt;br /&gt;
* &#039;&#039;&#039;A startup warning about &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt;&#039;&#039;&#039; — harmless, and does not affect operation. The supplied start scripts suppress it; launching the jar directly may still print it.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ModbusServer]] — the server-side companion tool&lt;br /&gt;
* [[AutoLab4j]] — uses the same Modbus stack to read Modbus printing triggers&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1845</id>
		<title>ModbusClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1845"/>
		<updated>2026-06-04T10:39:55Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Commander4j Modbus Client&#039;&#039;&#039; (&#039;&#039;util_modbusClient&#039;&#039;) is a desktop tool that acts as a [https://en.wikipedia.org/wiki/Modbus Modbus/TCP] client — a Modbus master. It connects to a remote Modbus server (a device, PLC, or the [[ModbusServer|Commander4j Modbus Server]]), continuously polls its four data tables across a chosen address window, and shows them in a single live grid. Coil and Holding Register values can be edited to drive the connected server. It is a test, troubleshooting and bench tool, and is the client-side companion to the [[ModbusServer|Commander4j Modbus Server]].&lt;br /&gt;
&lt;br /&gt;
== A Quick Modbus Primer ==&lt;br /&gt;
&lt;br /&gt;
If you are new to Modbus, the following terms are used throughout this page. Modbus is a simple, widely used industrial protocol for moving numeric and on/off values between automation equipment.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Master / Client&#039;&#039;&#039; — the device that initiates requests (reads and writes). This tool is a client.&lt;br /&gt;
* &#039;&#039;&#039;Slave / Server / Device&#039;&#039;&#039; — the device that holds the data and answers requests. The [[ModbusServer]] is a server.&lt;br /&gt;
* &#039;&#039;&#039;Unit ID&#039;&#039;&#039; (also &amp;quot;slave address&amp;quot;) — a number (0–247) identifying which device a request is for. A client must use the same unit ID the server is configured to answer as.&lt;br /&gt;
* &#039;&#039;&#039;Modbus/TCP&#039;&#039;&#039; — Modbus carried over an ordinary TCP/IP network connection, as opposed to serial (RTU) wiring. These tools speak Modbus/TCP only.&lt;br /&gt;
&lt;br /&gt;
Modbus organises all data into &#039;&#039;&#039;four tables&#039;&#039;&#039;, each addressed separately starting at zero:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Table !! Holds !! Size !! Can a client write it?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coils&#039;&#039;&#039; || On/off output bits || 1 bit || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete Inputs&#039;&#039;&#039; || On/off input bits || 1 bit || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input Registers&#039;&#039;&#039; || Numeric inputs (readings) || 16 bits (0–65535) || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding Registers&#039;&#039;&#039; || Numeric settings / values || 16 bits (0–65535) || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;input&amp;quot; tables represent values a device &#039;&#039;produces&#039;&#039; (sensor states, measurements), so a client can only read them. Coils and holding registers represent values a client is allowed to &#039;&#039;set&#039;&#039;. Each table also has a conventional &#039;&#039;&#039;reference number&#039;&#039;&#039; that operators quote instead of the raw zero-based address: coils start at 1, discrete inputs at 10001, input registers at 30001 and holding registers at 40001.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client is useful when:&lt;br /&gt;
&lt;br /&gt;
* Reading the live coils and registers of a PLC or other Modbus device to confirm it is responding&lt;br /&gt;
* Writing a coil or holding register to command a device during commissioning or fault-finding&lt;br /&gt;
* Checking that a device is reachable on a given host, port and unit ID&lt;br /&gt;
* Driving the [[ModbusServer]] during testing, or reading values the server is staging&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client is open source and hosted on GitHub:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/ModbusClient https://github.com/C4J/ModbusClient]&lt;br /&gt;
* &#039;&#039;&#039;Releases (downloads):&#039;&#039;&#039; [https://github.com/C4J/ModbusClient/releases https://github.com/C4J/ModbusClient/releases]&lt;br /&gt;
&lt;br /&gt;
== Running the Modbus Client ==&lt;br /&gt;
&lt;br /&gt;
The recommended way to install the Modbus Client is to download a native installer for your platform, either from the [[Downloads]] page or from the [https://github.com/C4J/ModbusClient/releases GitHub releases page]. Native installers are provided for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039;. Each installer bundles its own Java 25 runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Installing creates a native &#039;&#039;&#039;ModbusClient&#039;&#039;&#039; launcher that you run like any other desktop application — from the Start menu, Applications folder, or desktop — which opens the window described below.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly from its distribution folder as an ordinary Java 25 (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar modbusClient.jar&lt;br /&gt;
&lt;br /&gt;
The supplied &amp;lt;code&amp;gt;start_modbusClient.sh&amp;lt;/code&amp;gt; (macOS/Linux) and &amp;lt;code&amp;gt;start_modbusClient.cmd&amp;lt;/code&amp;gt; (Windows) scripts launch it the same way. Run the jar from its own folder so the bundled &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; dependencies are found alongside it.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has three parts: a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, the &#039;&#039;&#039;register table&#039;&#039;&#039; in the centre with a vertical button toolbar down the right-hand side, and an &#039;&#039;&#039;activity log&#039;&#039;&#039; along the bottom.&lt;br /&gt;
&lt;br /&gt;
=== Connection Bar ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Server host&#039;&#039;&#039; || The host name or IP address of the Modbus server to connect to. Defaults to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; (this machine) for quick loopback testing against a local [[ModbusServer]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Port&#039;&#039;&#039; || The TCP port of the server. The Modbus standard is &#039;&#039;&#039;502&#039;&#039;&#039;; match whatever the server is listening on.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unit ID&#039;&#039;&#039; || The unit / slave address to address requests to (0–247, default &#039;&#039;&#039;1&#039;&#039;&#039;). This must match the unit ID the server answers as, or every request will be rejected.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Status&#039;&#039;&#039; || Shows &#039;&#039;&#039;Disconnected&#039;&#039;&#039;, or &#039;&#039;&#039;Connected&#039;&#039;&#039; with the server address and unit ID in green.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039; button (the toggle at the top of the right-hand toolbar) opens and closes the connection. The host, port and unit ID can only be changed while disconnected. Once connected, the client polls the server roughly four times a second and the grid updates live.&lt;br /&gt;
&lt;br /&gt;
=== Register Table ===&lt;br /&gt;
&lt;br /&gt;
A single grid shows one row per address, with every Modbus data table side by side and colour-coded:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Column group !! Contents !! Editable here&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039; || The zero-based Modbus protocol address (the same address for the whole row). || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coil&#039;&#039;&#039; || Modbus reference (1…) and an on/off checkbox. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete&#039;&#039;&#039; || Discrete input reference (10001…) and an on/off checkbox. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input&#039;&#039;&#039; || Input register reference (30001…), a decimal value and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding&#039;&#039;&#039; || Holding register reference (40001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the &#039;&#039;&#039;Coil&#039;&#039;&#039; and &#039;&#039;&#039;Holding Register&#039;&#039;&#039; value cells can be edited, and only while connected — because Modbus has no function code for a client to write the discrete-input and input-register tables. Editing a cell writes the new value straight through to the server; the displayed value updates immediately and is reverted if the server rejects the write.&lt;br /&gt;
&lt;br /&gt;
Below the table, the &#039;&#039;&#039;Start address&#039;&#039;&#039; and &#039;&#039;&#039;Count&#039;&#039;&#039; fields choose which window of addresses the client polls; click the tick button (Apply range) to apply them. Up to 2000 rows can be shown at once.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Zero registers&#039;&#039;&#039; button (eraser icon) on the toolbar opens a menu to clear the visible window of the writable tables — &#039;&#039;&#039;Zero Coils&#039;&#039;&#039;, &#039;&#039;&#039;Zero Holding Registers&#039;&#039;&#039;, or &#039;&#039;&#039;Zero All&#039;&#039;&#039; for both. Only the writable tables appear, because the read-only ones cannot be cleared by a client.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
Connection events, writes, and any errors are written to the log at the bottom with a millisecond timestamp. The log keeps the most recent 400 lines. The two buttons beside it &#039;&#039;&#039;Save&#039;&#039;&#039; the log to a text file and &#039;&#039;&#039;Clear&#039;&#039;&#039; it. If the connection is lost (for example the server stops or the network drops), the client reports it in the log and returns to the disconnected state automatically.&lt;br /&gt;
&lt;br /&gt;
== Toolbar Buttons ==&lt;br /&gt;
&lt;br /&gt;
The vertical toolbar to the right of the register table provides, from top to bottom: &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039;, &#039;&#039;&#039;Open settings&#039;&#039;&#039;, &#039;&#039;&#039;Save settings&#039;&#039;&#039;, &#039;&#039;&#039;Zero registers&#039;&#039;&#039;, &#039;&#039;&#039;About&#039;&#039;&#039;, &#039;&#039;&#039;Licences&#039;&#039;&#039;, &#039;&#039;&#039;Help&#039;&#039;&#039; (opens this wiki page) and &#039;&#039;&#039;Close&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection settings (server host, port and unit ID) are stored in a small XML file, by default &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; beneath the application folder:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;config&amp;gt;&lt;br /&gt;
   &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;&lt;br /&gt;
   &amp;lt;port&amp;gt;502&amp;lt;/port&amp;gt;&lt;br /&gt;
   &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
 &amp;lt;/config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default settings are loaded automatically at start-up. Use the &#039;&#039;&#039;Open settings&#039;&#039;&#039; and &#039;&#039;&#039;Save settings&#039;&#039;&#039; toolbar buttons to load or store a configuration from any location. If you change the settings and then close the application, you are prompted to save the changes first.&lt;br /&gt;
&lt;br /&gt;
== Using the Client and Server Together ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client and the [[ModbusServer|Modbus Server]] are designed to be used as a pair to exercise a Modbus link from both ends without any real hardware:&lt;br /&gt;
&lt;br /&gt;
# Start the [[ModbusServer]] on one machine (or the same machine), choose a &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In the Modbus Client, set &#039;&#039;&#039;Server host&#039;&#039;&#039; to that machine (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; if both run on the same PC), set the matching &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Client → Server:&#039;&#039;&#039; edit a Coil or Holding Register in the client; the value is written to the server and appears in the server&#039;s grid and activity log.&lt;br /&gt;
# &#039;&#039;&#039;Server → Client:&#039;&#039;&#039; edit any value in the server — including discrete inputs and input registers, which the client can only read; the client&#039;s grid reflects it on the next poll.&lt;br /&gt;
&lt;br /&gt;
This makes the pair a complete bench setup: the server stands in for a device so you can develop or test a Modbus master, and the client stands in for a master so you can stage and inspect a device&#039;s data. Either tool can also be pointed at real third-party Modbus/TCP equipment.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Connection refused&amp;quot; or a timeout on Connect&#039;&#039;&#039; — check the server host and port, that the server is running and listening, and that no firewall is blocking the connection.&lt;br /&gt;
* &#039;&#039;&#039;Connected, but every read fails or the connection drops immediately&#039;&#039;&#039; — the &#039;&#039;&#039;Unit ID&#039;&#039;&#039; probably does not match the server. The client must address the exact unit ID the server answers as.&lt;br /&gt;
* &#039;&#039;&#039;A startup warning about &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt;&#039;&#039;&#039; — harmless, and does not affect operation. The supplied start scripts suppress it; launching the jar directly may still print it.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ModbusServer]] — the server-side companion tool&lt;br /&gt;
* [[AutoLab4j]] — uses the same Modbus stack to read laboratory instruments&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ModbusServer&amp;diff=1844</id>
		<title>ModbusServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ModbusServer&amp;diff=1844"/>
		<updated>2026-06-04T10:39:54Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Commander4j Modbus Server&#039;&#039;&#039; (&#039;&#039;util_modbusServer&#039;&#039;) is a desktop tool that turns your PC into a [https://en.wikipedia.org/wiki/Modbus Modbus/TCP] server — a Modbus slave, or &amp;quot;device&amp;quot;. It shows the live state of all four Modbus data tables in a single editable grid, so you can both &#039;&#039;&#039;observe&#039;&#039;&#039; what a connected Modbus client writes and &#039;&#039;&#039;drive&#039;&#039;&#039; that client by staging values for it to read. It is a test, simulation and bench tool, and is the server-side companion to the [[ModbusClient|Commander4j Modbus Client]].&lt;br /&gt;
&lt;br /&gt;
== A Quick Modbus Primer ==&lt;br /&gt;
&lt;br /&gt;
If you are new to Modbus, the following terms are used throughout this page. Modbus is a simple, widely used industrial protocol for moving numeric and on/off values between automation equipment.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Master / Client&#039;&#039;&#039; — the device that initiates requests (reads and writes). The [[ModbusClient]] is a client.&lt;br /&gt;
* &#039;&#039;&#039;Slave / Server / Device&#039;&#039;&#039; — the device that holds the data and answers requests. This tool is a server.&lt;br /&gt;
* &#039;&#039;&#039;Unit ID&#039;&#039;&#039; (also &amp;quot;slave address&amp;quot;) — a number (0–247) identifying which device a request is for. A client must use the same unit ID the server is configured to answer as.&lt;br /&gt;
* &#039;&#039;&#039;Modbus/TCP&#039;&#039;&#039; — Modbus carried over an ordinary TCP/IP network connection, as opposed to serial (RTU) wiring. These tools speak Modbus/TCP only.&lt;br /&gt;
&lt;br /&gt;
Modbus organises all data into &#039;&#039;&#039;four tables&#039;&#039;&#039;, each addressed separately starting at zero:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Table !! Holds !! Size !! Can a client write it?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coils&#039;&#039;&#039; || On/off output bits || 1 bit || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete Inputs&#039;&#039;&#039; || On/off input bits || 1 bit || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input Registers&#039;&#039;&#039; || Numeric inputs (readings) || 16 bits (0–65535) || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding Registers&#039;&#039;&#039; || Numeric settings / values || 16 bits (0–65535) || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;input&amp;quot; tables represent values a device &#039;&#039;produces&#039;&#039; (sensor states, measurements), so a client can only read them. Coils and holding registers represent values a client is allowed to &#039;&#039;set&#039;&#039;. Because this server stands in for the device, it lets you edit &#039;&#039;&#039;all four&#039;&#039;&#039; tables directly — including the two a client cannot write. Each table also has a conventional &#039;&#039;&#039;reference number&#039;&#039;&#039; that operators quote instead of the raw zero-based address: coils start at 1, discrete inputs at 10001, input registers at 30001 and holding registers at 40001.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server is useful when:&lt;br /&gt;
&lt;br /&gt;
* Testing a Modbus master (PLC, SCADA package, or the [[ModbusClient]]) without needing the real device it normally talks to&lt;br /&gt;
* Watching exactly which coils and registers a client reads and writes, with a timestamped log of every change&lt;br /&gt;
* Staging register values in advance so a client polling the server sees a known scenario&lt;br /&gt;
* Toggling discrete inputs and input registers — values a real device produces but a client cannot write — to simulate sensor or status changes&lt;br /&gt;
* Confirming a client is configured for the correct host, port and unit ID&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server is open source and hosted on GitHub:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/ModbusServer https://github.com/C4J/ModbusServer]&lt;br /&gt;
* &#039;&#039;&#039;Releases (downloads):&#039;&#039;&#039; [https://github.com/C4J/ModbusServer/releases https://github.com/C4J/ModbusServer/releases]&lt;br /&gt;
&lt;br /&gt;
== Running the Modbus Server ==&lt;br /&gt;
&lt;br /&gt;
The recommended way to install the Modbus Server is to download a native installer for your platform, either from the [[Downloads]] page or from the [https://github.com/C4J/ModbusServer/releases GitHub releases page]. Native installers are provided for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039;. Each installer bundles its own Java 25 runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Installing creates native &#039;&#039;&#039;launchers&#039;&#039;&#039; you can run like any other desktop application (from the Start menu, Applications folder, or desktop):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Launcher !! What it does&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ModbusServer&#039;&#039;&#039; || Starts the interactive window described below.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ModbusServer Service&#039;&#039;&#039; || Starts the server [[#Headless (Service) Mode|headless]], with no window, using the saved configuration file. Intended for running as a background service.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly from its distribution folder as an ordinary Java 25 (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar modbusServer.jar&lt;br /&gt;
&lt;br /&gt;
The supplied &amp;lt;code&amp;gt;start_modbusServer.sh&amp;lt;/code&amp;gt; (macOS/Linux) and &amp;lt;code&amp;gt;start_modbusServer.cmd&amp;lt;/code&amp;gt; (Windows) scripts launch it the same way. Run the jar from its own folder so the bundled &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; dependencies are found alongside it.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has three parts: a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, the &#039;&#039;&#039;register table&#039;&#039;&#039; in the centre with a vertical button toolbar down the right-hand side, and an &#039;&#039;&#039;activity log&#039;&#039;&#039; along the bottom.&lt;br /&gt;
&lt;br /&gt;
=== Connection Bar ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Bind address&#039;&#039;&#039; || The network interface to listen on. &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; listens on all interfaces; enter a specific IP to restrict the server to one.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Port&#039;&#039;&#039; || The TCP port to listen on. The Modbus standard is &#039;&#039;&#039;502&#039;&#039;&#039;, but ports below 1024 require elevated privileges on macOS and Linux — use a high port such as &#039;&#039;&#039;1502&#039;&#039;&#039; for unprivileged testing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unit ID&#039;&#039;&#039; || The single slave / unit address this server answers as (0–247, default &#039;&#039;&#039;1&#039;&#039;&#039;). Requests addressed to any other unit ID are rejected, so this is a deliberate one-device simulator.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Status&#039;&#039;&#039; || Shows &#039;&#039;&#039;Stopped&#039;&#039;&#039;, or &#039;&#039;&#039;Running&#039;&#039;&#039; with the active address, port and unit ID in green.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Start / Stop&#039;&#039;&#039; button (the toggle at the top of the right-hand toolbar) binds and unbinds the server. The bind address, port and unit ID can only be changed while the server is stopped. The server can be stopped and started again without restarting the application, and &#039;&#039;&#039;all register values are kept across a stop/start&#039;&#039;&#039; — they are only lost when you exit the application.&lt;br /&gt;
&lt;br /&gt;
=== Register Table ===&lt;br /&gt;
&lt;br /&gt;
A single grid shows one row per address, with every Modbus data table side by side and colour-coded:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Column group !! Contents !! Editable here&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039; || The zero-based Modbus protocol address (the same address for the whole row). || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coil&#039;&#039;&#039; || Modbus reference (1…) and an on/off checkbox. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete&#039;&#039;&#039; || Discrete input reference (10001…) and an on/off checkbox. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input&#039;&#039;&#039; || Input register reference (30001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding&#039;&#039;&#039; || Holding register reference (40001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Address&#039;&#039;&#039; is the zero-based protocol address; the &#039;&#039;&#039;Modbus Ref&#039;&#039;&#039; column in each group is the conventional reference number an operator would quote (for example coil 0 is reference 1, holding register 0 is reference 40001).&lt;br /&gt;
&lt;br /&gt;
All four tables are editable directly in this window — including discrete inputs and input registers, which a Modbus client is not allowed to write. This lets the server stand in for a real device whose inputs change. Values can be edited whether or not the server is running and whether or not a client is connected, which is useful for staging a test scenario in advance.&lt;br /&gt;
&lt;br /&gt;
Below the table, the &#039;&#039;&#039;Start address&#039;&#039;&#039; and &#039;&#039;&#039;Count&#039;&#039;&#039; fields choose which window of addresses is listed; click the tick button (Apply range) to apply them. Up to 2000 rows can be shown at once.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Zero registers&#039;&#039;&#039; button (eraser icon) on the toolbar opens a menu to clear the visible window for an individual table — Coils, Discrete Inputs, Input Registers or Holding Registers — or &#039;&#039;&#039;Zero All&#039;&#039;&#039; to clear every table at once.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
Every change to a coil or register is written to the log at the bottom with a millisecond timestamp, whether it came from a connected client or from an operator edit in the window. The log keeps the most recent 400 lines. The two buttons beside it &#039;&#039;&#039;Save&#039;&#039;&#039; the log to a text file and &#039;&#039;&#039;Clear&#039;&#039;&#039; it.&lt;br /&gt;
&lt;br /&gt;
== Toolbar Buttons ==&lt;br /&gt;
&lt;br /&gt;
The vertical toolbar to the right of the register table provides, from top to bottom: &#039;&#039;&#039;Start / Stop&#039;&#039;&#039; the server, &#039;&#039;&#039;Open settings&#039;&#039;&#039;, &#039;&#039;&#039;Save settings&#039;&#039;&#039;, &#039;&#039;&#039;Zero registers&#039;&#039;&#039;, &#039;&#039;&#039;About&#039;&#039;&#039;, &#039;&#039;&#039;Licences&#039;&#039;&#039;, &#039;&#039;&#039;Help&#039;&#039;&#039; (opens this wiki page) and &#039;&#039;&#039;Close&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection settings (bind address, port and unit ID) are stored in a small XML file, by default &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; beneath the application folder:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;config&amp;gt;&lt;br /&gt;
   &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
   &amp;lt;port&amp;gt;502&amp;lt;/port&amp;gt;&lt;br /&gt;
   &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
 &amp;lt;/config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default settings are loaded automatically at start-up. Use the &#039;&#039;&#039;Open settings&#039;&#039;&#039; and &#039;&#039;&#039;Save settings&#039;&#039;&#039; toolbar buttons to load or store a configuration from any location. If you change the settings and then close the application, you are prompted to save the changes first.&lt;br /&gt;
&lt;br /&gt;
== Headless (Service) Mode ==&lt;br /&gt;
&lt;br /&gt;
In addition to the interactive window, the Modbus Server can run headless as a background service, started by the &#039;&#039;&#039;ModbusServer Service&#039;&#039;&#039; launcher. In this mode it loads the saved &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt;, binds the server with no user interface, and runs until the operating system asks it to stop (for example a service stop, console Ctrl-C, or system shutdown). This is why the native installer provides two launchers — &#039;&#039;&#039;ModbusServer&#039;&#039;&#039; for the window and &#039;&#039;&#039;ModbusServer Service&#039;&#039;&#039; for the headless service.&lt;br /&gt;
&lt;br /&gt;
== Using the Server and Client Together ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server and the [[ModbusClient|Modbus Client]] are designed to be used as a pair to exercise a Modbus link from both ends without any real hardware:&lt;br /&gt;
&lt;br /&gt;
# Start this server, choose a &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In the [[ModbusClient]], set &#039;&#039;&#039;Server host&#039;&#039;&#039; to this machine (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; if both run on the same PC), set the matching &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Client → Server:&#039;&#039;&#039; when the client edits a Coil or Holding Register, the value is written here and appears in this server&#039;s grid and activity log.&lt;br /&gt;
# &#039;&#039;&#039;Server → Client:&#039;&#039;&#039; edit any value here — including discrete inputs and input registers, which the client can only read — and the client&#039;s grid reflects it on its next poll.&lt;br /&gt;
&lt;br /&gt;
This makes the pair a complete bench setup: the server stands in for a device so you can develop or test a Modbus master, while the client stands in for a master so you can stage and inspect a device&#039;s data. This server can equally answer a real third-party Modbus/TCP master.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Permission denied&amp;quot; when starting&#039;&#039;&#039; — the chosen port is below 1024 (the default is 502) and the operating system requires elevated privileges to bind it. Use a port of 1024 or higher, such as 1502, or run with elevated privileges.&lt;br /&gt;
* &#039;&#039;&#039;A client&#039;s requests are rejected&#039;&#039;&#039; — the server answers only the configured &#039;&#039;&#039;Unit ID&#039;&#039;&#039;. Check the client is using the same unit ID shown in the connection bar.&lt;br /&gt;
* &#039;&#039;&#039;A startup warning about &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt;&#039;&#039;&#039; — harmless, and does not affect operation. The supplied start scripts suppress it; launching the jar directly may still print it.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ModbusClient]] — the client-side companion tool&lt;br /&gt;
* [[AutoLab4j]] — uses the same Modbus stack to read laboratory instruments&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1843</id>
		<title>ModbusClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1843"/>
		<updated>2026-06-04T10:39:08Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Commander4j Modbus Client&#039;&#039;&#039; (&#039;&#039;util_modbusClient&#039;&#039;) is a desktop tool that acts as a [https://en.wikipedia.org/wiki/Modbus Modbus/TCP] client — a Modbus master. It connects to a remote Modbus server (a device, PLC, or the [[ModbusServer|Commander4j Modbus Server]]), continuously polls its four data tables across a chosen address window, and shows them in a single live grid. Coil and Holding Register values can be edited to drive the connected server. It is a test, troubleshooting and bench tool, and is the client-side companion to the [[ModbusServer|Commander4j Modbus Server]].&lt;br /&gt;
&lt;br /&gt;
== A Quick Modbus Primer ==&lt;br /&gt;
&lt;br /&gt;
If you are new to Modbus, the following terms are used throughout this page. Modbus is a simple, widely used industrial protocol for moving numeric and on/off values between automation equipment.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Master / Client&#039;&#039;&#039; — the device that initiates requests (reads and writes). This tool is a client.&lt;br /&gt;
* &#039;&#039;&#039;Slave / Server / Device&#039;&#039;&#039; — the device that holds the data and answers requests. The [[ModbusServer]] is a server.&lt;br /&gt;
* &#039;&#039;&#039;Unit ID&#039;&#039;&#039; (also &amp;quot;slave address&amp;quot;) — a number (0–247) identifying which device a request is for. A client must use the same unit ID the server is configured to answer as.&lt;br /&gt;
* &#039;&#039;&#039;Modbus/TCP&#039;&#039;&#039; — Modbus carried over an ordinary TCP/IP network connection, as opposed to serial (RTU) wiring. These tools speak Modbus/TCP only.&lt;br /&gt;
&lt;br /&gt;
Modbus organises all data into &#039;&#039;&#039;four tables&#039;&#039;&#039;, each addressed separately starting at zero:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Table !! Holds !! Size !! Can a client write it?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coils&#039;&#039;&#039; || On/off output bits || 1 bit || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete Inputs&#039;&#039;&#039; || On/off input bits || 1 bit || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input Registers&#039;&#039;&#039; || Numeric inputs (readings) || 16 bits (0–65535) || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding Registers&#039;&#039;&#039; || Numeric settings / values || 16 bits (0–65535) || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;input&amp;quot; tables represent values a device &#039;&#039;produces&#039;&#039; (sensor states, measurements), so a client can only read them. Coils and holding registers represent values a client is allowed to &#039;&#039;set&#039;&#039;. Each table also has a conventional &#039;&#039;&#039;reference number&#039;&#039;&#039; that operators quote instead of the raw zero-based address: coils start at 1, discrete inputs at 10001, input registers at 30001 and holding registers at 40001.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client is useful when:&lt;br /&gt;
&lt;br /&gt;
* Reading the live coils and registers of a PLC or other Modbus device to confirm it is responding&lt;br /&gt;
* Writing a coil or holding register to command a device during commissioning or fault-finding&lt;br /&gt;
* Checking that a device is reachable on a given host, port and unit ID&lt;br /&gt;
* Driving the [[ModbusServer]] during testing, or reading values the server is staging&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client is open source and hosted on GitHub:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/ModbusClient https://github.com/C4J/ModbusClient]&lt;br /&gt;
* &#039;&#039;&#039;Releases (downloads):&#039;&#039;&#039; [https://github.com/C4J/ModbusClient/releases https://github.com/C4J/ModbusClient/releases]&lt;br /&gt;
&lt;br /&gt;
== Running the Modbus Client ==&lt;br /&gt;
&lt;br /&gt;
The recommended way to install the Modbus Client is to download a native installer for your platform from the [https://github.com/C4J/ModbusClient/releases GitHub releases page]. Native installers are provided for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039;. Each installer bundles its own Java 25 runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Installing creates a native &#039;&#039;&#039;ModbusClient&#039;&#039;&#039; launcher that you run like any other desktop application — from the Start menu, Applications folder, or desktop — which opens the window described below.&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly from its distribution folder as an ordinary Java 25 (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar modbusClient.jar&lt;br /&gt;
&lt;br /&gt;
The supplied &amp;lt;code&amp;gt;start_modbusClient.sh&amp;lt;/code&amp;gt; (macOS/Linux) and &amp;lt;code&amp;gt;start_modbusClient.cmd&amp;lt;/code&amp;gt; (Windows) scripts launch it the same way. Run the jar from its own folder so the bundled &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; dependencies are found alongside it.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has three parts: a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, the &#039;&#039;&#039;register table&#039;&#039;&#039; in the centre with a vertical button toolbar down the right-hand side, and an &#039;&#039;&#039;activity log&#039;&#039;&#039; along the bottom.&lt;br /&gt;
&lt;br /&gt;
=== Connection Bar ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Server host&#039;&#039;&#039; || The host name or IP address of the Modbus server to connect to. Defaults to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; (this machine) for quick loopback testing against a local [[ModbusServer]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Port&#039;&#039;&#039; || The TCP port of the server. The Modbus standard is &#039;&#039;&#039;502&#039;&#039;&#039;; match whatever the server is listening on.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unit ID&#039;&#039;&#039; || The unit / slave address to address requests to (0–247, default &#039;&#039;&#039;1&#039;&#039;&#039;). This must match the unit ID the server answers as, or every request will be rejected.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Status&#039;&#039;&#039; || Shows &#039;&#039;&#039;Disconnected&#039;&#039;&#039;, or &#039;&#039;&#039;Connected&#039;&#039;&#039; with the server address and unit ID in green.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039; button (the toggle at the top of the right-hand toolbar) opens and closes the connection. The host, port and unit ID can only be changed while disconnected. Once connected, the client polls the server roughly four times a second and the grid updates live.&lt;br /&gt;
&lt;br /&gt;
=== Register Table ===&lt;br /&gt;
&lt;br /&gt;
A single grid shows one row per address, with every Modbus data table side by side and colour-coded:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Column group !! Contents !! Editable here&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039; || The zero-based Modbus protocol address (the same address for the whole row). || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coil&#039;&#039;&#039; || Modbus reference (1…) and an on/off checkbox. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete&#039;&#039;&#039; || Discrete input reference (10001…) and an on/off checkbox. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input&#039;&#039;&#039; || Input register reference (30001…), a decimal value and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding&#039;&#039;&#039; || Holding register reference (40001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the &#039;&#039;&#039;Coil&#039;&#039;&#039; and &#039;&#039;&#039;Holding Register&#039;&#039;&#039; value cells can be edited, and only while connected — because Modbus has no function code for a client to write the discrete-input and input-register tables. Editing a cell writes the new value straight through to the server; the displayed value updates immediately and is reverted if the server rejects the write.&lt;br /&gt;
&lt;br /&gt;
Below the table, the &#039;&#039;&#039;Start address&#039;&#039;&#039; and &#039;&#039;&#039;Count&#039;&#039;&#039; fields choose which window of addresses the client polls; click the tick button (Apply range) to apply them. Up to 2000 rows can be shown at once.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Zero registers&#039;&#039;&#039; button (eraser icon) on the toolbar opens a menu to clear the visible window of the writable tables — &#039;&#039;&#039;Zero Coils&#039;&#039;&#039;, &#039;&#039;&#039;Zero Holding Registers&#039;&#039;&#039;, or &#039;&#039;&#039;Zero All&#039;&#039;&#039; for both. Only the writable tables appear, because the read-only ones cannot be cleared by a client.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
Connection events, writes, and any errors are written to the log at the bottom with a millisecond timestamp. The log keeps the most recent 400 lines. The two buttons beside it &#039;&#039;&#039;Save&#039;&#039;&#039; the log to a text file and &#039;&#039;&#039;Clear&#039;&#039;&#039; it. If the connection is lost (for example the server stops or the network drops), the client reports it in the log and returns to the disconnected state automatically.&lt;br /&gt;
&lt;br /&gt;
== Toolbar Buttons ==&lt;br /&gt;
&lt;br /&gt;
The vertical toolbar to the right of the register table provides, from top to bottom: &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039;, &#039;&#039;&#039;Open settings&#039;&#039;&#039;, &#039;&#039;&#039;Save settings&#039;&#039;&#039;, &#039;&#039;&#039;Zero registers&#039;&#039;&#039;, &#039;&#039;&#039;About&#039;&#039;&#039;, &#039;&#039;&#039;Licences&#039;&#039;&#039;, &#039;&#039;&#039;Help&#039;&#039;&#039; (opens this wiki page) and &#039;&#039;&#039;Close&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection settings (server host, port and unit ID) are stored in a small XML file, by default &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; beneath the application folder:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;config&amp;gt;&lt;br /&gt;
   &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;&lt;br /&gt;
   &amp;lt;port&amp;gt;502&amp;lt;/port&amp;gt;&lt;br /&gt;
   &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
 &amp;lt;/config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default settings are loaded automatically at start-up. Use the &#039;&#039;&#039;Open settings&#039;&#039;&#039; and &#039;&#039;&#039;Save settings&#039;&#039;&#039; toolbar buttons to load or store a configuration from any location. If you change the settings and then close the application, you are prompted to save the changes first.&lt;br /&gt;
&lt;br /&gt;
== Using the Client and Server Together ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client and the [[ModbusServer|Modbus Server]] are designed to be used as a pair to exercise a Modbus link from both ends without any real hardware:&lt;br /&gt;
&lt;br /&gt;
# Start the [[ModbusServer]] on one machine (or the same machine), choose a &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In the Modbus Client, set &#039;&#039;&#039;Server host&#039;&#039;&#039; to that machine (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; if both run on the same PC), set the matching &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Client → Server:&#039;&#039;&#039; edit a Coil or Holding Register in the client; the value is written to the server and appears in the server&#039;s grid and activity log.&lt;br /&gt;
# &#039;&#039;&#039;Server → Client:&#039;&#039;&#039; edit any value in the server — including discrete inputs and input registers, which the client can only read; the client&#039;s grid reflects it on the next poll.&lt;br /&gt;
&lt;br /&gt;
This makes the pair a complete bench setup: the server stands in for a device so you can develop or test a Modbus master, and the client stands in for a master so you can stage and inspect a device&#039;s data. Either tool can also be pointed at real third-party Modbus/TCP equipment.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Connection refused&amp;quot; or a timeout on Connect&#039;&#039;&#039; — check the server host and port, that the server is running and listening, and that no firewall is blocking the connection.&lt;br /&gt;
* &#039;&#039;&#039;Connected, but every read fails or the connection drops immediately&#039;&#039;&#039; — the &#039;&#039;&#039;Unit ID&#039;&#039;&#039; probably does not match the server. The client must address the exact unit ID the server answers as.&lt;br /&gt;
* &#039;&#039;&#039;A startup warning about &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt;&#039;&#039;&#039; — harmless, and does not affect operation. The supplied start scripts suppress it; launching the jar directly may still print it.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ModbusServer]] — the server-side companion tool&lt;br /&gt;
* [[AutoLab4j]] — uses the same Modbus stack to read laboratory instruments&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ModbusServer&amp;diff=1842</id>
		<title>ModbusServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ModbusServer&amp;diff=1842"/>
		<updated>2026-06-04T10:39:07Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Commander4j Modbus Server&#039;&#039;&#039; (&#039;&#039;util_modbusServer&#039;&#039;) is a desktop tool that turns your PC into a [https://en.wikipedia.org/wiki/Modbus Modbus/TCP] server — a Modbus slave, or &amp;quot;device&amp;quot;. It shows the live state of all four Modbus data tables in a single editable grid, so you can both &#039;&#039;&#039;observe&#039;&#039;&#039; what a connected Modbus client writes and &#039;&#039;&#039;drive&#039;&#039;&#039; that client by staging values for it to read. It is a test, simulation and bench tool, and is the server-side companion to the [[ModbusClient|Commander4j Modbus Client]].&lt;br /&gt;
&lt;br /&gt;
== A Quick Modbus Primer ==&lt;br /&gt;
&lt;br /&gt;
If you are new to Modbus, the following terms are used throughout this page. Modbus is a simple, widely used industrial protocol for moving numeric and on/off values between automation equipment.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Master / Client&#039;&#039;&#039; — the device that initiates requests (reads and writes). The [[ModbusClient]] is a client.&lt;br /&gt;
* &#039;&#039;&#039;Slave / Server / Device&#039;&#039;&#039; — the device that holds the data and answers requests. This tool is a server.&lt;br /&gt;
* &#039;&#039;&#039;Unit ID&#039;&#039;&#039; (also &amp;quot;slave address&amp;quot;) — a number (0–247) identifying which device a request is for. A client must use the same unit ID the server is configured to answer as.&lt;br /&gt;
* &#039;&#039;&#039;Modbus/TCP&#039;&#039;&#039; — Modbus carried over an ordinary TCP/IP network connection, as opposed to serial (RTU) wiring. These tools speak Modbus/TCP only.&lt;br /&gt;
&lt;br /&gt;
Modbus organises all data into &#039;&#039;&#039;four tables&#039;&#039;&#039;, each addressed separately starting at zero:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Table !! Holds !! Size !! Can a client write it?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coils&#039;&#039;&#039; || On/off output bits || 1 bit || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete Inputs&#039;&#039;&#039; || On/off input bits || 1 bit || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input Registers&#039;&#039;&#039; || Numeric inputs (readings) || 16 bits (0–65535) || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding Registers&#039;&#039;&#039; || Numeric settings / values || 16 bits (0–65535) || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;input&amp;quot; tables represent values a device &#039;&#039;produces&#039;&#039; (sensor states, measurements), so a client can only read them. Coils and holding registers represent values a client is allowed to &#039;&#039;set&#039;&#039;. Because this server stands in for the device, it lets you edit &#039;&#039;&#039;all four&#039;&#039;&#039; tables directly — including the two a client cannot write. Each table also has a conventional &#039;&#039;&#039;reference number&#039;&#039;&#039; that operators quote instead of the raw zero-based address: coils start at 1, discrete inputs at 10001, input registers at 30001 and holding registers at 40001.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server is useful when:&lt;br /&gt;
&lt;br /&gt;
* Testing a Modbus master (PLC, SCADA package, or the [[ModbusClient]]) without needing the real device it normally talks to&lt;br /&gt;
* Watching exactly which coils and registers a client reads and writes, with a timestamped log of every change&lt;br /&gt;
* Staging register values in advance so a client polling the server sees a known scenario&lt;br /&gt;
* Toggling discrete inputs and input registers — values a real device produces but a client cannot write — to simulate sensor or status changes&lt;br /&gt;
* Confirming a client is configured for the correct host, port and unit ID&lt;br /&gt;
&lt;br /&gt;
== Source Code and Releases ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server is open source and hosted on GitHub:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Repository:&#039;&#039;&#039; [https://github.com/C4J/ModbusServer https://github.com/C4J/ModbusServer]&lt;br /&gt;
* &#039;&#039;&#039;Releases (downloads):&#039;&#039;&#039; [https://github.com/C4J/ModbusServer/releases https://github.com/C4J/ModbusServer/releases]&lt;br /&gt;
&lt;br /&gt;
== Running the Modbus Server ==&lt;br /&gt;
&lt;br /&gt;
The recommended way to install the Modbus Server is to download a native installer for your platform from the [https://github.com/C4J/ModbusServer/releases GitHub releases page]. Native installers are provided for &#039;&#039;&#039;Windows, macOS and Linux&#039;&#039;&#039;. Each installer bundles its own Java 25 runtime, so &#039;&#039;&#039;no separate Java installation is required&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Installing creates native &#039;&#039;&#039;launchers&#039;&#039;&#039; you can run like any other desktop application (from the Start menu, Applications folder, or desktop):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Launcher !! What it does&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ModbusServer&#039;&#039;&#039; || Starts the interactive window described below.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ModbusServer Service&#039;&#039;&#039; || Starts the server [[#Headless (Service) Mode|headless]], with no window, using the saved configuration file. Intended for running as a background service.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Running from the jar ===&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly from its distribution folder as an ordinary Java 25 (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar modbusServer.jar&lt;br /&gt;
&lt;br /&gt;
The supplied &amp;lt;code&amp;gt;start_modbusServer.sh&amp;lt;/code&amp;gt; (macOS/Linux) and &amp;lt;code&amp;gt;start_modbusServer.cmd&amp;lt;/code&amp;gt; (Windows) scripts launch it the same way. Run the jar from its own folder so the bundled &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; dependencies are found alongside it.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has three parts: a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, the &#039;&#039;&#039;register table&#039;&#039;&#039; in the centre with a vertical button toolbar down the right-hand side, and an &#039;&#039;&#039;activity log&#039;&#039;&#039; along the bottom.&lt;br /&gt;
&lt;br /&gt;
=== Connection Bar ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Bind address&#039;&#039;&#039; || The network interface to listen on. &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; listens on all interfaces; enter a specific IP to restrict the server to one.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Port&#039;&#039;&#039; || The TCP port to listen on. The Modbus standard is &#039;&#039;&#039;502&#039;&#039;&#039;, but ports below 1024 require elevated privileges on macOS and Linux — use a high port such as &#039;&#039;&#039;1502&#039;&#039;&#039; for unprivileged testing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unit ID&#039;&#039;&#039; || The single slave / unit address this server answers as (0–247, default &#039;&#039;&#039;1&#039;&#039;&#039;). Requests addressed to any other unit ID are rejected, so this is a deliberate one-device simulator.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Status&#039;&#039;&#039; || Shows &#039;&#039;&#039;Stopped&#039;&#039;&#039;, or &#039;&#039;&#039;Running&#039;&#039;&#039; with the active address, port and unit ID in green.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Start / Stop&#039;&#039;&#039; button (the toggle at the top of the right-hand toolbar) binds and unbinds the server. The bind address, port and unit ID can only be changed while the server is stopped. The server can be stopped and started again without restarting the application, and &#039;&#039;&#039;all register values are kept across a stop/start&#039;&#039;&#039; — they are only lost when you exit the application.&lt;br /&gt;
&lt;br /&gt;
=== Register Table ===&lt;br /&gt;
&lt;br /&gt;
A single grid shows one row per address, with every Modbus data table side by side and colour-coded:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Column group !! Contents !! Editable here&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039; || The zero-based Modbus protocol address (the same address for the whole row). || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coil&#039;&#039;&#039; || Modbus reference (1…) and an on/off checkbox. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete&#039;&#039;&#039; || Discrete input reference (10001…) and an on/off checkbox. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input&#039;&#039;&#039; || Input register reference (30001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding&#039;&#039;&#039; || Holding register reference (40001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Address&#039;&#039;&#039; is the zero-based protocol address; the &#039;&#039;&#039;Modbus Ref&#039;&#039;&#039; column in each group is the conventional reference number an operator would quote (for example coil 0 is reference 1, holding register 0 is reference 40001).&lt;br /&gt;
&lt;br /&gt;
All four tables are editable directly in this window — including discrete inputs and input registers, which a Modbus client is not allowed to write. This lets the server stand in for a real device whose inputs change. Values can be edited whether or not the server is running and whether or not a client is connected, which is useful for staging a test scenario in advance.&lt;br /&gt;
&lt;br /&gt;
Below the table, the &#039;&#039;&#039;Start address&#039;&#039;&#039; and &#039;&#039;&#039;Count&#039;&#039;&#039; fields choose which window of addresses is listed; click the tick button (Apply range) to apply them. Up to 2000 rows can be shown at once.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Zero registers&#039;&#039;&#039; button (eraser icon) on the toolbar opens a menu to clear the visible window for an individual table — Coils, Discrete Inputs, Input Registers or Holding Registers — or &#039;&#039;&#039;Zero All&#039;&#039;&#039; to clear every table at once.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
Every change to a coil or register is written to the log at the bottom with a millisecond timestamp, whether it came from a connected client or from an operator edit in the window. The log keeps the most recent 400 lines. The two buttons beside it &#039;&#039;&#039;Save&#039;&#039;&#039; the log to a text file and &#039;&#039;&#039;Clear&#039;&#039;&#039; it.&lt;br /&gt;
&lt;br /&gt;
== Toolbar Buttons ==&lt;br /&gt;
&lt;br /&gt;
The vertical toolbar to the right of the register table provides, from top to bottom: &#039;&#039;&#039;Start / Stop&#039;&#039;&#039; the server, &#039;&#039;&#039;Open settings&#039;&#039;&#039;, &#039;&#039;&#039;Save settings&#039;&#039;&#039;, &#039;&#039;&#039;Zero registers&#039;&#039;&#039;, &#039;&#039;&#039;About&#039;&#039;&#039;, &#039;&#039;&#039;Licences&#039;&#039;&#039;, &#039;&#039;&#039;Help&#039;&#039;&#039; (opens this wiki page) and &#039;&#039;&#039;Close&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection settings (bind address, port and unit ID) are stored in a small XML file, by default &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; beneath the application folder:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;config&amp;gt;&lt;br /&gt;
   &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
   &amp;lt;port&amp;gt;502&amp;lt;/port&amp;gt;&lt;br /&gt;
   &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
 &amp;lt;/config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default settings are loaded automatically at start-up. Use the &#039;&#039;&#039;Open settings&#039;&#039;&#039; and &#039;&#039;&#039;Save settings&#039;&#039;&#039; toolbar buttons to load or store a configuration from any location. If you change the settings and then close the application, you are prompted to save the changes first.&lt;br /&gt;
&lt;br /&gt;
== Headless (Service) Mode ==&lt;br /&gt;
&lt;br /&gt;
In addition to the interactive window, the Modbus Server can run headless as a background service, started by the &#039;&#039;&#039;ModbusServer Service&#039;&#039;&#039; launcher. In this mode it loads the saved &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt;, binds the server with no user interface, and runs until the operating system asks it to stop (for example a service stop, console Ctrl-C, or system shutdown). This is why the native installer provides two launchers — &#039;&#039;&#039;ModbusServer&#039;&#039;&#039; for the window and &#039;&#039;&#039;ModbusServer Service&#039;&#039;&#039; for the headless service.&lt;br /&gt;
&lt;br /&gt;
== Using the Server and Client Together ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server and the [[ModbusClient|Modbus Client]] are designed to be used as a pair to exercise a Modbus link from both ends without any real hardware:&lt;br /&gt;
&lt;br /&gt;
# Start this server, choose a &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In the [[ModbusClient]], set &#039;&#039;&#039;Server host&#039;&#039;&#039; to this machine (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; if both run on the same PC), set the matching &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Client → Server:&#039;&#039;&#039; when the client edits a Coil or Holding Register, the value is written here and appears in this server&#039;s grid and activity log.&lt;br /&gt;
# &#039;&#039;&#039;Server → Client:&#039;&#039;&#039; edit any value here — including discrete inputs and input registers, which the client can only read — and the client&#039;s grid reflects it on its next poll.&lt;br /&gt;
&lt;br /&gt;
This makes the pair a complete bench setup: the server stands in for a device so you can develop or test a Modbus master, while the client stands in for a master so you can stage and inspect a device&#039;s data. This server can equally answer a real third-party Modbus/TCP master.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Permission denied&amp;quot; when starting&#039;&#039;&#039; — the chosen port is below 1024 (the default is 502) and the operating system requires elevated privileges to bind it. Use a port of 1024 or higher, such as 1502, or run with elevated privileges.&lt;br /&gt;
* &#039;&#039;&#039;A client&#039;s requests are rejected&#039;&#039;&#039; — the server answers only the configured &#039;&#039;&#039;Unit ID&#039;&#039;&#039;. Check the client is using the same unit ID shown in the connection bar.&lt;br /&gt;
* &#039;&#039;&#039;A startup warning about &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt;&#039;&#039;&#039; — harmless, and does not affect operation. The supplied start scripts suppress it; launching the jar directly may still print it.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ModbusClient]] — the client-side companion tool&lt;br /&gt;
* [[AutoLab4j]] — uses the same Modbus stack to read laboratory instruments&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1841</id>
		<title>ModbusClient</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ModbusClient&amp;diff=1841"/>
		<updated>2026-06-04T10:31:46Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Commander4j Modbus Client&#039;&#039;&#039; (&#039;&#039;util_modbusClient&#039;&#039;) is a desktop tool that acts as a [https://en.wikipedia.org/wiki/Modbus Modbus/TCP] client — a Modbus master. It connects to a remote Modbus server (a device, PLC, or the [[ModbusServer|Commander4j Modbus Server]]), continuously polls its four data tables across a chosen address window, and shows them in a single live grid. Coil and Holding Register values can be edited to drive the connected server. It is a test, troubleshooting and bench tool, and is the client-side companion to the [[ModbusServer|Commander4j Modbus Server]].&lt;br /&gt;
&lt;br /&gt;
== A Quick Modbus Primer ==&lt;br /&gt;
&lt;br /&gt;
If you are new to Modbus, the following terms are used throughout this page. Modbus is a simple, widely used industrial protocol for moving numeric and on/off values between automation equipment.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Master / Client&#039;&#039;&#039; — the device that initiates requests (reads and writes). This tool is a client.&lt;br /&gt;
* &#039;&#039;&#039;Slave / Server / Device&#039;&#039;&#039; — the device that holds the data and answers requests. The [[ModbusServer]] is a server.&lt;br /&gt;
* &#039;&#039;&#039;Unit ID&#039;&#039;&#039; (also &amp;quot;slave address&amp;quot;) — a number (0–247) identifying which device a request is for. A client must use the same unit ID the server is configured to answer as.&lt;br /&gt;
* &#039;&#039;&#039;Modbus/TCP&#039;&#039;&#039; — Modbus carried over an ordinary TCP/IP network connection, as opposed to serial (RTU) wiring. These tools speak Modbus/TCP only.&lt;br /&gt;
&lt;br /&gt;
Modbus organises all data into &#039;&#039;&#039;four tables&#039;&#039;&#039;, each addressed separately starting at zero:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Table !! Holds !! Size !! Can a client write it?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coils&#039;&#039;&#039; || On/off output bits || 1 bit || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete Inputs&#039;&#039;&#039; || On/off input bits || 1 bit || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input Registers&#039;&#039;&#039; || Numeric inputs (readings) || 16 bits (0–65535) || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding Registers&#039;&#039;&#039; || Numeric settings / values || 16 bits (0–65535) || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;input&amp;quot; tables represent values a device &#039;&#039;produces&#039;&#039; (sensor states, measurements), so a client can only read them. Coils and holding registers represent values a client is allowed to &#039;&#039;set&#039;&#039;. Each table also has a conventional &#039;&#039;&#039;reference number&#039;&#039;&#039; that operators quote instead of the raw zero-based address: coils start at 1, discrete inputs at 10001, input registers at 30001 and holding registers at 40001.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client is useful when:&lt;br /&gt;
&lt;br /&gt;
* Reading the live coils and registers of a PLC or other Modbus device to confirm it is responding&lt;br /&gt;
* Writing a coil or holding register to command a device during commissioning or fault-finding&lt;br /&gt;
* Checking that a device is reachable on a given host, port and unit ID&lt;br /&gt;
* Driving the [[ModbusServer]] during testing, or reading values the server is staging&lt;br /&gt;
&lt;br /&gt;
== Running the Modbus Client ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method.&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly from its distribution folder. It is a Java 25 desktop (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar modbusClient.jar&lt;br /&gt;
&lt;br /&gt;
The supplied &amp;lt;code&amp;gt;start_modbusClient.sh&amp;lt;/code&amp;gt; (macOS/Linux) and &amp;lt;code&amp;gt;start_modbusClient.cmd&amp;lt;/code&amp;gt; (Windows) scripts launch it the same way. Run the jar from its own folder so the bundled &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; dependencies are found alongside it.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has three parts: a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, the &#039;&#039;&#039;register table&#039;&#039;&#039; in the centre with a vertical button toolbar down the right-hand side, and an &#039;&#039;&#039;activity log&#039;&#039;&#039; along the bottom.&lt;br /&gt;
&lt;br /&gt;
=== Connection Bar ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Server host&#039;&#039;&#039; || The host name or IP address of the Modbus server to connect to. Defaults to &amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; (this machine) for quick loopback testing against a local [[ModbusServer]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Port&#039;&#039;&#039; || The TCP port of the server. The Modbus standard is &#039;&#039;&#039;502&#039;&#039;&#039;; match whatever the server is listening on.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unit ID&#039;&#039;&#039; || The unit / slave address to address requests to (0–247, default &#039;&#039;&#039;1&#039;&#039;&#039;). This must match the unit ID the server answers as, or every request will be rejected.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Status&#039;&#039;&#039; || Shows &#039;&#039;&#039;Disconnected&#039;&#039;&#039;, or &#039;&#039;&#039;Connected&#039;&#039;&#039; with the server address and unit ID in green.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039; button (the toggle at the top of the right-hand toolbar) opens and closes the connection. The host, port and unit ID can only be changed while disconnected. Once connected, the client polls the server roughly four times a second and the grid updates live.&lt;br /&gt;
&lt;br /&gt;
=== Register Table ===&lt;br /&gt;
&lt;br /&gt;
A single grid shows one row per address, with every Modbus data table side by side and colour-coded:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Column group !! Contents !! Editable here&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039; || The zero-based Modbus protocol address (the same address for the whole row). || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coil&#039;&#039;&#039; || Modbus reference (1…) and an on/off checkbox. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete&#039;&#039;&#039; || Discrete input reference (10001…) and an on/off checkbox. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input&#039;&#039;&#039; || Input register reference (30001…), a decimal value and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || No (read-only)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding&#039;&#039;&#039; || Holding register reference (40001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the &#039;&#039;&#039;Coil&#039;&#039;&#039; and &#039;&#039;&#039;Holding Register&#039;&#039;&#039; value cells can be edited, and only while connected — because Modbus has no function code for a client to write the discrete-input and input-register tables. Editing a cell writes the new value straight through to the server; the displayed value updates immediately and is reverted if the server rejects the write.&lt;br /&gt;
&lt;br /&gt;
Below the table, the &#039;&#039;&#039;Start address&#039;&#039;&#039; and &#039;&#039;&#039;Count&#039;&#039;&#039; fields choose which window of addresses the client polls; click the tick button (Apply range) to apply them. Up to 2000 rows can be shown at once.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Zero registers&#039;&#039;&#039; button (eraser icon) on the toolbar opens a menu to clear the visible window of the writable tables — &#039;&#039;&#039;Zero Coils&#039;&#039;&#039;, &#039;&#039;&#039;Zero Holding Registers&#039;&#039;&#039;, or &#039;&#039;&#039;Zero All&#039;&#039;&#039; for both. Only the writable tables appear, because the read-only ones cannot be cleared by a client.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
Connection events, writes, and any errors are written to the log at the bottom with a millisecond timestamp. The log keeps the most recent 400 lines. The two buttons beside it &#039;&#039;&#039;Save&#039;&#039;&#039; the log to a text file and &#039;&#039;&#039;Clear&#039;&#039;&#039; it. If the connection is lost (for example the server stops or the network drops), the client reports it in the log and returns to the disconnected state automatically.&lt;br /&gt;
&lt;br /&gt;
== Toolbar Buttons ==&lt;br /&gt;
&lt;br /&gt;
The vertical toolbar to the right of the register table provides, from top to bottom: &#039;&#039;&#039;Connect / Disconnect&#039;&#039;&#039;, &#039;&#039;&#039;Open settings&#039;&#039;&#039;, &#039;&#039;&#039;Save settings&#039;&#039;&#039;, &#039;&#039;&#039;Zero registers&#039;&#039;&#039;, &#039;&#039;&#039;About&#039;&#039;&#039;, &#039;&#039;&#039;Licences&#039;&#039;&#039;, &#039;&#039;&#039;Help&#039;&#039;&#039; (opens this wiki page) and &#039;&#039;&#039;Close&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection settings (server host, port and unit ID) are stored in a small XML file, by default &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; beneath the application folder:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;config&amp;gt;&lt;br /&gt;
   &amp;lt;ip&amp;gt;127.0.0.1&amp;lt;/ip&amp;gt;&lt;br /&gt;
   &amp;lt;port&amp;gt;502&amp;lt;/port&amp;gt;&lt;br /&gt;
   &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
 &amp;lt;/config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default settings are loaded automatically at start-up. Use the &#039;&#039;&#039;Open settings&#039;&#039;&#039; and &#039;&#039;&#039;Save settings&#039;&#039;&#039; toolbar buttons to load or store a configuration from any location. If you change the settings and then close the application, you are prompted to save the changes first.&lt;br /&gt;
&lt;br /&gt;
== Using the Client and Server Together ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Client and the [[ModbusServer|Modbus Server]] are designed to be used as a pair to exercise a Modbus link from both ends without any real hardware:&lt;br /&gt;
&lt;br /&gt;
# Start the [[ModbusServer]] on one machine (or the same machine), choose a &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In the Modbus Client, set &#039;&#039;&#039;Server host&#039;&#039;&#039; to that machine (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; if both run on the same PC), set the matching &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Client → Server:&#039;&#039;&#039; edit a Coil or Holding Register in the client; the value is written to the server and appears in the server&#039;s grid and activity log.&lt;br /&gt;
# &#039;&#039;&#039;Server → Client:&#039;&#039;&#039; edit any value in the server — including discrete inputs and input registers, which the client can only read; the client&#039;s grid reflects it on the next poll.&lt;br /&gt;
&lt;br /&gt;
This makes the pair a complete bench setup: the server stands in for a device so you can develop or test a Modbus master, and the client stands in for a master so you can stage and inspect a device&#039;s data. Either tool can also be pointed at real third-party Modbus/TCP equipment.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Connection refused&amp;quot; or a timeout on Connect&#039;&#039;&#039; — check the server host and port, that the server is running and listening, and that no firewall is blocking the connection.&lt;br /&gt;
* &#039;&#039;&#039;Connected, but every read fails or the connection drops immediately&#039;&#039;&#039; — the &#039;&#039;&#039;Unit ID&#039;&#039;&#039; probably does not match the server. The client must address the exact unit ID the server answers as.&lt;br /&gt;
* &#039;&#039;&#039;A startup warning about &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt;&#039;&#039;&#039; — harmless, and does not affect operation. The supplied start scripts suppress it; launching the jar directly may still print it.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ModbusServer]] — the server-side companion tool&lt;br /&gt;
* [[AutoLab4j]] — uses the same Modbus stack to read laboratory instruments&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ModbusServer&amp;diff=1840</id>
		<title>ModbusServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ModbusServer&amp;diff=1840"/>
		<updated>2026-06-04T10:31:45Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The &#039;&#039;&#039;Commander4j Modbus Server&#039;&#039;&#039; (&#039;&#039;util_modbusServer&#039;&#039;) is a desktop tool that turns your PC into a [https://en.wikipedia.org/wiki/Modbus Modbus/TCP] server — a Modbus slave, or &amp;quot;device&amp;quot;. It shows the live state of all four Modbus data tables in a single editable grid, so you can both &#039;&#039;&#039;observe&#039;&#039;&#039; what a connected Modbus client writes and &#039;&#039;&#039;drive&#039;&#039;&#039; that client by staging values for it to read. It is a test, simulation and bench tool, and is the server-side companion to the [[ModbusClient|Commander4j Modbus Client]].&lt;br /&gt;
&lt;br /&gt;
== A Quick Modbus Primer ==&lt;br /&gt;
&lt;br /&gt;
If you are new to Modbus, the following terms are used throughout this page. Modbus is a simple, widely used industrial protocol for moving numeric and on/off values between automation equipment.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Master / Client&#039;&#039;&#039; — the device that initiates requests (reads and writes). The [[ModbusClient]] is a client.&lt;br /&gt;
* &#039;&#039;&#039;Slave / Server / Device&#039;&#039;&#039; — the device that holds the data and answers requests. This tool is a server.&lt;br /&gt;
* &#039;&#039;&#039;Unit ID&#039;&#039;&#039; (also &amp;quot;slave address&amp;quot;) — a number (0–247) identifying which device a request is for. A client must use the same unit ID the server is configured to answer as.&lt;br /&gt;
* &#039;&#039;&#039;Modbus/TCP&#039;&#039;&#039; — Modbus carried over an ordinary TCP/IP network connection, as opposed to serial (RTU) wiring. These tools speak Modbus/TCP only.&lt;br /&gt;
&lt;br /&gt;
Modbus organises all data into &#039;&#039;&#039;four tables&#039;&#039;&#039;, each addressed separately starting at zero:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Table !! Holds !! Size !! Can a client write it?&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coils&#039;&#039;&#039; || On/off output bits || 1 bit || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete Inputs&#039;&#039;&#039; || On/off input bits || 1 bit || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input Registers&#039;&#039;&#039; || Numeric inputs (readings) || 16 bits (0–65535) || No — read-only&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding Registers&#039;&#039;&#039; || Numeric settings / values || 16 bits (0–65535) || &#039;&#039;&#039;Yes&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The two &amp;quot;input&amp;quot; tables represent values a device &#039;&#039;produces&#039;&#039; (sensor states, measurements), so a client can only read them. Coils and holding registers represent values a client is allowed to &#039;&#039;set&#039;&#039;. Because this server stands in for the device, it lets you edit &#039;&#039;&#039;all four&#039;&#039;&#039; tables directly — including the two a client cannot write. Each table also has a conventional &#039;&#039;&#039;reference number&#039;&#039;&#039; that operators quote instead of the raw zero-based address: coils start at 1, discrete inputs at 10001, input registers at 30001 and holding registers at 40001.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server is useful when:&lt;br /&gt;
&lt;br /&gt;
* Testing a Modbus master (PLC, SCADA package, or the [[ModbusClient]]) without needing the real device it normally talks to&lt;br /&gt;
* Watching exactly which coils and registers a client reads and writes, with a timestamped log of every change&lt;br /&gt;
* Staging register values in advance so a client polling the server sees a known scenario&lt;br /&gt;
* Toggling discrete inputs and input registers — values a real device produces but a client cannot write — to simulate sensor or status changes&lt;br /&gt;
* Confirming a client is configured for the correct host, port and unit ID&lt;br /&gt;
&lt;br /&gt;
== Running the Modbus Server ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method.&lt;br /&gt;
&lt;br /&gt;
Alternatively the tool can be run directly from its distribution folder. It is a Java 25 desktop (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar modbusServer.jar&lt;br /&gt;
&lt;br /&gt;
The supplied &amp;lt;code&amp;gt;start_modbusServer.sh&amp;lt;/code&amp;gt; (macOS/Linux) and &amp;lt;code&amp;gt;start_modbusServer.cmd&amp;lt;/code&amp;gt; (Windows) scripts launch it the same way. Run the jar from its own folder so the bundled &amp;lt;code&amp;gt;lib/&amp;lt;/code&amp;gt; dependencies are found alongside it.&lt;br /&gt;
&lt;br /&gt;
== The Main Window ==&lt;br /&gt;
&lt;br /&gt;
The window has three parts: a &#039;&#039;&#039;connection bar&#039;&#039;&#039; across the top, the &#039;&#039;&#039;register table&#039;&#039;&#039; in the centre with a vertical button toolbar down the right-hand side, and an &#039;&#039;&#039;activity log&#039;&#039;&#039; along the bottom.&lt;br /&gt;
&lt;br /&gt;
=== Connection Bar ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Field !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Bind address&#039;&#039;&#039; || The network interface to listen on. &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; listens on all interfaces; enter a specific IP to restrict the server to one.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Port&#039;&#039;&#039; || The TCP port to listen on. The Modbus standard is &#039;&#039;&#039;502&#039;&#039;&#039;, but ports below 1024 require elevated privileges on macOS and Linux — use a high port such as &#039;&#039;&#039;1502&#039;&#039;&#039; for unprivileged testing.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unit ID&#039;&#039;&#039; || The single slave / unit address this server answers as (0–247, default &#039;&#039;&#039;1&#039;&#039;&#039;). Requests addressed to any other unit ID are rejected, so this is a deliberate one-device simulator.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Status&#039;&#039;&#039; || Shows &#039;&#039;&#039;Stopped&#039;&#039;&#039;, or &#039;&#039;&#039;Running&#039;&#039;&#039; with the active address, port and unit ID in green.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Start / Stop&#039;&#039;&#039; button (the toggle at the top of the right-hand toolbar) binds and unbinds the server. The bind address, port and unit ID can only be changed while the server is stopped. The server can be stopped and started again without restarting the application, and &#039;&#039;&#039;all register values are kept across a stop/start&#039;&#039;&#039; — they are only lost when you exit the application.&lt;br /&gt;
&lt;br /&gt;
=== Register Table ===&lt;br /&gt;
&lt;br /&gt;
A single grid shows one row per address, with every Modbus data table side by side and colour-coded:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Column group !! Contents !! Editable here&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Address&#039;&#039;&#039; || The zero-based Modbus protocol address (the same address for the whole row). || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Coil&#039;&#039;&#039; || Modbus reference (1…) and an on/off checkbox. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discrete&#039;&#039;&#039; || Discrete input reference (10001…) and an on/off checkbox. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Input&#039;&#039;&#039; || Input register reference (30001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || Yes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Holding&#039;&#039;&#039; || Holding register reference (40001…), a decimal value (0–65535) and a read-only &#039;&#039;&#039;Hex&#039;&#039;&#039; view. || Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Address&#039;&#039;&#039; is the zero-based protocol address; the &#039;&#039;&#039;Modbus Ref&#039;&#039;&#039; column in each group is the conventional reference number an operator would quote (for example coil 0 is reference 1, holding register 0 is reference 40001).&lt;br /&gt;
&lt;br /&gt;
All four tables are editable directly in this window — including discrete inputs and input registers, which a Modbus client is not allowed to write. This lets the server stand in for a real device whose inputs change. Values can be edited whether or not the server is running and whether or not a client is connected, which is useful for staging a test scenario in advance.&lt;br /&gt;
&lt;br /&gt;
Below the table, the &#039;&#039;&#039;Start address&#039;&#039;&#039; and &#039;&#039;&#039;Count&#039;&#039;&#039; fields choose which window of addresses is listed; click the tick button (Apply range) to apply them. Up to 2000 rows can be shown at once.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Zero registers&#039;&#039;&#039; button (eraser icon) on the toolbar opens a menu to clear the visible window for an individual table — Coils, Discrete Inputs, Input Registers or Holding Registers — or &#039;&#039;&#039;Zero All&#039;&#039;&#039; to clear every table at once.&lt;br /&gt;
&lt;br /&gt;
=== Activity Log ===&lt;br /&gt;
&lt;br /&gt;
Every change to a coil or register is written to the log at the bottom with a millisecond timestamp, whether it came from a connected client or from an operator edit in the window. The log keeps the most recent 400 lines. The two buttons beside it &#039;&#039;&#039;Save&#039;&#039;&#039; the log to a text file and &#039;&#039;&#039;Clear&#039;&#039;&#039; it.&lt;br /&gt;
&lt;br /&gt;
== Toolbar Buttons ==&lt;br /&gt;
&lt;br /&gt;
The vertical toolbar to the right of the register table provides, from top to bottom: &#039;&#039;&#039;Start / Stop&#039;&#039;&#039; the server, &#039;&#039;&#039;Open settings&#039;&#039;&#039;, &#039;&#039;&#039;Save settings&#039;&#039;&#039;, &#039;&#039;&#039;Zero registers&#039;&#039;&#039;, &#039;&#039;&#039;About&#039;&#039;&#039;, &#039;&#039;&#039;Licences&#039;&#039;&#039;, &#039;&#039;&#039;Help&#039;&#039;&#039; (opens this wiki page) and &#039;&#039;&#039;Close&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The connection settings (bind address, port and unit ID) are stored in a small XML file, by default &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt; beneath the application folder:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;config&amp;gt;&lt;br /&gt;
   &amp;lt;ip&amp;gt;0.0.0.0&amp;lt;/ip&amp;gt;&lt;br /&gt;
   &amp;lt;port&amp;gt;502&amp;lt;/port&amp;gt;&lt;br /&gt;
   &amp;lt;id&amp;gt;1&amp;lt;/id&amp;gt;&lt;br /&gt;
 &amp;lt;/config&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The default settings are loaded automatically at start-up. Use the &#039;&#039;&#039;Open settings&#039;&#039;&#039; and &#039;&#039;&#039;Save settings&#039;&#039;&#039; toolbar buttons to load or store a configuration from any location. If you change the settings and then close the application, you are prompted to save the changes first.&lt;br /&gt;
&lt;br /&gt;
== Headless (Service) Mode ==&lt;br /&gt;
&lt;br /&gt;
In addition to the interactive window, the Modbus Server can run headless as a background service. In this mode it loads the saved &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt;, binds the server with no user interface, and runs until the operating system asks it to stop (for example a service stop, console Ctrl-C, or system shutdown). The native install packages provide both a GUI launcher and a Service launcher for this purpose.&lt;br /&gt;
&lt;br /&gt;
== Using the Server and Client Together ==&lt;br /&gt;
&lt;br /&gt;
The Modbus Server and the [[ModbusClient|Modbus Client]] are designed to be used as a pair to exercise a Modbus link from both ends without any real hardware:&lt;br /&gt;
&lt;br /&gt;
# Start this server, choose a &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# In the [[ModbusClient]], set &#039;&#039;&#039;Server host&#039;&#039;&#039; to this machine (&amp;lt;code&amp;gt;127.0.0.1&amp;lt;/code&amp;gt; if both run on the same PC), set the matching &#039;&#039;&#039;port&#039;&#039;&#039; and &#039;&#039;&#039;unit ID&#039;&#039;&#039;, and press &#039;&#039;&#039;Connect&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;Client → Server:&#039;&#039;&#039; when the client edits a Coil or Holding Register, the value is written here and appears in this server&#039;s grid and activity log.&lt;br /&gt;
# &#039;&#039;&#039;Server → Client:&#039;&#039;&#039; edit any value here — including discrete inputs and input registers, which the client can only read — and the client&#039;s grid reflects it on its next poll.&lt;br /&gt;
&lt;br /&gt;
This makes the pair a complete bench setup: the server stands in for a device so you can develop or test a Modbus master, while the client stands in for a master so you can stage and inspect a device&#039;s data. This server can equally answer a real third-party Modbus/TCP master.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Permission denied&amp;quot; when starting&#039;&#039;&#039; — the chosen port is below 1024 (the default is 502) and the operating system requires elevated privileges to bind it. Use a port of 1024 or higher, such as 1502, or run with elevated privileges.&lt;br /&gt;
* &#039;&#039;&#039;A client&#039;s requests are rejected&#039;&#039;&#039; — the server answers only the configured &#039;&#039;&#039;Unit ID&#039;&#039;&#039;. Check the client is using the same unit ID shown in the connection bar.&lt;br /&gt;
* &#039;&#039;&#039;A startup warning about &amp;lt;code&amp;gt;sun.misc.Unsafe&amp;lt;/code&amp;gt;&#039;&#039;&#039; — harmless, and does not affect operation. The supplied start scripts suppress it; launching the jar directly may still print it.&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[ModbusClient]] — the client-side companion tool&lt;br /&gt;
* [[AutoLab4j]] — uses the same Modbus stack to read laboratory instruments&lt;br /&gt;
* [[SocketTest]] — a raw TCP/IP testing utility&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1839</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1839"/>
		<updated>2026-06-01T09:28:33Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpTransfer/releases SFTP-Transfer] || SFTP Send and Receive Automatically.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ZPL-Renderer/releases ZPL-Renderer] || Emulates a Zebra ZPL labeller.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/XML-Viewer/releases XML-Viewer] || Utility for viewing XML documents &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusServer/releases Modbus Server] || Modbus Server&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/TreeDoc/releases TreeDoc] || Easy way to create a document for directory structure&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LaunchPad/releases LaunchPad] || Menu system for Macos to replicate Launchpad&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1838</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1838"/>
		<updated>2026-06-01T09:27:49Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpTransfer/releases SFTP-Transfer] || SFTP Send and Receive Automatically.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ZPL-Renderer/releases ZPL-Renderer] || Emulates a Zebra ZPL labeller.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/XML-Viewer/releases XML-Viewer] || Utility for viewing XML documents &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusServer/releases Modbus Server] || Modbus Server&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/TreeDoc/releases TreeDoc] || Easy way to create a document for directory structure&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/LaunchPad/releases LaunchPad] || Menu system for Macos to replicate Launchpad&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1837</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1837"/>
		<updated>2026-06-01T09:26:18Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpTransfer/releases SFTP-Transfer] || SFTP Send and Receive Automatically.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ZPL-Renderer/releases ZPL-Renderer] || Emulates a Zebra ZPL labeller.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/XML-Viewer/releases XML-Viewer] || Utility for viewing XML documents &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusServer/releases Modbus Server] || Modbus Server&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/TreeDoc/releases TreeDoc] || Easy way to create a document for directory structure&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1836</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1836"/>
		<updated>2026-06-01T09:23:08Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpTransfer/releases SFTP-Transfer] || SFTP Send and Receive Automatically.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ZPL-Renderer/releases ZPL-Renderer] || Emulates a Zebra ZPL labeller.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/XML-Viewer/releases XML-Viewer] || Utility for viewing XML documents &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusServer/releases Modbus Server] || Modbus Server&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1835</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1835"/>
		<updated>2026-06-01T09:20:16Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ZPL-Renderer/releases ZPL-Renderer] || Emulates a Zebra ZPL labeller.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/XML-Viewer/releases XML-Viewer] || Utility for viewing XML documents &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusServer/releases Modbus Server] || Modbus Server&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/ModbusClient/releases Modbus Client] || Modbus Client&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1834</id>
		<title>Downloads</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Downloads&amp;diff=1834"/>
		<updated>2026-06-01T09:13:36Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Commander4j]]&lt;br /&gt;
[[Category:LabelServer4j]]&lt;br /&gt;
[[Category:AutoLab4j]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ GitHub Downloads&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J?tab=repositories All Projects] || Overview of all Projects &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j/releases Commander4j] || Commander4j Core Application &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-Middleware/releases Middleware4j] || Middleware for message translation to external systems&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-AutoLab/releases AutoLab4j] || Automatic Label Application triggered by MODBUS&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Commander4j-LabelServer/releases LabelServer4j] || Service to send Label Data to Labellers&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpSend/releases SFTP Send] || Utility to send files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/sftpGet/releases SFTP Get] || Utility to collect files automatically via SFTP&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/Menu4j/releases Menu4j] || Java Menu (tree) for launching applications and scripts&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/C4J/SocketTest/releases SocketTest] || TCP/IP Client for device comms and debugging&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=File:Modbus_256x256.png&amp;diff=1833</id>
		<title>File:Modbus 256x256.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=File:Modbus_256x256.png&amp;diff=1833"/>
		<updated>2026-05-26T13:23:06Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=Template:Menu_Applications&amp;diff=1832</id>
		<title>Template:Menu Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=Template:Menu_Applications&amp;diff=1832"/>
		<updated>2026-05-26T13:22:43Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: /* Applications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Applications=&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;8&amp;quot; style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
||[[File:Commander4j_256x256.png|link=[[Commander4j]]|100px]]&lt;br /&gt;
====[[Commander4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Middleware4j_256x256.png|link=[[Middleware4j]]|100px]]&lt;br /&gt;
====[[Middleware4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:AutoLab4j_256x256.png|link=[[AutoLab4j]]|100px]]&lt;br /&gt;
====[[AutoLab4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:LabelServer4j_256x256.png|link=[[LabelServer4j]]|100px]]&lt;br /&gt;
====[[LabelServer4j]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:Menu4j_256x256.png|link=[[Menu4j]]|100px]]&lt;br /&gt;
====[[Menu4j]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:sftpTransfer_256x256.png|link=[[SFTPTransfer]]|100px]]&lt;br /&gt;
====[[SFTPTransfer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:ZPLRenderer_256x256.png|link=[[ZPLRenderer]]|100px]]&lt;br /&gt;
====[[ZPLRenderer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SocketTest_256x256.png|link=[[SocketTest]]|100px]]&lt;br /&gt;
====[[SocketTest]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:TreeDoc_256x256.png|link=[[TreeDoc]]|100px]]&lt;br /&gt;
====[[TreeDoc]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:LaunchPad_256x256.png|link=[[LaunchPad]]|100px]]&lt;br /&gt;
====[[LaunchPad]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SFTGet4j_256x256.png|link=[[SFTPGet]]|100px]]&lt;br /&gt;
====[[SFTPGet]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:SFTPSend4j_256x256.png|link=[[SFTPSend]]|100px]]&lt;br /&gt;
====[[SFTPSend]]====&lt;br /&gt;
|-&lt;br /&gt;
||[[file:XMLViewer_256x256.png|link=[[XMLViewer]]|100px]]&lt;br /&gt;
====[[XMLViewer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Modbus_256x256.png|link=[[ModbusServer]]|100px]]&lt;br /&gt;
====[[ModbusServer]]====&lt;br /&gt;
|&lt;br /&gt;
||[[file:Modbus_256x256.png|link=[[ModbusClient]]|100px]]&lt;br /&gt;
====[[ModbusClient]]====&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=ZPLRenderer&amp;diff=1831</id>
		<title>ZPLRenderer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=ZPLRenderer&amp;diff=1831"/>
		<updated>2026-05-07T13:24:37Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: Updated by push_wiki.py&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ZPL Renderer is a desktop application that interprets ZPL (Zebra Programming Language) commands and renders them as a visual preview of what a label will look like when printed on a physical Zebra printer. It is a companion tool to Commander4j, LabelServer4j, and AutoLab4j.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
ZPL is a text-based command language used to define label layouts, text, graphics, and barcodes for Zebra label printers. The commands are sent directly to the printer as a stream of characters and are not human-readable. ZPL Renderer allows you to:&lt;br /&gt;
&lt;br /&gt;
* Load a ZPL file and see what the label will look like before sending it to a printer&lt;br /&gt;
* Listen on a network socket so that any application sending ZPL to that port renders the label on screen in real time&lt;br /&gt;
* Zoom in and out to examine label detail&lt;br /&gt;
* Preview multiple labels from a single ZPL stream&lt;br /&gt;
* Export the rendered label to PDF&lt;br /&gt;
* Print the rendered label directly from the application&lt;br /&gt;
&lt;br /&gt;
== Running ZPL Renderer ==&lt;br /&gt;
&lt;br /&gt;
Native install packages for Windows, macOS, and Linux are available from the [[Downloads]] page and are the preferred installation method.&lt;br /&gt;
&lt;br /&gt;
Alternatively, ZPL Renderer can be run directly from the distribution archive. It is a Java 25 desktop (Swing) application:&lt;br /&gt;
&lt;br /&gt;
 java -jar zplrenderer.jar&lt;br /&gt;
&lt;br /&gt;
On first launch it reads its configuration from &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Loading a ZPL File ==&lt;br /&gt;
&lt;br /&gt;
Use the &#039;&#039;&#039;Open&#039;&#039;&#039; toolbar button to load a &amp;lt;code&amp;gt;.zpl&amp;lt;/code&amp;gt; text file from disk. The label is rendered immediately. Use &#039;&#039;&#039;Refresh&#039;&#039;&#039; to reload the file after editing it externally.&lt;br /&gt;
&lt;br /&gt;
Several example ZPL files are included in the &amp;lt;code&amp;gt;examples/&amp;lt;/code&amp;gt; directory:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! File !! Contents&lt;br /&gt;
|-&lt;br /&gt;
| example1.zpl || Shipping label with QR code, text, and graphics&lt;br /&gt;
|-&lt;br /&gt;
| example2.zpl || Complex layout with boxes, barcodes, and logo&lt;br /&gt;
|-&lt;br /&gt;
| barcodes.zpl || Showcase of all supported barcode types&lt;br /&gt;
|-&lt;br /&gt;
| pallet_labels.zpl || Pallet label examples typical of Commander4j output&lt;br /&gt;
|-&lt;br /&gt;
| fonts.zpl || Font size and style demonstration&lt;br /&gt;
|-&lt;br /&gt;
| shipping.zpl || Shipping label sample&lt;br /&gt;
|-&lt;br /&gt;
| character.zpl || Character set reference&lt;br /&gt;
|-&lt;br /&gt;
| grid.zpl || Layout grid for alignment reference&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Network Socket Mode ==&lt;br /&gt;
&lt;br /&gt;
ZPL Renderer can listen on a TCP/IP port and render any ZPL label stream sent to it. This allows Commander4j, LabelServer4j, or any other application to use ZPL Renderer as a virtual printer — sending ZPL to the socket and seeing the result on screen instead of printing to paper.&lt;br /&gt;
&lt;br /&gt;
The default port is &#039;&#039;&#039;9100&#039;&#039;&#039; (the standard Zebra raw print port). The IP address and port are configured in &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt;. Enable listening using the &#039;&#039;&#039;Network&#039;&#039;&#039; button in the toolbar.&lt;br /&gt;
&lt;br /&gt;
ZPL Renderer extracts complete label blocks from the stream, identified by the standard &amp;lt;code&amp;gt;^XA&amp;lt;/code&amp;gt; (start of label) and &amp;lt;code&amp;gt;^XZ&amp;lt;/code&amp;gt; (end of label) delimiters.&lt;br /&gt;
&lt;br /&gt;
== REST API ==&lt;br /&gt;
&lt;br /&gt;
ZPL Renderer can also expose its rendering engine as a lightweight HTTP service. When REST mode is enabled, any application — including a web browser — can submit ZPL to ZPL Renderer over HTTP and receive back a rendered PNG, a multi-page ZIP of PNGs, or a multi-page PDF.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ZPL Renderer must be installed locally and the REST server must be toggled on for any of the URLs in this section to work.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Enabling REST Mode ===&lt;br /&gt;
&lt;br /&gt;
REST mode is controlled from the toolbar. Alongside the network socket controls, the toolbar provides:&lt;br /&gt;
&lt;br /&gt;
* a &#039;&#039;&#039;REST&#039;&#039;&#039; toggle button (disconnected icon when off, connected icon when on)&lt;br /&gt;
* a &#039;&#039;&#039;Port&#039;&#039;&#039; field (default &#039;&#039;&#039;8080&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Click the REST button to start the server on the chosen port. Click again to stop it. While the server is running, the port field is locked.&lt;br /&gt;
&lt;br /&gt;
A running REST server accepts requests on:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;/code&amp;gt; — a small HTML form for pasting ZPL by hand&lt;br /&gt;
* &amp;lt;code&amp;gt;http://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/render&amp;lt;/code&amp;gt; — the rendering endpoint&lt;br /&gt;
&lt;br /&gt;
=== Endpoints ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! URL !! Body / Parameters&lt;br /&gt;
|-&lt;br /&gt;
| GET || &amp;lt;code&amp;gt;/render?zpl=...&amp;lt;/code&amp;gt; || URL-encoded ZPL in the &amp;lt;code&amp;gt;zpl&amp;lt;/code&amp;gt; query parameter (suitable for short payloads or clickable links)&lt;br /&gt;
|-&lt;br /&gt;
| POST || &amp;lt;code&amp;gt;/render&amp;lt;/code&amp;gt; || Raw ZPL request body (any Content-Type other than form-encoded), read as ISO-8859-1&lt;br /&gt;
|-&lt;br /&gt;
| POST || &amp;lt;code&amp;gt;/render&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;application/x-www-form-urlencoded&amp;lt;/code&amp;gt; body with a &amp;lt;code&amp;gt;zpl&amp;lt;/code&amp;gt; field&lt;br /&gt;
|-&lt;br /&gt;
| GET || &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; || Returns a built-in HTML form for ad-hoc rendering in a browser&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Query Parameters ===&lt;br /&gt;
&lt;br /&gt;
All parameters are optional. Where a parameter is omitted, the value falls back to the GUI&#039;s current settings.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description !! Default&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dpi&amp;lt;/code&amp;gt; || Printer DPI (e.g. 203, 300, 600) || GUI setting&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;width&amp;lt;/code&amp;gt; || Label width || GUI setting&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;height&amp;lt;/code&amp;gt; || Label height || GUI setting&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;uom&amp;lt;/code&amp;gt; || Unit of measure: &amp;lt;code&amp;gt;cm&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;inch&amp;lt;/code&amp;gt; || GUI setting&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mag&amp;lt;/code&amp;gt; || Output magnification (1.0 = full DPI) || 1.0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;page&amp;lt;/code&amp;gt; || 1-indexed page selector (only used when &amp;lt;code&amp;gt;format=png&amp;lt;/code&amp;gt;) || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt; || Output format: &amp;lt;code&amp;gt;png&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;pdf&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;png&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Output Formats ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Format !! Content-Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;png&amp;lt;/code&amp;gt; || image/png || A single rendered label (the page selected by &amp;lt;code&amp;gt;page&amp;lt;/code&amp;gt;). Returns 404 if the page is out of range.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;zip&amp;lt;/code&amp;gt; || application/zip || All rendered labels packaged as &amp;lt;code&amp;gt;page_1.png&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;page_2.png&amp;lt;/code&amp;gt;, ...&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;pdf&amp;lt;/code&amp;gt; || application/pdf || All rendered labels in a single PDF (raster, one image per page).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Every successful response includes an &amp;lt;code&amp;gt;X-Total-Pages&amp;lt;/code&amp;gt; header reporting the number of labels found in the submitted ZPL.&lt;br /&gt;
&lt;br /&gt;
The server also adds permissive CORS headers (&amp;lt;code&amp;gt;Access-Control-Allow-Origin: *&amp;lt;/code&amp;gt;) so a web page served from anywhere can call the endpoint via JavaScript. &amp;lt;code&amp;gt;OPTIONS&amp;lt;/code&amp;gt; preflight requests are handled.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
The link below renders the contents of &amp;lt;code&amp;gt;examples/barcodes.zpl&amp;lt;/code&amp;gt; directly in a browser tab using the GET endpoint, with the ZPL inlined as a URL-encoded &amp;lt;code&amp;gt;zpl&amp;lt;/code&amp;gt; query parameter:&lt;br /&gt;
&lt;br /&gt;
* [http://127.0.0.1:8080/render?zpl=%5EXA%0A%5ELT0010%0A%5EFX%20EAN%208%0A%5ECF0%2C30%0A%5EFO120%2C10%5EFH%5EFDEAN%208_7e%5EFS%0A%5ECF0%2C25%0A%5EBY3%2C2%2C270%0A%5EFO50%2C40%5EB8N%2C100%2CY%2CN%5EFD1234567%5EFS%0A%0A%5EFX%20EAN%2013%0A%5ECF0%2C30%0A%5EFO550%2C10%5EFDEAN%2013%5EFS%0A%5ECF0%2C25%0A%5EBY3%2C2%2C270%0A%5EFO450%2C40%5EBEN%2C100%2CY%2CN%5EFD123456789012%5EFS%0A%0A%5EFX%20Interleaved%202%20of%205%0A%5ECF0%2C30%0A%5EFO100%2C220%5EFDInterleaved%202%20of%205%5EFS%0A%5ECF0%2C25%0A%5EBY3%2C2%2C290%0A%5EFO40%2C250%5EB2N%2C100%2CY%2CN%2CY%5EFD12345678%5EFS%0A%0A%5EFX%20Code%2039%0A%5ECF0%2C30%0A%5EFO550%2C220%5EFDCode%2039%5EFS%0A%5EFX%20Third%20section%20with%20bar%20code.%0A%5ECF0%2C25%0A%5EBY3%2C2%2C270%0A%5EFO400%2C250%5EB3N%2CY%2C100%2CY%2CN%5EFD12345678%5EFS%0A%0A%5EFX%20pdf%20417%0A%5ECF0%2C30%0A%5EFO170%2C410%5EFDPDF%20417%5EFS%0A%5EFX%20Third%20section%20with%20bar%20code.%0A%5ECF0%2C25%0A%5EBY2%2C2%2C100%0A%5EFO40%2C440%5EB7N%2C25%2C3%2C6%2C11%2CN%5EFD12345678%5EFS%0A%0A%5EFX%20Code%20128%0A%5ECF0%2C30%0A%5EFO540%2C600%5EFDCode%20128%5EFS%0A%5EFX%20Third%20section%20with%20bar%20code.%0A%5ECF0%2C25%0A%5EBY2%2C2%0A%5EFO460%2C630%0A%5EBCN%2C100%2CY%2CN%2CY%2CA%5EFD20250809ABC%5EFS%0A%0A%5EFX%20Code%2011%0A%5ECF0%2C30%0A%5EFO550%2C410%5EFDCode%2011%5EFS%0A%5EFX%20Third%20section%20with%20bar%20code.%0A%5EFO450%2C440%0A%5ECF0%2C25%0A%5EBY3%2C2%2C270%0A%5EB1N%2CN%2C100%2CY%2CN%5EFD12345678%5EFS%0A%0A%5EFX%20EAN%20128%0A%0A%5ECF0%2C30%0A%5EFO330%2C780%5EFDEAN%20128%5EFS%0A%5EFO80%2C810%0A%5EBY2%2C2%0A%5EBCN%2C100%2CY%2CN%2CY%2CN%0A%5ECF0%2C20%2C15%0A%5EFD%3E%3B%3E80207613036650397200715270131374752%3E8105212093365%5EFS%0A%0A%5EFX%20Aztec%0A%5ECF0%2C30%0A%5EFO160%2C980%5EFDAztec%5EFS%0A%5EFX%20Third%20section%20with%20bar%20code.%0A%5EFO140%2C1010%0A%5ECF0%2C25%0A%5EB0R%2C5%2CN%2C35%2CN%2C1%2C0%5EFDThis%20is%20a%20Test%20Barcode%5EFS%0A%0A%5EFT400%2C1120%0A%5EBQN%2C2%2C4%2CM%2C7%0A%5EFDMAhttps%3A%2F%2Fwww.commander4j.com%5EFS%0A%0A%5EXZ Render barcodes.zpl in your browser]&lt;br /&gt;
&lt;br /&gt;
To render the same file by uploading it as a POST body (more practical for large payloads), use any HTTP client. With &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 curl --data-binary @examples/barcodes.zpl \&lt;br /&gt;
      &amp;quot;http://127.0.0.1:8080/render?format=pdf&amp;quot; \&lt;br /&gt;
      -o barcodes.pdf&lt;br /&gt;
&lt;br /&gt;
For ad-hoc rendering without crafting a URL by hand, open the built-in form:&lt;br /&gt;
&lt;br /&gt;
* [http://127.0.0.1:8080/ http://127.0.0.1:8080/]&lt;br /&gt;
&lt;br /&gt;
== Zoom ==&lt;br /&gt;
&lt;br /&gt;
Use the zoom controls in the toolbar to scale the rendered label between 0.10× and 2.00×. The default zoom is configured in &amp;lt;code&amp;gt;config.xml&amp;lt;/code&amp;gt; (default: 0.5×). This is useful for examining barcode detail or checking overall label proportions.&lt;br /&gt;
&lt;br /&gt;
== Multiple Labels ==&lt;br /&gt;
&lt;br /&gt;
When a ZPL file or network stream contains multiple labels, ZPL Renderer displays them as pages. Navigation controls allow stepping through each label. The maximum number of pages displayed is configurable (default: 3).&lt;br /&gt;
&lt;br /&gt;
== Export and Print ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PDF Export&#039;&#039;&#039; — saves the rendered label as a vector PDF using Apache PDFBox&lt;br /&gt;
* &#039;&#039;&#039;Print&#039;&#039;&#039; — sends the rendered label to a system printer&lt;br /&gt;
&lt;br /&gt;
== Supported ZPL Commands ==&lt;br /&gt;
&lt;br /&gt;
ZPL Renderer supports over 100 ZPL commands. Key categories:&lt;br /&gt;
&lt;br /&gt;
=== Label Setup ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ^XA || Start of label&lt;br /&gt;
|-&lt;br /&gt;
| ^XZ || End of label&lt;br /&gt;
|-&lt;br /&gt;
| ^LL || Label length&lt;br /&gt;
|-&lt;br /&gt;
| ^LH || Label home (origin offset)&lt;br /&gt;
|-&lt;br /&gt;
| ^LT || Label top offset&lt;br /&gt;
|-&lt;br /&gt;
| ^PQ || Print quantity&lt;br /&gt;
|-&lt;br /&gt;
| ^CD || Change delimiter character&lt;br /&gt;
|-&lt;br /&gt;
| ^CC || Change caret character&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Text and Fields ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ^FO || Field origin (X,Y position from top-left)&lt;br /&gt;
|-&lt;br /&gt;
| ^FT || Field typeset (X,Y position from bottom-left)&lt;br /&gt;
|-&lt;br /&gt;
| ^FD || Field data (the text content)&lt;br /&gt;
|-&lt;br /&gt;
| ^FS || Field separator&lt;br /&gt;
|-&lt;br /&gt;
| ^FR || Field reverse (inverted colours)&lt;br /&gt;
|-&lt;br /&gt;
| ^FW || Field orientation/rotation&lt;br /&gt;
|-&lt;br /&gt;
| ^FX || Comment (ignored in output)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Fonts ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ^A0–^AZ || Select font by ID&lt;br /&gt;
|-&lt;br /&gt;
| ^CF || Change default alphanumeric font&lt;br /&gt;
|-&lt;br /&gt;
| ^CI || Change international character set/encoding&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ^GB || Graphic box (rectangle)&lt;br /&gt;
|-&lt;br /&gt;
| ^GC || Graphic circle&lt;br /&gt;
|-&lt;br /&gt;
| ^GD || Graphic diagonal line&lt;br /&gt;
|-&lt;br /&gt;
| ^GE || Graphic ellipse&lt;br /&gt;
|-&lt;br /&gt;
| ^GF || Graphic field (embedded image data)&lt;br /&gt;
|-&lt;br /&gt;
| ^GS || Graphic symbol&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Barcodes ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ^BC || Code 128 / GS1-128 (EAN-128)&lt;br /&gt;
|-&lt;br /&gt;
| ^BE || EAN-13&lt;br /&gt;
|-&lt;br /&gt;
| ^B8 || EAN-8&lt;br /&gt;
|-&lt;br /&gt;
| ^B3 || Code 39&lt;br /&gt;
|-&lt;br /&gt;
| ^B2 || Interleaved 2 of 5&lt;br /&gt;
|-&lt;br /&gt;
| ^B1 || Code 11&lt;br /&gt;
|-&lt;br /&gt;
| ^BQ || QR Code&lt;br /&gt;
|-&lt;br /&gt;
| ^B7 || PDF417&lt;br /&gt;
|-&lt;br /&gt;
| ^B0 / ^BO || Aztec&lt;br /&gt;
|-&lt;br /&gt;
| ^BY || Bar code field defaults (width, ratio, height)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Barcode rendering uses the OkapiBarcode library. GS1 application identifiers are interpreted from &amp;lt;code&amp;gt;xml/config/gs1_app_defs.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== config.xml ===&lt;br /&gt;
&lt;br /&gt;
Located at &amp;lt;code&amp;gt;xml/config/config.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Input folder || Default directory for ZPL file loading (default: &amp;lt;code&amp;gt;./examples&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| Port || Network socket port to listen on (default: 9100)&lt;br /&gt;
|-&lt;br /&gt;
| Default magnification || Starting zoom level (default: 0.5)&lt;br /&gt;
|-&lt;br /&gt;
| Max pages || Maximum number of label pages to display (default: 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== fonts.xml ===&lt;br /&gt;
&lt;br /&gt;
Located at &amp;lt;code&amp;gt;xml/config/fonts.xml&amp;lt;/code&amp;gt;, this file maps ZPL font IDs (0, A–Z) to TrueType font files and defines their pixel dimensions. This allows ZPL Renderer to simulate the fonts installed in a physical Zebra printer.&lt;br /&gt;
&lt;br /&gt;
Included fonts: Bitstream Vera, Anonymous Pro, ATTriumvirate.&lt;br /&gt;
&lt;br /&gt;
If your labels use fonts that differ from the defaults, edit &amp;lt;code&amp;gt;fonts.xml&amp;lt;/code&amp;gt; to match the font metrics of your target printer.&lt;br /&gt;
&lt;br /&gt;
== Relationship to Commander4j ==&lt;br /&gt;
&lt;br /&gt;
Commander4j generates ZPL label streams for pallet and case labels. ZPL Renderer allows you to preview these labels before deploying them to production printers, and to verify that label templates produce the correct output after making changes to the template syntax. See [[Label Template Syntax]] and [[Zebra ZPL Label]] for information on ZPL label authoring within Commander4j.&lt;br /&gt;
&lt;br /&gt;
See also: [[Zebra ZPL Label]], [[Label Template Syntax]], [[Printer Queues]], [[Production Lines &amp;amp; Labellers]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=File:SFTPTransfer.jpg&amp;diff=1830</id>
		<title>File:SFTPTransfer.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=File:SFTPTransfer.jpg&amp;diff=1830"/>
		<updated>2026-04-24T17:54:03Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
	<entry>
		<id>https://wiki.commander4j.com/index.php?title=SFTPTransfer&amp;diff=1829</id>
		<title>SFTPTransfer</title>
		<link rel="alternate" type="text/html" href="https://wiki.commander4j.com/index.php?title=SFTPTransfer&amp;diff=1829"/>
		<updated>2026-04-24T17:53:51Z</updated>

		<summary type="html">&lt;p&gt;Dgarratt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SFTPTransfer is a background file transfer service that moves files between a local filesystem and a remote SFTP server. It is a standalone Java application that runs either as a headless background service or as a desktop application with a minimal GUI, and supports both uploading (PUT) and downloading (GET) in independent threads.&lt;br /&gt;
&lt;br /&gt;
SFTPTransfer replaces the earlier sftpSend and sftpGet tools with a unified, configurable service.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
SFTPTransfer automates recurring file transfers between Commander4j and external systems — for example, uploading despatch notifications to a customer portal or downloading order files from a supplier. It runs continuously, polling for new files at a configurable interval, and handles authentication, retry, backup, and archiving without operator involvement.&lt;br /&gt;
&lt;br /&gt;
[[File:SFTPTransfer.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
== Startup Modes ==&lt;br /&gt;
&lt;br /&gt;
SFTPTransfer supports two startup modes selected at launch time:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mode !! Behaviour&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Start desktop&#039;&#039;&#039; || Opens a small GUI window. Transfer threads start in a paused state; the operator must click Start in the interface to begin polling. Useful for testing configuration.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Start service&#039;&#039;&#039; || Headless — no GUI window. Transfer threads start immediately on launch. Suitable for production deployment as a background service or scheduled task.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On Windows, the native install package includes &amp;lt;code&amp;gt;sftpTransfer_Service.exe&amp;lt;/code&amp;gt;, which manages the Windows service directly — see [[#Installing as a Windows Service|Installing as a Windows Service]] below. On Linux/macOS, use systemd, launchd, or nohup.&lt;br /&gt;
&lt;br /&gt;
== Configuration Files ==&lt;br /&gt;
&lt;br /&gt;
All configuration is held in XML files under the &amp;lt;code&amp;gt;xml/config/&amp;lt;/code&amp;gt; directory. Changes require a service restart unless hot-reload is triggered (see below).&lt;br /&gt;
&lt;br /&gt;
=== sftp_common.xml ===&lt;br /&gt;
&lt;br /&gt;
Shared settings used by all transfer threads:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Poll interval || How often (in seconds) each thread checks for new files. Default: 10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| Backup retention || Number of days to keep backed-up files before automatic deletion.&lt;br /&gt;
|-&lt;br /&gt;
| Log level || Logging verbosity passed to Log4j.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== sftp_put.xml ===&lt;br /&gt;
&lt;br /&gt;
Configures one or more PUT (upload) profiles. Each profile defines:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Enabled || Whether this profile&#039;s thread is active.&lt;br /&gt;
|-&lt;br /&gt;
| Local path || Local directory to watch for outbound files.&lt;br /&gt;
|-&lt;br /&gt;
| File mask || Wildcard pattern to match files (e.g. &amp;lt;code&amp;gt;*.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;order_*.csv&amp;lt;/code&amp;gt;). Uses Apache Commons IO WildcardFileFilter.&lt;br /&gt;
|-&lt;br /&gt;
| Remote host || SFTP server hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
| Remote port || SFTP port (default: 22).&lt;br /&gt;
|-&lt;br /&gt;
| Remote path || Target directory on the remote server.&lt;br /&gt;
|-&lt;br /&gt;
| Username || SFTP login username.&lt;br /&gt;
|-&lt;br /&gt;
| Password || AES-encrypted password (see [[#Password Encryption|Password Encryption]]).&lt;br /&gt;
|-&lt;br /&gt;
| Private key path || Path to SSH private key file (alternative to password authentication).&lt;br /&gt;
|-&lt;br /&gt;
| Backup path || Local directory where successfully uploaded files are moved.&lt;br /&gt;
|-&lt;br /&gt;
| Error path || Local directory where files that failed to upload are moved.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== sftp_get.xml ===&lt;br /&gt;
&lt;br /&gt;
Configures one or more GET (download) profiles. Each profile defines:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Setting !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Enabled || Whether this profile&#039;s thread is active.&lt;br /&gt;
|-&lt;br /&gt;
| Remote host || SFTP server hostname or IP address.&lt;br /&gt;
|-&lt;br /&gt;
| Remote port || SFTP port (default: 22).&lt;br /&gt;
|-&lt;br /&gt;
| Remote path || Directory on the remote server to poll for incoming files.&lt;br /&gt;
|-&lt;br /&gt;
| File mask || Wildcard pattern matched against the remote file listing (server-side ls).&lt;br /&gt;
|-&lt;br /&gt;
| Local path || Local directory where downloaded files are saved.&lt;br /&gt;
|-&lt;br /&gt;
| Username || SFTP login username.&lt;br /&gt;
|-&lt;br /&gt;
| Password || AES-encrypted password.&lt;br /&gt;
|-&lt;br /&gt;
| Private key path || Path to SSH private key file.&lt;br /&gt;
|-&lt;br /&gt;
| Delete after download || Whether to delete the remote file after successful download.&lt;br /&gt;
|-&lt;br /&gt;
| Backup path || Local directory where a copy of each downloaded file is kept.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== jsch_properties.xml ===&lt;br /&gt;
&lt;br /&gt;
Advanced SSH session parameters passed directly to the JSch library. Used to control host key checking, preferred algorithms, and connection timeouts. In most deployments this file can be left at its defaults.&lt;br /&gt;
&lt;br /&gt;
=== email_properties.xml ===&lt;br /&gt;
&lt;br /&gt;
SMTP settings for error notification emails. When a transfer failure occurs and email notification is enabled, SFTPTransfer sends an alert to the configured address. Fields include SMTP host, port, sender address, recipient address, and AES-encrypted SMTP password.&lt;br /&gt;
&lt;br /&gt;
== Installing as a Windows Service ==&lt;br /&gt;
&lt;br /&gt;
The native install package includes &amp;lt;code&amp;gt;sftpTransfer_Service.exe&amp;lt;/code&amp;gt;, a service-mode launcher built with install4j. This executable manages the Windows service directly — no additional wrapper is required.&lt;br /&gt;
&lt;br /&gt;
All service commands must be run from an elevated command prompt (Run as Administrator).&lt;br /&gt;
&lt;br /&gt;
The default Windows service name is &#039;&#039;&#039;sftpTransfer_Service&#039;&#039;&#039; (the launcher name defined in the installer). You can specify a different name as an optional second parameter — useful if you need to run multiple instances on the same machine. If a custom name is used at install time, that same name must be passed to every subsequent command.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Command !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /install&amp;lt;/code&amp;gt; || Register as &#039;&#039;&#039;sftpTransfer_Service&#039;&#039;&#039; with automatic startup on boot&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /install &amp;quot;My SFTP Service&amp;quot;&amp;lt;/code&amp;gt; || Register with a custom service name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /install-demand&amp;lt;/code&amp;gt; || Register with manual startup only&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /start&amp;lt;/code&amp;gt; || Start the service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /stop&amp;lt;/code&amp;gt; || Stop the service (waits for graceful shutdown)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /restart&amp;lt;/code&amp;gt; || Restart the service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /status&amp;lt;/code&amp;gt; || Query status (exit code: 0 = running, 3 = stopped)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Service.exe /uninstall&amp;lt;/code&amp;gt; || Remove the service registration&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If a custom service name was used at install time, append it to all subsequent commands:&lt;br /&gt;
&lt;br /&gt;
 sftpTransfer_Service.exe /start &amp;quot;My SFTP Service&amp;quot;&lt;br /&gt;
 sftpTransfer_Service.exe /stop &amp;quot;My SFTP Service&amp;quot;&lt;br /&gt;
 sftpTransfer_Service.exe /uninstall &amp;quot;My SFTP Service&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Once installed, the service also appears in the Windows Services management console (&amp;lt;code&amp;gt;services.msc&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Testing Before Installing as a Service ===&lt;br /&gt;
&lt;br /&gt;
The native install package also provides two alternatives for testing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Launcher !! Mode !! Use case&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer_Console.exe&amp;lt;/code&amp;gt; || Console (headless) || Runs the service logic in a visible console window — useful for watching log output during initial configuration&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sftpTransfer.exe&amp;lt;/code&amp;gt; || Desktop GUI || Opens the GUI window in Start desktop mode — transfer threads start paused, allowing configuration to be verified before enabling transfers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
SFTPTransfer supports two authentication methods, configured per profile:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Method !! How to configure&lt;br /&gt;
|-&lt;br /&gt;
| Password || Set the &amp;lt;code&amp;gt;Password&amp;lt;/code&amp;gt; field in the profile to an AES-encrypted value. Leave the private key path empty.&lt;br /&gt;
|-&lt;br /&gt;
| SSH private key || Set the &amp;lt;code&amp;gt;Private key path&amp;lt;/code&amp;gt; field to the path of a PEM-format private key file. The password field is ignored.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both methods use the JSch 2.x SSH library with Bouncy Castle as the cryptographic provider.&lt;br /&gt;
&lt;br /&gt;
=== Password Encryption ===&lt;br /&gt;
&lt;br /&gt;
Passwords stored in configuration files are AES-encrypted. Plain-text passwords are never stored on disk. To encrypt a password, use the password utility included with Commander4j (the same utility used for database passwords in Commander4j&#039;s own configuration).&lt;br /&gt;
&lt;br /&gt;
== File Transfer Behaviour ==&lt;br /&gt;
&lt;br /&gt;
=== PUT (Upload) ===&lt;br /&gt;
&lt;br /&gt;
# SFTPTransfer polls the local input directory every 10 seconds (configurable).&lt;br /&gt;
# Files matching the file mask are selected for upload.&lt;br /&gt;
# Each file is uploaded to the remote path using a temporary name with a &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; extension.&lt;br /&gt;
# On successful transfer, the remote file is renamed to its final name (atomic rename — the remote system never sees a partial file).&lt;br /&gt;
# The local source file is moved to the backup directory.&lt;br /&gt;
# If the transfer fails, the file is moved to the error directory and an error is logged.&lt;br /&gt;
&lt;br /&gt;
=== GET (Download) ===&lt;br /&gt;
&lt;br /&gt;
# SFTPTransfer lists the remote directory every 10 seconds (configurable).&lt;br /&gt;
# Files matching the file mask are selected for download.&lt;br /&gt;
# Each file is downloaded to the local path using a &amp;lt;code&amp;gt;.tmp&amp;lt;/code&amp;gt; extension.&lt;br /&gt;
# On successful download, the local file is renamed to its final name.&lt;br /&gt;
# If configured, the remote file is deleted after download.&lt;br /&gt;
# A backup copy is optionally saved to the local backup directory.&lt;br /&gt;
&lt;br /&gt;
== Thread Architecture ==&lt;br /&gt;
&lt;br /&gt;
When running, SFTPTransfer maintains the following threads:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Thread !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| TransferPUT || One thread per enabled PUT profile, each managing its own SFTP connection.&lt;br /&gt;
|-&lt;br /&gt;
| TransferGET || One thread per enabled GET profile, each managing its own SFTP connection.&lt;br /&gt;
|-&lt;br /&gt;
| EmailThread || Sends error notification emails asynchronously.&lt;br /&gt;
|-&lt;br /&gt;
| ArchiveThread || Periodically purges backup files older than the configured retention period.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hot Configuration Reload ==&lt;br /&gt;
&lt;br /&gt;
SFTPTransfer supports a configuration reload mode (&amp;lt;code&amp;gt;Mode_CONFIG_UPDATE&amp;lt;/code&amp;gt;). When this mode is triggered, running threads re-read their configuration files without requiring a full service restart. This allows profile changes — such as updating a remote path or rotating credentials — to be applied with minimal disruption.&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
All activity is written to the Log4j log file. The log records:&lt;br /&gt;
&lt;br /&gt;
* Service startup and configuration loaded&lt;br /&gt;
* Each thread starting and its profile settings&lt;br /&gt;
* Every file detected, transfer attempted, and outcome&lt;br /&gt;
* Every remote connection attempt and disconnect&lt;br /&gt;
* File move operations (to backup or error directories)&lt;br /&gt;
* Errors and exceptions with full context&lt;br /&gt;
&lt;br /&gt;
Log rotation and retention are configured in the Log4j configuration file included in the distribution.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Library !! Version !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| JSch || 2.27.9 || SSH/SFTP client&lt;br /&gt;
|-&lt;br /&gt;
| Bouncy Castle || current || Cryptographic provider for JSch&lt;br /&gt;
|-&lt;br /&gt;
| Apache Commons IO || current || WildcardFileFilter for local file matching&lt;br /&gt;
|-&lt;br /&gt;
| Log4j || 2.25.3 || Logging&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also: [[LabelServer4j]], [[Middleware4j]], [[Production Lines &amp;amp; Labellers]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Commander4j]]&lt;/div&gt;</summary>
		<author><name>Dgarratt</name></author>
	</entry>
</feed>