EEPROM funktion komplett entfernt

This commit is contained in:
chschloetel 2024-11-01 22:34:00 +01:00
parent 7fbfb2b49a
commit 56caa097e6

View File

@ -1,147 +1,132 @@
#include <Arduino.h>
#include <Wire.h>
#include <ModbusSlave.h>
#include <EEPROM.h>
#include <SHT2x.h>
// Default configurations for Modbus ID and baud rate
#define DEFAULT_SLAVE_ID 8
#define DEFAULT_BAUDRATE 9600
// Statische Definition von Modbus-ID und Baudrate
#define SLAVE_ID 8
#define SERIAL_BAUDRATERS485 9600
#define SERIAL_PORTRS485 Serial
// RS485-Konfiguration
#define RS485_CTRL_PIN 8
#define OutPutPin 9
// Arrays for Modbus register handling
// Register Arrays für Modbus
uint8_t ReadCoilRegister[] = {0, 1, 2};
uint8_t output_pins[] = {0, 1};
uint8_t ReadInputRegister[] = {0, 1, 2, 3, 4, 5, 6, 7};
uint8_t output_pins[] = {0,1};
uint8_t ReadInputRegister[] = {0,1,2,3,4,5,6,7};
uint8_t ReadCoilRegister_size = sizeof(ReadCoilRegister) / sizeof(ReadCoilRegister[0]);
uint8_t output_pins_size = sizeof(output_pins) / sizeof(output_pins[0]);
uint8_t ReadInputRegister_size = sizeof(ReadInputRegister) / sizeof(ReadInputRegister[0]);
// EEPROM memory locations
const int EEPROM_ADDR_SLAVE_ID = 0;
const int EEPROM_ADDR_BAUDRATE = EEPROM_ADDR_SLAVE_ID + sizeof(uint8_t);
int ValueInputOne = 0;
// Modbus object
#ifdef RS485_CTRL_PIN
Modbus slave(SERIAL_PORTRS485, DEFAULT_SLAVE_ID, RS485_CTRL_PIN);
Modbus slave(SERIAL_PORTRS485, SLAVE_ID, RS485_CTRL_PIN);
#else
Modbus slave(SERIAL_PORTRS485, DEFAULT_SLAVE_ID);
Modbus slave(SERIAL_PORTRS485, SLAVE_ID);
#endif
// SHT21 Sensor object
// SHT2x SHT21EnvSensor;
// EEPROM configuration loading
void loadConfig(uint8_t &slaveID, uint32_t &baudRate) {
EEPROM.get(EEPROM_ADDR_SLAVE_ID, slaveID);
EEPROM.get(EEPROM_ADDR_BAUDRATE, baudRate);
if (slaveID == 0xFF) {
slaveID = DEFAULT_SLAVE_ID;
EEPROM.put(EEPROM_ADDR_SLAVE_ID, slaveID);
// Funktion zur Steuerung der digitalen Ausgänge über Modbus
uint8_t writeDigitalOut(uint8_t fc, uint16_t address, uint16_t length) {
if (address > output_pins_size || (address + length) > output_pins_size) {
return STATUS_ILLEGAL_DATA_ADDRESS;
}
if (baudRate == 0xFFFFFFFF) {
baudRate = DEFAULT_BAUDRATE;
EEPROM.put(EEPROM_ADDR_BAUDRATE, baudRate);
for (uint16_t i = 0; i < length; i++) {
if (slave.readCoilFromBuffer(i) == 1) {
digitalWrite(OutPutPin, HIGH);
} else {
digitalWrite(OutPutPin, LOW);
}
}
return STATUS_OK;
}
// Write digital output function
uint8_t writeDigitalOut(uint8_t fc, uint16_t address, uint16_t length) {
if (address >= output_pins_size || (address + length) > output_pins_size) {
// Funktion zum Lesen von Coil-Register-Werten
uint8_t fReadCoilRegister(uint8_t fc, uint16_t address, uint16_t length) {
if (address > ReadCoilRegister_size || (address + length) > ReadCoilRegister_size) {
return STATUS_ILLEGAL_DATA_ADDRESS;
}
for (uint16_t i = 0; i < length; i++) {
if (i == 0) {
digitalWrite(OutPutPin, slave.readCoilFromBuffer(i) ? HIGH : LOW);
slave.writeCoilToBuffer(i, digitalRead(OutPutPin));
} else if (i == 1) {
slave.writeCoilToBuffer(i, 0);
} else if (i == 2) {
slave.writeCoilToBuffer(i, 1);
}
}
return STATUS_OK;
}
// Read Coil Register
uint8_t fReadCoilRegister(uint8_t fc, uint16_t address, uint16_t length) {
if (address >= ReadCoilRegister_size || (address + length) > ReadCoilRegister_size) {
return STATUS_ILLEGAL_DATA_ADDRESS;
}
for (uint16_t i = 0; i < length; i++) {
slave.writeCoilToBuffer(i, (i == 0) ? digitalRead(OutPutPin) : (i == 1 ? 0 : 1));
}
return STATUS_OK;
}
// Read Input Register
// Funktion zum Lesen von Input-Register-Werten
uint8_t fReadInputRegister(uint8_t fc, uint16_t address, uint16_t length) {
if (address >= ReadInputRegister_size || (address + length) > ReadInputRegister_size) {
if (address > ReadInputRegister_size || (address + length) > ReadInputRegister_size) {
return STATUS_ILLEGAL_DATA_ADDRESS;
}
float temperatur = 21.21; // Placeholder, replace with sensor reading
float humidity = 55.55; // Placeholder, replace with sensor reading
for (uint16_t i = 0; i < length; i++) {
float temperatur = 21.21; // Dummy-Wert für Temperatur
float humidity = 55.55; // Dummy-Wert für Luftfeuchtigkeit
switch (i) {
case 0:
slave.writeRegisterToBuffer(i, millis() / 1000); // Time in seconds
slave.writeRegisterToBuffer(i, millis() / 1000); // Zeit in Sekunden
break;
case 1:
slave.writeRegisterToBuffer(i, SERIAL_BAUDRATERS485);
slave.writeRegisterToBuffer(i, SERIAL_BAUDRATERS485); // Baudrate
break;
case 2:
slave.writeRegisterToBuffer(i, SLAVE_ID);
slave.writeRegisterToBuffer(i, SLAVE_ID); // Slave-ID
break;
case 3:
slave.writeRegisterToBuffer(i, static_cast<int>(temperatur * 100)); // Temperature
case 3: {
slave.writeRegisterToBuffer(i, static_cast<int>(temperatur * 100));
break;
case 4:
slave.writeRegisterToBuffer(i, static_cast<int>(humidity * 100)); // Humidity
}
case 4: {
slave.writeRegisterToBuffer(i, static_cast<int>(humidity * 100));
break;
}
case 5: {
const double UG = 8314.3;
const double mw = 18.016;
const double K = 273.15;
const double tp = 6.1078;
double absolutHumidity = (100000 * mw / UG * humidity / 100 * tp *
pow(10, (7.5 * temperatur) / (239 + temperatur)) / (temperatur + K)) * 100;
const double UG = 8314.3; // J/(kmol*K), universelle Gaskonstante
const double mw = 18.016; // kg/kmol, Molekulargewicht des Wasserdampfes
const double K = 273.15; // Konstante für Kelvin-Umrechnung
const double tp = 6.1078; // hPa, Triplettpunkt von Wasser
double absolutHumidity = (100000 * mw / UG * humidity / 100 * tp * pow(10, ((7.5 * temperatur) / (239 + temperatur))) / (temperatur + K)) * 100;
slave.writeRegisterToBuffer(i, static_cast<int>(absolutHumidity));
break;
}
case 6:
slave.writeRegisterToBuffer(i, 5); // Light level placeholder
slave.writeRegisterToBuffer(i, 5); // Platzhalter für Helligkeitswert
break;
case 7:
slave.writeRegisterToBuffer(i, digitalRead(OutPutPin));
slave.writeRegisterToBuffer(i, digitalRead(OutPutPin)); // Zustand des Ausgangs
break;
}
}
return STATUS_OK;
}
void setup() {
uint8_t slaveID;
uint32_t baudRate;
loadConfig(slaveID, baudRate);
SERIAL_PORTRS485.begin(baudRate);
slave.begin(baudRate);
pinMode(RS485_CTRL_PIN, OUTPUT);
pinMode(OutPutPin, OUTPUT);
digitalWrite(OutPutPin, LOW);
digitalWrite(RS485_CTRL_PIN, LOW); // RS485-Empfang aktivieren
SERIAL_PORTRS485.begin(SERIAL_BAUDRATERS485);
slave.begin(SERIAL_BAUDRATERS485);
// Modbus-Handler registrieren
slave.cbVector[CB_WRITE_COILS] = writeDigitalOut;
slave.cbVector[CB_READ_DISCRETE_INPUTS] = fReadCoilRegister;
slave.cbVector[CB_READ_INPUT_REGISTERS] = fReadInputRegister;
pinMode(OutPutPin, OUTPUT);
digitalWrite(OutPutPin, LOW);
}
void loop() {
slave.poll();
slave.poll(); // Verarbeitet ankommende Modbus-Anfragen
}