Hallo zusammen,
meine Modbus-Integration von einem SMA PV-Wechselrichter ist mittlerweile am Laufen und erhalte die korrekten Daten in den Eib-PC... meistens...
Die Daten des Wechselrichters hole ich zyklisch via Modbus-Verbindung ab, hierbei muss ich zwischen zweierlei Daten unterscheiden
Die reinen Visu-Daten aktualisiere ich jede Minute. Hier hole ich aktuell gestaffelt jede 10 Sekunden 2-3 Werte aus dem Wechselrichter ab.
Bei einer sekündlichen Abfrage von Modbusdaten bekomme ich alle Paar Sekunden Fehlermeldungen im Ereignisprotokoll, welche von der Modbus-Kommunikation kommen. Ich weiß nciht genau, ob der EibPC² oder der PV-WR hier nicht mit dem Datenhandling hinterher kommt. Bei Senkung auf 2 Sekunden läuft es. Leider gibt der cycle-Befehl keine 1,5sec etc. als Schleife her, um hier evtl. einen Grenzwert zu finden.
Hat hier schon jemand erfahrungen, wie weit ich die Modbus-Kommunikation ausreizen kann? Mein Hauptproblem ist einfach dass ich die beiden Steuerdaten zeitkritisch aktualiseirt benötige um den Netzanforderungen der Batterieregelung gerecht zu werden. Und für den Batterie-WR werden ja noch Moodbus-Kommunikationen dazukommen...
Das Programm sieht aktuell wie folgt aus (Mit den eingestellten 2 sec als Cycle läuft es problemlos, bei 1 sec als cycle ca.- alle 3-5 sec eine Fehlermeldung):
//--------------------------------------------------------------------------------------------------------------------------------------
//Modbus Init
WR_PV_Handle=modbusmaster($192.168.2.225$, 502u16, 5u32, 5)
//--------------------------------------------------------------------------------------------------------------------------------------
if cycle(0,2) then {
//Anlagenstatus holen
WR_PV_Betrieb_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 40029u16, WR_PV_Betrieb, BIG_ENDIAN, BIG_ENDIAN); /* Betreibsstatus */
WR_PV_P_DS_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30775u16, WR_PV_P_DS_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung DS */
if(WR_PV_Betrieb == 295u32) then { /* Status von vor 2 Sekunde, da neue Daten noch nicht vorliegen */
//Wechselrichter im Status "295 = In Betrieb"
WR_PV_P_L1 = WR_PV_P_L1_Temp; /* Wirkleistung L1 */
WR_PV_P_L2 = WR_PV_P_L2_Temp; /* Wirkleistung L2 */
WR_PV_P_L3 = WR_PV_P_L3_Temp; /* Wirkleistung L3 */
WR_PV_P_DS = WR_PV_P_DS_Temp; /* Wirkleistung DS */
WR_PV_Q_L1 = WR_PV_Q_L1_Temp; /* Blindleistung L1 */
WR_PV_Q_L2 = WR_PV_Q_L2_Temp; /* Blindleistung L2 */
WR_PV_Q_L3 = WR_PV_Q_L3_Temp; /* Blindleistung L3 */
WR_PV_Q_DS = WR_PV_Q_DS_Temp; /* Blindleistung DS */
WR_PV_P_DC1 = WR_PV_P_DC1_Temp; /* Wirkleistung DC1 (Hausdach) */
WR_PV_P_DC2 = WR_PV_P_DC2_Temp; /* Wirkleistung DC2 (Anbau) */
WR_PV_U_ZK_mV = WR_PV_U_ZK * 10s32; /* Zwischenkreisspannung, in mV */
} else {
//Werte sind ungültig, da PV-WR nicht im Status "295 = In Betrieb"
WR_PV_P_L1 = 0s32;
WR_PV_P_L2 = 0s32;
WR_PV_P_L3 = 0s32;
WR_PV_P_DS = 0s32;
WR_PV_Q_L1 = 0s32;
WR_PV_Q_L2 = 0s32;
WR_PV_Q_L3 = 0s32;
WR_PV_Q_DS = 0s32;
WR_PV_P_DC1 = 0s32;
WR_PV_P_DC2 = 0s32;
WR_PV_U_ZK_mV = 0s32;
} endif;
WR_PV_P_DCG = WR_PV_P_DC1_Temp + WR_PV_P_DC2_Temp; /* Wirkleistung DC Gesamt */
// Wirkungsgrad Wechselrichter
Temp_f32_1 = convert (WR_PV_P_DS, Dummy_f32);
Temp_f32_2 = convert (WR_PV_P_DCG, Dummy_f32);
if (Temp_f32_2 <= 0f32) then Temp_f32_2 = 8000f32 endif; /* Teilen durch 0 verhindern, 8000 = Maximalleistung PV-WR */
WR_PV_Wirkungsgrad = 100f32 * Temp_f32_1 / Temp_f32_2;
} endif
//--------------------------------------------------------------------------------------------------------------------------------------
if stime(0) then {
//Anlagendaten holen
WR_PV_Tagesertrag_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30535u16, WR_PV_Tagesertrag, BIG_ENDIAN, BIG_ENDIAN); /* Tagesertrag in Wh */
WR_PV_Gesamtertrag_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30531u16, WR_PV_Gesamtertrag, BIG_ENDIAN, BIG_ENDIAN); /* Gesamtertrag in kWh */
} endif
if stime(10) then {
//Anlagendaten holen
WR_PV_P_L1_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30777u16, WR_PV_P_L1_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung L1 */
WR_PV_P_L2_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30779u16, WR_PV_P_L2_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung L2 */
} endif
if stime(20) then {
//Anlagendaten holen
WR_PV_P_L3_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30781u16, WR_PV_P_L3_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung L3 */
WR_PV_Q_L1_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30807u16, WR_PV_Q_L1_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung L1 */
} endif
if stime(30) then {
//Anlagendaten holen
WR_PV_Q_L2_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30809u16, WR_PV_Q_L2_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung L2 */
WR_PV_Q_L3_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30811u16, WR_PV_Q_L3_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung L3 */
} endif
if stime(40) then {
//Anlagendaten holen
WR_PV_Q_DS_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30805u16, WR_PV_Q_DS_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung DS */
WR_PV_P_DC1_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30773u16, WR_PV_P_DC1_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung DC1 (Hausdach) */
} endif
if stime(50) then {
//Anlagendaten holen
WR_PV_P_DC2_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30961u16, WR_PV_P_DC2_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung DC2 (Anbau) */
WR_PV_U_ZK_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30975u16, WR_PV_U_ZK, BIG_ENDIAN, BIG_ENDIAN); /* Zwischenkreisspannung, 2 Nachkommastellen */
} endif
//--------------------------------------------------------------------------------------------------------------------------------------
Dazu die Visu (Ein wenig Nachbearbeitung der Daten fehlt noch, gerade beim Wirkungsgrad, da hier die Ausgangleistung schneller aktualisiert (alle 1-2 Sec) als die Eingangsleistung (alle 60 sec):
Webserver2.png
meine Modbus-Integration von einem SMA PV-Wechselrichter ist mittlerweile am Laufen und erhalte die korrekten Daten in den Eib-PC... meistens...
Die Daten des Wechselrichters hole ich zyklisch via Modbus-Verbindung ab, hierbei muss ich zwischen zweierlei Daten unterscheiden
- Daten, welche zur Anlagensteurung genutzt werden
- Status
- Ausgangsleistung (Drehstrom) des Wechselrichters
- Auf diese Signale reagiert aktuell die Hausautomatisierung. Zusätzlich wird demnächst der Batterie-Wechselrichter dazukommen, welcher hierüber ebenfalls gesteuert wird (Lade-/Entladeleistung)
- Daten, welche rein der Visualisierung dienen
- DC-Leitungen
- AC-Leitung je Phase
- Blindleistung
- ...
Die reinen Visu-Daten aktualisiere ich jede Minute. Hier hole ich aktuell gestaffelt jede 10 Sekunden 2-3 Werte aus dem Wechselrichter ab.
Bei einer sekündlichen Abfrage von Modbusdaten bekomme ich alle Paar Sekunden Fehlermeldungen im Ereignisprotokoll, welche von der Modbus-Kommunikation kommen. Ich weiß nciht genau, ob der EibPC² oder der PV-WR hier nicht mit dem Datenhandling hinterher kommt. Bei Senkung auf 2 Sekunden läuft es. Leider gibt der cycle-Befehl keine 1,5sec etc. als Schleife her, um hier evtl. einen Grenzwert zu finden.
Hat hier schon jemand erfahrungen, wie weit ich die Modbus-Kommunikation ausreizen kann? Mein Hauptproblem ist einfach dass ich die beiden Steuerdaten zeitkritisch aktualiseirt benötige um den Netzanforderungen der Batterieregelung gerecht zu werden. Und für den Batterie-WR werden ja noch Moodbus-Kommunikationen dazukommen...
Das Programm sieht aktuell wie folgt aus (Mit den eingestellten 2 sec als Cycle läuft es problemlos, bei 1 sec als cycle ca.- alle 3-5 sec eine Fehlermeldung):
//--------------------------------------------------------------------------------------------------------------------------------------
//Modbus Init
WR_PV_Handle=modbusmaster($192.168.2.225$, 502u16, 5u32, 5)
//--------------------------------------------------------------------------------------------------------------------------------------
if cycle(0,2) then {
//Anlagenstatus holen
WR_PV_Betrieb_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 40029u16, WR_PV_Betrieb, BIG_ENDIAN, BIG_ENDIAN); /* Betreibsstatus */
WR_PV_P_DS_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30775u16, WR_PV_P_DS_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung DS */
if(WR_PV_Betrieb == 295u32) then { /* Status von vor 2 Sekunde, da neue Daten noch nicht vorliegen */
//Wechselrichter im Status "295 = In Betrieb"
WR_PV_P_L1 = WR_PV_P_L1_Temp; /* Wirkleistung L1 */
WR_PV_P_L2 = WR_PV_P_L2_Temp; /* Wirkleistung L2 */
WR_PV_P_L3 = WR_PV_P_L3_Temp; /* Wirkleistung L3 */
WR_PV_P_DS = WR_PV_P_DS_Temp; /* Wirkleistung DS */
WR_PV_Q_L1 = WR_PV_Q_L1_Temp; /* Blindleistung L1 */
WR_PV_Q_L2 = WR_PV_Q_L2_Temp; /* Blindleistung L2 */
WR_PV_Q_L3 = WR_PV_Q_L3_Temp; /* Blindleistung L3 */
WR_PV_Q_DS = WR_PV_Q_DS_Temp; /* Blindleistung DS */
WR_PV_P_DC1 = WR_PV_P_DC1_Temp; /* Wirkleistung DC1 (Hausdach) */
WR_PV_P_DC2 = WR_PV_P_DC2_Temp; /* Wirkleistung DC2 (Anbau) */
WR_PV_U_ZK_mV = WR_PV_U_ZK * 10s32; /* Zwischenkreisspannung, in mV */
} else {
//Werte sind ungültig, da PV-WR nicht im Status "295 = In Betrieb"
WR_PV_P_L1 = 0s32;
WR_PV_P_L2 = 0s32;
WR_PV_P_L3 = 0s32;
WR_PV_P_DS = 0s32;
WR_PV_Q_L1 = 0s32;
WR_PV_Q_L2 = 0s32;
WR_PV_Q_L3 = 0s32;
WR_PV_Q_DS = 0s32;
WR_PV_P_DC1 = 0s32;
WR_PV_P_DC2 = 0s32;
WR_PV_U_ZK_mV = 0s32;
} endif;
WR_PV_P_DCG = WR_PV_P_DC1_Temp + WR_PV_P_DC2_Temp; /* Wirkleistung DC Gesamt */
// Wirkungsgrad Wechselrichter
Temp_f32_1 = convert (WR_PV_P_DS, Dummy_f32);
Temp_f32_2 = convert (WR_PV_P_DCG, Dummy_f32);
if (Temp_f32_2 <= 0f32) then Temp_f32_2 = 8000f32 endif; /* Teilen durch 0 verhindern, 8000 = Maximalleistung PV-WR */
WR_PV_Wirkungsgrad = 100f32 * Temp_f32_1 / Temp_f32_2;
} endif
//--------------------------------------------------------------------------------------------------------------------------------------
if stime(0) then {
//Anlagendaten holen
WR_PV_Tagesertrag_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30535u16, WR_PV_Tagesertrag, BIG_ENDIAN, BIG_ENDIAN); /* Tagesertrag in Wh */
WR_PV_Gesamtertrag_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30531u16, WR_PV_Gesamtertrag, BIG_ENDIAN, BIG_ENDIAN); /* Gesamtertrag in kWh */
} endif
if stime(10) then {
//Anlagendaten holen
WR_PV_P_L1_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30777u16, WR_PV_P_L1_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung L1 */
WR_PV_P_L2_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30779u16, WR_PV_P_L2_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung L2 */
} endif
if stime(20) then {
//Anlagendaten holen
WR_PV_P_L3_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30781u16, WR_PV_P_L3_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung L3 */
WR_PV_Q_L1_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30807u16, WR_PV_Q_L1_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung L1 */
} endif
if stime(30) then {
//Anlagendaten holen
WR_PV_Q_L2_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30809u16, WR_PV_Q_L2_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung L2 */
WR_PV_Q_L3_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30811u16, WR_PV_Q_L3_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung L3 */
} endif
if stime(40) then {
//Anlagendaten holen
WR_PV_Q_DS_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30805u16, WR_PV_Q_DS_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Blindleistung DS */
WR_PV_P_DC1_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30773u16, WR_PV_P_DC1_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung DC1 (Hausdach) */
} endif
if stime(50) then {
//Anlagendaten holen
WR_PV_P_DC2_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30961u16, WR_PV_P_DC2_Temp, BIG_ENDIAN, BIG_ENDIAN); /* Wirkleistung DC2 (Anbau) */
WR_PV_U_ZK_Status = readmodbus(WR_PV_Handle, MB_INPUT_REGISTER, 30975u16, WR_PV_U_ZK, BIG_ENDIAN, BIG_ENDIAN); /* Zwischenkreisspannung, 2 Nachkommastellen */
} endif
//--------------------------------------------------------------------------------------------------------------------------------------
Dazu die Visu (Ein wenig Nachbearbeitung der Daten fehlt noch, gerade beim Wirkungsgrad, da hier die Ausgangleistung schneller aktualisiert (alle 1-2 Sec) als die Eingangsleistung (alle 60 sec):
Webserver2.png
Kommentar