Drivers

The Commands available in each driver are displayed in blue and the Subsystems are shown in red or black in a tree. For example, reading the temperature and setting the voltage with the imaginary driver:

digraph foo {
   rankdir="LR";
   node [shape=none fontsize=10];
   temperature [fontcolor=blue];
   current [fontcolor=blue];
   voltage [fontcolor=blue];
   Driver -> power_supply;
   Driver -> temperature;
   power_supply -> current;
   power_supply -> voltage;
}

is done with

>>> driver = Driver(socket)
>>> driver.temperature.read()
... 25
>>> driver.power_supply.voltage.write(10)

Virtual instrument driver

Virtual instrument driver used to test GUIs.

class pyhard2.driver.virtual.Pid(proportional=2.0, integral_time=0.0, derivative_time=0.0, vmin=0.0, vmax=100.0)

Wrap pyhard2.pid.PidController to handle asynchronous setting of output and measure.

class pyhard2.driver.virtual.Input

Linear input simulator.

class pyhard2.driver.virtual.Output

Output simulator using a transfer function.

class pyhard2.driver.virtual.PidSubsystem(parent, proportional=2.0, integral_time=0.0, derivative_time=0.0, vmin=0.0, vmax=100.0, spmin=0.0, spmax=100.0)

The subsystem for the PID.

class pyhard2.driver.virtual.VirtualInstrument(socket=None)

Driver for virtual instruments with a PID.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430263831752 [fontcolor=red, label=input];
VirtualInstrument -> 140430263831752  [weight=3];
140430263832208 [fontcolor=blue, label=measure];
140430263831752 -> 140430263832208  [weight=1];
140430263831600 [fontcolor=blue, label=sysout];
140430263831752 -> 140430263831600  [weight=1];
140430268113280 [fontcolor=red, label=pid];
VirtualInstrument -> 140430268113280  [weight=3];
140430263829320 [fontcolor=blue, label=anti_windup];
140430268113280 -> 140430263829320  [weight=1];
140430267939736 [fontcolor=blue, label=vmin];
140430268113280 -> 140430267939736  [weight=1];
140430267939584 [fontcolor=blue, label=setpoint];
140430268113280 -> 140430267939584  [weight=1];
140430268113432 [fontcolor=blue, label=measure];
140430268113280 -> 140430268113432  [weight=1];
140430267939432 [fontcolor=blue, label=proportional];
140430268113280 -> 140430267939432  [weight=1];
140430263831904 [fontcolor=blue, label=vmax];
140430268113280 -> 140430263831904  [weight=1];
140430267937304 [fontcolor=blue, label=output];
140430268113280 -> 140430267937304  [weight=1];
140430267937760 [fontcolor=blue, label=integral_time];
140430268113280 -> 140430267937760  [weight=1];
140430267939888 [fontcolor=blue, label=derivative_time];
140430268113280 -> 140430267939888  [weight=1];
140430263828560 [fontcolor=red, label=output];
VirtualInstrument -> 140430263828560  [weight=3];
140430263829168 [fontcolor=blue, label=input];
140430263828560 -> 140430263829168  [weight=1];
140430263829472 [fontcolor=blue, label=noise];
140430263828560 -> 140430263829472  [weight=1];
140430263830536 [fontcolor=blue, label=output];
140430263828560 -> 140430263830536  [weight=1];
}

AML

Arun Microelectronics Ltd. gauge drivers

Driver for Arun Microelectronics Ltd. (AML) gauges according to the manual of an NGC2D instrument, the driver should also support PGC1 instruments.

class pyhard2.driver.aml.Protocol(socket)

Communication protocol.

Communication is read only:

group Query
User    ->  Instrument: "*{command}{node}"
note right: {node} is not used on NGC2D instruments
User    <-- Instrument: 17-bytes response
end

class pyhard2.driver.aml.Ngc2d(socket)

Driver for NGC2D ion gauges.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430267940344 [fontcolor=blue, label=status];
Ngc2d -> 140430267940344  [weight=1];
140430267940040 [fontcolor=blue, label=IG_type];
Ngc2d -> 140430267940040  [weight=1];
140430267939584 [fontcolor=blue, label=reset_error];
Ngc2d -> 140430267939584  [weight=1];
140430267940192 [fontcolor=blue, label=error];
Ngc2d -> 140430267940192  [weight=1];
140430267939736 [fontcolor=blue, label=measure];
Ngc2d -> 140430267939736  [weight=1];
140430267939432 [fontcolor=blue, label=poll];
Ngc2d -> 140430267939432  [weight=1];
140430267939888 [fontcolor=blue, label=unit];
Ngc2d -> 140430267939888  [weight=1];
}

Amtron

Drivers for Amtron CS400 family of controllers.

class pyhard2.driver.amtron.CommunicationProtocol(socket)

Communication uses a simple ASCII protocol.

group Set
User    ->  Instrument: :w {byte subsystem}{byte command} {value}
end

group Query
User    ->  Instrument: :r {byte subsystem}{byte command}
User    <-- Instrument: {echo}
User    <-- Instrument: :{response}
User    <-- Instrument: :OK
end

class pyhard2.driver.amtron.Subsystem(index, parent=None)

A Subsystem with an index.

class pyhard2.driver.amtron.ControlMode

Enum for control.control_mode

CURRENT

Control with current.

POWER

Control with the power.

class pyhard2.driver.amtron.CS400(socket)

