Project:TecanWireProtocolProject
From London Hackspace Wiki
The aim of this project is to understand the Tecan wire protocol so we can control the robot using a python app.
Source code will be here https://github.com/london-biohackers/python-tecan-genesis
Aims of the project are
connect to the machine over serial from python (hardware handshake etc)
$ python tecan_stuffs.py The Tecan Reports FIRMWARE version: AYM1@GENESIS-V1.61-07/2001A
initialize the machine
This requires to send the firmware command to the Roma "PIA" position initialization, and then send "PIS" to the main initialization
$ python tecan_stuffs.py init Initialization complete
- read the current position of the Liha (liquid handling module and tips)
- this is kinda working.
- read the current position of the Roma
- this is kinda working.
control the Lihi- this is kinda working.
control the RoMa- this is kinda working.
- handle collision condition from robot
We used portmon to dump the data from the serial port
59 0.00000335 RSPDRV.exe IRP_MJ_CLEANUP Serial0 SUCCESS 60 0.01551789 RSPDRV.exe IRP_MJ_CLOSE Serial0 SUCCESS 61 0.00006453 RSPDRV.exe IRP_MJ_CREATE Serial0 SUCCESS Options: Open 62 0.00000782 RSPDRV.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR 63 0.00000279 RSPDRV.exe IRP_MJ_FLUSH_BUFFERS Serial0 SUCCESS 64 0.00000335 RSPDRV.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR 65 0.00000223 RSPDRV.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial0 SUCCESS InSize: 2048 OutSize: 2048 66 0.00000223 RSPDRV.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS 67 0.00000251 RSPDRV.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS 68 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS 69 0.00000223 RSPDRV.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS 70 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS 71 0.00000168 RSPDRV.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS 72 0.00000168 RSPDRV.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS 73 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS 74 0.00000810 RSPDRV.exe IOCTL_SERIAL_SET_BAUD_RATE Serial0 SUCCESS Rate: 9600 75 0.00000559 RSPDRV.exe IOCTL_SERIAL_SET_RTS Serial0 SUCCESS 76 0.00000419 RSPDRV.exe IOCTL_SERIAL_SET_DTR Serial0 SUCCESS 77 0.00000363 RSPDRV.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 78 0.00000223 RSPDRV.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 79 0.00000363 RSPDRV.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:1 Replace:40 XonLimit:2048 XoffLimit:512 80 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_TIMEOUTS Serial0 SUCCESS 81 0.00000196 RSPDRV.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:10 RM:0 RC:0 WM:0 WC:0 82 0.00000335 RSPDRV.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR 83 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_BAUD_RATE Serial0 SUCCESS 84 0.00000168 RSPDRV.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial0 SUCCESS 85 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_CHARS Serial0 SUCCESS 86 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_HANDFLOW Serial0 SUCCESS 87 0.20741267 RSPDRV.exe IRP_MJ_READ Serial0 TIMEOUT Length 14: 02 40 41 31 03 31 02 51 41 31 40 38 03 58 88 0.00004163 RSPDRV.exe IRP_MJ_WRITE Serial0 SUCCESS Length 10: 02 41 41 31 52 4E 54 31 03 49 89 0.00003185 RSPDRV.exe IRP_MJ_WRITE Serial0 SUCCESS Length 6: 02 40 41 31 03 31 90 0.07780346 RSPDRV.exe IRP_MJ_READ Serial0 TIMEOUT Length 34: 02 40 4D 31 03 3D 02 53 4D 31 40 47 45 4E 45 53 49 53 2D 56 31 2E 36 31 2D 30 37 2F 32 30 30 31 03 4B 91 0.00484363 RSPDRV.exe IRP_MJ_WRITE Serial0 SUCCESS Length 10: 02 43 4D 31 52 46 56 30 03 4C 92 0.00003129 RSPDRV.exe IRP_MJ_WRITE Serial0 SUCCESS Length 6: 02 40 4D 31 03 3D 93 65.24853773 RSPDRV.exe IRP_MJ_READ Serial0 TIMEOUT Length 14: 02 40 4D 31 03 3D 02 54 4D 31 40 31 03 58 94 0.00004777 RSPDRV.exe IRP_MJ_WRITE Serial0 SUCCESS Length 12: 02 44 4D 31 52 53 44 30 2C 31 03 51 95 0.00002766 RSPDRV.exe IRP_MJ_WRITE Serial0 SUCCESS Length 6: 02 40 4D 31 03 3D 96 0.06222886 RSPDRV.exe IRP_MJ_READ Serial0 TIMEOUT Length 14: 02 40 41 31 03 31 02 52 41 31 40 38 03 5B
hardware handshake
Stop bits: 1 Parity : None Word len : 8 Speed : ?
77 0.00000363 RSPDRV.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial0 SUCCESS StopBits: 1 Parity: NONE WordLength: 8 78 0.00000223 RSPDRV.exe IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13 79 0.00000363 RSPDRV.exe IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:1 Replace:40 XonLimit:2048 XoffLimit:512 80 0.00000196 RSPDRV.exe IOCTL_SERIAL_GET_TIMEOUTS Serial0 SUCCESS 81 0.00000196 RSPDRV.exe IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:10 RM:0 RC:0 WM:0 WC:0 82 0.00000335 RSPDRV.exe IOCTL_SERIAL_PURGE Serial0 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
message format
each message seems to be a STX terminated by a ETX and a xor of the message bytes appended as an error detection;
96 0.06222886 RSPDRV.exe IRP_MJ_READ Serial0 TIMEOUT Length 14: 02 40 41 31 03 31 02 52 41 31 40 38 03 5B 02 <---- STX byte 40 41 31 <---- MESSAGE bytes 03 <---- ETX byte 31 <---- some sort of xor check looks like (byte1 xor byte2 xor Byte3 +1) 02 52 41 31 40 38 03 5B