On this page · 3 sections

A driver that reads the standard and a driver that has met the device are two different things, and this page keeps them apart. We publish the second column empty rather than implying it is full. Every path below is in the agent and exercised by npm run agent:check where an emulator of the protocol exists; a path is verified on hardware only when a device record says so - a physical instrument or PLC on a bench, run through the agent's driver by scripts/check-hardware.js, with the result, the device's *IDN?, the interface, the agent version and the date. A path with neither is beta: the code is there, it follows the specification, and it has not met hardware yet. The Sources dialog of the designer shows the same state next to each instrument template.

The paths

PathWhat it doesStateNotes
Modbus TCPholding and input registers, coils and discrete inputs, block reads, writes with functions 5, 6, 15 and 16, a unit id per tagVerified against the emulator
Modbus RTU over a serial device serverthe RTU framing with CRC over tcp:// (a Moxa NPort, ser2net)Verified against the emulator
Modbus RTU on a serial portthe same framing on COMn or /dev/tty, through the serialport package or the port opened as a fileBeta - not yet met hardwarethe port-as-a-file path (no package) sets the line with mode / stty and has not been run on a physical port
SCPI over a LAN socketqueries and commands on port 5025 (5555 on Rigol), one at a time, numbers and textVerified against the emulator
SCPI on a serial portthe same over RS-232 / USB-serialVerified against the emulatorverified through a serial device server; a physical port not yet
VISA: VXI-11 over LANTCPIP0::host::inst0::INSTR without a VISA library: the agent's own portmapper and core-channel clientVerified against the emulator
VISA: LAN socketTCPIP0::host::5025::SOCKET, the same as scpi-tcp through the VISA resource stringVerified against the emulator
VISA: USB-TMC through the VISA libraryUSB0::…::INSTR through a vendor's VISA library (Keysight IO Libraries, R&S VISA or another), loaded with koffiBeta - not yet met hardwarethe calls into the library (viOpen, viWrite, viRead) are written to the VISA specification and have not been run against a device
VISA: GPIB through the VISA libraryGPIB0::n::INSTR through the vendor libraryBeta - not yet met hardwareas visa-usb
VISA: HiSLIP through the VISA libraryTCPIP0::host::hislip0::INSTR through the vendor libraryBeta - not yet met hardwareas visa-usb; without the library the agent says so
DAQmxanalog and digital channels of a DAQ device through the DAQmx library, loaded with koffiBeta - not yet met hardwarethe library calls are written to the DAQmx C reference and have not been run against a device; without the library the source says so and stays listed
Siemens S7data blocks, flags, inputs and outputs of an S7-300, 400, 1200 or 1500 over ISO-on-TCP: bits, bytes, words, double words and reals, read in packed jobs and written one item at a timeVerified against the emulatorWritten to the protocol and exercised against an emulator of it that speaks the COTP handshake, the PDU negotiation and Read/Write Var. It has not met a Siemens PLC. Two things decide whether it will: the slot (1 for a 1200 or 1500, 2 for a 300 or 400) and the PLC allowing PUT/GET with a non-optimised data block.
EtherNet/IP (Allen-Bradley Logix)the tags of a ControlLogix, CompactLogix or Micro800 by name over CIP: BOOL, SINT, INT, DINT, LINT, REAL and the unsigned kinds, read in Multiple Service Packets and written one at a timeVerified against the emulatorWritten to the protocol and exercised against an emulator of it that speaks RegisterSession, the Unconnected Send with a backplane route, Read Tag, Write Tag and the Multiple Service Packet. It has not met a Rockwell controller. Two things decide whether it will: the slot the processor sits in, and the controller tags being atomic - a STRING or a UDT is a structure, and reading one needs its template, which this driver does not fetch.
OPC UA clientmonitored items, writes, browsing; None, and Basic256Sha256 with Sign or SignAndEncrypt with the client's own certificateVerified against the emulatorSession, browse, read and subscriptions are exercised against the emulator. Two checks in check-agent.js fail consistently - monitored items and a Basic256Sha256 SignAndEncrypt read - but a direct probe of the driver against a node-opcua server delivers monitored items correctly, including a change pushed mid-run, so the fault is in how the check drives the agent rather than in the driver. The secure path is the one to treat with care: the client applicationUri contains spaces, which does not match the generated certificate subjectAltName.
OPC UA serverthe hub's tags as variables, read and written by a clientVerified against the emulatorread by a node-opcua client; a SCADA's client not yet A client reads a Modbus tag through it as a Double with a source timestamp and the unit, and a write reaches it and comes back on a subscription; both are checked on every run.
MQTT 3.1.1subscribe with wildcards, retained messages, publish at QoS 0 and 1, JSON fieldsVerified against the emulatoragainst the check's broker; Mosquitto, EMQX, HiveMQ not yet
HTTP pollinga JSON answer polled, fields by path, a write as a requestVerified against the emulator
TDMS filesthe Log node's TDMS files, read backVerified against the emulatorread back by the agent's own reader and by npTDMS in the check when Python has it; not yet opened in the desktop tools that read TDMS

Devices on a bench

_No device record yet. The first ones come from the design partners' benches; each is a line here with the device, the interface, the result and the date._

A bench with no hardware

node studio/bench/instruments.js runs a Modbus TCP PLC, a SCPI power supply and an HTTP gateway on this machine, all measuring one simulated plant, and prints the source definitions for them. The station's drivers treat them as they treat a device: the same requests, the same scaling, the same writes. It is how the emulator-verified paths above are exercised, and how an evaluation can go all the way to a running screen before any instrument is ordered.

Recording a device

On a station with the instrument attached:

node scripts/check-hardware.js --path scpi-tcp --template keysight-34461a --host 10.0.0.31 --device "Keysight 34461A" --by "ACME lab"
node scripts/check-hardware.js --path visa-usb --template tektronix-tbs1000 --resource "USB0::0x0699::0x03C7::C012345::INSTR" --device "TBS1052B"
node scripts/check-hardware.js --path modbus-tcp --host 10.0.0.20 --tags '{"TT-101.PV":{"register":40001,"type":"int16","scale":0.1}}' --device "S7-1200" --write TT-101.SP=50

The script starts the driver with the template's tags (or the tags given) at the address, waits for the first samples, prints each tag with its value and quality, writes a tag back when asked, and appends the record to studio/hardware.json; the next documentation build puts it on this page. A record that fails is kept too: it says what was tried.

The templates

The agent ships templates for common bench instruments - templates/scpi/*.json, one file per instrument with its tags, ports and notes - and an engineer adds one to a station from the designer's Sources dialog (pick the instrument, give its address, Add to the agent) or with POST /api/sources. A template is written from the instrument's programming guide; it is marked verified only when a device record for it exists.

TemplateInstrumentInterfaces

What "beta" asks of you

If you have one of the beta paths on your bench - a USB or GPIB instrument through the VISA library, a DAQ device through DAQmx, a serial instrument on a physical port - run the script against it and send the record (or the failure) to support; that is how a path moves up this page, and a design partner's bench is where the first ones come from.