/ SONDA · PROTOCOLS

The plant floor, as items of a project.

A Modbus device, an OPC UA server, a HART instrument or a DDS domain sits in the tree beside the REST calls. One tag model for all four, values with a quality and a timestamp, a watch that reports only what changed — and a reading past a line that starts a flow calling your APIs.

MODBUS TCP · RTU OVER TCP OPC UA HART-IP DDS / RTPS

One core under four protocols

TagsName, address or node, type, byte order, scale, offset, unit, deadband. Every value carries good, bad or uncertain, and a timestamp.
WatchFrom 100 ms. Report by exception: a change, a quality change, or a move past the deadband. One shared watch per device for the pane, the flows and the app watchers.
WritesOff by default, per device. Decided from the saved project, never from what the window sends. A danger confirm before each one. Every write on the activity feed.
On watchA device pushes its reads to a POST, PUT or PATCH request in the project — on change or every read — through the project's auth, environment, tunnel and scripts.
LostA dead device says "the connection is gone", never a green light. Each later read retries; "connected again" is logged.
/ THE FOUR

What each one does.

Modbus, HART-IP and DDS are Sonda's own implementations from the specifications, standard library only. OPC UA uses a pure-Go client.

Modbus

Modbus TCP and RTU over TCP through a serial gateway. Coils, discrete inputs, holding and input registers; function codes 1, 2, 3, 4 to read, 5, 6 and 16 to write, 43/14 to identify the device. Types from bool to float64 and strings; byte orders ABCD, CDAB, BADC, DCBA; scale and offset applied on read and reversed on write with range checks. Reads batched into as few requests as possible. A register map pasted from CSV or copied out. A raw read with decimal, hex, binary and signed. Exceptions in words. No serial port: RTU means through a gateway.

OPC UA

opc.tcp with None, Basic256Sha256, Aes128_Sha256_RsaOaep or Aes256_Sha256_RsaPss; None, Sign or SignAndEncrypt; anonymous or username. "Ask the server" lists every endpoint with a Use it button. The server's certificate is pinned on first contact and a changed one refused with a man-in-the-middle warning. This computer's own application certificate, its key sealed under the account password, shown for the server's administrator to trust. Browse the address space from Objects down and add any variable as a tag; read in one request; write in the node's own type. Watching is polling, from 100 ms.

HART-IP

TCP, port 5094, to an instrument, a gateway or a multiplexer; polling addresses 0 to 63; HART 5, 6 and 7. Commands 0, 2, 3, 9, 12, 13, 15 and 20 to read; 17, 18, 22, 34, 35 and 40 to write. PV, SV, TV, QV, loop current and percent of range; about 150 unit codes named; the device status byte in words — malfunction, configuration changed, loop fixed, PV out of limits. A loop test fixes the current at 4, 12 or 20 mA or any value from 3.5 to 23, for 30 seconds to 10 minutes, and releases it when time is up, when you press Release, or on disconnect — retried twelve times if the device will not let go. Writes are a person's, from the Configure page, each with a confirm; never a flow's.

DDS

Sonda's own DDSI-RTPS 2.x — no DDS library, no vendor runtime. Join a domain by multicast or by peers alone for VPNs and clouds. See every participant with its vendor — RTI Connext, OpenDDS, Fast DDS, Cyclone DDS, OpenSplice, CoreDX and more — every topic, every writer and reader with its QoS, and why two of them do not match, in words. ROS 2 names and 28 common ROS 2 types built in. Types from IDL or ROS 2 .msg; XCDR1 and XCDR2 decoded. Subscribe to any topic, keyed instances kept, fragments reassembled. Publish as a real DataWriter with reliability, durability and partitions, a confirm per sample, every sample on the activity feed.

/ FROM A READING TO AN API CALL

A tank level past a line starts a flow.

A device is a messenger to the rest of Sonda: its topics are tag names, its messages are value changes.

Flows

A flow's trigger names the device and the tag; each change past the deadband is a message; a filter such as msg.value > 80 starts a run that calls your APIs.

Flows

Apps

An app watcher listens on a device. A function reads tags now with app.read, and writes one with app.publish — only from a pressed button or a watcher allowed to send changes.

Apps

On watch

No flow at all: the device posts an envelope — values, quality, units, what changed — to a request of yours, or fills placeholders such as {{$watch.values.Level}} in its body. Best effort, one push in flight, counters for sent, failed and skipped.

The shared core, listed
/ LOCKFLARE SONDA

Four industrial protocols, in the free edition.

Modbus, OPC UA, HART-IP, DDS, listed →