The Edge Logic Editor
A canvas, a palette and an inspector. A node is a device, a step or an output; a wire is the path a value takes. Every save is a version.
The canvas
The editor is a canvas with the palette on the left and the inspector on the right. A node is added by clicking it in the palette or dragging it onto the canvas; wires are drawn from a node's output port to another's input port. Edits save by themselves, a second after you stop; the status bar says Saved · v3 with the version that was kept. Every save is a version you can see on the design page.
Palette groups
| Group | Nodes | What they are |
|---|---|---|
| PLC & industrial | Modbus, Siemens S7, S7CommPlus, Fetch/Write, RK512, Allen-Bradley CIP, PCCC, Mitsubishi MELSEC and FX, Omron FINS and Host Link, Beckhoff TwinCAT, OPC UA Client, GE SRTP and EGD, Yaskawa, DirectNET, Emerson ROC, DNP3, BACnet/IP client, SNMP, MTConnect, M-Bus, DLMS/COSEM, WITS, Yokogawa | Sources: a device the runtime polls. One node is one device; its tags are its addresses. |
| Transforms | Scale, Unit conversion, Deadband / Change filter, Expression, Cast, Rename / Map, Rate limit, Debounce, Batch / Aggregate, JSON template | Shape values on their way. Scale, Unit conversion and Rename are applied to the tag once; the others run on the route (below, and in Logic and routing nodes). |
| Logic & routing | Condition / Route, Join, Inject / Trigger, Throttle, Catch / Status | Decide where and when values go, and report what went wrong. Each is executed by the runtime; see Logic and routing nodes. |
| Output | MQTT out, HTTP out, SQL out, OPC UA Server out, BACnet/IP out, WebSocket out, Modbus Server out, Store & forward | Where the data goes. One node is one destination in the runtime; Store & forward is the disk buffer in front of one. |
| Gateway | Modbus converter | A service beside the flow: a serial Modbus bus published on a TCP or UDP socket. |
| Messaging | MQTT in, HTTP in, Write out | Drawable, but not gateway features: the runtime publishes rather than subscribes, and is read-only towards the plant. Validation names each one and leaves it out. |
@tamidas/edge-logic, the same editor the TamidaS IoT Platform uses, vendored unchanged. What is Modbus Logic-specific is the compiler behind it, which turns the flow into the runtime's configuration.Sources: reading a device
A source node is one device. Its inspector holds the connection (host and port, or a serial port with baud, parity, data and stop bits, and the unit or station ID), the poll interval, and the addresses to read. Each address becomes a tag: a name, a data type, a byte order and a scaling, with a quality the runtime keeps up to date.
- Modbus addresses take the reference form (
40001,30001,00001,10001) orholding:0,input:0,coil:0,discrete:0. Neighbouring registers are read in one block request. - Each other protocol has its own address form, shown as an example in the node:
DB1.DBW0for S7,Program:Main.Speedfor Allen-Bradley CIP,D100for MELSEC,MAIN.fSpeedfor TwinCAT,ns=2;s=Pump.Speedfor an OPC UA server. The runtime's own driver checks every address at validation. - Data types: BOOL, INT16, UINT16, INT32, UINT32, INT64, UINT64, FLOAT32, FLOAT64 and text, with the byte orders ABCD, BADC, CDAB and DCBA for values wider than one register.
- io-tags.json from the Modbus Scanner imports on the design page: names, data types, byte order and scaling arrive with it, and the editor draws the device.
What the transform nodes become
A transform sits on the wire between a source and an output. The compiler turns each into the thing the runtime already has for it: a setting on the tag, a setting on the route, or a step the route executes on every message, in the order the wire passes them.
| Node | Becomes |
|---|---|
| Scale | The tag's own scale and offset: y = m × x + b, applied once, before routing. A clamp and rounding to a number of decimals follow it. |
| Unit conversion | A conversion on the tag: degC to degF, bar to psi, kW to hp, l/min to m³/h. Two different dimensions are refused at validation. |
| Rename / Map | The tag's published name. |
| Deadband / Change filter | The route's deadband, absolute or percent. A value that has not moved past it is not published. *Any change* means no deadband. |
| Rate limit | A periodic route: at most one publish per interval, whatever the poll rate. |
| Expression, Cast | Steps on the route that change the value before it is published: value * 1.8 + 32, or a cast to bool, integer, float or text. |
| Debounce, Batch, JSON template, Throttle | Steps on the route that shape the message that leaves: wait for a quiet period, collect into one array, reshape the payload, drop when the output is behind. |
| Store & forward | The output's bounded disk buffer, replayed in order when the output returns. Server-style outputs hold the present value and have nothing to buffer. |