Driver for the Amtron CS400 family of controllers.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430266963824 [label=profile];
CS400 -> 140430266963824  [weight=3];
140430266963216 [fontcolor=blue, label=errors_total];
CS400 -> 140430266963216  [weight=1];
140430266962000 [fontcolor=blue, label=errors];
CS400 -> 140430266962000  [weight=1];
140430266965344 [label=laser];
CS400 -> 140430266965344  [weight=3];
140430266965496 [fontcolor=blue, label=errors];
140430266965344 -> 140430266965496  [weight=1];
140430266806960 [fontcolor=blue, label=temperature];
140430266965344 -> 140430266806960  [weight=1];
140430266806656 [fontcolor=blue, label=on_time];
140430266965344 -> 140430266806656  [weight=1];
140430266965648 [fontcolor=blue, label=warnings];
140430266965344 -> 140430266965648  [weight=1];
140430266806808 [fontcolor=blue, label=service_interval];
140430266965344 -> 140430266806808  [weight=1];
140430266806504 [fontcolor=blue, label=_serial_number_low];
140430266965344 -> 140430266806504  [weight=1];
140430266806352 [fontcolor=blue, label=_serial_number_high];
140430266965344 -> 140430266806352  [weight=1];
140430266807112 [fontcolor=blue, label=power];
140430266965344 -> 140430266807112  [weight=1];
140430266965800 [fontcolor=blue, label=configuration];
140430266965344 -> 140430266965800  [weight=1];
140430266807264 [fontcolor=blue, label=head_humidity];
140430266965344 -> 140430266807264  [weight=1];
140430266962912 [fontcolor=blue, label=_command];
CS400 -> 140430266962912  [weight=1];
140430266962760 [fontcolor=blue, label=_gate];
CS400 -> 140430266962760  [weight=1];
140430266962152 [fontcolor=blue, label=warnings];
CS400 -> 140430266962152  [weight=1];
140430266809544 [label=cooler];
CS400 -> 140430266809544  [weight=3];
140430266809848 [fontcolor=blue, label=_errors2];
140430266809544 -> 140430266809848  [weight=1];
140430266810000 [fontcolor=blue, label=_warnings];
140430266809544 -> 140430266810000  [weight=1];
140430266809696 [fontcolor=blue, label=_errors1];
140430266809544 -> 140430266809696  [weight=1];
140430266962456 [fontcolor=blue, label=firmware];
CS400 -> 140430266962456  [weight=1];
140430266810152 [label=power];
CS400 -> 140430266810152  [weight=3];
140430266819856 [fontcolor=blue, label=min_voltage];
140430266810152 -> 140430266819856  [weight=1];
140430266820008 [fontcolor=blue, label=max_voltage];
140430266810152 -> 140430266820008  [weight=1];
140430266818640 [fontcolor=blue, label=errors];
140430266810152 -> 140430266818640  [weight=1];
140430266819400 [fontcolor=blue, label=power];
140430266810152 -> 140430266819400  [weight=1];
140430266818944 [fontcolor=blue, label=warnings];
140430266810152 -> 140430266818944  [weight=1];
140430266819552 [fontcolor=blue, label=power_factor];
140430266810152 -> 140430266819552  [weight=1];
140430266819096 [fontcolor=blue, label=current];
140430266810152 -> 140430266819096  [weight=1];
140430266819248 [fontcolor=blue, label=voltage];
140430266810152 -> 140430266819248  [weight=1];
140430266818792 [fontcolor=blue, label=errors2];
140430266810152 -> 140430266818792  [weight=1];
140430266819704 [fontcolor=blue, label=max_current];
140430266810152 -> 140430266819704  [weight=1];
140430266963976 [label=control];
CS400 -> 140430266963976  [weight=3];
140430266964584 [fontcolor=blue, label=total_power];
140430266963976 -> 140430266964584  [weight=1];
140430266964888 [fontcolor=blue, label=total_power_calc];
140430266963976 -> 140430266964888  [weight=1];
140430266964432 [fontcolor=blue, label=total_current_meas];
140430266963976 -> 140430266964432  [weight=1];
140430266965192 [fontcolor=blue, label=pulse_pause];
140430266963976 -> 140430266965192  [weight=1];
140430266964736 [fontcolor=blue, label=total_power_meas];
140430266963976 -> 140430266964736  [weight=1];
140430266964128 [fontcolor=blue, label=control_mode];
140430266963976 -> 140430266964128  [weight=1];
140430266965040 [fontcolor=blue, label=pulse_duration];
140430266963976 -> 140430266965040  [weight=1];
140430266964280 [fontcolor=blue, label=total_current];
140430266963976 -> 140430266964280  [weight=1];
140430266963520 [fontcolor=blue, label=timeout_laser_on];
CS400 -> 140430266963520  [weight=1];
140430266820160 [fontcolor=red, label=command];
CS400 -> 140430266820160  [weight=3];
140430266820768 [fontcolor=blue, label=gate_state];
140430266820160 -> 140430266820768  [weight=1];
140430266821224 [fontcolor=blue, label=is_warning_present];
140430266820160 -> 140430266821224  [weight=1];
140430266820464 [fontcolor=blue, label=clear_errors];
140430266820160 -> 140430266820464  [weight=1];
140430266820920 [fontcolor=blue, label=is_ready];
140430266820160 -> 140430266820920  [weight=1];
140430266821072 [fontcolor=blue, label=is_laser_enabled];
140430266820160 -> 140430266821072  [weight=1];
140430266821376 [fontcolor=blue, label=is_error_present];
140430266820160 -> 140430266821376  [weight=1];
140430266820616 [fontcolor=blue, label=laser_state];
140430266820160 -> 140430266820616  [weight=1];
140430266807416 [label=interface];
CS400 -> 140430266807416  [weight=3];
140430266807872 [fontcolor=blue, label=io_config];
140430266807416 -> 140430266807872  [weight=1];
140430266807568 [fontcolor=blue, label=errors];
140430266807416 -> 140430266807568  [weight=1];
140430266808024 [fontcolor=blue, label=io_config_OEM];
140430266807416 -> 140430266808024  [weight=1];
140430266809392 [fontcolor=blue, label=PWM_input_slope];
140430266807416 -> 140430266809392  [weight=1];
140430266808176 [fontcolor=blue, label=io_state];
140430266807416 -> 140430266808176  [weight=1];
140430266807720 [fontcolor=blue, label=warnings];
140430266807416 -> 140430266807720  [weight=1];
140430266808632 [fontcolor=red, label=io_digital_out];
140430266807416 -> 140430266808632  [weight=3];
140430266808936 [fontcolor=blue, label=pilot_laser_state];
140430266808632 -> 140430266808936  [weight=1];
140430266809088 [fontcolor=blue, label=pilot_beam_intensity];
140430266807416 -> 140430266809088  [weight=1];
140430266808328 [fontcolor=blue, label=io_digital_in];
140430266807416 -> 140430266808328  [weight=1];
140430266808480 [fontcolor=blue, label=_io_digital_out];
140430266807416 -> 140430266808480  [weight=1];
140430266809240 [fontcolor=blue, label=PWM_input_offset];
140430266807416 -> 140430266809240  [weight=1];
140430266963368 [fontcolor=blue, label=warnings_total];
CS400 -> 140430266963368  [weight=1];
140430266963064 [fontcolor=blue, label=_devstate];
CS400 -> 140430266963064  [weight=1];
140430266962304 [fontcolor=blue, label=configuration];
CS400 -> 140430266962304  [weight=1];
140430266962608 [fontcolor=blue, label=operation_mode];
CS400 -> 140430266962608  [weight=1];
140430266963672 [fontcolor=blue, label=operation_time];
CS400 -> 140430266963672  [weight=1];
}

