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