17 Aug 2021 - tsp
Last update 11 Oct 2021
9 mins
Disclaimer / Warning: Please note that this page is in no way associated with Gamma vacuum. Everything here has been discovered while hacking around with their product and might also be totally wrong, only partially complete or inaccurate. It just worked for us.
This is a short blog post that describes on how to talk to Gamma vacuum ion pump controllers (in particular their QPC quad pump controller) using Ethernet to query parameters and adjust settings. Particularly we’re using this to monitor the pressure inside a vacuum chamber that has no additional pressure gauge.
There is some official documentation on the used protocol in some manuals - but that’s mainly oriented towards the serial (RS232 or RS485 / modbus) interface. To help ourself with development (and provide some kind of documentation for hacking around later on) I decided to write down our collected - incomplete - information.
As one can see they applied somehow everything required for a stable serial link though not being the most beautiful ASCII based protocol (I personally do prefer binary protocols so that doesn’t mean much):
0x7E
) that
is used by the client to detect a potential packet start. This symbol does not
occur anywhere except on packet start.0x0D
. After the system
has received the start of packet and end of packet marker it tries to verify
the checksum that’s built by simply summing all bytes (in binary notation).This protocol can be used either on RS232 or ModBus - in case of ModBus the configuration of the unit address is crucial. Any malformed packets are simply ignored by the device.
Length | Content | Description |
---|---|---|
1 Byte | Start character | Always 0x7E |
1 Byte | Space | Always 0x20 |
2 Byte | Address | Address of the device on the serial bus (RS485 / Modbus). 2 Hexadecimal ASCII characters. |
1 Byte | Space | Always 0x20 |
2 Byte | Command | 2 Hexadecimal ASCII characters |
1 Byte | Space | Always 0x20 |
optional | Data fields | Data payload, always terminated by 0x20 |
2 Byte | Checksum | Add all fields exclude start, checksum and terminator modulo 256 - simply add and ignore overflow |
1 Byte | Terminator | 0x0D |
Length | Content | Description |
---|---|---|
2 Byte | Address | Address of the remote unit |
1 Byte | Space | Always 0x20 |
2 Byte | Status | Literals OK or ER |
1 Byte | Space | Always 0x20 |
2 Byte | Response code | 2 Hex characters |
1 Byte | Space | Always 0x20 |
optional | Data fields | Data payload, always terminated by 0x20 |
2 Byte | Checksum | Add all fields exclude checksum and terminator modulo 256 - simply add and ignore overflow |
1 Byte | Terminator | 0x0D |
The documentation for the Telnet protocol is not that good but orients itself
at the serial protocol. It misses all of the synchronization patterns (Start
character) as well as the checksums - it relies on TCP for that. It’s built
around an interactive Telnet-like session without Telnet features. It’s just
a TCP connection that shows an greater than sign >
with code 0x3E
whenever it accepts input. All commands seem to be prefixed by spc
- which
seems to stand for single pump controller - even for their quad pump controller.
This has been the hard part to decode. Despite of this one can use the same
commands as over the serial interface:
Command | Meaning | Sample request | Sample response | Comments |
---|---|---|---|---|
0x01 | Get Model Number | spc 01 |
OK 00 DIGITEL QPC |
Just some identification for the model |
0x02 | Get firmware version | spc 02 |
OK 00 FIRMWARE VERSION: 1.38 |
Identifies the firmware running on the pump controller |
0x07 | Master reset | spc 07 |
Not tried yet | Performs a full software reset |
0xFF | Legacy master reset | spc FF |
Not tried yet | Performs a full software reset |
0x91 | Set arc detect | spc 91 1 YES |
OK 00 |
Sets the arc detection mode |
0x92 | Get arc detect | spc 92 1 |
OK 00 YES |
Gets the arc detection mode (yes or no) |
0x0A | Get current | spc 0A 1 |
OK 00 1.4E-06 AMPS |
Reads the current currently flowing through the pump |
0x0B | Read pressure | spc 0B 1 or spc 0B 2 |
OK 00 1.6E-08 MBAR |
Gets the pressure reading calculated from the flowing current |
0x0C | Read voltage | spc 0C 1 |
OK 00 6970 |
Gets the current applied voltage in volts (in the sample nearly 7 kV) |
0x0D | Read supply status | spc 0D 1 |
OK 00 RUNNING 00 or for example OK 00 PUMP ERROR 00 |
A human readable string that’s also shown on the pump controller itself |
0x0E | Set pressure units | spc 0E M |
OK 00 |
Sets the unit to be used for pressure (M is millibars, T is torr, P pascal) |
0x11 | Get pump size | spc 11 1 |
OK 00 100 L/S |
Reads the configured pump size. |
0x1D | Get calibration factor | spc 1D 1 |
OK 00 1.00 |
Reads the calibration factor for pressure estimation |
0x33 | Set auto-restart | spc 33 1 YES |
OK 00 |
Sets auto restart enabled or disabled |
0x34 | Get auto-restart | spc 34 1 |
OK 00 YES |
Gets auto restart status |
0x37 | Start pump | spc 37 1 |
OK 00 |
Starts the specified pump |
0x38 | Stop pump | spc 38 1 |
OK 00 |
Stops the specified pump |
The get model number command can be used to identify the type of the ion pump controller.
spc 01
followed by a carriage return 0x0d
OK 00 DIGITEL QPC
followed by two carriage returns
and one linefeed (0x0d 0x0d 0x0a
) - it seems someone just takes the
response message from the serial port and appends an 0x0d 0x0a
at
the end.
OK
)00
The get firmware version command identifies the installed firmware.
spc 02
followed by a carriage return 0x0d
OK 00 FIRMWARE VERSION: 1.38
Since I personally don’t know if this format might change in future my library tries to parse the last argument as MAJOR.MINOR version pair but also keeps the strings - the version is not checked by my personal implementations.
There are two firmware reset commands available - the legacy one 0xFF
does
exactly the same thing but is a remaining opcode from some older protocol
versions.
spc 07
followed by a carriage return 0x0d
OK 00
This enables or disabled arcing detection of the pump. If arc protection is enabled the ion pump controller reduces the voltage of the pump during arcing. It should usually be enabled.
spc 91 1 YES
followed by a carriage returnOK 00
Tells the status of arc detection (see above for a general description).
spc 92 1
OK 00 YES
Reads pressure of the specified pump. The data field is the index of the
pump (for example 1
or 2
)
spc 0B 1
followed by a carriage return 0x0d
(or
for example spc 0B 2
for the second pump)OK 00 1.6E-08 MBAR
.
OK
with code 00
1.6E-08
)MBAR
)I’ve built a small Python module that’s also used by our labs environmental monitoring system to log data (and then visualize using Grafana). This module including an example program is available as a GitHub GIST.
In addition to this module an object oriented version has been developed that also includes a mini CLI utility for remote control of the QPC that’s also available on GitHub
This article is tagged:
Dipl.-Ing. Thomas Spielauer, Wien (webcomplains389t48957@tspi.at)
This webpage is also available via TOR at http://rh6v563nt2dnxd5h2vhhqkudmyvjaevgiv77c62xflas52d5omtkxuid.onion/