Bronkhorst

Drivers for Bronkhorst flow and pressure controllers.

Communication uses the ASCII protocol described in the instruction manual number 9.17.027. The commands and subsystems are described in the instruction manual number 9.17.023.

Note

Reference:
class pyhard2.driver.bronkhorst.Access

Access enum with SEC access for secured commands.

RO, WO, RW, SEC
class pyhard2.driver.bronkhorst.Subsystem(process, parent=None)

Subsystem with process number.

class pyhard2.driver.bronkhorst.Cmd(reader, type=None, **kwargs)

Command with a type attributes.

Parameters:type (str) – {CHAR, UINT, FLOAT, ULONG, STRING} Parameter type.
class Context(command, value=None, node=None)

Context with a type attribute.

class pyhard2.driver.bronkhorst.AsciiProtocol(socket)

ASCII protocol.

class pyhard2.driver.bronkhorst.Controller(socket)

Driver for Bronkhorst controllers.

Note

Node 128 broadcasts to every node.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430267937760 [fontcolor=blue, label=setpoint_slope];
Controller -> 140430267937760  [weight=1];
140430267937456 [fontcolor=blue, label=info];
Controller -> 140430267937456  [weight=1];
140430267940192 [fontcolor=blue, label=capacity_100pct];
Controller -> 140430267940192  [weight=1];
140430266822288 [label=identification];
Controller -> 140430266822288  [weight=3];
140430263828864 [fontcolor=blue, label=firmware];
140430266822288 -> 140430263828864  [weight=1];
140430266822440 [fontcolor=blue, label=model_number];
140430266822288 -> 140430266822440  [weight=1];
140430263829168 [fontcolor=blue, label=device_type_ptr];
140430266822288 -> 140430263829168  [weight=1];
140430263828560 [fontcolor=blue, label=serial_number];
140430266822288 -> 140430263828560  [weight=1];
140430263829016 [fontcolor=blue, label=usertag];
140430266822288 -> 140430263829016  [weight=1];
140430263828712 [fontcolor=blue, label=config_string];
140430266822288 -> 140430263828712  [weight=1];
140430267937304 [fontcolor=blue, label=analog_input];
Controller -> 140430267937304  [weight=1];
140430268113280 [fontcolor=blue, label=setpoint];
Controller -> 140430268113280  [weight=1];
140430263830536 [label=counter];
Controller -> 140430263830536  [weight=3];
140430263831448 [fontcolor=blue, label=new_setpoint];
140430263830536 -> 140430263831448  [weight=1];
140430263831144 [fontcolor=blue, label=output_mode];
140430263830536 -> 140430263831144  [weight=1];
140430263830840 [fontcolor=blue, label=unit_ptr];
140430263830536 -> 140430263830840  [weight=1];
140430263830688 [fontcolor=blue, label=value];
140430263830536 -> 140430263830688  [weight=1];
140430263831296 [fontcolor=blue, label=setpoint_mode];
140430263830536 -> 140430263831296  [weight=1];
140430263830992 [fontcolor=blue, label=limit];
140430263830536 -> 140430263830992  [weight=1];
140430263831752 [fontcolor=blue, label=mode];
140430263830536 -> 140430263831752  [weight=1];
140430263831600 [fontcolor=blue, label=unit];
140430263830536 -> 140430263831600  [weight=1];
140430263831904 [label=controller];
Controller -> 140430263831904  [weight=3];
140430263840848 [fontcolor=blue, label=response_when_stable];
140430263831904 -> 140430263840848  [weight=1];
140430263841152 [fontcolor=blue, label=PIDKp];
140430263831904 -> 140430263841152  [weight=1];
140430263841000 [fontcolor=blue, label=response_on_startup];
140430263831904 -> 140430263841000  [weight=1];
140430263832360 [fontcolor=blue, label=response_on_setpoint_change];
140430263831904 -> 140430263832360  [weight=1];
140430263841456 [fontcolor=blue, label=PIDKd];
140430263831904 -> 140430263841456  [weight=1];
140430263832056 [fontcolor=blue, label=valve_output];
140430263831904 -> 140430263832056  [weight=1];
140430263841304 [fontcolor=blue, label=PIDKi];
140430263831904 -> 140430263841304  [weight=1];
140430267939736 [fontcolor=blue, label=fluid];
Controller -> 140430267939736  [weight=1];
140430263829320 [label=alarm];
Controller -> 140430263829320  [weight=3];
140430263829472 [fontcolor=blue, label=max_limit];
140430263829320 -> 140430263829472  [weight=1];
140430263829928 [fontcolor=blue, label=output_mode];
140430263829320 -> 140430263829928  [weight=1];
140430263830080 [fontcolor=blue, label=setpoint_mode];
140430263829320 -> 140430263830080  [weight=1];
140430263829624 [fontcolor=blue, label=min_limit];
140430263829320 -> 140430263829624  [weight=1];
140430263830232 [fontcolor=blue, label=new_setpoint];
140430263829320 -> 140430263830232  [weight=1];
140430263829776 [fontcolor=blue, label=mode];
140430263829320 -> 140430263829776  [weight=1];
140430263830384 [fontcolor=blue, label=delay_time];
140430263829320 -> 140430263830384  [weight=1];
140430267939584 [fontcolor=blue, label=sensor_type];
Controller -> 140430267939584  [weight=1];
140430267940040 [fontcolor=blue, label=capacity_unit_ptr];
Controller -> 140430267940040  [weight=1];
140430267940344 [fontcolor=blue, label=capacity_unit];
Controller -> 140430267940344  [weight=1];
140430268113432 [fontcolor=blue, label=measure];
Controller -> 140430268113432  [weight=1];
140430266821528 [label=direct_reading];
Controller -> 140430266821528  [weight=3];
140430266821984 [fontcolor=blue, label=setpoint];
140430266821528 -> 140430266821984  [weight=1];
140430266821680 [fontcolor=blue, label=capacity_0pct];
140430266821528 -> 140430266821680  [weight=1];
140430266822136 [fontcolor=blue, label=master_slave_ratio];
140430266821528 -> 140430266822136  [weight=1];
140430266821832 [fontcolor=blue, label=measure];
140430266821528 -> 140430266821832  [weight=1];
140430267939888 [fontcolor=blue, label=control_mode];
Controller -> 140430267939888  [weight=1];
140430267939432 [fontcolor=blue, label=fluid_ptr];
Controller -> 140430267939432  [weight=1];
}

