Holdingregister Write Funktion mit Write-ToEEprom ergänzt.
Holdingregister Read mit Funtion Read-EEPROM ergänzt
This commit is contained in:
parent
9bfedb97cb
commit
1c34032bc3
60
src/main.cpp
60
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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user