Skip to content

Commit 20d6c60

Browse files
krevsbechEmantor
authored andcommitted
driver/pyvisadriver: add driver to support PyVISA
Add driver and resource to support controlling test instruments using the PyVISA package. Signed-off-by: Kasper Revsbech <[email protected]>
1 parent c050c73 commit 20d6c60

File tree

11 files changed

+123
-0
lines changed

11 files changed

+123
-0
lines changed

CHANGES.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ New Features in 0.3.0
6161
- ``labgrid-client`` now respects the ``LG_HOSTNAME`` and ``LG_USERNAME``
6262
environment variables to set the hostname and username when accessing
6363
resources.
64+
- PyVISA support added, allowing to use PyVISA controlled test equipment from
65+
Labgrid.
6466

6567
Breaking changes in 0.3.0
6668
~~~~~~~~~~~~~~~~~~~~~~~~~

dev-requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ psutil==5.6.6
1313
-r xena-requirements.txt
1414
-r graph-requirements.txt
1515
-r docker-requirements.txt
16+
-r pyvisa-requirements.txt

doc/configuration.rst

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,23 @@ A XenaManager resource describes a Xena Manager instance which is the instance t
627627
Used by:
628628
- `XenaDriver`_
629629

630+
PyVISADevice
631+
~~~~~~~~~~~~
632+
A PyVISADevice resource describes a test stimuli device controlled by PyVISA.
633+
Such device could be a signal generator.
634+
635+
.. code-block:: yaml
636+
637+
PyVISADevice:
638+
type: "TCPIP"
639+
url: "192.168.110.11"
640+
641+
- type (str): device resource type following the pyVISA resource syntax, e.g. ASRL, TCPIP...
642+
- url (str): device identifier on selected resource, e.g. <ip> for TCPIP resource
643+
644+
Used by:
645+
- `PyVISADriver`_
646+
630647
RemotePlace
631648
~~~~~~~~~~~
632649
A RemotePlace describes a set of resources attached to a labgrid remote place.
@@ -1796,6 +1813,17 @@ Binds to:
17961813
Implements:
17971814
- :any:`DigitalOutputProtocol`
17981815

1816+
PyVISADriver
1817+
~~~~~~~~~~~~
1818+
The PyVISADriver uses a PyVISADevice resource to control test equipment manageable by PyVISA.
1819+
1820+
Binds to:
1821+
pyvisa_resource:
1822+
- `PyVISADevice`_
1823+
1824+
Implements:
1825+
- None yet
1826+
17991827
Strategies
18001828
----------
18011829

examples/pyvisa/env.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
targets:
2+
main:
3+
resources:
4+
PyVISADevice:
5+
type: "TCPIP"
6+
url: "192.168.110.11"
7+
drivers:
8+
PyVISADriver:
9+
name: "PyVisa_device"

examples/pyvisa/pyvisa_example.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import pytest
2+
3+
4+
@pytest.fixture()
5+
def signal_generator(target):
6+
return target.get_driver('PyVISADriver').get_session()
7+
8+
9+
def test_with_signal_generator_example(signal_generator):
10+
signal_generator.write('*RST')
11+
12+
# Setup channel 1
13+
signal_generator.write('C1:BSWV WVTP,SQUARE,HLEV,5,LLEV,0,DUTY,50')
14+
# Switch on channel 1
15+
signal_generator.write('C1:OUTP ON,LOAD,HZ,PLRT,NOR')

labgrid/driver/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@
2929
from .xenadriver import XenaDriver
3030
from .dockerdriver import DockerDriver
3131
from .lxaiobusdriver import LXAIOBusPIODriver
32+
from .pyvisadriver import PyVISADriver

labgrid/driver/pyvisadriver.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from importlib import import_module
2+
import attr
3+
4+
from ..factory import target_factory
5+
from .common import Driver
6+
7+
8+
@target_factory.reg_driver
9+
@attr.s(eq=False)
10+
class PyVISADriver(Driver):
11+
"""The PyVISADriver provides a transparent layer to the PyVISA module allowing to get a pyvisa resource
12+
13+
Args:
14+
bindings (dict): driver to use with PyVISA
15+
"""
16+
bindings = {"pyvisa_resource": "PyVISADevice"}
17+
18+
def __attrs_post_init__(self):
19+
super().__attrs_post_init__()
20+
_py_pyvisa_module = import_module('pyvisa')
21+
self._pyvisa_resource_manager = _py_pyvisa_module.ResourceManager()
22+
self.pyvisa_device = None
23+
24+
def on_activate(self):
25+
device_identifier = '{}::{}::INSTR'.format(self.pyvisa_resource.type, self.pyvisa_resource.url)
26+
self.pyvisa_device = self._pyvisa_resource_manager.open_resource(device_identifier)
27+
28+
def on_deactivate(self):
29+
self.pyvisa_device = None
30+
31+
@Driver.check_active
32+
def get_session(self):
33+
return self.pyvisa_device

labgrid/resource/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@
1717
from .flashrom import Flashrom, NetworkFlashrom
1818
from .docker import DockerManager, DockerDaemon, DockerConstants
1919
from .lxaiobus import LXAIOBusPIO
20+
from .pyvisa import PyVISADevice

labgrid/resource/pyvisa.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import attr
2+
3+
from ..factory import target_factory
4+
from .common import Resource
5+
6+
7+
@target_factory.reg_resource
8+
@attr.s(eq=False)
9+
class PyVISADevice(Resource):
10+
"""The PyVISADevice describes a test stimuli device controlled with PyVISA
11+
12+
Args:
13+
type (str): device resource type following the pyVISA resource syntax, e.g. ASRL, TCPIP...
14+
url (str): device identifier on selected resource, e.g. <ip> for TCPIP resource
15+
"""
16+
type = attr.ib(validator=attr.validators.instance_of(str))
17+
url = attr.ib(validator=attr.validators.instance_of(str))

pyvisa-requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pyvisa==1.10.1
2+
PyVISA-py==0.4.1

0 commit comments

Comments
 (0)