class pyhard2.driver.bronkhorst.MFC(socket)

Instrument for mass-flow controllers.

class pyhard2.driver.bronkhorst.PC(socket)

Instrument for pressure controllers.

DAQ

Drivers for National Instrument hardware.

The materials supported is the one supported by NI-DAQmx on Windows and comedi on Linux.

Note

  • The driver depends on pycomedi on Linux or PyLibNIDAQmx on Windows.
  • The driver requires numpy on all platform.
Reference:
class pyhard2.driver.daq.Cmd(**kwargs)

Command without reader.

class Context(command, value=None, node=None)

Context with minimum and maximum attributes.

class pyhard2.driver.daq.Subsystem(device, parent=None)

A subsytem with a device attribute.

Parameters:device (string) – The device name.
class pyhard2.driver.daq.Daq(device, parent=None)

Driver for DAQ hardware.

On windows, the node names are portN/lineM for the digital in/out channels and aiN or aoN for the analog input and output.

On linux, the node names are SUBDEVICE.CHANNEL, that is the number of the subdevice and of the channel separated with a dot ..

Parameters:device (str) – The name of the device on windows or its address (example /dev/comedi0) on linux.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430263841760 [fontcolor=red, label=digitalIO];
Daq -> 140430263841760  [weight=3];
140430263842064 [fontcolor=blue, label=state];
140430263841760 -> 140430263842064  [weight=1];
140430263842216 [fontcolor=red, label=voltage];
Daq -> 140430263842216  [weight=3];
140430263842520 [fontcolor=blue, label=ai];
140430263842216 -> 140430263842520  [weight=1];
140430263842672 [fontcolor=blue, label=ao];
140430263842216 -> 140430263842672  [weight=1];
}

Example

NI 622x cards have following nodes:

  • 32 AI channels: ai[0-31]
  • 4 AO channels: ao[0-3]
  • 32 DIO channels on port0: port0/line[0-31]
  • 8 DIO channels on port1: port1/line[0-7]
  • 8 DIO channels on port2: port2/line[0-7]

Use as follows

>>> driver = Daq("NAME")  # The actual device name
>>> driver.state.read("port0/line3")  # windows names
... False
>>> driver.state.write(True, "port0/line3")
>>> driver.state.read("port0/line3")
... True
>>> driver.voltage.ai.read("ai0")
... 0.5
>>> driver.voltage.ao.write(1.0, "ao0")

pylibnidaqmx wrappers to communicate with DAQ hardware on Windows.

class pyhard2.driver.daq.windaq.DioTask(name='')

A class that inherits from both DigitalInputTask and DigitalOutputTask.

Without the double inheritance provided here, DigitalInputTask.read() switches the state off.

class pyhard2.driver.daq.windaq.DioProtocol(parent=None)

Protocol for Digital IO lines.

class pyhard2.driver.daq.windaq.VoltageAioProtocol(parent=None)

Protocol for Analog Input and Analog Output lines.

Comedi wrappers to communicate with DAQ hardware on linux.

Warning

The linux driver is not tested.

class pyhard2.driver.daq.lindaq.DioProtocol(parent=None)

Protocol for Digital IO lines.

class pyhard2.driver.daq.lindaq.AioProtocol(parent=None)

Protocol for Analog Input and Analog Output lines.

Delta-Elektronika

Delta-Electronica drivers

class pyhard2.driver.deltaelektronika.DplProtocol(socket)

Communication using the Delta Programming Language (DPL)

Warning

the Delta Programming Language (DPL) has been obsoleted by Delta-Electronica.

class pyhard2.driver.deltaelektronika.Sm700Series(socket)

Driver for Delta Elektronika SM700-Series power supplies.

