diff --git a/include/pages.h b/include/pages.h index 1edd338..efca468 100644 --- a/include/pages.h +++ b/include/pages.h @@ -15,5 +15,5 @@ void sendButton(AsyncResponseStream *response, const char *title, const char *action, const char *css = ""); void sendTableRow(AsyncResponseStream *response, const char *name, uint32_t value); void sendDebugForm(AsyncResponseStream *response, String slaveId, String reg, String function); - + const String ErrorName(Modbus::Error code); #endif /* PAGES_H */ \ No newline at end of file diff --git a/src/pages.cpp b/src/pages.cpp index b3168e1..ebbec32 100644 --- a/src/pages.cpp +++ b/src/pages.cpp @@ -255,7 +255,8 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi * ModbusMessage answer = rtu->syncRequest(0xdeadbeef, slaveId.toInt(), func.toInt(), reg.toInt(), 1); LOGDEVICE = previous; response->print(""); - if (answer.getError() == SUCCESS){ + auto error = answer.getError(); + if (error == SUCCESS){ auto count = answer[2]; response->print("Answer: 0x"); for (size_t i = 0; i < count; i++) @@ -265,7 +266,7 @@ void setupPages(AsyncWebServer *server, ModbusClientRTU *rtu, ModbusBridgeWiFi * response->print(""); } else{ - response->printf("Error: %#02x", answer.getError()); + response->printf("Error: %#02x (%s)", error, ErrorName(error)); } sendDebugForm(response, slaveId, reg, func); sendButton(response, "Back", "/"); @@ -484,4 +485,39 @@ void sendDebugForm(AsyncResponseStream *response, String slaveId, String reg, St "d.querySelector(`option[value='${d.dataset.value}']`).selected=true" "}})();" ""); -} \ No newline at end of file +} + +const String ErrorName(Modbus::Error code) +{ + switch (code) + { + case Modbus::Error::SUCCESS: return "Success"; + case Modbus::Error::ILLEGAL_FUNCTION: return "Illegal function"; + case Modbus::Error::ILLEGAL_DATA_ADDRESS: return "Illegal data address"; + case Modbus::Error::ILLEGAL_DATA_VALUE: return "Illegal data value"; + case Modbus::Error::SERVER_DEVICE_FAILURE: return "Server device failure"; + case Modbus::Error::ACKNOWLEDGE: return "Acknowledge"; + case Modbus::Error::SERVER_DEVICE_BUSY: return "Server device busy"; + case Modbus::Error::NEGATIVE_ACKNOWLEDGE: return "Negative acknowledge"; + case Modbus::Error::MEMORY_PARITY_ERROR: return "Memory parity error"; + case Modbus::Error::GATEWAY_PATH_UNAVAIL: return "Gateway path unavailable"; + case Modbus::Error::GATEWAY_TARGET_NO_RESP: return "Gateway target no response"; + case Modbus::Error::TIMEOUT: return "Timeout"; + case Modbus::Error::INVALID_SERVER: return "Invalid server"; + case Modbus::Error::CRC_ERROR: return "CRC error"; + case Modbus::Error::FC_MISMATCH: return "Function code mismatch"; + case Modbus::Error::SERVER_ID_MISMATCH: return "Server id mismatch"; + case Modbus::Error::PACKET_LENGTH_ERROR: return "Packet length error"; + case Modbus::Error::PARAMETER_COUNT_ERROR: return "Parameter count error"; + case Modbus::Error::PARAMETER_LIMIT_ERROR: return "Parameter limit error"; + case Modbus::Error::REQUEST_QUEUE_FULL: return "Request queue full"; + case Modbus::Error::ILLEGAL_IP_OR_PORT: return "Illegal ip or port"; + case Modbus::Error::IP_CONNECTION_FAILED: return "IP connection failed"; + case Modbus::Error::TCP_HEAD_MISMATCH: return "TCP header mismatch"; + case Modbus::Error::EMPTY_MESSAGE: return "Empty message"; + case Modbus::Error::ASCII_FRAME_ERR: return "ASCII frame error"; + case Modbus::Error::ASCII_CRC_ERR: return "ASCII crc error"; + case Modbus::Error::ASCII_INVALID_CHAR: return "ASCII invalid character"; + default: return "undefined error"; + } +}