The error string is what you actually search for when a line stops. 67 codes across 14 protocols — what each one means, when it happens, and how to fix it.
Modbus OPC UA MQTT / Sparkplug B FANUC FOCAS EtherNet/IP PROFINET / S7 BACnet/IP J1939 (CAN) MTConnect ROS 2 (DDS) SNMP MAVLink HTTP / REST CSV ingest
Modbus answers a bad request with an exception response: the function code echoed back with the high bit set, followed by a one-byte exception code. The codes below are from the MODBUS Application Protocol specification and mean the same thing over TCP and RTU. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| Exception 01 | Illegal Function | 0x01 |
| Exception 02 | Illegal Data Address | 0x02 |
| Exception 03 | Illegal Data Value | 0x03 |
| Exception 04 | Server Device Failure | 0x04 |
| Exception 06 | Server Device Busy | 0x06 |
| Exception 0B | Gateway Target Device Failed To Respond | 0x0B |
OPC UA returns a 32-bit StatusCode on every operation. Anything beginning Bad is a failure, Uncertain means the value is suspect, Good means usable. The severity is in the top two bits, which is why every Bad code is 0x80-something. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| BadNodeIdUnknown | Node ID is not known to the server | 0x80340000 |
| BadConnectionClosed | The secure channel was closed | 0x80AE0000 |
| BadTimeout | The operation timed out | 0x800A0000 |
| BadSecurityChecksFailed | An error occurred verifying security | 0x80130000 |
| BadUserAccessDenied | User does not have permission | 0x801F0000 |
| BadSubscriptionIdInvalid | The subscription id is not valid | 0x80280000 |
MQTT rejects a connection with a CONNACK return code. Version 3.1.1 uses codes 1-5; version 5.0 replaces them with a wider set of reason codes starting at 0x80. Sparkplug B then adds its own sequencing rules on top, which is where most industrial MQTT problems actually live. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| CONNACK 1 | Connection Refused: unacceptable protocol version | 0x01 |
| CONNACK 2 | Connection Refused: identifier rejected | 0x02 |
| CONNACK 3 | Connection Refused: server unavailable | 0x03 |
| CONNACK 5 | Connection Refused: not authorized | 0x05 |
| Sparkplug NDATA before NBIRTH | Data message received with no birth certificate | — |
| Sparkplug seq out of order | Sequence number gap in the Sparkplug stream | — |
Every Fwlib32 call returns a short. Zero is EW_OK; negative values are communication-layer failures; positive values are the CNC rejecting the request. The negative codes are the ones people search for.
FOCAS is FANUC's own library, not one of Forge's 14 protocol adapters. Forge reaches FANUC controllers over MTConnect, OPC UA, or EtherNet/IP. These codes are documented because anyone integrating a FANUC directly will meet them, and because the fix is often to stop using FOCAS.
| Code | Meaning | Hex / value |
|---|---|---|
| -16 | EW_SOCKET — socket communication error | — |
| -1 | EW_BUSY — CNC is busy | — |
| -8 | EW_HANDLE — library handle error | — |
| -17 | EW_PROTOCOL — protocol error | — |
EtherNet/IP carries CIP, and CIP replies carry a General Status code. A general status of 0x01 is usually accompanied by a two-byte extended status that holds the actual reason. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| 0x01 | Connection failure | 0x01 |
| 0x04 | Path segment error | 0x04 |
| 0x05 | Path destination unknown | 0x05 |
| 0x08 | Service not supported | 0x08 |
| 0x16 | Object does not exist | 0x16 |
Two separate error surfaces get conflated here. S7 communication over ISO-on-TCP returns S7 error classes on data access, while PROFINET IO itself reports device and module faults through diagnostic alarms. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| S7 0x05 | Address out of range | 0x05 |
| S7 0x0A | Item not available | 0x0A |
| ISO connection refused | ISO-on-TCP connection rejected on port 102 | — |
| PN station failure | PROFINET IO device failure | — |
BACnet errors carry an error class and an error code. The class says which part of the system objected — object, property, device, security, resources, services — and the code says what specifically went wrong. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| UNKNOWN_OBJECT | Error Class OBJECT, code UNKNOWN_OBJECT | — |
| UNKNOWN_PROPERTY | Error Class PROPERTY, code UNKNOWN_PROPERTY | — |
| WRITE_ACCESS_DENIED | Error Class PROPERTY, code WRITE_ACCESS_DENIED | — |
| TIMEOUT | Error Class DEVICE, code TIMEOUT | — |
| VALUE_OUT_OF_RANGE | Error Class PROPERTY, code VALUE_OUT_OF_RANGE | — |
J1939 reports faults as diagnostic trouble codes in DM1 and DM2 messages. A DTC is an SPN naming the suspect parameter, an FMI naming the failure mode, and an occurrence count. The FMI is the part that tells you what kind of failure it is. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| FMI 0 | Data valid but above normal operational range — most severe | — |
| FMI 3 | Voltage above normal or shorted to high source | — |
| FMI 4 | Voltage below normal or shorted to low source | — |
| FMI 5 | Current below normal or open circuit | — |
| FMI 2 | Data erratic, intermittent or incorrect | — |
| FMI 31 | Condition exists | — |
An MTConnect agent replies to a bad request with an MTConnectError document containing an errorCode attribute. Separately, the agent reports UNAVAILABLE as a data value — which is not an error, and confuses more integrators than any actual error code. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| OUT_OF_RANGE | Requested sequence number is out of range | — |
| NO_DEVICE | Named device does not exist on this agent | — |
| UNAUTHORIZED | Request was not authorized | — |
| UNAVAILABLE | Data item value is UNAVAILABLE (not an error) | — |
ROS 2 failures are mostly discovery and QoS problems in the DDS layer underneath. Nodes that cannot see each other, or that see each other and refuse to connect, account for most of it. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| Incompatible QoS | Publisher and subscriber QoS do not match | — |
| No publishers discovered | Topic exists but nothing is discovered | — |
| RCL_RET_TIMEOUT | Operation timed out | 2 |
| Failed to find a free participant index | No free DDS participant slot | — |
SNMP responses carry an error-status field. Version 1 defines six values; version 2c and 3 extend the set and add per-variable exceptions that appear in place of a value rather than as a request-level error.
| Code | Meaning | Hex / value |
|---|---|---|
| noSuchName | error-status 2 — object does not exist | 2 |
| tooBig | error-status 1 — response would not fit | 1 |
| genErr | error-status 5 — general error | 5 |
| authorizationError | error-status 16 — authorization failed | 16 |
MAVLink command results come back as a COMMAND_ACK with a MAV_RESULT value. Link-level problems show up instead as heartbeat loss or checksum failures.
| Code | Meaning | Hex / value |
|---|---|---|
| MAV_RESULT 2 | DENIED — command permanently denied | 2 |
| MAV_RESULT 3 | UNSUPPORTED — command not supported | 3 |
| MAV_RESULT 4 | FAILED — command accepted but execution failed | 4 |
| Heartbeat timeout | No HEARTBEAT received within the expected interval | — |
These are the status codes the Forge API itself returns. They follow standard HTTP semantics, with a few Forge-specific meanings worth stating so you do not debug the wrong layer. · protocol hub
| Code | Meaning | Hex / value |
|---|---|---|
| 401 | Unauthorized — missing or invalid API key | — |
| 402 | Payment Required — billing, not permissions | — |
| 403 | Forbidden — guardrail, and often intentional | — |
| 422 | Unprocessable Entity — body shape is wrong | — |
| 429 | Too Many Requests — rate limited | — |
CSV has no error codes of its own — it is a file format with no protocol layer. What follows are the failures Forge's CSV ingest actually returns, and the data problems that make a CSV normalize badly rather than fail outright. The second group is more dangerous, because nothing errors.
| Code | Meaning | Hex / value |
|---|---|---|
| empty_csv | No header row, or no data rows | — |
| too_many_fields | Column count exceeds the ingest limit | — |
| mixed types in a column | A column holds numbers and text (no error raised) | — |
| timestamp not recognized | Observation time falls back to ingest time | — |
Fixing the error gets the data flowing. Forge is what stops you writing a parser per vendor once it does.