Holdingregister Write Funktion mit Write-ToEEprom ergänzt.

Holdingregister Read mit Funtion Read-EEPROM ergänzt
This commit is contained in:
chschloetel 2024-11-02 16:56:41 +01:00
parent 9bfedb97cb
commit 1c34032bc3

View File

@ -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);