pyvisa / pyvisa-py

A pure python PyVISA backend
https://pyvisa-py.readthedocs.io
MIT License
285 stars 122 forks source link

Vxi11 fails to decode buffer value returned by an instrument (BK9100) #356

Closed tristanlorriaux closed 1 year ago

tristanlorriaux commented 1 year ago

Hi there 🚀,

The error :

We encounter a major bug with pyvisa-py. Here are the different pyvisa first commands in iPython :

$ import pyvisa as visa $ rm = visa.ResourceManager('@py') $ bk = rm.open_resource('TCPIP0::192.168.0.133::inst0::INSTR')

Then $ bk.query('*IDN?') works and returns :

OUT: 'B&K PRECISION,9185B,508H19110,0.09\r\n'

which is our instrument. But, when we query $ bk.query('MEAS:CURR?'), it fails.

To be more explicit, the $ bk.write('MEAS:CURR?') or for instance $ bk.write('OUT?') work and return with debug mode ($visa.log_to_screen()) :

$ bk.write('MEAS:VOLT?')

2023-02-16 15:00:13,318 - pyvisa - DEBUG - Make call 11, (12984800, 2000, 10000, 8, b'MEAS:VOLT?\r\n'), <bound method Vxi11Packer.pack_device_write_parms of <pyvisa_py.protocols.vxi11.Vxi11Packer object at 0x000001ed1758a3d8>>, <bound method Vxi11Unpacker.unpack_device_write_resp of <pyvisa_py.protocols.vxi11.Vxi11Unpacker object at 0x000001ed1758a410>>
b"\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x07\xaf\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6!\xe0\x00\x00\x07\xd0\x00\x00'\x10\x00\x00\x00\x08\x00\x00\x00\x0cMEAS:VOLT?\r\n"
2023-02-16 15:00:13,318 - pyvisa - DEBUG - Sending record through <socket.socket fd=9856, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.14', 57717), raddr=('192.168.0.133', 49155)>: b"\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x07\xaf\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6!\xe0\x00\x00\x07\xd0\x00\x00'\x10\x00\x00\x00\x08\x00\x00\x00\x0cMEAS:VOLT?\r\n"
2023-02-16 15:00:13,318 - pyvisa - DEBUG - RawTCPClient: procedure type 11
2023-02-16 15:00:13,318 - pyvisa - DEBUG - received b'\x80\x00\x00 '
2023-02-16 15:00:13,318 - pyvisa - DEBUG - received b'\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c'
2023-02-16 15:00:13,318 - pyvisa - DEBUG - Received record through <socket.socket fd=9856, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.14', 57717), raddr=('192.168.0.133', 49155)>: bytearray(b'\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c')
b'\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c'

OUT : 12

But if we read(), raw_read(), read_ascii_values(), read_binary_values(), read_bytes(), it fails and return the EOF error :

2023-02-16 15:00:20,168 - pyvisa - DEBUG - TCPIP0::192.168.0.133::inst0::INSTR - reading 20480 bytes (last status <StatusCode.success_max_count_read: 1073676294>)
20480
2023-02-16 15:00:20,168 - pyvisa - DEBUG - Make call 12, (12984800, 20480, 2000, 10000, 0, 0), <bound method Vxi11Packer.pack_device_read_parms of <pyvisa_py.protocols.vxi11.Vxi11Packer object at 0x000001ed1758a3d8>>, <bound method Vxi11Unpacker.unpack_device_read_resp of <pyvisa_py.protocols.vxi11.Vxi11Unpacker object at 0x000001ed1758a410>>
b"\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x07\xaf\x00\x00\x00\x01\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6!\xe0\x00\x00P\x00\x00\x00\x07\xd0\x00\x00'\x10\x00\x00\x00\x00\x00\x00\x00\x00"
2023-02-16 15:00:20,168 - pyvisa - DEBUG - Sending record through <socket.socket fd=9856, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.14', 57717), raddr=('192.168.0.133', 49155)>: b"\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x07\xaf\x00\x00\x00\x01\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6!\xe0\x00\x00P\x00\x00\x00\x07\xd0\x00\x00'\x10\x00\x00\x00\x00\x00\x00\x00\x00"
2023-02-16 15:00:20,168 - pyvisa - DEBUG - RawTCPClient: procedure type 12
2023-02-16 15:00:20,178 - pyvisa - DEBUG - received b'\x80\x00\x00*'
2023-02-16 15:00:20,178 - pyvisa - DEBUG - received b'\x00\x00\x00\x07\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x060.00\r\n'
2023-02-16 15:00:20,178 - pyvisa - DEBUG - Received record through <socket.socket fd=9856, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.14', 57717), raddr=('192.168.0.133', 49155)>: bytearray(b'\x00\x00\x00\x07\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x060.00\r\n')
b'\x00\x00\x00\x07\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x060.00\r\n'

EOFError                                  Traceback (most recent call last)
Cell In[56], line 1
----> 1 bk.read()

File ~\mambaforge-pypy3\lib\site-packages\pyvisa\resources\messagebased.py:486, in MessageBasedResource.read(self, termination, encoding)
    484 if termination is None:
    485     termination = self._read_termination
--> 486     message = self._read_raw().decode(enco)
    487 else:
    488     with self.read_termination_context(termination):

File ~\mambaforge-pypy3\lib\site-packages\pyvisa\resources\messagebased.py:442, in MessageBasedResource._read_raw(self, size)
    435     while status == loop_status:
    436         logger.debug(
    437             "%s - reading %d bytes (last status %r)",
    438             self._resource_name,
    439             size,
    440             status,
    441         )
