diff --git a/platformio.ini b/platformio.ini index 06a458b..fc07555 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,7 +15,7 @@ platform = espressif32 framework = arduino lib_deps = - https://github.com/tzapu/WiFiManager.git + https://github.com/PBRunot/WiFiManager.git#0404abde0d9d2da5c09be7d0cc669b1188bb1c81 https://github.com/me-no-dev/ESPAsyncWebServer.git https://github.com/eModbus/eModbus.git https://github.com/bblanchon/ArduinoJson.git diff --git a/src/localmodbus.cpp b/src/localmodbus.cpp index 5932781..ead2ff1 100644 --- a/src/localmodbus.cpp +++ b/src/localmodbus.cpp @@ -117,6 +117,7 @@ ModbusMessage FC02(ModbusMessage request) { } // FC03: worker do serve Modbus function code 0x03 (READ_HOLD_REGISTER) +// Gets the current temperature (from address 0x00 with a length of 4 Bytes) ModbusMessage FC03(ModbusMessage request) { uint16_t address; // requested register address uint16_t words; // requested number of registers @@ -141,6 +142,32 @@ ModbusMessage FC03(ModbusMessage request) { return response; } +// FC04: worker do serve Modbus function code 0x04 (READ_INPUT_REGISTER) +// Gets the current temperature (from address 0x00 with a length of 4 Bytes) +ModbusMessage FC04(ModbusMessage request) { + uint16_t address; // requested register address + uint16_t words; // requested number of registers + ModbusMessage response; // response message to be sent back + + LOG_D("Worker for FC04\n"); + + // get request values + request.get(2, address); + request.get(4, words); + + // return current temperature + if (address == 0 && words == 2) { + // Looks okay. Set up message with serverID, FC and length of data + response.add(request.getServerID(), request.getFunctionCode(), (uint8_t)(words * 2)); + // add current temperature to response + response.add(temperatureRead()); + } else { + // Set up error response. + response.setError(request.getServerID(), request.getFunctionCode(), ILLEGAL_DATA_ADDRESS); + } + return response; +} + // FC05: worker do serve Modbus function code 0x05 (WRITE_COIL) ModbusMessage FC05(ModbusMessage request) { uint16_t address; // requested coil @@ -255,14 +282,14 @@ void setupLocalModbus(uint8_t serverID, ModbusClientRTU *rtu, ModbusBridgeWiFi * _bridge = bridge; _config = config; _serverID = serverID; - bridge->registerWorker(serverID, READ_HOLD_REGISTER, &FC03); + //bridge->registerWorker(serverID, READ_HOLD_REGISTER, &FC03); + bridge->registerWorker(serverID, READ_INPUT_REGISTER, &FC04); bridge->registerWorker(serverID, DIAGNOSTICS_SERIAL, &FC08); } void enableCoilWorkers() { _bridge->registerWorker(_serverID, READ_COIL, &FC01); _bridge->registerWorker(_serverID, WRITE_COIL, &FC05); - // _bridge->registerWorker(_serverID, WRITE_MULT_COILS, &FC0F); } void enableInputWorkers() {