A Subset of the PSC488 EXT commands is implemented in the dpl subsystem as well as the SCPI-like commands found in the PSC 232 PSC 488 Programming Manual (an html document).

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430262882536 [fontcolor=blue, label=custom_string];
Sm700Series -> 140430262882536  [weight=1];
140430263841304 [label=remote];
Sm700Series -> 140430263841304  [weight=3];
140430263841000 [fontcolor=blue, label=cc];
140430263841304 -> 140430263841000  [weight=1];
140430263841456 [fontcolor=blue, label=cv];
140430263841304 -> 140430263841456  [weight=1];
140430262882840 [fontcolor=blue, label=help];
Sm700Series -> 140430262882840  [weight=1];
140430263842976 [label=calibration];
Sm700Series -> 140430263842976  [weight=3];
140430263843280 [label=current];
140430263842976 -> 140430263843280  [weight=3];
140430263844496 [fontcolor=blue, label=offset];
140430263843280 -> 140430263844496  [weight=1];
140430263844344 [fontcolor=blue, label=gain];
140430263843280 -> 140430263844344  [weight=1];
140430263843584 [label=measure];
140430263843280 -> 140430263843584  [weight=3];
140430263844648 [fontcolor=blue, label=gain];
140430263843584 -> 140430263844648  [weight=1];
140430262882384 [fontcolor=blue, label=offset];
140430263843584 -> 140430262882384  [weight=1];
140430263843128 [label=voltage];
140430263842976 -> 140430263843128  [weight=3];
140430263843888 [fontcolor=blue, label=offset];
140430263843128 -> 140430263843888  [weight=1];
140430263843736 [fontcolor=blue, label=gain];
140430263843128 -> 140430263843736  [weight=1];
140430263843432 [label=measure];
140430263843128 -> 140430263843432  [weight=3];
140430263844040 [fontcolor=blue, label=gain];
140430263843432 -> 140430263844040  [weight=1];
140430263844192 [fontcolor=blue, label=offset];
140430263843432 -> 140430263844192  [weight=1];
140430262882688 [fontcolor=blue, label=variables];
Sm700Series -> 140430262882688  [weight=1];
140430267939736 [label=sense];
Sm700Series -> 140430267939736  [weight=3];
140430267937304 [label=digital];
140430267939736 -> 140430267937304  [weight=3];
140430267937760 [fontcolor=blue, label=switch];
140430267937304 -> 140430267937760  [weight=1];
140430267937456 [fontcolor=blue, label=extended_data];
140430267937304 -> 140430267937456  [weight=1];
140430267940192 [fontcolor=blue, label=data];
140430267937304 -> 140430267940192  [weight=1];
140430263830688 [label=source];
Sm700Series -> 140430263830688  [weight=3];
140430263829016 [label=function];
140430263830688 -> 140430263829016  [weight=3];
140430267939888 [fontcolor=blue, label=lock_frontpanel];
140430263829016 -> 140430267939888  [weight=1];
140430263828864 [fontcolor=blue, label=output_b];
140430263829016 -> 140430263828864  [weight=1];
140430263828560 [fontcolor=blue, label=enable_remote_shutdown];
140430263829016 -> 140430263828560  [weight=1];
140430263829168 [fontcolor=blue, label=output_a];
140430263829016 -> 140430263829168  [weight=1];
140430267939432 [fontcolor=blue, label=output];
140430263829016 -> 140430267939432  [weight=1];
140430263831448 [fontcolor=blue, label=max_voltage];
140430263830688 -> 140430263831448  [weight=1];
140430263831144 [fontcolor=blue, label=current];
140430263830688 -> 140430263831144  [weight=1];
140430263830840 [fontcolor=blue, label=voltage];
140430263830688 -> 140430263830840  [weight=1];
140430263828712 [fontcolor=blue, label=max_current];
140430263830688 -> 140430263828712  [weight=1];
140430263829776 [fontcolor=red, label=common];
Sm700Series -> 140430263829776  [weight=3];
140430263830080 [fontcolor=blue, label=reset];
140430263829776 -> 140430263830080  [weight=1];
140430263829928 [fontcolor=blue, label=self_test];
140430263829776 -> 140430263829928  [weight=1];
140430263832056 [fontcolor=blue, label=event_status_enable];
140430263829776 -> 140430263832056  [weight=1];
140430263831904 [fontcolor=blue, label=service_request_enable];
140430263829776 -> 140430263831904  [weight=1];
140430263832360 [fontcolor=blue, label=event_status_register];
140430263829776 -> 140430263832360  [weight=1];
140430263831600 [fontcolor=blue, label=wait_to_continue];
140430263829776 -> 140430263831600  [weight=1];
140430263830536 [fontcolor=blue, label=status_byte];
140430263829776 -> 140430263830536  [weight=1];
140430263829472 [fontcolor=blue, label=clear_status];
140430263829776 -> 140430263829472  [weight=1];
140430263829624 [fontcolor=blue, label=identification];
140430263829776 -> 140430263829624  [weight=1];
140430263831752 [fontcolor=blue, label=operation_completed];
140430263829776 -> 140430263831752  [weight=1];
140430267940344 [label=measure];
Sm700Series -> 140430267940344  [weight=3];
140430267939584 [fontcolor=blue, label=current];
140430267940344 -> 140430267939584  [weight=1];
140430267940040 [fontcolor=blue, label=voltage];
140430267940344 -> 140430267940040  [weight=1];
140430268113432 [fontcolor=red, label=dpl];
Sm700Series -> 140430268113432  [weight=3];
140430266821832 [fontcolor=blue, label=max_voltage];
140430268113432 -> 140430266821832  [weight=1];
140430263829320 [fontcolor=blue, label=scpi];
140430268113432 -> 140430263829320  [weight=1];
140430266822288 [fontcolor=blue, label=error];
140430268113432 -> 140430266822288  [weight=1];
140430266821984 [fontcolor=blue, label=current];
140430268113432 -> 140430266821984  [weight=1];
140430266822440 [fontcolor=blue, label=identification];
140430268113432 -> 140430266822440  [weight=1];
140430266821680 [fontcolor=blue, label=voltage];
140430268113432 -> 140430266821680  [weight=1];
140430266821528 [fontcolor=blue, label=step_mode_current];
140430268113432 -> 140430266821528  [weight=1];
140430263830384 [fontcolor=blue, label=dpl];
140430268113432 -> 140430263830384  [weight=1];
140430268113280 [fontcolor=blue, label=step_mode_voltage];
140430268113432 -> 140430268113280  [weight=1];
140430266822136 [fontcolor=blue, label=max_current];
140430268113432 -> 140430266822136  [weight=1];
140430263841152 [label=local];
Sm700Series -> 140430263841152  [weight=3];
140430263842824 [fontcolor=blue, label=cc];
140430263841152 -> 140430263842824  [weight=1];
140430263840848 [fontcolor=blue, label=cv];
140430263841152 -> 140430263840848  [weight=1];
140430263831296 [fontcolor=blue, label=channel];
Sm700Series -> 140430263831296  [weight=1];
}

Fluke

Fluke drivers

Driver following the technical note entitled: “Fluke 189/187/98-IV/87-IV Remote Interface Specification”

class pyhard2.driver.fluke.CommunicationProtocol(socket)

Protocol for Fluke model 189, 187, 89-IV, and 87-IV digital multimeters.

Commands consist of two-letter codes that are sent from the computer to the meter.

group Default Setup
User    ->  Meter: DS
User    <-- Meter: ACK
note right: ACK == {0, 1}, 0 for no error
end

group IDentification
User    ->  Meter: ID
User    <-- Meter: ACK
User    <-- Meter: {id}
end

group Query Measurement
User    ->  Meter: QM
User    <-- Meter: ACK
User    <-- Meter: QM,{reading}
end

group Reset Instrument
User    ->  Meter: RI
User    <-- Meter: ACK
end

group Set Function (key presses)
User    ->  Meter: SF {key code}
User    <-- Meter: ACK
end

class pyhard2.driver.fluke.Fluke18x(socket)

