Determining Honeywell Maintenance Release numbers

If you use Honeywell’s Enterprise provisioner, their configuration tool, you need to use the settings file that matches the Android version and maintenance release number of the device you are using.

These settings files can be downloaded from the Honeywell software download site ( under Software and Tools, Device Management, Enterprise Provisioner, Provisioning Bundles.

A typical description of a bundle is: “EP Bundle to be used with Android 11 MR 04 Mobility Edge Devices”.

It’s easy enough to find out the version of Android in Settings, About, but where is the Maintenance Release number?

If you scroll to the bottom of the About screen you’ll see that the last entry is a Build number; for example 94.00.03 (0037).

The MR number is the last two number after the last period. In this case it’s MR3. Scroll down the file listing of provisioning bundles and you’ll see a file named HON660Settings_93-94.00.03.exe with a description of “EP Bundles to be used with Android 12 MR 03 Mobility Edge devices”.

Download this file and run it.  Start (or restart) Enterprise Provisioner and you can now select that setting file from the drop down list:




Upgrading a Honeywell CK75 Android version

First, download the operating system files, either GMS (Google Mobile Services) or Non-GMS from Honeywell’s FTP site. You’ll need to sign up for an account if you are not registered.

Navigate to Software, Computer Devices, Handheld, CK75 CN75 CN75e, Android 6, Current, Device Image, GMS (or Non-GMS). Download the file that has an “sd” in the  file name. You’ll need Honeywell’s Download Manager; there’s a link to it on the FTP page.

Unzip the files into a temporary folder. Insert a micro SD card into your PC and format it as FAT32. Copy the entire contents of the unzipped folder onto the root of the SD card. Power down the CK75 and open the back cover above he battery, there are three screws holding it down. Insert the micro SD card into the slot; refer to the manual if you need help with this.

Replace the cover, turn on the CK75 and place it into a powered dock. The files on the SD card will be detected on boot up, a Honeywell logo will display,  and after 8 minutes or so an animation appears on screen:

In another 4 minutes the CK75 will reboot to a Honeywell screen. In another 3 to 4 minutes the Android Welcome screen will appear and walk you through the initial set up. When this is done, power off the CK75 and remove the SD card.

Next, navigate to the same folder on Honeywell’s FTP server, but instead of GMS or Non-GMS select the CommonES folder and download the .zip file. This file contains updates to the Honeywell programs on the CK75. Connect the CK75 to your PC (refer to the manual if you don’t know how to do this) and copy the downloaded .zip file (don’t expand it) to IPSM\honeywell\autoinstall folder. You may have to create this last folder yourself.

Go to the main apps page on the CK75 and select AutoInstall. Make sure that AutoInstall is enabled, then click on “Packages upgrade”. You’ll see the various programs being updated. When complete, delete the .zip file from the \IPSM\honeywell\autoinstall folder. The package updater does not clean this up automatically and the upgrade will install on each boot unless you manually delete this file.

Connecting a Serial Scanner to a Honeywell VM3 running Windows 7

The VM3 manual tells you to go to Control Panel, Enterprise Settings, Data Collection to set this up, but there is no Enterprise Settings (formerly Intermec Settings) to select in the control panel.

To access Enterprise Settings, start File Manager and navigate to \Program Files(x86)\Intermec\IVA\bin and right click on the “Intermec Settings” program. Add a shortcut to your desktop and you’ll have access to the features described in the manual.

Note: Select ASCII as the scanner type for a serial scanner and match the baud rate, parity, data bits, and stop bits and you’ll be good to go. If not, make sure the Virtual Wedge is enabled; it’s the last choice in the main menu.

Determining if it’s Daylight Savings time in Fingerprint

Although the current revision of PC and PM printer firmware supports time zones, any time arithmetic in Fingerprint is done in Greenwich Mean time, so you have to adjust your numbers according to your time zone and if it’s Standard or Daylight Savings time.

For example, if it’s five o’clock local time in the Eastern Time zone and you want to calculate an expiration time two hours later, your result will be two hours earlier than the current time during Daylight Savings, and three hours during Standard time. This isn’t a big deal, you only have to add the time offset, but determining if it’s DST or not isn’t obvious.

There’s a function in the Fingerprint language, WEEKDAY that returns a number for the day of the week where Sunday is 1, Monday is 2, etc. So you can get the number of the first day in November,  subtract it (plus  one) from 7 to calculate the first Sunday in November, when DST ends:

zDST$ = “F”


zSTOPDAY$ = RIGHT$((“0” + STR$(7-A%+1)),2)

Likewise you can calculate when DST begins (the second Sunday in March)with the same function:


zSTARTDAY$ = RIGHT$((“0” + STR$(14-A%+1)),2)


Of course, Daylight Saving begins and ends at 2 in the morning, but the above should be sufficient for most applications.


IPL on a PX series vs a PM series, label length

IPL (Intermec Printer Language) never specified the length of a label, it relied on the user to format the data properly; if you went over the edge, it would happily print on the next label.

The new PM series printers behave differently. When you define a label size image memory is allocated based on those settings. Anything that falls outside those limits will get chopped off. IPL is now a Fingerprint program that runs on the PM43 so there is a conflict between the two languages on this label size issue.

Here’s the same data sent to a PX (top) and a PM printer (bottom):

This usually won’t be a problem if your labels are set up correctly and don’t run over the edge of the label. However, there’s an IPL command (<SI> L) that’s misnamed “Maximum Label Length” that sets the label length on the  PM and PC series running IPL. To quote from the IPL reference manual “Notes: The printer uses this number for detecting media faults. It does not use this
number to limit the image size of a format on the label.”

I think mapping this configuration command to set the label length is a bug, but I understand how this could happen. They way to get around this is to implement the “Ignore IPL” commands feature in the PM43.

To get the printer to ignore an IPL command you have to turn on this feature; the easiest way is through the web interface. Sign in as “itadmin” using “pass” as the password and click on the Configure tab, then the Languages link on the left, then IPL, and you’ll see the Commands Ignore pull down in the General Settings:

Enable Commands Ignore and press the Save button.

You can enable this from the front panel menu too. Go into Settings, down arrow to Languages, General Settings,  then enable Commands Ignore.

Enabling this will cause the printer to ignore these commands:

<SI> d  dark adjust

<SI>g media sensitivity

<SI>c cutter enable/disable

<SI>D end of print skip distance

<SI>F top of form set

<SI>f label rest point

<SI>L maximum label length

<SI>R label retract enable

<SI>r retract distance

<SI>t self strip enable/disable

<SI>W set label width

<SI>X label origin, X Y adjust

These commands are contained in a file named IGNCMDS.CFG in the /home/user/config/ipl folder. You can add any SI command you want ignored here, or you can delete the command that you still want the printer to respond to. Copy this file to your PC using and FTP client, edit it, then copy if back to the same folder.

Note: Loftware normally sent out the maximum label length configuration of 5 inches (<SI>L1000) with their compiled files or Print Server product when sending data to IPL printers. If you see your label length being reset to 5 inches, it’s likely that Lofware is the source of this IPL data string.


Writing Fingerprint to run on the PM and PX series, part 2

I mentioned in an earlier post that the Dir command (used to rotate images, text, and barcodes) works differently in the PM and PX series when applied to images. The PX series printer can only rotate an image by 180 degrees but the PM series can rotate images at 0, 90, 180, and 270 degrees. Here’s a label that prints an image using all four Dir parameters:

The way around this is to rotate your images (I like IRfanview) ahead of time and print all of your images at Dir 1 and both printer will behave the same.

While we’re on the subject of IRfanview, you can greatly reduce the size of your images by reducing them to 2 bits per pixel. Thermal and thermal transfer printers can only print in black or white, so anything beyond 2 bpp is a waste of space. For example, here’s an image that we had to use in a Fingerprint program:

At 16 bits per pixel this image used 2,718,478 bytes of storage. After conversion to 2 bits per pixel it was only 340,262 bytes, an almost 90% reduction in size with no loss of resolution.


Speeding up batch printing on an Intermec PM43

We recently wrote a Fingerprint application for a large snack food manufacturer. The application prompts the user for the item number they want to print and the number of labels. After printing a sample label for approval, the program prints the requested quantity. There are four different label formats, and the data for the label is retreived from a .CSV look up file.

We issue a “PRINT FEED” command for each label; the labels are serialized so each one is unique.

Here’s a video of the labels printing:   Video

Notice that the printer pauses after each label. On our next release we implemented the command “OPTIMIZE “BATCH” ON” with each of the label formats. According to the manual, this command means that “The program execution will not wait for the printing of the label to be completed, but proceeds executing next label image into the other of the two image buffers as soon as possible.”

The effect was to greatly speed up label printing: Video_1

Writing Fingerprint programs that run on the PM and PX series printers

I’m in the middle of a couple of these projects, so while the subject is fresh, I’ll note tips.

The PM series printer needs to have device names in lower case, and both the PX and PM series converts everything to upper case by default. The command to turn this off is SYSVAR(43)=1, so you can get the version of the printer and execute this command accordingly:

IF LEFT$(VERSION$(1),2) = “PM” THEN SYSVAR(43) = 1

The VERSION$(1) command returns the printer type: PM43, PX4, etc.

I’m converting a program that runs on a PX series to run on a PM. The users are used to pressing the “<” and “i” key to execute certain functions, but these keys are absent on the PM series. To get around this I copied the less than key image from the /usr/share/ui/images/fpapps folder on the PM43 and copied it into the /home/user/display folder and named it funckey_1.png. I then edited the image with Paint to create a custom “i” key and saved it as funkey_5.png.

Next, I executed the display key function if the printer was a PM series:


When the code executes, the display looks like this:

The less that and I key map to the F1 and F5 keys, but the display is friendly for the user. Note that the DISPLAY KEY2,0 through 4,0 hides the F2, F3, and F4 keys from the screen.

As I mentioned earlier, the PM series needs device names in lower case, so UART1: becomes uart1: and CONSOLE: becomes console:

Make all of your file names upper case and specify the path to make them compatible with both printers, so it’s /c/MYFILE.TXT.

We use the sound command to put timed delays into our code; a typical command: SOUND 20000,100. This doesn’t work with the PM series, it’s sound command is limited to 4 digits, so use SOUND 0,100 instead, This will run on both printers.

Intermec published a nice document on migrating to the PM series, you can find it here.

If you have images to print on your labels be aware the the DIR command works differently in the PM and PX series. The PM can rotate images in all four directions, the PX only by 180 degrees. The best practice is to use DIR1 on all images on your label and rotate the images themselves with an editor(such as IRFAN) as needed so you images will print out the same on both printers.


One last item that has nothing to do with this subject, but it is a Fingerprint topic. I was doing a program on a PC43 series printer using small cryo labels .5 inches long. After the label printed the label gap came to rest directly over the label sensor and the printer returned an out of media status when I queried it with ?PRSTAT.  No start/stop or label length commands could fix this so I used a PRSTAT(8) command instead and waited on a “next label not found error”,  a 132 to get around this issue. Saved a project.

How to print barcode labels from your program

Sometimes you need to print labels from a program you are writing. Here’s a few tricks to make that job easier.

You can develop a label format in its native language of IPL, ZPL, Direct Protocol, etc (there’s a bunch of them) but an easier method is to use a design tool, which are available for free from printer manufacturers and capture its output.  For Intermec printers you can download Bartender UltraLite from the Honeywell web site here. You’ll need to sign up to get an account and you’ll have to use their download tool, which works with Windows 7 but not 10.

Next, download the appropriate printer driver for your target printer. You can get these from the same Honeywell site or from Seagull Scientific.

Once you have the software and driver installed, use Bartender to design your label:

Print your label to check that it looks the way you want and you can then print your template to disk for later inclusion into your code.

Find the printer driver and open the Printer Properties page. Click on the Port Tab and change the Port to “File”:

Now print your label from Bartender again. A dialog box will pop up asking you for a file name and location to save the output. Once this is done you can open the file with a text editor and look at the data. The label above created this output file:

<xpml><page quantity=’0′ pitch=’50.8 mm’></xpml>’Seagull:2.1:DP
SYSVAR(48) = 0
OPEN “tmp:setup.sys” FOR OUTPUT AS #1
SETUP “tmp:setup.sys”
KILL “tmp:setup.sys”
<xpml></page></xpml><xpml><page quantity=’1′ pitch=’50.8 mm’></xpml>CLL
BARSET “CODE128C”,2,1,6,203
PB “12345678”
PP474,495:NASC 1252
FT “Dutch 801 Roman BT”
PT “12345678”
PP325,297:PT “Sample Text”

You can get rid of of the overhead and just keep the portion that actually prints the label:

BARSET “CODE128C”,2,1,6,203
PB “12345678”
PP474,495:NASC 1252
FT “Dutch 801 Roman BT”
PT “12345678”
PP325,297:PT “Sample Text”

You can replace the two fixed text fields “12345678” and “Sample Text” with variable names and include it in your code.

You can test print the small file above by making an FTP connection from a command line to the printer and use PUT to sendthe label format to location PR1. As an example:

One label printer after the PUT command. Hope this helps.

How to connect an Intermec printer to a PLC

One thing I can say with confidence about Intermec printers is that they are the most versatile on the market. Intermec printers can run user developed programs and they have a wide variety of add on options.

I recently did a job for a medical manufacturer who wanted to control label printing from a Programmable Logic Controller (PLC).  They use Bartender to send the label data and needed the printer to print one label each time the PLC fires a relay.

Intermec offers an industrial I/O board for their PX and PM series of printers (1-971143-800 and 270-192-001, respectively) that have 8 sense inputs, 8 optocoupler out ports, and 4 relay ports. The manual is here.

I used a Fingerprint program and an I/O board to connect their PX6 printers to a PLC.

When the program starts it turns on a relay that is used as a “ready” signal to the PLC indicating that it’s ready for a new job.

A fingerprint program then receives label data from Bartender on the Centronics port, filters out unneeded data and writes the label to disk.  The program then turns the  “ready” relay off, indicating that to the PLC that a job is running.

If an error occurs (out of labels, ribbons, etc.) another relay is closed to flag the PLC of the error condition and the specific error is displayed by the printer for the user’s intervention.

The program monitors one of the sense input ports and prints one label when it detects voltage on that pair (10V to 40V). The setup during testing looked like this:

The industrial I/O board uses a 44 pin high density connector for the inputs and relay pairs. We used the red pair of wires and a 24 volt power supply to simulate the PLC output, the black pair was “ready”,  and the white pair was the error indicator. I used a serial port to connect to Bartender because I didn’t have a Centronics port available. We could have used any port, Ethernet, USB, serial, or parallel to receive the label data from Bartender.