--> 442         chunk, status = self.visalib.read(self.session, size)
    443         ret.extend(chunk)
    444 except errors.VisaIOError as e:

File ~\mambaforge-pypy3\lib\site-packages\pyvisa_py\highlevel.py:512, in PyVisaLibrary.read(self, session, count)
    510 # from the session handle, dispatch to the read method of the session object.
    511 try:
--> 512     data, status_code = self.sessions[session].read(count)
    513 except KeyError:
    514     return (
    515         b"",
    516         self.handle_return_value(session, StatusCode.error_invalid_object),
    517     )

File ~\mambaforge-pypy3\lib\site-packages\pyvisa_py\tcpip.py:534, in TCPIPInstrVxi11.read(self, count)
    530 while reason & end_reason == 0:
    531     # Decrease timeout so that the total timeout does not get larger
    532     # than the specified timeout.
    533     timeout = max(0, timeout - int((time.time() - start_time) * 1000))
--> 534     error, reason, data = read_fun(
    535         self.link, chunk_length, timeout, self.lock_timeout, flags, term_char
    536     )
    537     print(data)
    538     print(read_data)

File ~\mambaforge-pypy3\lib\site-packages\pyvisa_py\protocols\vxi11.py:235, in CoreClient.device_read(self, link, request_size, io_timeout, lock_timeout, flags, term_char)
    233 params = (link, request_size, io_timeout, lock_timeout, flags, term_char)
    234 try:
--> 235     return self.make_call(
    236         DEVICE_READ,
    237         params,
    238         self.packer.pack_device_read_parms,
    239         self.unpacker.unpack_device_read_resp,
    240     )
    241 except socket.timeout as e:
    242     return ErrorCodes.io_error, e.args[0], ""

File ~\mambaforge-pypy3\lib\site-packages\pyvisa_py\protocols\rpc.py:478, in RawTCPClient.make_call(self, proc, args, pack_func, unpack_func)
    472 # In case of a timeout because the instrument cannot answer, the
    473 # instrument should let use something went wrong. If we hit the hard
    474 # timeout of the rpc, it means something worse happened (cable
    475 # unplugged).
    476 self.timeout += 1.0
--> 478 return super(RawTCPClient, self).make_call(proc, args, pack_func, unpack_func)

File ~\mambaforge-pypy3\lib\site-packages\pyvisa_py\protocols\rpc.py:236, in Client.make_call(self, proc, args, pack_func, unpack_func)
    234 self.do_call()
    235 if unpack_func:
--> 236     result = unpack_func()
    237 else:
    238     result = None

File ~\mambaforge-pypy3\lib\site-packages\pyvisa_py\protocols\vxi11.py:184, in Vxi11Unpacker.unpack_device_read_resp(self)
    182 error = self.unpack_int()
    183 reason = self.unpack_int()
--> 184 data = self.unpack_opaque()
    185 return error, reason, data

File ~\mambaforge-pypy3\Lib\xdrlib.py:217, in Unpacker.unpack_string(self)
    215 def unpack_string(self):
    216     n = self.unpack_uint()
--> 217     return self.unpack_fstring(n)

File ~\mambaforge-pypy3\Lib\xdrlib.py:209, in Unpacker.unpack_fstring(self, n)
    207 j = i + (n+3)//4*4
    208 if j > len(self.__buf):
--> 209     raise EOFError
    210 self.__pos = j
    211 return self.__buf[i:i+n]

EOFError:

(Seems to come from decoding the response in the Vxi11 protocol.)

The context :

I use mamba with python 3.9, but it also fails on other computers with other distros but it works with an old pyvisa package (1.11, not using pyvisa-py). Current versions used :

PyVISA 1.13.0 PyVISA-py 0.6.2

Output of pyvisa-info

Machine Details: Platform ID: Windows-10-10.0.22000-SP0 Processor: Intel64 Family 6 Model 165 Stepping 5, GenuineIntel

Python: Implementation: PyPy Executable: C:....\mambaforge-pypy3\python.exe Version: 3.9.16 Compiler: MSC v.1929 64 bit (AMD64) Bits: 64bit Build: Jan 18 2023 (#feeb267e) Unicode: UCS4

PyVISA Version: 1.13.0

Backends: ivi: Version: 1.13.0 (bundled with PyVISA) Binary library: Not found py: Version: 0.6.2 ASRL INSTR: Available via PySerial (3.5) USB INSTR: Please install PyUSB to use this resource type. No module named 'usb' USB RAW: Please install PyUSB to use this resource type. No module named 'usb' TCPIP INSTR: Available Resource discovery:

Thank in advance for your responses ! Best regards,

Tristan

MatthieuDartiailh commented 1 year ago

Can you share the manual of your instrument ?

Do you see any change if you specify \r\n as termination character ? I doubt it will make a difference but I would like to be sure.

tristanlorriaux commented 1 year ago

Indeed, the read termination is /r/n but with or without, it doesn't change anything ! Here is the PDF of the BK : A700000007901997.pdf Thanks a lot for your quick response 🚀

MatthieuDartiailh commented 1 year ago

From your instrument it does not appear to support VXI-11 protocol (and I am quite surprised you got an IDN). However page 104 raw socket connection is mentioned. Can you try again using a raw socket resource ? TCPIP::192.168.0.133::5025::SOCKET

tristanlorriaux commented 1 year ago

Hi there 👋,

Seems to work, thanks a lot ! It was indeed BK instuments not supporting VXI-11 protocol. The IDN has actually misled us a bit, but raw socket connection with 5025 port works (we should have worked a little more on the manual oops).

Thanks a lot ! 🚀

MatthieuDartiailh commented 1 year ago

Happy you got it to work