Driver for the Fluke Series 18x multimeters.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430263829016 [fontcolor=blue, label=reset];
Fluke18x -> 140430263829016  [weight=1];
140430268113280 [label=button];
Fluke18x -> 140430268113280  [weight=3];
140430263829320 [fontcolor=blue, label=press_auto_hold];
140430268113280 -> 140430263829320  [weight=1];
140430263829624 [fontcolor=blue, label=press_backlight];
140430268113280 -> 140430263829624  [weight=1];
140430263829472 [fontcolor=blue, label=press_Hz];
140430268113280 -> 140430263829472  [weight=1];
140430263830536 [fontcolor=blue, label=press_logging];
140430268113280 -> 140430263830536  [weight=1];
140430263831600 [fontcolor=blue, label=press_calibration];
140430268113280 -> 140430263831600  [weight=1];
140430263830232 [fontcolor=blue, label=press_wake_up];
140430268113280 -> 140430263830232  [weight=1];
140430263831296 [fontcolor=blue, label=press_min_max];
140430268113280 -> 140430263831296  [weight=1];
140430263831904 [fontcolor=blue, label=press_setup];
140430268113280 -> 140430263831904  [weight=1];
140430263830080 [fontcolor=blue, label=press_save];
140430268113280 -> 140430263830080  [weight=1];
140430263831752 [fontcolor=blue, label=press_down_arrow];
140430268113280 -> 140430263831752  [weight=1];
140430263829776 [fontcolor=blue, label=press_hold];
140430268113280 -> 140430263829776  [weight=1];
140430263832056 [fontcolor=blue, label=press_range];
140430268113280 -> 140430263832056  [weight=1];
140430263830384 [fontcolor=blue, label=press_blue];
140430268113280 -> 140430263830384  [weight=1];
140430263829928 [fontcolor=blue, label=press_rel];
140430268113280 -> 140430263829928  [weight=1];
140430263830688 [fontcolor=blue, label=press_fast_min_max];
140430268113280 -> 140430263830688  [weight=1];
140430263832360 [fontcolor=blue, label=press_shift];
140430268113280 -> 140430263832360  [weight=1];
140430263830992 [fontcolor=blue, label=press_cancel];
140430268113280 -> 140430263830992  [weight=1];
140430268114344 [fontcolor=blue, label=press_up_arrow];
140430268113280 -> 140430268114344  [weight=1];
140430263828712 [fontcolor=blue, label=identification];
Fluke18x -> 140430263828712  [weight=1];
140430263830840 [fontcolor=blue, label=measure];
Fluke18x -> 140430263830840  [weight=1];
140430263831448 [fontcolor=blue, label=default_setup];
Fluke18x -> 140430263831448  [weight=1];
140430263831144 [fontcolor=blue, label=unit];
Fluke18x -> 140430263831144  [weight=1];
}

SCPI

class pyhard2.driver.ieee.Ieee488CommunicationProtocol(socket, parent=None)

Communication protocol for the IEEE 488.1 standard.

class pyhard2.driver.ieee.ScpiSubsystem(mnemonic, parent=None)

Subsystem with a mnemonic.

class pyhard2.driver.ieee.ScpiCommunicationProtocol(socket, parent=None)

SCPI protocol.

IEEE 488.1 standard.

class pyhard2.driver.ieee.ieee488_1.Ieee4881(socket, parent=None)

IEEE 488.1 Requirements in IEEE 488.2 standard.

Section 4.1

IEEE 488.2 standard.

class pyhard2.driver.ieee.ieee488_2.Ieee4882(socket, parent=None)

IEEE 488.2 Requirements.

  • Table 4-4 – Required Status Reporting Common Commands
  • Table 4-7 – Required Internal Operation Common Commands
  • Table 4-17 – Required Synchronization Commands
class pyhard2.driver.ieee.ieee488_2.PowerOn(parent)

Table 4-5 – Optional Power-On Common Commands

class pyhard2.driver.ieee.ieee488_2.ParallelPoll(parent)

Table 4-6 – Optional Parallel Poll Common Commands

class pyhard2.driver.ieee.ieee488_2.ResourceDescription(parent)

Table 4-8 – Optional Resource Description Common Command

class pyhard2.driver.ieee.ieee488_2.ProtectedUserData(parent)

Table 4-9 – Optional Protected User Data Command

class pyhard2.driver.ieee.ieee488_2.Calibration(parent)

Table 4-10 – Optional Calibration Command

class pyhard2.driver.ieee.ieee488_2.Trigger(parent)

Table 4-11 – Optional Trigger Command

class pyhard2.driver.ieee.ieee488_2.Macro(parent)

Table 4-12 – Optional Trigger Macro Commands Table 4-13 – Optional Macro Commands

class pyhard2.driver.ieee.ieee488_2.Identification(parent)

Table 4-14 – Optional Option Identification Command

class pyhard2.driver.ieee.ieee488_2.StoredSetting(parent)

Table 4-15 – Optional Stored Setting Commands

class pyhard2.driver.ieee.ieee488_2.Learn(parent)

Table 4-16 – Optional Learn Command

class pyhard2.driver.ieee.ieee488_2.SystemConfiguration(parent)

Table 4-18 – Optional System Configuration Commands

class pyhard2.driver.ieee.ieee488_2.ControlPassing(parent)

Table 4-19 – Optional Passing Control Commands

Standard commands for programmable instruments (SCPI).

class pyhard2.driver.ieee.scpi.ScpiRequired(socket, parent=None)

Required commands from the SCPI standard.

Note

SCPI std. mandates IEEE488.2, excluding IEEE488.1. However, hardware vendors do not always follow the standard. Drivers actually following the standard should nest either the Scpi or the 488.2 commands such as:

import pyhard2.driver.ieee.ieee488_2.Ieee4882 as Ieee4882
import pyhard2.driver.ieee.scpi.ScpiRequired as Scpi

ScpiDriver(Scpi):

    def __init__(self, socket):
        super(ScpiDriver, self).__init__(socket)
        self.common = Ieee4882(socket, self)
        # Continue definition.
class pyhard2.driver.ieee.scpi.ScpiDigitalMeter(socket, meter_fn, parent=None)

SCPI Instrument Classes - 3 Digital Meters

Base functionality of a digital meter.

class pyhard2.driver.ieee.scpi.ScpiDCVoltmeter(socket, parent=None)

