binary module

BinaryCommand

class zaber.serial.BinaryCommand(device_number, command_number, data=0, message_id=None)

Bases: object

Models a single command in Zaber’s Binary protocol.

device_number

An integer representing the number (a.k.a. address) of the device to which to send the command. A device number of 0 indicates the command should be executed by all devices. 0-255.

command_number

An integer representing the command to be sent to the device. Command numbers are listed in Zaber’s Binary Protocol Manual. 0-255.

data

The data value to be transmitted with the command.

message_id

The message ID of the command. 0-255, or None if not present.

Parameters:
  • device_number – An integer specifying the number of the target device to which to send this command. 0-255.
  • command_number – An integer specifying the command to be sent. 0-255.
  • data – An optional integer containing the data value to be sent with the command. When omitted, data will be set to 0.
  • message_id – An optional integer specifying a message ID to give to the message. 0-255, or None if no message ID is to be used.
Raises:

ValueError – An invalid value was passed.

encode()

Encodes a 6-byte byte string to be transmitted to a device.

Returns:A byte string of length 6, formatted according to Zaber’s Binary Protocol Manual.

BinaryDevice

class zaber.serial.BinaryDevice(port, number)

Bases: object

A class to represent a Zaber device in the Binary protocol.

port

A BinarySerial object which represents the port to which this device is connected.

number

The integer number of this device. 1-255.

Parameters:
  • port – A BinarySerial object to use as a parent port.
  • number – An integer between 1 and 255 which is the number of this device.
Raises:

ValueError – The device number was invalid.

get_status()

Sends the “Return Status” command (54), and returns the result.

Returns:An integer representing a status code, according to Zaber’s Binary Protocol Manual.
home()

Sends the “home” command (1), then waits for the device to reply.

Returns: A BinaryReply containing the reply received.

move_abs(position)

Sends the “move absolute” command (20), then waits for the device to reply.

Parameters:position – The position in microsteps to which to move.

Returns: A BinaryReply containing the reply received.

move_rel(distance)

Sends the “move relative” command (21), then waits for the device to reply.

Parameters:distance – The distance in microsteps to which to move.

Returns: A BinaryReply containing the reply received.

move_vel(speed)

Sends the “move at constant speed” command (22), then waits for the device to reply.

Parameters:speed – An integer representing the speed at which to move.

Notes

Unlike the other “move” commands, the device replies immediately to this command. This means that when this function returns, it is likely that the device is still moving.

Returns: A BinaryReply containing the reply received.

send(*args)

Sends a command to this device, then waits for a response.

Parameters:*args – Either a single BinaryCommand, or 1-3 integers specifying, in order, the command number, data value, and message ID of the command to be sent.

Notes

The ability to pass integers to this function is provided as a convenience to the programmer. Calling device.send(2) is equivalent to calling device.send(BinaryCommand(device.number, 2)).

Note that in the Binary protocol, devices will only reply once they have completed a command. Since this function waits for a reply from the device, this function may block for a long time while it waits for a response. For the same reason, it is important to set the timeout of this device’s parent port to a value sufficiently high that any command sent will be completed within the timeout.

Regardless of the device address specified to this function, the device number of the transmitted command will be overwritten with the number of this device.

If the command has a message ID set, this function will return a reply with a message ID. It does not check whether the message IDs match.

Raises:UnexpectedReplyError – The reply read was not send by this device.

Returns: A BinaryReply containing the reply received.

stop()

Sends the “stop” command (23), then waits for the device to reply.

Returns: A BinaryReply containing the reply received.

BinaryReply

class zaber.serial.BinaryReply(reply, message_id=False)

Bases: object

Models a single reply in Zaber’s Binary protocol.

device_number

The number of the device from which this reply was sent.

command_number

The number of the command which triggered this reply.

data

The data value associated with the reply.

message_id

The message ID number, if present, otherwise None.

Parameters:
  • reply – A byte string of length 6 containing a binary reply encoded according to Zaber’s Binary Protocol Manual.
  • message_id – True if a message ID should be extracted from the reply, False if not.

Notes

Because a Binary reply’s message ID truncates the last byte of the data value of the reply, it is impossible to tell whether a reply contains a message ID or not. Therefore, the user must specify whether or not a message ID should be assumed to be present.

Raises:TypeError – An invalid type was passed as reply. This may indicate that a unicode string was passed instead of a binary (ascii) string.
encode()

Returns the reply as a binary string, in the form in which it would appear if it had been read from the serial port.

Returns:A byte string of length 6 formatted according to the Binary Protocol Manual.

BinarySerial

class zaber.serial.BinarySerial(port, baud=9600, timeout=5, inter_char_timeout=0.01)

Bases: object

A class for interacting with Zaber devices using the Binary protocol.

This class defines a few simple methods for writing to and reading from a device connected over the serial port.

Creates a new instance of the BinarySerial class.

Parameters:
  • port – A string containing the name of the serial port to which to connect.
  • baud – An integer representing the baud rate at which to communicate over the serial port.
  • timeout – A number representing the number of seconds to wait for a reply. Fractional numbers are accepted and can be used to specify times shorter than a second.
  • inter_char_timeout – A number representing the number of seconds to wait between bytes in a reply. If your computer is bad at reading incoming serial data in a timely fashion, try increasing this value.

Notes

This class will open the port immediately upon instantiation. This follows the pattern set by PySerial, which this class uses internally to perform serial communication.

Raises:TypeError – The port argument passed was not a string.
baudrate

The baud rate at which to read and write.

The default baud rate for the Binary protocol is 9600. T-Series devices are only capable of communication at 9600 baud. A-Series devices can communicate at 115200, 57600, 38400, 19200, and 9600 baud.

Note that this changes the baud rate of the computer on which this code is running. It does not change the baud rate of connected devices.

close()

Closes the serial port.

flush()

Flushes the buffers of the underlying serial port.

open()

Opens the serial port.

read(message_id=False)

Reads six bytes from the port and returns a BinaryReply.

Parameters:message_id – True if the response is expected to have a message ID. Defaults to False.
Returns:A BinaryCommand containing all of the information read from the serial port.
Raises:zaber.serial.TimeoutError – No data was read before the specified timeout elapsed.
timeout

The number of seconds to wait for input while reading.

The timeout property accepts floating point numbers for fractional wait times.

write(*args)

Writes a command to the port.

This function accepts either a BinaryCommand object, a set of integer arguments, a list of integers, or a string. If passed integer arguments or a list of integers, those integers must be in the same order as would be passed to the BinaryCommand constructor (ie. device number, then command number, then data, and then an optional message ID).

Parameters:*args – A BinaryCommand to be sent, or between 2 and 4 integer arguements, or a list containing between 2 and 4 integers, or a string representing a properly-formatted Binary command.

Notes

Passing integers or a list of integers is equivalent to passing a BinaryCommand with those integers as constructor arguments.

For example, all of the following are equivalent:

>>> write(BinaryCommand(1, 55, 1000))
>>> write(1, 55, 1000)
>>> write([1, 55, 1000])
>>> write(struct.pack("<2Bl", 1, 55, 1000))
>>> write('\x01\x37\xe8\x03\x00\x00')
Raises:
  • TypeError – The arguments passed to write() did not conform to the specification of *args above.
  • ValueError – A string of length other than 6 was passed.