Pierwszy commit - inicjalizacja projektu
This commit is contained in:
241
CONFIG.md
Normal file
241
CONFIG.md
Normal file
@@ -0,0 +1,241 @@
|
||||
# Konfiguracja programu modb_orno3
|
||||
|
||||
## Parametry konfiguracyjne
|
||||
|
||||
Wszystkie parametry są zdefiniowane na początku pliku `modb_orno3.c` (linie 11-40):
|
||||
|
||||
```c
|
||||
/* KONFIGURACJA PROGRAMU - EDYTUJ TU */
|
||||
|
||||
/* Port szeregowy */
|
||||
#define USB_DEV_DEFAULT "/dev/ttyUSB0"
|
||||
|
||||
/* Adresy urządzeń Modbus RTU */
|
||||
#define ORNO_SLAVE_ADR 2
|
||||
#define SUN2000_SLAVE_ADR 3
|
||||
|
||||
/* Parametry timing dla ORNO (mikrosekund) */
|
||||
#define ORNO_RTS_DELAY 5000 /* RTS delay: 5ms */
|
||||
#define ORNO_BYTE_TIMEOUT 2500 /* Byte timeout: 2.5ms */
|
||||
|
||||
/* Parametry timing dla SUN2K (mikrosekund) */
|
||||
#define SUN2K_RTS_DELAY 5000 /* RTS delay: 5ms */
|
||||
#define SUN2K_BYTE_TIMEOUT 2500 /* Byte timeout: 2.5ms */
|
||||
|
||||
/* Przerwa między ORNO a SUN2K (mikrosekund) */
|
||||
#define DELAY_BETWEEN_DEVICES 100000 /* 100ms */
|
||||
|
||||
/* MQTT - ustaw 1 aby wyłączyć MQTT */
|
||||
#define DISABLE_MQTT 0 /* 0 = MQTT włączony, 1 = wyłączony */
|
||||
|
||||
/* Broker MQTT */
|
||||
#define MQTT_BROKER "10.1.1.1"
|
||||
#define MQTT_PORT 1883
|
||||
|
||||
/* Tryb pracy */
|
||||
#define READ_LOOP false /* false = jeden odczyt, true = pętla co 5s */
|
||||
#define READ_ORNO true /* Czy odczytywać ORNO */
|
||||
#define READ_SUN2K true /* Czy odczytywać SUN2K */
|
||||
```
|
||||
|
||||
## Uruchomienie
|
||||
|
||||
### Kompilacja:
|
||||
```bash
|
||||
bash cc-modb_orno3.sh
|
||||
```
|
||||
|
||||
### Uruchomienie:
|
||||
```bash
|
||||
./modborno3
|
||||
```
|
||||
|
||||
Program uruchamia się **bez parametrów** i używa konfiguracji z #define.
|
||||
|
||||
## Sekwencja działania
|
||||
|
||||
1. **Odczyt ORNO** (adres Modbus: 2)
|
||||
- Napięcia L1, L2, L3
|
||||
- Prądy L1, L2, L3
|
||||
- Moc Total, L1, L2, L3
|
||||
- Energia Total, L1, L2, L3
|
||||
- Częstotliwość
|
||||
|
||||
2. **Przerwa 100ms**
|
||||
|
||||
3. **Odczyt SUN2K** (adres Modbus: 3)
|
||||
- Wszystkie rejestry falownika
|
||||
- Czasy start/shutdown
|
||||
- Statusy
|
||||
- Moce
|
||||
- Energia dzienna i całkowita
|
||||
|
||||
## Tematy MQTT
|
||||
|
||||
### ORNO:
|
||||
- `/energy/orno/U` - napięcia (JSON: U1, U2, U3)
|
||||
- `/energy/orno/I` - prądy (JSON: I1, I2, I3)
|
||||
- `/energy/orno/P` - moc (JSON: P_Tot, P1, P2, P3)
|
||||
- `/energy/orno/W` - energia (JSON: W_Tot, W1, W2, W3)
|
||||
- `/energy/orno/Hz` - częstotliwość (wartość)
|
||||
|
||||
### SUN2K:
|
||||
- `/energy/SUN2K` - wszystkie parametry (JSON dla każdego rejestru)
|
||||
|
||||
## Modyfikacja konfiguracji
|
||||
|
||||
1. Edytuj plik `modb_orno3.c`
|
||||
2. Zmień wartości #define
|
||||
3. Przekompiluj: `bash cc-modb_orno3.sh`
|
||||
4. Uruchom: `./modborno3`
|
||||
|
||||
## Przykłady modyfikacji
|
||||
|
||||
### Wyłączenie MQTT:
|
||||
```c
|
||||
#define DISABLE_MQTT 1
|
||||
```
|
||||
|
||||
### Zmiana adresu brokera:
|
||||
```c
|
||||
#define MQTT_BROKER "192.168.1.100"
|
||||
#define MQTT_PORT 1883
|
||||
```
|
||||
|
||||
### Tryb ciągły (pętla co 5s):
|
||||
```c
|
||||
#define READ_LOOP true
|
||||
```
|
||||
|
||||
### Tylko ORNO (bez SUN2K):
|
||||
```c
|
||||
#define READ_SUN2K false
|
||||
```
|
||||
|
||||
### Zmiana przerwy między odczytami (200ms):
|
||||
```c
|
||||
#define DELAY_BETWEEN_DEVICES 200000
|
||||
```
|
||||
|
||||
## Walidacja danych i zabezpieczenia MQTT
|
||||
|
||||
### Automatyczna walidacja wartości
|
||||
|
||||
Program **automatycznie waliduje** wszystkie odczytane wartości przed wysłaniem do MQTT.
|
||||
Dane są wysyłane do MQTT **tylko** gdy:
|
||||
|
||||
1. ✅ Odczyt Modbus zakończył się sukcesem (prawidłowa liczba rejestrów)
|
||||
2. ✅ Wartość nie jest **NaN** (Not a Number)
|
||||
3. ✅ Wartość nie jest **Inf** (Infinity)
|
||||
4. ✅ Wartość mieści się w **rozsądnym zakresie**
|
||||
|
||||
### Zakresy walidacji dla ORNO
|
||||
|
||||
| Parametr | Zakres | Jednostka | Powód |
|
||||
|----------|--------|-----------|-------|
|
||||
| **Napięcia L1/L2/L3** | 150 - 280 | V | Typowy zakres sieci UE (230V ±20%) |
|
||||
| **Prądy L1/L2/L3** | 0 - 100 | A | Zabezpieczenie instalacji domowej |
|
||||
| **Moc Total/L1/L2/L3** | -25000 - +25000 | W | Pozwala na generację (wartości ujemne) |
|
||||
| **Energia Total/L1/L2/L3** | 0 - 1000000 | kWh | Licznik nie może mieć ujemnej energii |
|
||||
| **Częstotliwość** | 47 - 53 | Hz | Typowy zakres sieci UE (50Hz) / US (60Hz) |
|
||||
|
||||
### Logi walidacji
|
||||
|
||||
Program wyświetla szczegółowe informacje o walidacji:
|
||||
|
||||
**Gdy dane są prawidłowe:**
|
||||
```
|
||||
Voltages: L1=225.8 V, L2=221.3 V, L3=229.8 V
|
||||
MQTT: Published voltages
|
||||
```
|
||||
|
||||
**Gdy odczyt się nie powiódł:**
|
||||
```
|
||||
Failed to read currents: Resource temporarily unavailable
|
||||
(brak komunikatu MQTT - dane nie są wysyłane)
|
||||
```
|
||||
|
||||
**Gdy wartość jest poza zakresem:**
|
||||
```
|
||||
WARNING: Value 350.5 out of range [150.0, 280.0]
|
||||
MQTT: Skipping voltages - invalid values
|
||||
```
|
||||
|
||||
**Gdy wartość jest NaN lub Inf:**
|
||||
```
|
||||
WARNING: Value is NaN
|
||||
MQTT: Skipping power - invalid values
|
||||
```
|
||||
|
||||
### Zabezpieczenia dla SUN2K
|
||||
|
||||
Dla urządzenia SUN2K program:
|
||||
|
||||
- ❌ **NIE wysyła** danych gdy odczyt się nie powiódł
|
||||
- ❌ **NIE używa** starych wartości (`buf_last_val`) po błędzie
|
||||
- ✅ **Tylko** aktualne, poprawnie odczytane wartości są publikowane
|
||||
|
||||
**Przykład:**
|
||||
```
|
||||
modbus_read_registers addr=0x7D55 nb=1 -> ERR (Connection timed out)
|
||||
Frequency: Failed to 11 read: Connection timed out
|
||||
MQTT: Skipping Frequency - no valid data
|
||||
```
|
||||
|
||||
### Dlaczego to ważne?
|
||||
|
||||
**Bez walidacji:**
|
||||
- Błędne odczyty (CRC errors) mogły wysyłać śmieciowe dane do MQTT
|
||||
- Wartości NaN/Inf mogły powodować błędy w systemach monitoringu
|
||||
- Niemożliwe wartości (np. 10000V) mogły wywoływać fałszywe alarmy
|
||||
|
||||
**Z walidacją:**
|
||||
- ✅ Tylko **poprawne** wartości trafiają do MQTT
|
||||
- ✅ System monitoringu dostaje **wiarygodne** dane
|
||||
- ✅ Brak **fałszywych alarmów** z powodu błędnych odczytów
|
||||
- ✅ **Logi** pokazują dokładnie co poszło nie tak
|
||||
|
||||
### Kod walidacji
|
||||
|
||||
Funkcja walidacji znajduje się w [modb_orno3.c:237-250](modb_orno3.c#L237-L250):
|
||||
|
||||
```c
|
||||
int is_valid_float(float value, float min_val, float max_val)
|
||||
{
|
||||
if (isnan(value)) {
|
||||
printf("WARNING: Value is NaN\n");
|
||||
return 0;
|
||||
}
|
||||
if (isinf(value)) {
|
||||
printf("WARNING: Value is Inf\n");
|
||||
return 0;
|
||||
}
|
||||
if (value < min_val || value > max_val) {
|
||||
printf("WARNING: Value %.2f out of range [%.2f, %.2f]\n",
|
||||
value, min_val, max_val);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
```
|
||||
|
||||
Walidacja jest wywoływana dla każdego pomiaru przed wysłaniem do MQTT.
|
||||
|
||||
### Modyfikacja zakresów walidacji
|
||||
|
||||
Jeśli chcesz zmienić zakresy walidacji (np. dla instalacji przemysłowej):
|
||||
|
||||
1. Otwórz plik `modb_orno3.c`
|
||||
2. Znajdź sekcję z walidacją (np. dla napięć około linii 370)
|
||||
3. Zmień wartości w `is_valid_float()`:
|
||||
|
||||
**Przykład - zwiększenie zakresu prądów do 200A:**
|
||||
```c
|
||||
/* Przed: */
|
||||
if (is_valid_float(I1, 0.0, 100.0) && ...
|
||||
|
||||
/* Po: */
|
||||
if (is_valid_float(I1, 0.0, 200.0) && ...
|
||||
```
|
||||
|
||||
4. Przekompiluj: `bash cc-modb_orno3.sh`
|
||||
Reference in New Issue
Block a user