SCPI Voltmeter.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430263828712 [label=status];
ScpiDCVoltmeter -> 140430263828712  [weight=3];
140430263830384 [label=questionable];
140430263828712 -> 140430263830384  [weight=3];
140430263830992 [label=operation];
140430263828712 -> 140430263830992  [weight=3];
140430263829928 [fontcolor=blue, label=enable];
140430263830992 -> 140430263829928  [weight=1];
140430263830688 [fontcolor=blue, label=condition];
140430263830992 -> 140430263830688  [weight=1];
140430263832360 [fontcolor=blue, label=event];
140430263830992 -> 140430263832360  [weight=1];
140430263832056 [fontcolor=blue, label=preset];
140430263828712 -> 140430263832056  [weight=1];
140430263829776 [label=configure];
ScpiDCVoltmeter -> 140430263829776  [weight=3];
140430263830080 [label=read];
ScpiDCVoltmeter -> 140430263830080  [weight=3];
140430263831296 [label=sense];
ScpiDCVoltmeter -> 140430263831296  [weight=3];
140430263830232 [label=function];
140430263831296 -> 140430263830232  [weight=3];
140430268113432 [fontcolor=red, label=_scpi];
ScpiDCVoltmeter -> 140430268113432  [weight=3];
140430268114344 [label=system];
ScpiDCVoltmeter -> 140430268114344  [weight=3];
140430263830840 [fontcolor=blue, label=version];
140430268114344 -> 140430263830840  [weight=1];
140430263831144 [label=error];
140430268114344 -> 140430263831144  [weight=3];
140430263831448 [fontcolor=blue, label=next];
140430263831144 -> 140430263831448  [weight=1];
140430263831600 [label=initiate];
ScpiDCVoltmeter -> 140430263831600  [weight=3];
140430263829624 [fontcolor=blue, label=abort];
140430263831600 -> 140430263829624  [weight=1];
140430263830536 [label=immediate];
140430263831600 -> 140430263830536  [weight=3];
140430263829472 [fontcolor=blue, label=all];
140430263830536 -> 140430263829472  [weight=1];
140430263829320 [label=trigger];
ScpiDCVoltmeter -> 140430263829320  [weight=3];
140430263829016 [label=sequence];
140430263829320 -> 140430263829016  [weight=3];
140430264673552 [fontcolor=blue, label=count];
140430263829016 -> 140430264673552  [weight=1];
140430264673704 [fontcolor=blue, label=delay];
140430263829016 -> 140430264673704  [weight=1];
140430264673856 [fontcolor=blue, label=source];
140430263829016 -> 140430264673856  [weight=1];
140430263831904 [label=measure];
ScpiDCVoltmeter -> 140430263831904  [weight=3];
140430263831752 [label=fetch];
ScpiDCVoltmeter -> 140430263831752  [weight=3];
}

class pyhard2.driver.ieee.scpi.ScpiPowerSupply(socket, parent=None)

SCPI Instrument Classes - 7 Power Supplies.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430267939432 [label=status];
ScpiPowerSupply -> 140430267939432  [weight=3];
140430267937456 [label=questionable];
140430267939432 -> 140430267937456  [weight=3];
140430264672792 [fontcolor=blue, label=current];
140430267937456 -> 140430264672792  [weight=1];
140430264672944 [fontcolor=blue, label=voltage];
140430267937456 -> 140430264672944  [weight=1];
140430267939888 [label=operation];
140430267939432 -> 140430267939888  [weight=3];
140430267940192 [fontcolor=blue, label=enable];
140430267939888 -> 140430267940192  [weight=1];
140430267937304 [fontcolor=blue, label=condition];
140430267939888 -> 140430267937304  [weight=1];
140430267939736 [fontcolor=blue, label=event];
140430267939888 -> 140430267939736  [weight=1];
140430267937760 [fontcolor=blue, label=preset];
140430267939432 -> 140430267937760  [weight=1];
140430263829168 [fontcolor=red, label=_scpi];
ScpiPowerSupply -> 140430263829168  [weight=3];
140430263828864 [label=system];
ScpiPowerSupply -> 140430263828864  [weight=3];
140430267939584 [fontcolor=blue, label=version];
140430263828864 -> 140430267939584  [weight=1];
140430267940344 [label=error];
140430263828864 -> 140430267940344  [weight=3];
140430267940040 [fontcolor=blue, label=next];
140430267940344 -> 140430267940040  [weight=1];
140430264672336 [label=source];
ScpiPowerSupply -> 140430264672336  [weight=3];
140430264672488 [fontcolor=blue, label=current];
140430264672336 -> 140430264672488  [weight=1];
140430264672640 [fontcolor=blue, label=voltage];
140430264672336 -> 140430264672640  [weight=1];
140430264673096 [label=measure];
ScpiPowerSupply -> 140430264673096  [weight=3];
140430264673248 [fontcolor=blue, label=current];
140430264673096 -> 140430264673248  [weight=1];
140430264673400 [fontcolor=blue, label=voltage];
140430264673096 -> 140430264673400  [weight=1];
140430267940496 [label=output];
ScpiPowerSupply -> 140430267940496  [weight=3];
140430267940648 [fontcolor=blue, label=state];
140430267940496 -> 140430267940648  [weight=1];
}

Peaktech

Drivers for the Peaktech PT1885 power supply.

class pyhard2.driver.peaktech.CommunicationProtocol(socket)

Communication uses an ASCII protocol:

group Set
User    ->  Instrument: {mnemonic}{node} {value}
end
group Query
User    ->  Instrument: {mnemonic}{node}
User    <-- Instrument: {values}
end

class pyhard2.driver.peaktech.Pt1885(socket)

Driver for Peaktech PT1885 power supplies.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430263831600 [fontcolor=blue, label=current_meas];
Pt1885 -> 140430263831600  [weight=1];
140430268113432 [fontcolor=blue, label=max_voltage];
Pt1885 -> 140430268113432  [weight=1];
140430263829016 [fontcolor=blue, label=voltage_meas];
Pt1885 -> 140430263829016  [weight=1];
140430263831752 [fontcolor=blue, label=voltage_lim];
Pt1885 -> 140430263831752  [weight=1];
140430263829320 [fontcolor=blue, label=current];
Pt1885 -> 140430263829320  [weight=1];
140430263831904 [fontcolor=blue, label=voltage];
Pt1885 -> 140430263831904  [weight=1];
140430268113280 [fontcolor=blue, label=max_current];
Pt1885 -> 140430268113280  [weight=1];
}

