From 1c34032bc35fcf48aac8ae323f59d6e0c73f79a8 Mon Sep 17 00:00:00 2001 From: chschloetel Date: Sat, 2 Nov 2024 16:56:41 +0100 Subject: [PATCH] =?UTF-8?q?Holdingregister=20Write=20Funktion=20mit=20Writ?= =?UTF-8?q?e-ToEEprom=20erg=C3=A4nzt.=20Holdingregister=20Read=20mit=20Fun?= =?UTF-8?q?tion=20Read-EEPROM=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) 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);