Add some Comments on every line by KI

This commit is contained in:
chschloetel 2025-02-20 18:06:11 +01:00
parent 14a946bf5f
commit 9024f46755

View File

@ -1,28 +1,30 @@
#include <Arduino.h>
#include <Wire.h>
#include <ModbusSlave.h>
#include <SHT2x.h>
#include <Arduino.h> // Einbindung der Arduino-Bibliothek für grundlegende Funktionen
#include <Wire.h> // Bibliothek für die I2C-Kommunikation
#include <ModbusSlave.h> // Modbus-Bibliothek für die Kommunikation als Slave
#include <SHT2x.h> // Bibliothek für den SHT2x-Sensor (Temperatur & Luftfeuchtigkeit)
// Statische Definition von Modbus-ID und Baudrate
#define SLAVE_ID 8
#define SERIAL_BAUDRATERS485 9600
#define SERIAL_PORTRS485 Serial
#define SLAVE_ID 8 // Modbus-Slave-Adresse (ID)
#define SERIAL_BAUDRATERS485 9600 // Baudrate für die serielle RS485-Kommunikation
#define SERIAL_PORTRS485 Serial // Serielle Schnittstelle für RS485
// RS485-Konfiguration
#define RS485_CTRL_PIN 8
#define OutPutPin 9
#define RS485_CTRL_PIN 8 // Steuer-Pin für den RS485-Bus (Richtungskontrolle)
#define OutPutPin 9 // Pin für digitalen Ausgang
// 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};
// Register-Arrays für Modbus
uint8_t ReadCoilRegister[] = {0, 1, 2}; // Coil-Register für digitale Werte (Lesen)
uint8_t output_pins[] = {0, 1}; // Liste der digitalen Ausgänge
uint8_t ReadInputRegister[] = {0, 1, 2, 3, 4, 5, 6, 7}; // Input-Register für analoge Werte (Lesen)
// Größen der Register-Arrays berechnen
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]);
int ValueInputOne = 0;
int ValueInputOne = 0; // Variable zur Speicherung eines Eingabewertes
// Modbus-Objekt initialisieren, abhängig von der RS485-Steuerleitung
#ifdef RS485_CTRL_PIN
Modbus slave(SERIAL_PORTRS485, SLAVE_ID, RS485_CTRL_PIN);
#else
@ -31,102 +33,112 @@ Modbus slave(SERIAL_PORTRS485, SLAVE_ID);
// Funktion zur Steuerung der digitalen Ausgänge über Modbus
uint8_t writeDigitalOut(uint8_t fc, uint16_t address, uint16_t length) {
// Prüfen, ob die Adresse und Länge innerhalb des gültigen Bereichs liegen
if (address > output_pins_size || (address + length) > output_pins_size) {
return STATUS_ILLEGAL_DATA_ADDRESS;
return STATUS_ILLEGAL_DATA_ADDRESS; // Fehlercode zurückgeben
}
// Durchlaufen der angegebenen Register-Adressen
for (uint16_t i = 0; i < length; i++) {
// Lesen des Coil-Werts aus dem Modbus-Puffer und entsprechend den Ausgang setzen
if (slave.readCoilFromBuffer(i) == 1) {
digitalWrite(OutPutPin, HIGH);
digitalWrite(OutPutPin, HIGH); // Ausgang einschalten
} else {
digitalWrite(OutPutPin, LOW);
digitalWrite(OutPutPin, LOW); // Ausgang ausschalten
}
}
return STATUS_OK;
return STATUS_OK; // Erfolgreiche Verarbeitung
}
// Funktion zum Lesen von Coil-Register-Werten
// Funktion zum Lesen von Coil-Register-Werten (Digitale Eingänge)
uint8_t fReadCoilRegister(uint8_t fc, uint16_t address, uint16_t length) {
// Prüfen, ob die Adresse und Länge innerhalb des gültigen Bereichs liegen
if (address > ReadCoilRegister_size || (address + length) > ReadCoilRegister_size) {
return STATUS_ILLEGAL_DATA_ADDRESS;
return STATUS_ILLEGAL_DATA_ADDRESS; // Fehlercode zurückgeben
}
// Durchlaufen der Register-Adressen und Werte setzen
for (uint16_t i = 0; i < length; i++) {
if (i == 0) {
slave.writeCoilToBuffer(i, digitalRead(OutPutPin));
slave.writeCoilToBuffer(i, digitalRead(OutPutPin)); // Wert des digitalen Ausgangs zurückgeben
} else if (i == 1) {
slave.writeCoilToBuffer(i, 0);
slave.writeCoilToBuffer(i, 0); // Platzhalterwert
} else if (i == 2) {
slave.writeCoilToBuffer(i, 1);
slave.writeCoilToBuffer(i, 1); // Platzhalterwert
}
}
return STATUS_OK;
return STATUS_OK; // Erfolgreiche Verarbeitung
}
// Funktion zum Lesen von Input-Register-Werten
// Funktion zum Lesen von Input-Register-Werten (Analoge Werte)
uint8_t fReadInputRegister(uint8_t fc, uint16_t address, uint16_t length) {
// Prüfen, ob die Adresse und Länge innerhalb des gültigen Bereichs liegen
if (address > ReadInputRegister_size || (address + length) > ReadInputRegister_size) {
return STATUS_ILLEGAL_DATA_ADDRESS;
return STATUS_ILLEGAL_DATA_ADDRESS; // Fehlercode zurückgeben
}
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
// Dummy-Werte für Temperatur und Luftfeuchtigkeit
float temperatur = 21.21;
float humidity = 55.55;
switch (i) {
case 0:
slave.writeRegisterToBuffer(i, millis() / 1000); // Zeit in Sekunden
slave.writeRegisterToBuffer(i, millis() / 1000); // Laufzeit des Systems in Sekunden
break;
case 1:
slave.writeRegisterToBuffer(i, SERIAL_BAUDRATERS485); // Baudrate
slave.writeRegisterToBuffer(i, SERIAL_BAUDRATERS485); // Baudrate des Modbus
break;
case 2:
slave.writeRegisterToBuffer(i, SLAVE_ID); // Slave-ID
break;
case 3: {
slave.writeRegisterToBuffer(i, static_cast<int>(temperatur * 100));
case 3:
slave.writeRegisterToBuffer(i, static_cast<int>(temperatur * 100)); // Temperatur in 1/100 °C
break;
}
case 4: {
slave.writeRegisterToBuffer(i, static_cast<int>(humidity * 100));
case 4:
slave.writeRegisterToBuffer(i, static_cast<int>(humidity * 100)); // Luftfeuchtigkeit in 1/100 %
break;
}
case 5: {
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));
case 5: {
// Berechnung der absoluten Luftfeuchtigkeit
const double UG = 8314.3; // J/(kmol*K), universelle Gaskonstante
const double mw = 18.016; // kg/kmol, Molekulargewicht von Wasserdampf
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)); // Absolute Feuchtigkeit schreiben
break;
}
case 6:
slave.writeRegisterToBuffer(i, 5); // Platzhalter für Helligkeitswert
slave.writeRegisterToBuffer(i, 5); // Platzhalterwert für Helligkeitssensor
break;
case 7:
slave.writeRegisterToBuffer(i, digitalRead(OutPutPin)); // Zustand des Ausgangs
slave.writeRegisterToBuffer(i, digitalRead(OutPutPin)); // Status des digitalen Ausgangs
break;
}
}
return STATUS_OK;
return STATUS_OK; // Erfolgreiche Verarbeitung
}
void setup() {
pinMode(RS485_CTRL_PIN, OUTPUT);
digitalWrite(RS485_CTRL_PIN, LOW); // RS485-Empfang aktivieren
pinMode(RS485_CTRL_PIN, OUTPUT); // RS485-Steuerpin als Ausgang setzen
digitalWrite(RS485_CTRL_PIN, LOW); // RS485 auf Empfangsmodus setzen
SERIAL_PORTRS485.begin(SERIAL_BAUDRATERS485);
slave.begin(SERIAL_BAUDRATERS485);
SERIAL_PORTRS485.begin(SERIAL_BAUDRATERS485); // Serielle Kommunikation starten
slave.begin(SERIAL_BAUDRATERS485); // Modbus initialisieren
// Modbus-Handler registrieren
// Modbus-Callback-Funktionen 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);
pinMode(OutPutPin, OUTPUT); // Digitalen Ausgangspin als Ausgang setzen
digitalWrite(OutPutPin, LOW); // Ausgang auf LOW setzen (Standardzustand)
}
void loop() {
slave.poll(); // Verarbeitet ankommende Modbus-Anfragen
slave.poll(); // Modbus-Anfragen verarbeiten
}