diff --git a/src/main.cpp b/src/main.cpp index da761d0..2de1678 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -121,6 +121,63 @@ uint8_t fReadInputRegister(uint8_t fc, uint16_t address, uint16_t length) { return STATUS_OK; } +// Write function for holding registers +uint8_t fWriteHoldingRegister(uint8_t fc, uint16_t address, uint16_t length) { + if (address >= sizeof(HoldingRegister) / sizeof(HoldingRegister[0]) || (address + length) > sizeof(HoldingRegister) / sizeof(HoldingRegister[0])) { + return STATUS_ILLEGAL_DATA_ADDRESS; + } + + for (uint16_t i = 0; i < length; i++) { + int value = slave.readRegisterFromBuffer(i); + HoldingRegister[address + i] = value; + + // Use switch-case for specific register addresses + switch (address + i) { + case 0: + modbusConfig.SetModbusID(value); // Update Modbus ID in EEPROM + break; + case 1: + modbusConfig.SetModbusID(value); // Update Modbus ID in EEPROM + break; + case 2: + modbusConfig.SetBaudRate(value); // Update Baud rate in EEPROM + break; + default: + // No specific action for other addresses + break; + } + } + + return STATUS_OK; +} + +// Optional: Read function for holding registers +uint8_t fReadHoldingRegister(uint8_t fc, uint16_t address, uint16_t length) { + if (address >= sizeof(HoldingRegister) / sizeof(HoldingRegister[0]) || (address + length) > sizeof(HoldingRegister) / sizeof(HoldingRegister[0])) { + return STATUS_ILLEGAL_DATA_ADDRESS; + } + + for (uint16_t i = 0; i < length; i++) { + // Add specific data to holding registers + switch (address + i) { + case 0: // Modbus ID + slave.writeRegisterToBuffer(i, modbusConfig.GetModbusID()); + break; + case 1: // Modbus ID + slave.writeRegisterToBuffer(i, modbusConfig.GetModbusID()); + break; + case 2: // Baud rate + slave.writeRegisterToBuffer(i, modbusConfig.GetBaudRate()); + break; + default: // Other data from HoldingRegister array + slave.writeRegisterToBuffer(i, HoldingRegister[address + i]); + break; + } + } + + return STATUS_OK; +} + void setup() { pinMode(RS485_CTRL_PIN, OUTPUT); digitalWrite(RS485_CTRL_PIN, LOW); // RS485-Empfang aktivieren @@ -132,7 +189,8 @@ void setup() { slave.cbVector[CB_WRITE_COILS] = writeDigitalOut; slave.cbVector[CB_READ_DISCRETE_INPUTS] = fReadCoilRegister; slave.cbVector[CB_READ_INPUT_REGISTERS] = fReadInputRegister; - //slave.cbVector[CB_WRITE_INPUT_REGISTERS] = fWriteInputRegister; // Registrierung der Schreib-Funktion + slave.cbVector[CB_WRITE_HOLDING_REGISTERS] = fWriteHoldingRegister; + slave.cbVector[CB_READ_HOLDING_REGISTERS] = fReadHoldingRegister;//slave.cbVector[CB_WRITE_INPUT_REGISTERS] = fWriteInputRegister; // Registrierung der Schreib-Funktion pinMode(OutPutPin, OUTPUT); digitalWrite(OutPutPin, LOW);