Pfeiffer

Drivers for the Pfeiffer TPG 256 A MaxiGauge controller.

class pyhard2.driver.pfeiffer.CommunicationProtocol(socket)

Driver for the Pfeiffer Maxigauge.

The protocol used is similar to ANSI X3.

User    ->  Instrument: {query}
User    <-- Instrument: ACK
User    ->  Instrument: ENQ
User    <-- Instrument: {answer}

class pyhard2.driver.pfeiffer.Maxigauge(socket)

Maxigauge subsystem.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430267940344 [fontcolor=blue, label=errors];
Maxigauge -> 140430267940344  [weight=1];
140430267937456 [label=gauge];
Maxigauge -> 140430267937456  [weight=3];
140430267940040 [fontcolor=blue, label=pressure];
140430267937456 -> 140430267940040  [weight=1];
140430267940192 [fontcolor=blue, label=unit];
Maxigauge -> 140430267940192  [weight=1];
}

Watlow

Drivers for Watlow Series 988 family of controllers.

Note

The XON/XOFF protocol is implemented.

class pyhard2.driver.watlow.XonXoffProtocol(socket)

Communication using the XON/XOFF protocol follows:

group Set
User    ->  Instrument: "= {mnemonic} {value}"
User    <-- Instrument: XOFF
User    <-- Instrument: XON
end

group Query
User    ->  Instrument: "? {mnemonic}"
User    <-- Instrument: XOFF
User    <-- Instrument: XON{value}
end

class pyhard2.driver.watlow.Series988(socket)

Driver for the Watlow Series 988 family of controllers.

digraph _ {
rankdir=LR;
node [shape=none, fontsize=10];
140430267937456 [fontcolor=blue, label=power];
Series988 -> 140430267937456  [weight=1];
140430263829624 [label=setup];
Series988 -> 140430263829624  [weight=3];
140430263831448 [label=output2];
140430263829624 -> 140430263831448  [weight=3];
140430263829776 [fontcolor=blue, label=action];
140430263831448 -> 140430263829776  [weight=1];
140430263828712 [fontcolor=blue, label=process_range];
140430263831448 -> 140430263828712  [weight=1];
140430263832056 [fontcolor=blue, label=hysteresis];
140430263831448 -> 140430263832056  [weight=1];
140430263830688 [label=communication];
140430263829624 -> 140430263830688  [weight=3];
140430263831144 [label=output1];
140430263829624 -> 140430263831144  [weight=3];
140430263831296 [fontcolor=blue, label=action];
140430263831144 -> 140430263831296  [weight=1];
140430263830232 [fontcolor=blue, label=process_range];
140430263831144 -> 140430263830232  [weight=1];
140430263830080 [fontcolor=blue, label=hysteresis];
140430263831144 -> 140430263830080  [weight=1];
140430263830840 [label=global_];
140430263829624 -> 140430263830840  [weight=3];
140430263830992 [fontcolor=blue, label=ramp_init];
140430263830840 -> 140430263830992  [weight=1];
140430263832360 [fontcolor=blue, label=ramp_rate];
140430263830840 -> 140430263832360  [weight=1];
140430263741184 [label=factory];
Series988 -> 140430263741184  [weight=3];
140430263742096 [label=calibration];
140430263741184 -> 140430263742096  [weight=3];
140430263741336 [label=lockout];
140430263741184 -> 140430263741336  [weight=3];
140430263741488 [label=diagnostic];
140430263741184 -> 140430263741488  [weight=3];
140430263741944 [fontcolor=blue, label=ambient_temperature];
140430263741488 -> 140430263741944  [weight=1];
140430263741640 [fontcolor=blue, label=test_data];
140430263741488 -> 140430263741640  [weight=1];
140430263741792 [fontcolor=blue, label=software_revision];
140430263741488 -> 140430263741792  [weight=1];
140430267940344 [fontcolor=blue, label=temperature2];
Series988 -> 140430267940344  [weight=1];
140430267940040 [fontcolor=blue, label=temperature1];
Series988 -> 140430267940040  [weight=1];
140430263829928 [label=operation];
Series988 -> 140430263829928  [weight=3];
140430263738600 [label=pid];
140430263829928 -> 140430263738600  [weight=3];
140430263738752 [label=a1];
140430263738600 -> 140430263738752  [weight=3];
140430263739664 [fontcolor=blue, label=derivative];
140430263738752 -> 140430263739664  [weight=1];
140430263739512 [fontcolor=blue, label=integral];
140430263738752 -> 140430263739512  [weight=1];
140430263739360 [fontcolor=blue, label=gain];
140430263738752 -> 140430263739360  [weight=1];
140430263738904 [label=a2];
140430263738600 -> 140430263738904  [weight=3];
140430263740120 [fontcolor=blue, label=derivative];
140430263738904 -> 140430263740120  [weight=1];
140430263739968 [fontcolor=blue, label=integral];
140430263738904 -> 140430263739968  [weight=1];
140430263739816 [fontcolor=blue, label=gain];
140430263738904 -> 140430263739816  [weight=1];
140430263739208 [label=b2];
140430263738600 -> 140430263739208  [weight=3];
140430263741032 [fontcolor=blue, label=derivative];
140430263739208 -> 140430263741032  [weight=1];
140430263740880 [fontcolor=blue, label=integral];
140430263739208 -> 140430263740880  [weight=1];
140430263740728 [fontcolor=blue, label=gain];
140430263739208 -> 140430263740728  [weight=1];
140430263739056 [label=b1];
140430263738600 -> 140430263739056  [weight=3];
140430263740576 [fontcolor=blue, label=derivative];
140430263739056 -> 140430263740576  [weight=1];
140430263740424 [fontcolor=blue, label=integral];
140430263739056 -> 140430263740424  [weight=1];
140430263740272 [fontcolor=blue, label=gain];
140430263739056 -> 140430263740272  [weight=1];
140430263830384 [label=system];
140430263829928 -> 140430263830384  [weight=3];
140430263738448 [fontcolor=blue, label=setpoint2];
140430263830384 -> 140430263738448  [weight=1];
140430267940192 [fontcolor=blue, label=setpoint];
Series988 -> 140430267940192  [weight=1];
}