Reference
Verified hardware
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
| Path | What it does | State | Notes |
|---|---|---|---|
| Modbus TCP | holding and input registers, coils and discrete inputs, block reads, writes with functions 5, 6, 15 and 16, a unit id per tag | Verified against the emulator | |
| Modbus RTU over a serial device server | the RTU framing with CRC over tcp:// (a Moxa NPort, ser2net) | Verified against the emulator | |
| Modbus RTU on a serial port | the same framing on COMn or /dev/tty, through the serialport package or the port opened as a file | Beta - not yet met hardware | the 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 socket | queries and commands on port 5025 (5555 on Rigol), one at a time, numbers and text | Verified against the emulator | |
| SCPI on a serial port | the same over RS-232 / USB-serial | Verified against the emulator | verified through a serial device server; a physical port not yet |
| VISA: VXI-11 over LAN | TCPIP0::host::inst0::INSTR without a VISA library: the agent's own portmapper and core-channel client | Verified against the emulator | |
| VISA: LAN socket | TCPIP0::host::5025::SOCKET, the same as scpi-tcp through the VISA resource string | Verified against the emulator | |
| VISA: USB-TMC through the VISA library | USB0::…::INSTR through a vendor's VISA library (Keysight IO Libraries, R&S VISA or another), loaded with koffi | Beta - not yet met hardware | the 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 library | GPIB0::n::INSTR through the vendor library | Beta - not yet met hardware | as visa-usb |
| VISA: HiSLIP through the VISA library | TCPIP0::host::hislip0::INSTR through the vendor library | Beta - not yet met hardware | as visa-usb; without the library the agent says so |
| DAQmx | analog and digital channels of a DAQ device through the DAQmx library, loaded with koffi | Beta - not yet met hardware | the 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 S7 | data 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 time | Verified against the emulator | Written 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 time | Verified against the emulator | Written 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 client | monitored items, writes, browsing; None, and Basic256Sha256 with Sign or SignAndEncrypt with the client's own certificate | Verified against the emulator | Session, 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 server | the hub's tags as variables, read and written by a client | Verified against the emulator | read 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.1 | subscribe with wildcards, retained messages, publish at QoS 0 and 1, JSON fields | Verified against the emulator | against the check's broker; Mosquitto, EMQX, HiveMQ not yet |
| HTTP polling | a JSON answer polled, fields by path, a write as a request | Verified against the emulator | |
| TDMS files | the Log node's TDMS files, read back | Verified against the emulator | read 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.
| Template | Instrument | Interfaces |
|---|
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.