A clear call contract
JSON-RPC 2.0 defines method, params, id, result and error. Requests map to responses one-to-one, with standard error codes.
Technology
Falcon does not invent a new protocol. It translates serial PLC ↔ HMI traffic into JSON-RPC 2.0 messages engineers already know, and moves them over plain MQTT publish / subscribe.
One side of Falcon sits on the field serial link; the other hands the data to your systems over MQTT.
| Where | Support |
|---|---|
| Field side: PLC ↔ HMI | Serial: RS-232, RS-422, RS-485 |
| System side: Falcon → MES / SCADA / cloud | MQTT with JSON-RPC 2.0 messages |
| PLC and HMI connected over Ethernet | Not supported yet |
Tell us your PLC / HMI models and wiring via the quote form and we will confirm the matching protocol and cabling.
JSON-RPC 2.0 defines method, params, id, result and error. Requests map to responses one-to-one, with standard error codes.
MQTT is lightweight, supports QoS and retained messages, and is the most common transport in AIoT and Industry 4.0 — nearly every platform speaks it.
Python, Node.js, C#, Go, Node-RED or cloud IoT services — if it can send JSON over MQTT, it can integrate.
Monitoring data, remote commands and system status all share one MQTT broker: a simple architecture with centralized permissions.
Each Falcon uses its gateway ID as the topic prefix, split by purpose into requests, responses, events and status.
| Topic | Direction | Purpose |
|---|---|---|
falcon/{gw}/rpc/req | Client → Falcon | JSON-RPC requests (read / write tags, control, replay) |
falcon/{gw}/rpc/res/{client} | Falcon → Client | JSON-RPC response matching the request id |
falcon/{gw}/event | Falcon → Subscribers | Observed PLC ↔ HMI traffic (JSON-RPC notifications) |
falcon/{gw}/status | Falcon → Subscribers | Online / offline state (retained + LWT) |
Clients publish requests to rpc/req with a reply_to topic. Falcon executes and returns a result or error carrying the same id.
// Topic: falcon/line-01/rpc/req
{
"jsonrpc": "2.0",
"id": "c7f2-0001",
"method": "tag.write",
"params": {
"tag": "D100",
"value": 1250,
"reply_to": "falcon/line-01/rpc/res/mes-01"
}
}// Topic: falcon/line-01/rpc/res/mes-01
{
"jsonrpc": "2.0",
"id": "c7f2-0001",
"result": {
"tag": "D100",
"value": 1250,
"ts": "2026-11-04T08:15:02.481Z"
}
}{
"jsonrpc": "2.0",
"id": "c7f2-0002",
"error": {
"code": -32602,
"message": "Invalid params",
"data": { "tag": "D9999", "reason": "out of range" }
}
}Whenever Falcon observes traffic between HMI and PLC, it publishes a JSON-RPC notification (no id) to the event topic, available to every subscriber in real time.
// Topic: falcon/line-01/event (JSON-RPC notification, no id)
{
"jsonrpc": "2.0",
"method": "traffic.observed",
"params": {
"direction": "hmi->plc",
"op": "read",
"tags": { "D100": 1200, "M20": true },
"ts": "2026-11-04T08:15:01.937Z"
}
}Methods are named domain.action so their purpose is obvious at a glance.
| Method | Description |
|---|---|
tag.read | Read the current value of one or more PLC tags |
tag.write | Write a PLC tag (control intervention) |
monitor.subscribe | Choose which tag ranges are monitored and published |
log.record | Start / stop recording a traffic log |
log.replay | Replay a log to reproduce field traffic |
system.info | Gateway version, health and connection info |
Subscribe to events and read tags in under 30 lines with paho-mqtt.
import json, uuid
import paho.mqtt.client as mqtt
GW = "falcon/line-01"
ME = "mes-01"
def on_message(client, userdata, msg):
print(msg.topic, json.loads(msg.payload))
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=ME)
client.on_message = on_message
client.connect("broker.local", 1883)
client.subscribe(f"{GW}/event")
client.subscribe(f"{GW}/rpc/res/{ME}")
req = {
"jsonrpc": "2.0",
"id": str(uuid.uuid4()),
"method": "tag.read",
"params": {"tags": ["D100", "M20"], "reply_to": f"{GW}/rpc/res/{ME}"},
}
client.publish(f"{GW}/rpc/req", json.dumps(req), qos=1)
client.loop_forever()Topic names, method names and fields on this page are illustrative. Refer to the product technical documentation for the actual specification.
Supported PLC
Falcon works with the Japanese and Taiwanese PLCs common on factory floors over serial (RS-232 / RS-422 / RS-485), with no need to replace existing equipment.
Support varies by series and protocol within each brand. Tell us your model through the quote form for a compatibility check. Brands not listed here are welcome too. Request a Quote →
Tell us your PLC / HMI models and site requirements. Our sales team replies with an integration assessment and quote within one business day.